From fda50c0711fe875ac0fe175677cf60dcfd680ec2 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Tue, 5 Dec 2023 13:35:58 -0800 Subject: [PATCH 1/4] Updated api to stream --- pgml-dashboard/Cargo.lock | 96 ++++-- pgml-dashboard/Cargo.toml | 2 + pgml-dashboard/src/api/chatbot.rs | 554 +++++++++++++++++++++++------- 3 files changed, 498 insertions(+), 154 deletions(-) diff --git a/pgml-dashboard/Cargo.lock b/pgml-dashboard/Cargo.lock index f28f4db10..121b52b3b 100644 --- a/pgml-dashboard/Cargo.lock +++ b/pgml-dashboard/Cargo.lock @@ -854,6 +854,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "debugid" version = "0.8.0" @@ -1229,9 +1235,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1244,9 +1250,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1254,15 +1260,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1282,15 +1288,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -1299,21 +1305,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -2515,6 +2521,7 @@ dependencies = [ "csv-async", "dotenv", "env_logger", + "futures", "glob", "itertools", "lazy_static", @@ -2530,6 +2537,7 @@ dependencies = [ "regex", "reqwest", "rocket", + "rocket_ws", "sailfish", "scraper", "sentry", @@ -3041,8 +3049,8 @@ dependencies = [ [[package]] name = "rocket" -version = "0.5.0-rc.3" -source = "git+https://github.com/SergioBenitez/Rocket#07fe79796f058ab12683ff9e344558bece263274" +version = "0.6.0-dev" +source = "git+https://github.com/SergioBenitez/Rocket#7f7d352e453e83f3d23ee12f8965ce75c977fcea" dependencies = [ "async-stream", "async-trait", @@ -3078,8 +3086,8 @@ dependencies = [ [[package]] name = "rocket_codegen" -version = "0.5.0-rc.3" -source = "git+https://github.com/SergioBenitez/Rocket#07fe79796f058ab12683ff9e344558bece263274" +version = "0.6.0-dev" +source = "git+https://github.com/SergioBenitez/Rocket#7f7d352e453e83f3d23ee12f8965ce75c977fcea" dependencies = [ "devise", "glob", @@ -3094,8 +3102,8 @@ dependencies = [ [[package]] name = "rocket_http" -version = "0.5.0-rc.3" -source = "git+https://github.com/SergioBenitez/Rocket#07fe79796f058ab12683ff9e344558bece263274" +version = "0.6.0-dev" +source = "git+https://github.com/SergioBenitez/Rocket#7f7d352e453e83f3d23ee12f8965ce75c977fcea" dependencies = [ "cookie", "either", @@ -3118,6 +3126,15 @@ dependencies = [ "uncased", ] +[[package]] +name = "rocket_ws" +version = "0.1.0" +source = "git+https://github.com/SergioBenitez/Rocket#7f7d352e453e83f3d23ee12f8965ce75c977fcea" +dependencies = [ + "rocket", + "tokio-tungstenite", +] + [[package]] name = "rust-stemmers" version = "1.2.0" @@ -4337,6 +4354,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "tokio-util" version = "0.7.8" @@ -4525,6 +4554,25 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "typed-arena" version = "2.0.2" diff --git a/pgml-dashboard/Cargo.toml b/pgml-dashboard/Cargo.toml index 47238f6ed..6d1b803dd 100644 --- a/pgml-dashboard/Cargo.toml +++ b/pgml-dashboard/Cargo.toml @@ -50,3 +50,5 @@ tokio = { version = "1", features = ["full"] } url = "2.4" yaml-rust = "0.4" zoomies = { git="https://github.com/HyperparamAI/zoomies.git", branch="master" } +ws = { package = "rocket_ws", git = "https://github.com/SergioBenitez/Rocket" } +futures = "0.3.29" diff --git a/pgml-dashboard/src/api/chatbot.rs b/pgml-dashboard/src/api/chatbot.rs index c4b12d0c2..b5de54244 100644 --- a/pgml-dashboard/src/api/chatbot.rs +++ b/pgml-dashboard/src/api/chatbot.rs @@ -1,5 +1,6 @@ use anyhow::Context; -use pgml::{Collection, Pipeline}; +use futures::stream::StreamExt; +use pgml::{types::GeneralJsonAsyncIterator, Collection, OpenSourceAI, Pipeline}; use rand::{distributions::Alphanumeric, Rng}; use reqwest::Client; use rocket::{ @@ -44,12 +45,59 @@ enum ChatRole { Bot, } +impl ChatRole { + fn to_model_specific_role(&self, brain: &ChatbotBrain) -> &'static str { + match self { + ChatRole::User => "user", + ChatRole::Bot => match brain { + ChatbotBrain::OpenAIGPT4 => "assistant", + _ => "model", + }, + } + } +} + #[derive(Clone, Copy, Serialize, Deserialize)] enum ChatbotBrain { OpenAIGPT4, - PostgresMLFalcon180b, - AnthropicClaude, - MetaLlama2, + TekniumOpenHermes25Mistral7B, +} + +impl ChatbotBrain { + fn is_open_source(&self) -> bool { + match self { + Self::OpenAIGPT4 => false, + _ => true, + } + } + + fn get_system_message( + &self, + knowledge_base: &KnowledgeBase, + context: &str, + ) -> anyhow::Result { + match self { + Self::OpenAIGPT4 => { + let system_prompt = std::env::var("CHATBOT_CHATGPT_SYSTEM_PROMPT")?; + let system_prompt = system_prompt + .replace("{topic}", knowledge_base.topic()) + .replace("{persona}", "Engineer") + .replace("{language}", "English"); + Ok(serde_json::json!({ + "role": "system", + "content": system_prompt + })) + } + _ => Ok(serde_json::json!({ + "role": "system", + "content": format!(r#"You are a friendly and helpful chatbot that uses the following documents to answer the user's questions with the best of your ability. There is one rule: Do Not Lie. + +{} + + "#, context) + })), + } + } } impl TryFrom for ChatbotBrain { @@ -57,15 +105,22 @@ impl TryFrom for ChatbotBrain { fn try_from(value: u8) -> anyhow::Result { match value { - 0 => Ok(ChatbotBrain::OpenAIGPT4), - 1 => Ok(ChatbotBrain::PostgresMLFalcon180b), - 2 => Ok(ChatbotBrain::AnthropicClaude), - 3 => Ok(ChatbotBrain::MetaLlama2), + 0 => Ok(ChatbotBrain::TekniumOpenHermes25Mistral7B), + 1 => Ok(ChatbotBrain::OpenAIGPT4), _ => Err(anyhow::anyhow!("Invalid brain id")), } } } +impl From for &'static str { + fn from(value: ChatbotBrain) -> Self { + match value { + ChatbotBrain::OpenAIGPT4 => "gpt-4", + ChatbotBrain::TekniumOpenHermes25Mistral7B => "teknium/OpenHermes-2.5-Mistral-7B", + } + } +} + #[derive(Clone, Copy, Serialize, Deserialize)] enum KnowledgeBase { PostgresML, @@ -122,7 +177,7 @@ struct Document { impl Document { fn new( - text: String, + text: &str, role: ChatRole, user_id: String, model: ChatbotBrain, @@ -139,7 +194,7 @@ impl Document { .as_millis(); Document { id, - text, + text: text.to_string(), role, user_id, model, @@ -194,112 +249,168 @@ async fn get_openai_chatgpt_answer( Ok(response) } -#[post("/chatbot/get-answer", format = "json", data = "")] -pub async fn chatbot_get_answer( - user: User, - data: Json, -) -> Result { - match wrapped_chatbot_get_answer(user, data).await { - Ok(response) => Ok(ResponseOk( - json!({ - "answer": response, - }) - .to_string(), - )), - Err(error) => { - eprintln!("Error: {:?}", error); - Ok(ResponseOk( - json!({ - "error": error.to_string(), - }) - .to_string(), - )) +// #[post("/chatbot/get-answer", format = "json", data = "")] +// pub async fn chatbot_get_answer( +// user: User, +// data: Json, +// ) -> Result { +// match wrapped_chatbot_get_answer(user, data).await { +// Ok(response) => Ok(ResponseOk( +// json!({ +// "answer": response, +// }) +// .to_string(), +// )), +// Err(error) => { +// eprintln!("Error: {:?}", error); +// Ok(ResponseOk( +// json!({ +// "error": error.to_string(), +// }) +// .to_string(), +// )) +// } +// } +// } + +struct UpdateHistory { + collection: Collection, + user_document: Document, + model: ChatbotBrain, + knowledge_base: KnowledgeBase, +} + +impl UpdateHistory { + fn new( + collection: Collection, + user_document: Document, + model: ChatbotBrain, + knowledge_base: KnowledgeBase, + ) -> Self { + Self { + collection, + user_document, + model, + knowledge_base, } } + + fn update_history(mut self, chatbot_response: &str) -> anyhow::Result<()> { + let chatbot_document = Document::new( + chatbot_response, + ChatRole::Bot, + self.user_document.user_id.to_owned(), + self.model, + self.knowledge_base, + ); + let new_history_messages: Vec = vec![ + serde_json::to_value(self.user_document).unwrap().into(), + serde_json::to_value(chatbot_document).unwrap().into(), + ]; + // We do not want to block our return waiting for this to happen + tokio::spawn(async move { + self.collection + .upsert_documents(new_history_messages, None) + .await + .expect("Failed to upsert user history"); + }); + Ok(()) + } } -pub async fn wrapped_chatbot_get_answer( - user: User, - data: Json, -) -> Result { - let brain = ChatbotBrain::try_from(data.model)?; - let knowledge_base = KnowledgeBase::try_from(data.knowledge_base)?; - - // Create it up here so the timestamps that order the conversation are accurate - let user_document = Document::new( - data.question.clone(), - ChatRole::User, - user.chatbot_session_id.clone(), - brain, - knowledge_base, - ); - - let collection = knowledge_base.collection(); - let collection = Collection::new( - collection, - Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), - ); - - let mut history_collection = Collection::new( - "ChatHistory", - Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), - ); - let messages = history_collection - .get_documents(Some( - json!({ - "limit": 5, - "order_by": {"timestamp": "desc"}, - "filter": { - "metadata": { - "$and" : [ - { - "$or": - [ - {"role": {"$eq": ChatRole::Bot}}, - {"role": {"$eq": ChatRole::User}} - ] - }, - { - "user_id": { - "$eq": user.chatbot_session_id - } - }, - { - "knowledge_base": { - "$eq": knowledge_base - } - }, - { - "model": { - "$eq": brain - } +#[derive(Serialize)] +struct StreamResponse { + error: Option, + result: Option, +} + +impl StreamResponse { + fn from_error(error: E) -> Self { + StreamResponse { + error: Some(format!("{error}")), + result: None, + } + } + + fn from_result(result: &str) -> Self { + StreamResponse { + error: None, + result: Some(result.to_string()), + } + } +} + +#[get("/chatbot/get-answer")] +pub async fn chatbot_get_answer(user: User, ws: ws::WebSocket) -> ws::Stream!['static] { + ws::Stream! { ws => + for await message in ws { + let v = process_message(message, &user).await; + match v { + Ok(v) => + match v { + ProcessMessageResponse::StreamResponse((mut it, update_history)) => { + let mut total_text: Vec = Vec::new(); + while let Some(value) = it.next().await { + match value { + Ok(v) => { + let v: &str = v.as_array().unwrap()[0].as_str().unwrap(); + total_text.push(v.to_string()); + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_result(v)).unwrap()); + }, + Err(e) => yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(e)).unwrap()) } - ] + } + update_history.update_history(&total_text.join("")).unwrap(); + }, + ProcessMessageResponse::FullResponse(resp) => { + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_result(&resp)).unwrap()); } } + Err(e) => { + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(e)).unwrap()); + } + } + }; + } +} - }) - .into(), - )) - .await?; +enum ProcessMessageResponse { + StreamResponse((GeneralJsonAsyncIterator, UpdateHistory)), + FullResponse(String), +} - let mut history = messages - .into_iter() - .map(|m| { - // Can probably remove this clone - let chat_role: ChatRole = serde_json::from_value(m["document"]["role"].to_owned())?; - if chat_role == ChatRole::Bot { - Ok(format!("Assistant: {}", m["document"]["text"])) - } else { - Ok(format!("User: {}", m["document"]["text"])) - } - }) - .collect::>>()?; - history.reverse(); - let history = history.join("\n"); +#[derive(Deserialize)] +struct Message { + model: u8, + knowledge_base: u8, + question: String, +} - let pipeline = Pipeline::new("v1", None, None, None); - let context = collection +async fn process_message( + message: Result, + user: &User, +) -> anyhow::Result { + if let ws::Message::Text(s) = message? { + let data: Message = serde_json::from_str(&s)?; + let brain = ChatbotBrain::try_from(data.model)?; + let knowledge_base = KnowledgeBase::try_from(data.knowledge_base)?; + + // Create it up here so the timestamps that order the conversation are accurate + let user_document = Document::new( + &data.question, + ChatRole::User, + user.chatbot_session_id.clone(), + brain, + knowledge_base, + ); + + let pipeline = Pipeline::new("v1", None, None, None); + let collection = knowledge_base.collection(); + let collection = Collection::new( + collection, + Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), + ); + let context = collection .query() .vector_recall(&data.question, &pipeline, Some(json!({ "instruction": "Represent the Wikipedia question for retrieving supporting documents: " @@ -312,33 +423,216 @@ pub async fn wrapped_chatbot_get_answer( .collect::>() .join("\n"); - let answer = - get_openai_chatgpt_answer(knowledge_base, &history, &context, &data.question).await?; - - let new_history_messages: Vec = vec![ - serde_json::to_value(user_document).unwrap().into(), - serde_json::to_value(Document::new( - answer.clone(), - ChatRole::Bot, - user.chatbot_session_id.clone(), - brain, - knowledge_base, - )) - .unwrap() - .into(), - ]; - - // We do not want to block our return waiting for this to happen - tokio::spawn(async move { - history_collection - .upsert_documents(new_history_messages, None) - .await - .expect("Failed to upsert user history"); - }); + let history_collection = Collection::new( + "ChatHistory", + Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), + ); + let messages = history_collection + .get_documents(Some( + json!({ + "limit": 5, + "order_by": {"timestamp": "desc"}, + "filter": { + "metadata": { + "$and" : [ + { + "$or": + [ + {"role": {"$eq": ChatRole::Bot}}, + {"role": {"$eq": ChatRole::User}} + ] + }, + { + "user_id": { + "$eq": user.chatbot_session_id + } + }, + { + "knowledge_base": { + "$eq": knowledge_base + } + }, + { + "model": { + "$eq": brain + } + } + ] + } + } - Ok(answer) + }) + .into(), + )) + .await?; + + let mut history = messages + .into_iter() + .map(|m| { + let chat_role: ChatRole = serde_json::from_value(m["document"]["role"].to_owned())?; + Ok(serde_json::json!({ + "role": chat_role.to_model_specific_role(&brain), + "content": m["document"]["text"] + }) + .into()) + }) + .collect::>>()?; + let system_message = brain.get_system_message(&knowledge_base, &context)?; + history.push(system_message.into()); + history.reverse(); + + let update_history = + UpdateHistory::new(history_collection, user_document, brain, knowledge_base); + + if brain.is_open_source() { + let op = OpenSourceAI::new(Some( + std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set"), + )); + let stream = op + .chat_completions_create_stream_async( + serde_json::to_value::<&str>(brain.into()).unwrap().into(), + history, + None, + None, + None, + None, + ) + .await?; + Ok(ProcessMessageResponse::StreamResponse(( + stream, + update_history, + ))) + } else { + let response = "test".to_string(); + update_history.update_history(&response)?; + Ok(ProcessMessageResponse::FullResponse(response.to_string())) + } + } else { + Err(anyhow::anyhow!("Error invalid message format")) + } } +// pub async fn wrapped_chatbot_get_answer( +// user: User, +// data: Json, +// ) -> Result { +// let brain = ChatbotBrain::try_from(data.model)?; +// let knowledge_base = KnowledgeBase::try_from(data.knowledge_base)?; + +// // Create it up here so the timestamps that order the conversation are accurate +// let user_document = Document::new( +// data.question.clone(), +// ChatRole::User, +// user.chatbot_session_id.clone(), +// brain, +// knowledge_base, +// ); + +// let collection = knowledge_base.collection(); +// let collection = Collection::new( +// collection, +// Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), +// ); + +// let mut history_collection = Collection::new( +// "ChatHistory", +// Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), +// ); +// let messages = history_collection +// .get_documents(Some( +// json!({ +// "limit": 5, +// "order_by": {"timestamp": "desc"}, +// "filter": { +// "metadata": { +// "$and" : [ +// { +// "$or": +// [ +// {"role": {"$eq": ChatRole::Bot}}, +// {"role": {"$eq": ChatRole::User}} +// ] +// }, +// { +// "user_id": { +// "$eq": user.chatbot_session_id +// } +// }, +// { +// "knowledge_base": { +// "$eq": knowledge_base +// } +// }, +// { +// "model": { +// "$eq": brain +// } +// } +// ] +// } +// } + +// }) +// .into(), +// )) +// .await?; + +// let mut history = messages +// .into_iter() +// .map(|m| { +// // Can probably remove this clone +// let chat_role: ChatRole = serde_json::from_value(m["document"]["role"].to_owned())?; +// if chat_role == ChatRole::Bot { +// Ok(format!("Assistant: {}", m["document"]["text"])) +// } else { +// Ok(format!("User: {}", m["document"]["text"])) +// } +// }) +// .collect::>>()?; +// history.reverse(); +// let history = history.join("\n"); + +// let pipeline = Pipeline::new("v1", None, None, None); +// let context = collection +// .query() +// .vector_recall(&data.question, &pipeline, Some(json!({ +// "instruction": "Represent the Wikipedia question for retrieving supporting documents: " +// }).into())) +// .limit(5) +// .fetch_all() +// .await? +// .into_iter() +// .map(|(_, context, metadata)| format!("#### Document {}: {}", metadata["id"], context)) +// .collect::>() +// .join("\n"); + +// let answer = +// get_openai_chatgpt_answer(knowledge_base, &history, &context, &data.question).await?; + +// let new_history_messages: Vec = vec![ +// serde_json::to_value(user_document).unwrap().into(), +// serde_json::to_value(Document::new( +// answer.clone(), +// ChatRole::Bot, +// user.chatbot_session_id.clone(), +// brain, +// knowledge_base, +// )) +// .unwrap() +// .into(), +// ]; + +// // We do not want to block our return waiting for this to happen +// tokio::spawn(async move { +// history_collection +// .upsert_documents(new_history_messages, None) +// .await +// .expect("Failed to upsert user history"); +// }); + +// Ok(answer) +// } + pub fn routes() -> Vec { routes![chatbot_get_answer] } From 668cafb388dd22cf1f9cc0078909c5af4f5f51b1 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Fri, 8 Dec 2023 13:58:28 -0800 Subject: [PATCH 2/4] Working chatbot streaming --- pgml-dashboard/src/api/chatbot.rs | 516 ++++++++++-------- .../src/components/chatbot/chatbot.scss | 20 +- .../components/chatbot/chatbot_controller.js | 370 +++++++------ pgml-dashboard/src/components/chatbot/mod.rs | 110 ++-- .../src/components/chatbot/template.html | 88 +-- 5 files changed, 601 insertions(+), 503 deletions(-) diff --git a/pgml-dashboard/src/api/chatbot.rs b/pgml-dashboard/src/api/chatbot.rs index b5de54244..702a41715 100644 --- a/pgml-dashboard/src/api/chatbot.rs +++ b/pgml-dashboard/src/api/chatbot.rs @@ -4,7 +4,7 @@ use pgml::{types::GeneralJsonAsyncIterator, Collection, OpenSourceAI, Pipeline}; use rand::{distributions::Alphanumeric, Rng}; use reqwest::Client; use rocket::{ - http::Status, + http::{Cookie, CookieJar, Status}, outcome::IntoOutcome, request::{self, FromRequest}, route::Route, @@ -15,11 +15,6 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use std::time::{SystemTime, UNIX_EPOCH}; -use crate::{ - forms, - responses::{Error, ResponseOk}, -}; - pub struct User { chatbot_session_id: String, } @@ -41,6 +36,7 @@ impl<'r> FromRequest<'r> for User { #[derive(Serialize, Deserialize, PartialEq, Eq)] enum ChatRole { + System, User, Bot, } @@ -50,9 +46,12 @@ impl ChatRole { match self { ChatRole::User => "user", ChatRole::Bot => match brain { - ChatbotBrain::OpenAIGPT4 => "assistant", - _ => "model", + ChatbotBrain::OpenAIGPT4 + | ChatbotBrain::TekniumOpenHermes25Mistral7B + | ChatbotBrain::Openchat35 => "assistant", + ChatbotBrain::GrypheMythoMaxL213b => "model", }, + ChatRole::System => "system", } } } @@ -61,14 +60,13 @@ impl ChatRole { enum ChatbotBrain { OpenAIGPT4, TekniumOpenHermes25Mistral7B, + GrypheMythoMaxL213b, + Openchat35, } impl ChatbotBrain { fn is_open_source(&self) -> bool { - match self { - Self::OpenAIGPT4 => false, - _ => true, - } + !matches!(self, Self::OpenAIGPT4) } fn get_system_message( @@ -98,15 +96,47 @@ impl ChatbotBrain { })), } } + + fn into_model_json(self) -> serde_json::Value { + match self { + Self::TekniumOpenHermes25Mistral7B => serde_json::json!({ + "model": "TheBloke/OpenHermes-2.5-Mistral-7B-GPTQ", + "revision": "main", + "device_map": "auto" + }), + // Self::GrypheMythoMaxL213b => serde_json::json!("Gryphe/MythoMax-L2-13b"), + Self::GrypheMythoMaxL213b => serde_json::json!({ + "model": "TheBloke/MythoMax-L2-13B-GPTQ", + "revision": "main", + "device_map": "auto" + }), + Self::Openchat35 => serde_json::json!({ + "model": "TheBloke/Starling-LM-7B-alpha-GPTQ", + "revision": "main", + "device_map": "auto" + }), + _ => unimplemented!(), + } + } + + fn get_chat_template(&self) -> Option<&'static str> { + match self { + Self::TekniumOpenHermes25Mistral7B => Some("{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"), + Self::GrypheMythoMaxL213b => Some("{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '### Instruction:\n' + message['content'] + '\n'}}\n{% elif message['role'] == 'system' %}\n{{ message['content'] + '\n'}}\n{% elif message['role'] == 'model' %}\n{{ '### Response:>\n' + message['content'] + eos_token + '\n'}}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '### Response:' }}\n{% endif %}\n{% endfor %}"), + _ => None + } + } } -impl TryFrom for ChatbotBrain { +impl TryFrom<&str> for ChatbotBrain { type Error = anyhow::Error; - fn try_from(value: u8) -> anyhow::Result { + fn try_from(value: &str) -> anyhow::Result { match value { - 0 => Ok(ChatbotBrain::TekniumOpenHermes25Mistral7B), - 1 => Ok(ChatbotBrain::OpenAIGPT4), + "teknium/OpenHermes-2.5-Mistral-7B" => Ok(ChatbotBrain::TekniumOpenHermes25Mistral7B), + "Gryphe/MythoMax-L2-13b" => Ok(ChatbotBrain::GrypheMythoMaxL213b), + "openai" => Ok(ChatbotBrain::OpenAIGPT4), + "openchat/openchat_3.5" => Ok(ChatbotBrain::Openchat35), _ => Err(anyhow::anyhow!("Invalid brain id")), } } @@ -115,8 +145,10 @@ impl TryFrom for ChatbotBrain { impl From for &'static str { fn from(value: ChatbotBrain) -> Self { match value { - ChatbotBrain::OpenAIGPT4 => "gpt-4", ChatbotBrain::TekniumOpenHermes25Mistral7B => "teknium/OpenHermes-2.5-Mistral-7B", + ChatbotBrain::GrypheMythoMaxL213b => "Gryphe/MythoMax-L2-13b", + ChatbotBrain::OpenAIGPT4 => "openai", + ChatbotBrain::Openchat35 => "openchat/openchat_3.5", } } } @@ -150,20 +182,31 @@ impl KnowledgeBase { } } -impl TryFrom for KnowledgeBase { +impl TryFrom<&str> for KnowledgeBase { type Error = anyhow::Error; - fn try_from(value: u8) -> anyhow::Result { + fn try_from(value: &str) -> anyhow::Result { match value { - 0 => Ok(KnowledgeBase::PostgresML), - 1 => Ok(KnowledgeBase::PyTorch), - 2 => Ok(KnowledgeBase::Rust), - 3 => Ok(KnowledgeBase::PostgreSQL), + "postgresml" => Ok(KnowledgeBase::PostgresML), + "pytorch" => Ok(KnowledgeBase::PyTorch), + "rust" => Ok(KnowledgeBase::Rust), + "postgresql" => Ok(KnowledgeBase::PostgreSQL), _ => Err(anyhow::anyhow!("Invalid knowledge base id")), } } } +impl From for &'static str { + fn from(value: KnowledgeBase) -> Self { + match value { + KnowledgeBase::PostgresML => "postgresml", + KnowledgeBase::PyTorch => "pytorch", + KnowledgeBase::Rust => "rust", + KnowledgeBase::PostgreSQL => "postgresql", + } + } +} + #[derive(Serialize, Deserialize)] struct Document { id: String, @@ -204,29 +247,11 @@ impl Document { } } -async fn get_openai_chatgpt_answer( - knowledge_base: KnowledgeBase, - history: &str, - context: &str, - question: &str, -) -> Result { +async fn get_openai_chatgpt_answer(messages: M) -> anyhow::Result { let openai_api_key = std::env::var("OPENAI_API_KEY")?; - let base_prompt = std::env::var("CHATBOT_CHATGPT_BASE_PROMPT")?; - let system_prompt = std::env::var("CHATBOT_CHATGPT_SYSTEM_PROMPT")?; - - let system_prompt = system_prompt - .replace("{topic}", knowledge_base.topic()) - .replace("{persona}", "Engineer") - .replace("{language}", "English"); - - let content = base_prompt - .replace("{history}", history) - .replace("{context}", context) - .replace("{question}", question); - let body = json!({ "model": "gpt-3.5-turbo", - "messages": [{"role": "system", "content": system_prompt}, {"role": "user", "content": content}], + "messages": messages, "temperature": 0.7 }); @@ -249,30 +274,6 @@ async fn get_openai_chatgpt_answer( Ok(response) } -// #[post("/chatbot/get-answer", format = "json", data = "")] -// pub async fn chatbot_get_answer( -// user: User, -// data: Json, -// ) -> Result { -// match wrapped_chatbot_get_answer(user, data).await { -// Ok(response) => Ok(ResponseOk( -// json!({ -// "answer": response, -// }) -// .to_string(), -// )), -// Err(error) => { -// eprintln!("Error: {:?}", error); -// Ok(ResponseOk( -// json!({ -// "error": error.to_string(), -// }) -// .to_string(), -// )) -// } -// } -// } - struct UpdateHistory { collection: Collection, user_document: Document, @@ -320,54 +321,169 @@ impl UpdateHistory { #[derive(Serialize)] struct StreamResponse { + id: Option, error: Option, result: Option, + partial_result: Option, } impl StreamResponse { - fn from_error(error: E) -> Self { + fn from_error(id: Option, error: E) -> Self { StreamResponse { + id, error: Some(format!("{error}")), result: None, + partial_result: None, } } - fn from_result(result: &str) -> Self { + fn from_result(id: u64, result: &str) -> Self { StreamResponse { + id: Some(id), error: None, result: Some(result.to_string()), + partial_result: None, + } + } + + fn from_partial_result(id: u64, result: &str) -> Self { + StreamResponse { + id: Some(id), + error: None, + result: None, + partial_result: Some(result.to_string()), } } } +#[get("/chatbot/clear-history")] +pub async fn clear_history(cookies: &CookieJar<'_>) -> Status { + // let cookie = Cookie::build("chatbot_session_id").path("/"); + let cookie = Cookie::new("chatbot_session_id", ""); + cookies.remove(cookie); + Status::Ok +} + +#[derive(Serialize)] +pub struct GetHistoryResponse { + result: Option>, + error: Option, +} + +#[derive(Serialize)] +struct HistoryMessage { + side: String, + content: String, + knowledge_base: String, + model: String, +} + +#[get("/chatbot/get-history")] +pub async fn chatbot_get_history(user: User) -> Json { + match do_chatbot_get_history(&user, 100).await { + Ok(messages) => Json(GetHistoryResponse { + result: Some(messages), + error: None, + }), + Err(e) => Json(GetHistoryResponse { + result: None, + error: Some(format!("{e}")), + }), + } +} + +async fn do_chatbot_get_history(user: &User, limit: usize) -> anyhow::Result> { + let history_collection = Collection::new( + "ChatHistory", + Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), + ); + let mut messages = history_collection + .get_documents(Some( + json!({ + "limit": limit, + "order_by": {"timestamp": "desc"}, + "filter": { + "metadata": { + "$and" : [ + { + "$or": + [ + {"role": {"$eq": ChatRole::Bot}}, + {"role": {"$eq": ChatRole::User}} + ] + }, + { + "user_id": { + "$eq": user.chatbot_session_id + } + } + ] + } + } + + }) + .into(), + )) + .await?; + messages.reverse(); + let messages: anyhow::Result> = messages + .into_iter() + .map(|m| { + let side: String = m["document"]["role"] + .as_str() + .context("Error parsing chat role")? + .to_string() + .to_lowercase(); + let content: String = m["document"]["text"] + .as_str() + .context("Error parsing text")? + .to_string(); + let model: ChatbotBrain = serde_json::from_value(m["document"]["model"].to_owned()) + .context("Error parsing model")?; + let model: &str = model.into(); + let knowledge_base: KnowledgeBase = + serde_json::from_value(m["document"]["knowledge_base"].to_owned()) + .context("Error parsing knowledge_base")?; + let knowledge_base: &str = knowledge_base.into(); + Ok(HistoryMessage { + side, + content, + model: model.to_string(), + knowledge_base: knowledge_base.to_string(), + }) + }) + .collect(); + messages +} + #[get("/chatbot/get-answer")] pub async fn chatbot_get_answer(user: User, ws: ws::WebSocket) -> ws::Stream!['static] { ws::Stream! { ws => for await message in ws { let v = process_message(message, &user).await; match v { - Ok(v) => + Ok((v, id)) => match v { ProcessMessageResponse::StreamResponse((mut it, update_history)) => { let mut total_text: Vec = Vec::new(); while let Some(value) = it.next().await { match value { Ok(v) => { - let v: &str = v.as_array().unwrap()[0].as_str().unwrap(); + let v: &str = v["choices"][0]["delta"]["content"].as_str().unwrap(); total_text.push(v.to_string()); - yield ws::Message::from(serde_json::to_string(&StreamResponse::from_result(v)).unwrap()); + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_partial_result(id, v)).unwrap()); }, - Err(e) => yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(e)).unwrap()) + Err(e) => yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(Some(id), e)).unwrap()) } } update_history.update_history(&total_text.join("")).unwrap(); }, ProcessMessageResponse::FullResponse(resp) => { - yield ws::Message::from(serde_json::to_string(&StreamResponse::from_result(&resp)).unwrap()); + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_result(id, &resp)).unwrap()); } } Err(e) => { - yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(e)).unwrap()); + yield ws::Message::from(serde_json::to_string(&StreamResponse::from_error(None, e)).unwrap()); } } }; @@ -381,21 +497,21 @@ enum ProcessMessageResponse { #[derive(Deserialize)] struct Message { - model: u8, - knowledge_base: u8, + id: u64, + model: String, + knowledge_base: String, question: String, } async fn process_message( message: Result, user: &User, -) -> anyhow::Result { +) -> anyhow::Result<(ProcessMessageResponse, u64)> { if let ws::Message::Text(s) = message? { let data: Message = serde_json::from_str(&s)?; - let brain = ChatbotBrain::try_from(data.model)?; - let knowledge_base = KnowledgeBase::try_from(data.knowledge_base)?; + let brain = ChatbotBrain::try_from(data.model.as_str())?; + let knowledge_base = KnowledgeBase::try_from(data.knowledge_base.as_str())?; - // Create it up here so the timestamps that order the conversation are accurate let user_document = Document::new( &data.question, ChatRole::User, @@ -409,6 +525,7 @@ async fn process_message( let collection = Collection::new( collection, Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), + // Some(std::env::var("CHATBOT_DATABASE_URL_TWO").expect("CHATBOT_DATABASE_URL not set")), ); let context = collection .query() @@ -419,15 +536,16 @@ async fn process_message( .fetch_all() .await? .into_iter() - .map(|(_, context, metadata)| format!("#### Document {}: {}", metadata["id"], context)) + .map(|(_, context, metadata)| format!("\n\n#### Document {}: \n{}\n\n", metadata["id"], context)) .collect::>() .join("\n"); + // let context = "".to_string(); - let history_collection = Collection::new( + let mut history_collection = Collection::new( "ChatHistory", Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), ); - let messages = history_collection + let mut messages = history_collection .get_documents(Some( json!({ "limit": 5, @@ -452,11 +570,7 @@ async fn process_message( "$eq": knowledge_base } }, - { - "model": { - "$eq": brain - } - } + // This is where we would match on the model if we wanted to ] } } @@ -465,21 +579,74 @@ async fn process_message( .into(), )) .await?; + messages.reverse(); + + let (mut history, _) = + messages + .into_iter() + .fold((Vec::new(), None), |(mut new_history, role), value| { + let current_role: ChatRole = + serde_json::from_value(value["document"]["role"].to_owned()) + .expect("Error parsing chat role"); + if let Some(role) = role { + if role == current_role { + match role { + ChatRole::User => new_history.push( + serde_json::json!({ + "role": ChatRole::Bot.to_model_specific_role(&brain), + "content": "*no response due to error*" + }) + .into(), + ), + ChatRole::Bot => new_history.push( + serde_json::json!({ + "role": ChatRole::User.to_model_specific_role(&brain), + "content": "*no response due to error*" + }) + .into(), + ), + _ => panic!("Too many system messages"), + } + } + let new_message: pgml::types::Json = serde_json::json!({ + "role": current_role.to_model_specific_role(&brain), + "content": value["document"]["text"] + }) + .into(); + new_history.push(new_message); + } else if matches!(current_role, ChatRole::User) { + let new_message: pgml::types::Json = serde_json::json!({ + "role": current_role.to_model_specific_role(&brain), + "content": value["document"]["text"] + }) + .into(); + new_history.push(new_message); + } + (new_history, Some(current_role)) + }); - let mut history = messages - .into_iter() - .map(|m| { - let chat_role: ChatRole = serde_json::from_value(m["document"]["role"].to_owned())?; - Ok(serde_json::json!({ - "role": chat_role.to_model_specific_role(&brain), - "content": m["document"]["text"] - }) - .into()) - }) - .collect::>>()?; let system_message = brain.get_system_message(&knowledge_base, &context)?; - history.push(system_message.into()); - history.reverse(); + history.insert(0, system_message.into()); + + // Need to make sure we aren't about to add two user messages back to back + if let Some(message) = history.last() { + if message["role"].as_str().unwrap() == ChatRole::User.to_model_specific_role(&brain) { + history.push( + serde_json::json!({ + "role": ChatRole::Bot.to_model_specific_role(&brain), + "content": "*no response due to errors*" + }) + .into(), + ); + } + } + history.push( + serde_json::json!({ + "role": ChatRole::User.to_model_specific_role(&brain), + "content": data.question + }) + .into(), + ); let update_history = UpdateHistory::new(history_collection, user_document, brain, knowledge_base); @@ -488,151 +655,34 @@ async fn process_message( let op = OpenSourceAI::new(Some( std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set"), )); + let chat_template = brain.get_chat_template(); let stream = op .chat_completions_create_stream_async( - serde_json::to_value::<&str>(brain.into()).unwrap().into(), + brain.into_model_json().into(), history, + Some(10000), None, None, - None, - None, + chat_template.map(|t| t.to_string()), ) .await?; - Ok(ProcessMessageResponse::StreamResponse(( - stream, - update_history, - ))) + Ok(( + ProcessMessageResponse::StreamResponse((stream, update_history)), + data.id, + )) } else { - let response = "test".to_string(); + let response = match brain { + ChatbotBrain::OpenAIGPT4 => get_openai_chatgpt_answer(history).await?, + _ => unimplemented!(), + }; update_history.update_history(&response)?; - Ok(ProcessMessageResponse::FullResponse(response.to_string())) + Ok((ProcessMessageResponse::FullResponse(response), data.id)) } } else { Err(anyhow::anyhow!("Error invalid message format")) } } -// pub async fn wrapped_chatbot_get_answer( -// user: User, -// data: Json, -// ) -> Result { -// let brain = ChatbotBrain::try_from(data.model)?; -// let knowledge_base = KnowledgeBase::try_from(data.knowledge_base)?; - -// // Create it up here so the timestamps that order the conversation are accurate -// let user_document = Document::new( -// data.question.clone(), -// ChatRole::User, -// user.chatbot_session_id.clone(), -// brain, -// knowledge_base, -// ); - -// let collection = knowledge_base.collection(); -// let collection = Collection::new( -// collection, -// Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), -// ); - -// let mut history_collection = Collection::new( -// "ChatHistory", -// Some(std::env::var("CHATBOT_DATABASE_URL").expect("CHATBOT_DATABASE_URL not set")), -// ); -// let messages = history_collection -// .get_documents(Some( -// json!({ -// "limit": 5, -// "order_by": {"timestamp": "desc"}, -// "filter": { -// "metadata": { -// "$and" : [ -// { -// "$or": -// [ -// {"role": {"$eq": ChatRole::Bot}}, -// {"role": {"$eq": ChatRole::User}} -// ] -// }, -// { -// "user_id": { -// "$eq": user.chatbot_session_id -// } -// }, -// { -// "knowledge_base": { -// "$eq": knowledge_base -// } -// }, -// { -// "model": { -// "$eq": brain -// } -// } -// ] -// } -// } - -// }) -// .into(), -// )) -// .await?; - -// let mut history = messages -// .into_iter() -// .map(|m| { -// // Can probably remove this clone -// let chat_role: ChatRole = serde_json::from_value(m["document"]["role"].to_owned())?; -// if chat_role == ChatRole::Bot { -// Ok(format!("Assistant: {}", m["document"]["text"])) -// } else { -// Ok(format!("User: {}", m["document"]["text"])) -// } -// }) -// .collect::>>()?; -// history.reverse(); -// let history = history.join("\n"); - -// let pipeline = Pipeline::new("v1", None, None, None); -// let context = collection -// .query() -// .vector_recall(&data.question, &pipeline, Some(json!({ -// "instruction": "Represent the Wikipedia question for retrieving supporting documents: " -// }).into())) -// .limit(5) -// .fetch_all() -// .await? -// .into_iter() -// .map(|(_, context, metadata)| format!("#### Document {}: {}", metadata["id"], context)) -// .collect::>() -// .join("\n"); - -// let answer = -// get_openai_chatgpt_answer(knowledge_base, &history, &context, &data.question).await?; - -// let new_history_messages: Vec = vec![ -// serde_json::to_value(user_document).unwrap().into(), -// serde_json::to_value(Document::new( -// answer.clone(), -// ChatRole::Bot, -// user.chatbot_session_id.clone(), -// brain, -// knowledge_base, -// )) -// .unwrap() -// .into(), -// ]; - -// // We do not want to block our return waiting for this to happen -// tokio::spawn(async move { -// history_collection -// .upsert_documents(new_history_messages, None) -// .await -// .expect("Failed to upsert user history"); -// }); - -// Ok(answer) -// } - pub fn routes() -> Vec { - routes![chatbot_get_answer] + routes![chatbot_get_answer, chatbot_get_history, clear_history] } diff --git a/pgml-dashboard/src/components/chatbot/chatbot.scss b/pgml-dashboard/src/components/chatbot/chatbot.scss index e4bc2f723..a8b934dd5 100644 --- a/pgml-dashboard/src/components/chatbot/chatbot.scss +++ b/pgml-dashboard/src/components/chatbot/chatbot.scss @@ -19,6 +19,7 @@ div[data-controller="chatbot"] { #chatbot-change-the-brain-title, #knowledge-base-title { + font-size: 1.25rem; padding: 0.5rem; padding-top: 0.85rem; margin-bottom: 1rem; @@ -30,6 +31,7 @@ div[data-controller="chatbot"] { margin-top: calc($spacer * 4); } + div[data-chatbot-target="clear"], .chatbot-brain-option-label, .chatbot-knowledge-base-option-label { cursor: pointer; @@ -37,7 +39,7 @@ div[data-controller="chatbot"] { transition: all 0.1s; } - .chatbot-brain-option-label:hover { + .chatbot-brain-option-label:hover, div[data-chatbot-target="clear"]:hover { background-color: #{$gray-800}; } @@ -59,8 +61,8 @@ div[data-controller="chatbot"] { } .chatbot-brain-option-logo { - height: 30px; width: 30px; + height: 30px; background-position: center; background-repeat: no-repeat; background-size: contain; @@ -70,6 +72,14 @@ div[data-controller="chatbot"] { padding-left: 2rem; } + #brain-knowledge-base-divider-line { + height: 0.15rem; + width: 100%; + background-color: #{$gray-500}; + margin-top: 1.5rem; + margin-bottom: 1.5rem; + } + .chatbot-example-questions { display: none; max-height: 66px; @@ -299,4 +309,10 @@ div[data-controller="chatbot"].chatbot-full { #knowledge-base-wrapper { display: block; } + #brain-knowledge-base-divider-line { + display: none; + } + #clear-history-text { + display: block !important; + } } diff --git a/pgml-dashboard/src/components/chatbot/chatbot_controller.js b/pgml-dashboard/src/components/chatbot/chatbot_controller.js index ef6703b33..03106c40b 100644 --- a/pgml-dashboard/src/components/chatbot/chatbot_controller.js +++ b/pgml-dashboard/src/components/chatbot/chatbot_controller.js @@ -4,6 +4,10 @@ import autosize from "autosize"; import DOMPurify from "dompurify"; import * as marked from "marked"; +const getRandomInt = () => { + return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); +} + const LOADING_MESSAGE = `
Loading
@@ -15,36 +19,40 @@ const getBackgroundImageURLForSide = (side, knowledgeBase) => { if (side == "user") { return "/dashboard/static/images/chatbot_user.webp"; } else { - if (knowledgeBase == 0) { + if (knowledgeBase == "postgresml") { return "/dashboard/static/images/owl_gradient.svg"; - } else if (knowledgeBase == 1) { + } else if (knowledgeBase == "pytorch") { return "/dashboard/static/images/logos/pytorch.svg"; - } else if (knowledgeBase == 2) { + } else if (knowledgeBase == "rust") { return "/dashboard/static/images/logos/rust.svg"; - } else if (knowledgeBase == 3) { + } else if (knowledgeBase == "postgresql") { return "/dashboard/static/images/logos/postgresql.svg"; } } }; -const createHistoryMessage = (side, question, id, knowledgeBase) => { - id = id || ""; +const createHistoryMessage = (message, knowledgeBase) => { + if (message.side == "system") { + return ` +
${message.text}
+ `; + } return ` -
-
- ${question} +
+ ${message.get_html()}
@@ -52,17 +60,29 @@ const createHistoryMessage = (side, question, id, knowledgeBase) => { }; const knowledgeBaseIdToName = (knowledgeBase) => { - if (knowledgeBase == 0) { + if (knowledgeBase == "postgresml") { return "PostgresML"; - } else if (knowledgeBase == 1) { + } else if (knowledgeBase == "pytorch") { return "PyTorch"; - } else if (knowledgeBase == 2) { + } else if (knowledgeBase == "rust") { return "Rust"; - } else if (knowledgeBase == 3) { + } else if (knowledgeBase == "postgresql") { return "PostgreSQL"; } }; +const brainIdToName = (brain) => { + if (brain == "teknium/OpenHermes-2.5-Mistral-7B") { + return "OpenHermes" + } else if (brain == "Gryphe/MythoMax-L2-13b") { + return "MythoMax" + } else if (brain == "openchat/openchat_3.5") { + return "OpenChat" + } else if (brain == "openai") { + return "ChatGPT" + } +} + const createKnowledgeBaseNotice = (knowledgeBase) => { return `
Chatting with Knowledge Base ${knowledgeBaseIdToName( @@ -71,21 +91,71 @@ const createKnowledgeBaseNotice = (knowledgeBase) => { `; }; -const getAnswer = async (question, model, knowledgeBase) => { - const response = await fetch("/chatbot/get-answer", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ question, model, knowledgeBase }), - }); - return response.json(); -}; +class Message { + constructor(id, side, text, is_partial=false) { + this.id = id + this.text = text + this.side = side + this.is_partial = is_partial + } + + get_html() { + return DOMPurify.sanitize(marked.parse(this.text)); + } +} + +class RawMessage extends Message { + constructor(id, side, text, is_partial=false) { + super(id, side, text, is_partial); + } + + get_html() { + return this.text; + } +} + +class MessageHistory { + constructor() { + this.messageHistory = {}; + } + + add_message(message, knowledgeBase) { + console.log("ADDDING", message, knowledgeBase); + if (!(knowledgeBase in this.messageHistory)) { + this.messageHistory[knowledgeBase] = []; + } + if (message.is_partial) { + let current_message = this.messageHistory[knowledgeBase].find(item => item.id == message.id); + if (!current_message) { + this.messageHistory[knowledgeBase].push(message); + } else { + current_message.text += message.text; + } + } else { + if (this.messageHistory[knowledgeBase].length == 0 || message.side != "system") { + this.messageHistory[knowledgeBase].push(message); + } else if (this.messageHistory[knowledgeBase][this.messageHistory[knowledgeBase].length -1].side == "system") { + this.messageHistory[knowledgeBase][this.messageHistory[knowledgeBase].length -1] = message + } else { + this.messageHistory[knowledgeBase].push(message); + } + } + } + + get_messages(knowledgeBase) { + if (!(knowledgeBase in this.messageHistory)) { + return []; + } else { + return this.messageHistory[knowledgeBase]; + } + } +} export default class extends Controller { initialize() { - this.alertCount = 0; - this.gettingAnswer = false; + this.messageHistory = new MessageHistory(); + this.messageIdToKnowledgeBaseId = {}; + this.expanded = false; this.chatbot = document.getElementById("chatbot"); this.expandContractImage = document.getElementById( @@ -100,55 +170,111 @@ export default class extends Controller { this.exampleQuestions = document.getElementsByClassName( "chatbot-example-questions", ); - this.handleBrainChange(); // This will set our initial brain this.handleKnowledgeBaseChange(); // This will set our initial knowledge base + this.handleBrainChange(); // This will set our initial brain this.handleResize(); + + const url = ((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.hostname + (((window.location.port != 80) && (window.location.port != 443)) ? ":" + window.location.port : "") + window.location.pathname + "/get-answer"; + this.socket = new WebSocket(url); + this.socket.onmessage = (message) => { + let result = JSON.parse(message.data); + console.log(result); + + if (result.error) { + this.showChatbotAlert("Error", "Error getting chatbot answer"); + console.log(result.error); + this.redrawChat(); // This clears any loading messages + } else { + let message; + if (result.partial_result) { + message = new Message(result.id, "bot", result.partial_result, true); + } else { + message = new Message(result.id, "bot", result.result, false); + } + this.messageHistory.add_message(message, this.messageIdToKnowledgeBaseId[message.id]); + this.redrawChat(); + } + this.chatHistory.scrollTop = this.chatHistory.scrollHeight; + }; + + this.socket.onclose = () => { + window.setTimeout(() => this.openConnection(), 500); + }; + this.getHistory(); + } + + async clearHistory() { + // This endpoint clears the chatbot_sesion_id cookie + await fetch("/chatbot/clear-history"); + window.location.reload(); + } + + async getHistory() { + const result = await fetch("/chatbot/get-history"); + const history = await result.json(); + if (history.error) { + console.log("Error getting chat history", history.error) + } else { + for (const message of history.result) { + const newMessage = new Message(getRandomInt(), message.side, message.content, false); + console.log(newMessage); + this.messageHistory.add_message(newMessage, message.knowledge_base); + } + } + this.redrawChat(); + } + + redrawChat() { + this.chatHistory.innerHTML = ""; + const messages = this.messageHistory.get_messages(this.knowledgeBase); + for (const message of messages) { + console.log("Drawing", message); + this.chatHistory.insertAdjacentHTML( + "beforeend", + createHistoryMessage( + message, + this.knowledgeBase, + ), + ); + } + + // Hide or show example questions + this.hideExampleQuestions(); + if (messages.length == 0 || (messages.length == 1 && messages[0].side == "system")) { + document + .getElementById(`chatbot-example-questions-${this.knowledgeBase}`) + .style.setProperty("display", "flex", "important"); + } + + this.chatHistory.scrollTop = this.chatHistory.scrollHeight; } newUserQuestion(question) { - this.chatHistory.insertAdjacentHTML( - "beforeend", - createHistoryMessage("user", question), - ); + const message = new Message(getRandomInt(), "user", question); + this.messageHistory.add_message(message, this.knowledgeBase); + this.messageIdToKnowledgeBaseId[message.id] = this.knowledgeBase; + this.hideExampleQuestions(); + this.redrawChat(); + + let loadingMessage = new Message("loading", "bot", LOADING_MESSAGE); this.chatHistory.insertAdjacentHTML( "beforeend", createHistoryMessage( - "bot", - LOADING_MESSAGE, - "chatbot-loading-message", + loadingMessage, this.knowledgeBase, ), ); - this.hideExampleQuestions(); this.chatHistory.scrollTop = this.chatHistory.scrollHeight; - - this.gettingAnswer = true; - getAnswer(question, this.brain, this.knowledgeBase) - .then((answer) => { - if (answer.answer) { - this.chatHistory.insertAdjacentHTML( - "beforeend", - createHistoryMessage( - "bot", - DOMPurify.sanitize(marked.parse(answer.answer)), - "", - this.knowledgeBase, - ), - ); - } else { - this.showChatbotAlert("Error", answer.error); - console.log(answer.error); - } - }) - .catch((error) => { - this.showChatbotAlert("Error", "Error getting chatbot answer"); - console.log(error); - }) - .finally(() => { - document.getElementById("chatbot-loading-message").remove(); - this.chatHistory.scrollTop = this.chatHistory.scrollHeight; - this.gettingAnswer = false; - }); + + let id = getRandomInt(); + this.messageIdToKnowledgeBaseId[id] = this.knowledgeBase; + let socketData = { + id, + question, + model: this.brain, + knowledge_base: this.knowledgeBase + }; + this.socket.send(JSON.stringify(socketData)); } handleResize() { @@ -169,12 +295,10 @@ export default class extends Controller { handleEnter(e) { // This prevents adding a return e.preventDefault(); - + // Don't continue if the question is empty const question = this.questionInput.value.trim(); - if (question.length == 0) { + if (question.length == 0) return; - } - // Handle resetting the input // There is probably a better way to do this, but this was the best/easiest I found this.questionInput.value = ""; @@ -185,105 +309,31 @@ export default class extends Controller { } handleBrainChange() { - // Comment this out when we go back to using brains - this.brain = 0; + let selected = document.querySelector('input[name="chatbot-brain-options"]:checked').value; + if (selected == this.brain) + return; + this.brain = selected; this.questionInput.focus(); - - // Uncomment this out when we go back to using brains - // We could just disable the input, but we would then need to listen for click events so this seems easier - // if (this.gettingAnswer) { - // document.querySelector( - // `input[name="chatbot-brain-options"][value="${this.brain}"]`, - // ).checked = true; - // this.showChatbotAlert( - // "Error", - // "Cannot change brain while chatbot is loading answer", - // ); - // return; - // } - // let selected = parseInt( - // document.querySelector('input[name="chatbot-brain-options"]:checked') - // .value, - // ); - // if (selected == this.brain) { - // return; - // } - // brainToContentMap[this.brain] = this.chatHistory.innerHTML; - // this.chatHistory.innerHTML = brainToContentMap[selected] || ""; - // if (this.chatHistory.innerHTML) { - // this.exampleQuestions.style.setProperty("display", "none", "important"); - // } else { - // this.exampleQuestions.style.setProperty("display", "flex", "important"); - // } - // this.brain = selected; - // this.chatHistory.scrollTop = this.chatHistory.scrollHeight; - // this.questionInput.focus(); + this.addBrainAndKnowledgeBaseChangedSystemMessage(); } handleKnowledgeBaseChange() { - // Uncomment this when we go back to using brains - // let selected = parseInt( - // document.querySelector('input[name="chatbot-knowledge-base-options"]:checked') - // .value, - // ); - // this.knowledgeBase = selected; - - // Comment this out when we go back to using brains - // We could just disable the input, but we would then need to listen for click events so this seems easier - if (this.gettingAnswer) { - document.querySelector( - `input[name="chatbot-knowledge-base-options"][value="${this.knowledgeBase}"]`, - ).checked = true; - this.showChatbotAlert( - "Error", - "Cannot change knowledge base while chatbot is loading answer", - ); - return; - } - let selected = parseInt( - document.querySelector( - 'input[name="chatbot-knowledge-base-options"]:checked', - ).value, - ); - if (selected == this.knowledgeBase) { + let selected = document.querySelector('input[name="chatbot-knowledge-base-options"]:checked').value; + if (selected == this.knowledgeBase) return; - } - - // document.getElementById - this.knowledgeBaseToContentMap[this.knowledgeBase] = - this.chatHistory.innerHTML; - this.chatHistory.innerHTML = this.knowledgeBaseToContentMap[selected] || ""; this.knowledgeBase = selected; - - // This should be extended to insert the new knowledge base notice in the correct place - if (this.chatHistory.childElementCount == 0) { - this.chatHistory.insertAdjacentHTML( - "beforeend", - createKnowledgeBaseNotice(this.knowledgeBase), - ); - this.hideExampleQuestions(); - document - .getElementById( - `chatbot-example-questions-${knowledgeBaseIdToName( - this.knowledgeBase, - )}`, - ) - .style.setProperty("display", "flex", "important"); - } else if (this.chatHistory.childElementCount == 1) { - this.hideExampleQuestions(); - document - .getElementById( - `chatbot-example-questions-${knowledgeBaseIdToName( - this.knowledgeBase, - )}`, - ) - .style.setProperty("display", "flex", "important"); - } else { - this.hideExampleQuestions(); - } - - this.chatHistory.scrollTop = this.chatHistory.scrollHeight; + this.redrawChat(); this.questionInput.focus(); + this.addBrainAndKnowledgeBaseChangedSystemMessage(); + } + + addBrainAndKnowledgeBaseChangedSystemMessage() { + let knowledge_base = knowledgeBaseIdToName(this.knowledgeBase); + let brain = brainIdToName(this.brain); + let content = `Chatting with ${brain} about ${knowledge_base}`; + const newMessage = new Message(getRandomInt(), "system", content); + this.messageHistory.add_message(newMessage, this.knowledgeBase); + this.redrawChat(); } handleExampleQuestionClick(e) { diff --git a/pgml-dashboard/src/components/chatbot/mod.rs b/pgml-dashboard/src/components/chatbot/mod.rs index 8bcf23fc4..4d7d74c48 100644 --- a/pgml-dashboard/src/components/chatbot/mod.rs +++ b/pgml-dashboard/src/components/chatbot/mod.rs @@ -4,7 +4,7 @@ use sailfish::TemplateOnce; type ExampleQuestions = [(&'static str, [(&'static str, &'static str); 4]); 4]; const EXAMPLE_QUESTIONS: ExampleQuestions = [ ( - "PostgresML", + "postgresml", [ ("How do I", "use pgml.transform()?"), ("Show me", "a query to train a model"), @@ -13,7 +13,7 @@ const EXAMPLE_QUESTIONS: ExampleQuestions = [ ], ), ( - "PyTorch", + "pytorch", [ ("What are", "tensors?"), ("How do I", "train a model?"), @@ -22,7 +22,7 @@ const EXAMPLE_QUESTIONS: ExampleQuestions = [ ], ), ( - "Rust", + "rust", [ ("What is", "a lifetime?"), ("How do I", "use a for loop?"), @@ -31,7 +31,7 @@ const EXAMPLE_QUESTIONS: ExampleQuestions = [ ], ), ( - "PostgreSQL", + "postgresql", [ ("How do I", "join two tables?"), ("What is", "a GIN index?"), @@ -41,79 +41,92 @@ const EXAMPLE_QUESTIONS: ExampleQuestions = [ ), ]; -const KNOWLEDGE_BASES: [&str; 0] = [ - // "Knowledge Base 1", - // "Knowledge Base 2", - // "Knowledge Base 3", - // "Knowledge Base 4", -]; - const KNOWLEDGE_BASES_WITH_LOGO: [KnowledgeBaseWithLogo; 4] = [ - KnowledgeBaseWithLogo::new("PostgresML", "/dashboard/static/images/owl_gradient.svg"), - KnowledgeBaseWithLogo::new("PyTorch", "/dashboard/static/images/logos/pytorch.svg"), - KnowledgeBaseWithLogo::new("Rust", "/dashboard/static/images/logos/rust.svg"), KnowledgeBaseWithLogo::new( + "postgresml", + "PostgresML", + "/dashboard/static/images/owl_gradient.svg", + ), + KnowledgeBaseWithLogo::new( + "pytorch", + "PyTorch", + "/dashboard/static/images/logos/pytorch.svg", + ), + KnowledgeBaseWithLogo::new("rust", "Rust", "/dashboard/static/images/logos/rust.svg"), + KnowledgeBaseWithLogo::new( + "postgresql", "PostgreSQL", "/dashboard/static/images/logos/postgresql.svg", ), ]; struct KnowledgeBaseWithLogo { + id: &'static str, name: &'static str, logo: &'static str, } impl KnowledgeBaseWithLogo { - const fn new(name: &'static str, logo: &'static str) -> Self { - Self { name, logo } + const fn new(id: &'static str, name: &'static str, logo: &'static str) -> Self { + Self { id, name, logo } } } -const CHATBOT_BRAINS: [ChatbotBrain; 0] = [ - // ChatbotBrain::new( - // "PostgresML", - // "Falcon 180b", - // "/dashboard/static/images/owl_gradient.svg", - // ), - // ChatbotBrain::new( - // "OpenAI", - // "ChatGPT", - // "/dashboard/static/images/logos/openai.webp", - // ), - // ChatbotBrain::new( - // "Anthropic", - // "Claude", - // "/dashboard/static/images/logos/anthropic.webp", - // ), - // ChatbotBrain::new( - // "Meta", - // "Llama2 70b", - // "/dashboard/static/images/logos/meta.webp", - // ), +const CHATBOT_BRAINS: [ChatbotBrain; 4] = [ + ChatbotBrain::new( + "teknium/OpenHermes-2.5-Mistral-7B", + "OpenHermes", + "teknium/OpenHermes-2.5-Mistral-7B", + "/dashboard/static/images/owl_gradient.svg", + ), + ChatbotBrain::new( + "Gryphe/MythoMax-L2-13b", + "MythoMax", + "Gryphe/MythoMax-L2-13b", + "/dashboard/static/images/owl_gradient.svg", + ), + ChatbotBrain::new( + "openai", + "OpenAI", + "ChatGPT", + "/dashboard/static/images/logos/openai.webp", + ), + ChatbotBrain::new( + "openchat/openchat_3.5", + "OpenChat", + "openchat/openchat_3.5", + "/dashboard/static/images/logos/meta.webp", + ), ]; struct ChatbotBrain { + id: &'static str, provider: &'static str, model: &'static str, logo: &'static str, } -// impl ChatbotBrain { -// const fn new(provider: &'static str, model: &'static str, logo: &'static str) -> Self { -// Self { -// provider, -// model, -// logo, -// } -// } -// } +impl ChatbotBrain { + const fn new( + id: &'static str, + provider: &'static str, + model: &'static str, + logo: &'static str, + ) -> Self { + Self { + id, + provider, + model, + logo, + } + } +} #[derive(TemplateOnce)] #[template(path = "chatbot/template.html")] pub struct Chatbot { - brains: &'static [ChatbotBrain; 0], + brains: &'static [ChatbotBrain; 4], example_questions: &'static ExampleQuestions, - knowledge_bases: &'static [&'static str; 0], knowledge_bases_with_logo: &'static [KnowledgeBaseWithLogo; 4], } @@ -122,7 +135,6 @@ impl Default for Chatbot { Chatbot { brains: &CHATBOT_BRAINS, example_questions: &EXAMPLE_QUESTIONS, - knowledge_bases: &KNOWLEDGE_BASES, knowledge_bases_with_logo: &KNOWLEDGE_BASES_WITH_LOGO, } } diff --git a/pgml-dashboard/src/components/chatbot/template.html b/pgml-dashboard/src/components/chatbot/template.html index 1f47cf865..9da069cce 100644 --- a/pgml-dashboard/src/components/chatbot/template.html +++ b/pgml-dashboard/src/components/chatbot/template.html @@ -1,102 +1,72 @@
-
+
- -
Knowledge Base:
+
Change the Brain:
- <% for (index, knowledge_base) in knowledge_bases_with_logo.iter().enumerate() { %> + <% for (index, brain) in brains.iter().enumerate() { %>
checked <% } %> />
<% } %> - - - -
From aa82b6dd7e18c77b3baea4327dfe6a6ada829626 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 14 Dec 2023 15:54:02 -0800 Subject: [PATCH 3/4] Added images and finalized models for chatbot --- pgml-dashboard/src/api/chatbot.rs | 18 +++--- .../components/chatbot/chatbot_controller.js | 53 ++++++++---------- pgml-dashboard/src/components/chatbot/mod.rs | 12 ++-- .../static/images/logos/mythomax.webp | Bin 0 -> 33508 bytes .../static/images/logos/openhermes.webp | Bin 0 -> 97164 bytes .../static/images/logos/starling.webp | Bin 0 -> 42416 bytes 6 files changed, 38 insertions(+), 45 deletions(-) create mode 100644 pgml-dashboard/static/images/logos/mythomax.webp create mode 100644 pgml-dashboard/static/images/logos/openhermes.webp create mode 100644 pgml-dashboard/static/images/logos/starling.webp diff --git a/pgml-dashboard/src/api/chatbot.rs b/pgml-dashboard/src/api/chatbot.rs index 702a41715..c993ff6cb 100644 --- a/pgml-dashboard/src/api/chatbot.rs +++ b/pgml-dashboard/src/api/chatbot.rs @@ -48,7 +48,7 @@ impl ChatRole { ChatRole::Bot => match brain { ChatbotBrain::OpenAIGPT4 | ChatbotBrain::TekniumOpenHermes25Mistral7B - | ChatbotBrain::Openchat35 => "assistant", + | ChatbotBrain::Starling7b => "assistant", ChatbotBrain::GrypheMythoMaxL213b => "model", }, ChatRole::System => "system", @@ -61,7 +61,7 @@ enum ChatbotBrain { OpenAIGPT4, TekniumOpenHermes25Mistral7B, GrypheMythoMaxL213b, - Openchat35, + Starling7b, } impl ChatbotBrain { @@ -104,13 +104,12 @@ impl ChatbotBrain { "revision": "main", "device_map": "auto" }), - // Self::GrypheMythoMaxL213b => serde_json::json!("Gryphe/MythoMax-L2-13b"), Self::GrypheMythoMaxL213b => serde_json::json!({ "model": "TheBloke/MythoMax-L2-13B-GPTQ", "revision": "main", "device_map": "auto" }), - Self::Openchat35 => serde_json::json!({ + Self::Starling7b => serde_json::json!({ "model": "TheBloke/Starling-LM-7B-alpha-GPTQ", "revision": "main", "device_map": "auto" @@ -136,7 +135,7 @@ impl TryFrom<&str> for ChatbotBrain { "teknium/OpenHermes-2.5-Mistral-7B" => Ok(ChatbotBrain::TekniumOpenHermes25Mistral7B), "Gryphe/MythoMax-L2-13b" => Ok(ChatbotBrain::GrypheMythoMaxL213b), "openai" => Ok(ChatbotBrain::OpenAIGPT4), - "openchat/openchat_3.5" => Ok(ChatbotBrain::Openchat35), + "berkeley-nest/Starling-LM-7B-alpha" => Ok(ChatbotBrain::Starling7b), _ => Err(anyhow::anyhow!("Invalid brain id")), } } @@ -148,7 +147,7 @@ impl From for &'static str { ChatbotBrain::TekniumOpenHermes25Mistral7B => "teknium/OpenHermes-2.5-Mistral-7B", ChatbotBrain::GrypheMythoMaxL213b => "Gryphe/MythoMax-L2-13b", ChatbotBrain::OpenAIGPT4 => "openai", - ChatbotBrain::Openchat35 => "openchat/openchat_3.5", + ChatbotBrain::Starling7b => "berkeley-nest/Starling-LM-7B-alpha", } } } @@ -375,7 +374,7 @@ struct HistoryMessage { side: String, content: String, knowledge_base: String, - model: String, + brain: String, } #[get("/chatbot/get-history")] @@ -448,7 +447,7 @@ async fn do_chatbot_get_history(user: &User, limit: usize) -> anyhow::Result `; -const getBackgroundImageURLForSide = (side, knowledgeBase) => { +const getBackgroundImageURLForSide = (side, brain) => { if (side == "user") { return "/dashboard/static/images/chatbot_user.webp"; } else { - if (knowledgeBase == "postgresml") { - return "/dashboard/static/images/owl_gradient.svg"; - } else if (knowledgeBase == "pytorch") { - return "/dashboard/static/images/logos/pytorch.svg"; - } else if (knowledgeBase == "rust") { - return "/dashboard/static/images/logos/rust.svg"; - } else if (knowledgeBase == "postgresql") { - return "/dashboard/static/images/logos/postgresql.svg"; + if (brain == "teknium/OpenHermes-2.5-Mistral-7B") { + return "/dashboard/static/images/logos/openhermes.webp" + } else if (brain == "Gryphe/MythoMax-L2-13b") { + return "/dashboard/static/images/logos/mythomax.webp" + } else if (brain == "berkeley-nest/Starling-LM-7B-alpha") { + return "/dashboard/static/images/logos/starling.webp" + } else if (brain == "openai") { + return "/dashboard/static/images/logos/openai.webp" } } }; -const createHistoryMessage = (message, knowledgeBase) => { +const createHistoryMessage = (message) => { if (message.side == "system") { return `
${message.text}
@@ -46,7 +46,7 @@ const createHistoryMessage = (message, knowledgeBase) => {
@@ -76,8 +76,8 @@ const brainIdToName = (brain) => { return "OpenHermes" } else if (brain == "Gryphe/MythoMax-L2-13b") { return "MythoMax" - } else if (brain == "openchat/openchat_3.5") { - return "OpenChat" + } else if (brain == "berkeley-nest/Starling-LM-7B-alpha") { + return "Starling" } else if (brain == "openai") { return "ChatGPT" } @@ -92,10 +92,11 @@ const createKnowledgeBaseNotice = (knowledgeBase) => { }; class Message { - constructor(id, side, text, is_partial=false) { + constructor(id, side, brain, text, is_partial=false) { this.id = id - this.text = text this.side = side + this.brain = brain + this.text = text this.is_partial = is_partial } @@ -187,9 +188,9 @@ export default class extends Controller { } else { let message; if (result.partial_result) { - message = new Message(result.id, "bot", result.partial_result, true); + message = new Message(result.id, "bot", this.brain, result.partial_result, true); } else { - message = new Message(result.id, "bot", result.result, false); + message = new Message(result.id, "bot", this.brain, result.result); } this.messageHistory.add_message(message, this.messageIdToKnowledgeBaseId[message.id]); this.redrawChat(); @@ -216,7 +217,7 @@ export default class extends Controller { console.log("Error getting chat history", history.error) } else { for (const message of history.result) { - const newMessage = new Message(getRandomInt(), message.side, message.content, false); + const newMessage = new Message(getRandomInt(), message.side, message.brain, message.content, false); console.log(newMessage); this.messageHistory.add_message(newMessage, message.knowledge_base); } @@ -231,10 +232,7 @@ export default class extends Controller { console.log("Drawing", message); this.chatHistory.insertAdjacentHTML( "beforeend", - createHistoryMessage( - message, - this.knowledgeBase, - ), + createHistoryMessage(message), ); } @@ -250,19 +248,16 @@ export default class extends Controller { } newUserQuestion(question) { - const message = new Message(getRandomInt(), "user", question); + const message = new Message(getRandomInt(), "user", this.brain, question); this.messageHistory.add_message(message, this.knowledgeBase); this.messageIdToKnowledgeBaseId[message.id] = this.knowledgeBase; this.hideExampleQuestions(); this.redrawChat(); - let loadingMessage = new Message("loading", "bot", LOADING_MESSAGE); + let loadingMessage = new Message("loading", "bot", this.brain, LOADING_MESSAGE); this.chatHistory.insertAdjacentHTML( "beforeend", - createHistoryMessage( - loadingMessage, - this.knowledgeBase, - ), + createHistoryMessage(loadingMessage), ); this.chatHistory.scrollTop = this.chatHistory.scrollHeight; @@ -331,7 +326,7 @@ export default class extends Controller { let knowledge_base = knowledgeBaseIdToName(this.knowledgeBase); let brain = brainIdToName(this.brain); let content = `Chatting with ${brain} about ${knowledge_base}`; - const newMessage = new Message(getRandomInt(), "system", content); + const newMessage = new Message(getRandomInt(), "system", this.brain, content); this.messageHistory.add_message(newMessage, this.knowledgeBase); this.redrawChat(); } diff --git a/pgml-dashboard/src/components/chatbot/mod.rs b/pgml-dashboard/src/components/chatbot/mod.rs index 4d7d74c48..4b149b96e 100644 --- a/pgml-dashboard/src/components/chatbot/mod.rs +++ b/pgml-dashboard/src/components/chatbot/mod.rs @@ -77,13 +77,13 @@ const CHATBOT_BRAINS: [ChatbotBrain; 4] = [ "teknium/OpenHermes-2.5-Mistral-7B", "OpenHermes", "teknium/OpenHermes-2.5-Mistral-7B", - "/dashboard/static/images/owl_gradient.svg", + "/dashboard/static/images/logos/openhermes.webp", ), ChatbotBrain::new( "Gryphe/MythoMax-L2-13b", "MythoMax", "Gryphe/MythoMax-L2-13b", - "/dashboard/static/images/owl_gradient.svg", + "/dashboard/static/images/logos/mythomax.webp", ), ChatbotBrain::new( "openai", @@ -92,10 +92,10 @@ const CHATBOT_BRAINS: [ChatbotBrain; 4] = [ "/dashboard/static/images/logos/openai.webp", ), ChatbotBrain::new( - "openchat/openchat_3.5", - "OpenChat", - "openchat/openchat_3.5", - "/dashboard/static/images/logos/meta.webp", + "berkeley-nest/Starling-LM-7B-alpha", + "Starling", + "berkeley-nest/Starling-LM-7B-alpha", + "/dashboard/static/images/logos/starling.webp", ), ]; diff --git a/pgml-dashboard/static/images/logos/mythomax.webp b/pgml-dashboard/static/images/logos/mythomax.webp new file mode 100644 index 0000000000000000000000000000000000000000..6e6c363b24f11ce27fdc10e8521d12efc013d94f GIT binary patch literal 33508 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 literal 0 HcmV?d00001 diff --git a/pgml-dashboard/static/images/logos/openhermes.webp b/pgml-dashboard/static/images/logos/openhermes.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c202681eae510692a652228fa215828efc7dea1 GIT binary patch literal 97164 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

|I?zZlf!1!gqdQQ0>` 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 E03RvH?f?J) literal 0 HcmV?d00001 From 685cc854f69dcb042f245c53362995e342df9435 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:27:36 -0800 Subject: [PATCH 4/4] Take advantage of the new quantized_config option --- pgml-dashboard/src/api/chatbot.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pgml-dashboard/src/api/chatbot.rs b/pgml-dashboard/src/api/chatbot.rs index c993ff6cb..0b8978844 100644 --- a/pgml-dashboard/src/api/chatbot.rs +++ b/pgml-dashboard/src/api/chatbot.rs @@ -102,17 +102,29 @@ impl ChatbotBrain { Self::TekniumOpenHermes25Mistral7B => serde_json::json!({ "model": "TheBloke/OpenHermes-2.5-Mistral-7B-GPTQ", "revision": "main", - "device_map": "auto" + "device_map": "auto", + "quantization_config": { + "bits": 4, + "max_input_length": 10000 + } }), Self::GrypheMythoMaxL213b => serde_json::json!({ "model": "TheBloke/MythoMax-L2-13B-GPTQ", "revision": "main", - "device_map": "auto" + "device_map": "auto", + "quantization_config": { + "bits": 4, + "max_input_length": 10000 + } }), Self::Starling7b => serde_json::json!({ "model": "TheBloke/Starling-LM-7B-alpha-GPTQ", "revision": "main", - "device_map": "auto" + "device_map": "auto", + "quantization_config": { + "bits": 4, + "max_input_length": 10000 + } }), _ => unimplemented!(), } @@ -537,7 +549,6 @@ async fn process_message( .map(|(_, context, metadata)| format!("\n\n#### Document {}: \n{}\n\n", metadata["id"], context)) .collect::>() .join("\n"); - // let context = "".to_string(); let history_collection = Collection::new( "ChatHistory",