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", pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy