Spaces:
Runtime error
Runtime error
import streamlit as st | |
import os | |
from textblob import TextBlob | |
from langchain.prompts import PromptTemplate | |
import pandas as pd | |
from langchain_groq import ChatGroq | |
from langchain_core.prompts import PromptTemplate | |
from langchain_core.output_parsers import StrOutputParser | |
from langchain_chroma import Chroma | |
from langchain_huggingface import HuggingFaceEmbeddings | |
# Load the dataset | |
df = pd.read_csv('./drugs_side_effects_drugs_com.csv') | |
df = df[['drug_name', 'medical_condition', 'side_effects']] | |
df.dropna(inplace=True) | |
# Prepare context data for vector store | |
context_data = [" | ".join([f"{col}: {df.iloc[i][col]}" for col in df.columns]) for i in range(2)] | |
# Set up Groq LLM and vector store | |
groq_key = os.environ.get('gloq_key') | |
llm = ChatGroq(model="llama-3.1-70b-versatile", api_key=groq_key) | |
embed_model = HuggingFaceEmbeddings(model_name="mixedbread-ai/mxbai-embed-large-v1") | |
vectorstore = Chroma( | |
collection_name="medical_dataset_store", | |
embedding_function=embed_model, | |
persist_directory="./" | |
) | |
vectorstore.add_texts(context_data) | |
retriever = vectorstore.as_retriever() | |
# Define prompt template | |
SYSTEM_PROMPT_GENERAL = """ | |
You are CareBot, a pharmacist and medical expert known as Treasure. Your goal is to provide empathetic, supportive, and detailed responses tailored to the user's needs. | |
Behavior Guidelines: | |
1. Introduction: Greet the user as Treasure during the first interaction. | |
2. Personalization: Adapt responses to the user's tone and emotional state. | |
3. Empathy: Respond warmly to the user's concerns and questions. | |
4. Evidence-Based: Use reliable sources to answer queries. For missing data, advise seeking professional consultation. | |
5. Focus: Avoid providing off-topic information; address the user's query specifically. | |
6. Encouragement: Balance acknowledging concerns with actionable and constructive suggestions. | |
7. Context Integration: Use the given context to deliver accurate and relevant answers without repeating the context explicitly. | |
Objective: | |
Deliver thoughtful, empathetic, and medically sound advice based on the user’s query. | |
Response Style: | |
- Detailed but concise | |
- Professional, empathetic tone | |
- Clear and actionable guidance | |
""" | |
rag_prompt_template = PromptTemplate( | |
input_variables=["context", "user_input"], | |
template=""" | |
{system_prompt} | |
Context: {context} | |
User: {user_input} | |
Assistant:""" | |
) | |
st.title("CareBot: Your AI Medical Assistant") | |
# Initialize session state for chat history | |
if "messages" not in st.session_state: | |
st.session_state["messages"] = [ | |
{"role": "assistant", "content": "Hi there! I'm Treasure, your friendly pharmacist. How can I help you today?"} | |
] | |
# Display chat history | |
for msg in st.session_state.messages: | |
st.chat_message(msg["role"]).write(msg["content"]) | |
# User input | |
if user_query := st.chat_input("Ask me a medical question, or share your concerns."): | |
# Add user message to the session state | |
st.session_state.messages.append({"role": "user", "content": user_query}) | |
st.chat_message("user").write(user_query) | |
# Perform sentiment analysis | |
sentiment = TextBlob(user_query).sentiment.polarity | |
# Modify prompt based on sentiment | |
system_prompt = SYSTEM_PROMPT_GENERAL | |
if sentiment < 0: | |
system_prompt += "\nThe user seems upset or worried. Prioritize empathy and reassurance." | |
# Retrieve context from vector store | |
context_results = retriever.get_relevant_documents(user_query) | |
context = "\n".join([result.page_content for result in context_results]) | |
# Format the prompt | |
formatted_prompt = rag_prompt_template.format( | |
system_prompt=system_prompt, | |
context=context, | |
user_input=user_query | |
) | |
# Generate response using Groq LLM | |
response = "" | |
for text in llm.stream(formatted_prompt): | |
response += text | |
# Add assistant response to the session state | |
st.session_state.messages.append({"role": "assistant", "content": response.strip()}) | |
st.chat_message("assistant").write(response.strip()) |