diff options
| author | sigoden <sigoden@gmail.com> | 2023-03-05 07:52:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-05 07:52:36 +0800 |
| commit | 598c31c3d946e8772c4d1bc450b5d2b1bdf587c0 (patch) | |
| tree | df12513b90f3b559b25f93a9f9d26f54e58d1118 | |
| parent | 822f0eed9429f71524e739352da3f76d604071d5 (diff) | |
| download | aichat-598c31c3d946e8772c4d1bc450b5d2b1bdf587c0.tar.gz | |
refactor: optimize role prompt (#13)
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | src/client.rs | 32 | ||||
| -rw-r--r-- | src/repl.rs | 8 |
3 files changed, 26 insertions, 15 deletions
@@ -76,7 +76,6 @@ We can predefine a batch of roles in `roles.yaml`. For example, we define a emoj I want you to translate the sentences I wrote into emojis. I will write the sentence, and you will express it with emojis. I just want you to express it with emojis. I don't want you to reply with anything but emoji. When I need to tell you something in English, I will do it by wrapping it in curly brackets like {like this}. - My first sentence is: ``` Let ChatGPT answer questions in the role of a emoji translator diff --git a/src/client.rs b/src/client.rs index 1f42346..3fe75dd 100644 --- a/src/client.rs +++ b/src/client.rs @@ -81,11 +81,10 @@ impl ChatGptClient { } async fn acquire_inner(&self, content: &str, prompt: Option<String>) -> Result<String> { - let content = combine(content, prompt); if self.config.dry_run { - return Ok(content); + return Ok(combine(content, prompt)); } - let builder = self.request_builder(&content, false); + let builder = self.request_builder(content, prompt, false); let data: Value = builder.send().await?.json().await?; @@ -102,12 +101,11 @@ impl ChatGptClient { prompt: Option<String>, receiver: &mut ReplyReceiver, ) -> Result<()> { - let content = combine(content, prompt); if self.config.dry_run { - receiver.text(&content); + receiver.text(&combine(content, prompt)); return Ok(()); } - let builder = self.request_builder(&content, true); + let builder = self.request_builder(content, prompt, true); let mut stream = builder.send().await?.bytes_stream().eventsource(); let mut virgin = true; while let Some(part) = stream.next().await { @@ -135,10 +133,25 @@ impl ChatGptClient { Ok(()) } - fn request_builder(&self, content: &str, stream: bool) -> RequestBuilder { + fn request_builder( + &self, + content: &str, + prompt: Option<String>, + stream: bool, + ) -> RequestBuilder { + let user_message = json!({ "role": "user", "content": content }); + let messages = match prompt { + Some(prompt) => { + let system_message = json!({ "role": "system", "content": prompt.trim() }); + json!([system_message, user_message]) + } + None => { + json!([user_message]) + } + }; let mut body = json!({ "model": MODEL, - "messages": [{"role": "user", "content": content}], + "messages": messages, }); if let Some(v) = self.config.temperature { @@ -160,11 +173,10 @@ impl ChatGptClient { fn combine(content: &str, prompt: Option<String>) -> String { match prompt { - Some(v) => format!("{v} {content}"), + Some(prompt) => format!("{}\n{content}", prompt.trim()), None => content.to_string(), } } - fn init_runtime() -> Result<Runtime> { tokio::runtime::Builder::new_current_thread() .enable_all() diff --git a/src/repl.rs b/src/repl.rs index 164d746..17617f8 100644 --- a/src/repl.rs +++ b/src/repl.rs @@ -134,7 +134,6 @@ impl Repl { }, ".clear-role" => { handler.handle(ReplCmd::UnsetRole)?; - dump("", 1); } ".editor" => { dump( @@ -156,7 +155,6 @@ impl Repl { } ".info" => { handler.handle(ReplCmd::Info)?; - dump("", 1); } _ => dump_unknown_command(), } @@ -295,8 +293,9 @@ impl ReplCmdHandler { } ReplCmd::SetRole(name) => match self.config.find_role(&name) { Some(role) => { + let output = format!("{}>> {}", role.name, role.prompt.trim()); self.state.borrow_mut().role = Some(role); - dump("", 1); + dump(output, 2); } None => { dump("Unknown role", 2); @@ -304,6 +303,7 @@ impl ReplCmdHandler { }, ReplCmd::UnsetRole => { self.state.borrow_mut().role = None; + dump("Clear the current selected role", 1); } ReplCmd::Info => { let state = self.state.borrow(); @@ -338,7 +338,7 @@ impl ReplCmdHandler { for (name, value) in items { info.push_str(&format!("{name:<20}{value}\n")); } - dump(info, 0); + dump(info, 1); } } Ok(()) |
