import streamlit as st from langchain.prompts import PromptTemplate from langchain_community.llms import CTransformers from src.helper import download_hf_embeddings, text_split, download_hf_model from langchain_community.vectorstores import Pinecone as LangchainPinecone import os from dotenv import load_dotenv from src.prompt import prompt_template from langchain.chains import RetrievalQA import time from pinecone import Pinecone from tqdm.auto import tqdm # Load environment variables load_dotenv() PINECONE_API_KEY = os.getenv('PINECONE_API_KEY') index_name = "medicure-chatbot" # Set page configuration st.set_page_config(page_title="Medical Chatbot", page_icon="🏥", layout="wide") # Custom CSS for styling st.markdown(""" """, unsafe_allow_html=True) # Initialize session state for chat history if 'chat_history' not in st.session_state: st.session_state.chat_history = [] # Header st.title("🏥 Medicure RAG Chatbot") # Display welcome message st.write("Welcome to Medicure Chatbot! Ask any medical question and I'll do my best to help you.") st.write("#### Built with 🤗 Ctransformers, Langchain, and Pinecone VectorDB. Powered by Metal-llama2-7b-chat quantized LLM") st.write("##### Resource Used 📖 : The Gale Encyclopedia of Medicine ") # Parameters section st.sidebar.header("Parameters") k_value = st.sidebar.slider("Number of relevant documents (k)", min_value=1, max_value=10, value=2) max_new_tokens = st.sidebar.slider("Max new tokens", min_value=64, max_value=1024, value=512) temperature = st.sidebar.slider("Temperature", min_value=0.1, max_value=1.0, value=0.8, step=0.1) # Initialize the chatbot components @st.cache_resource def initialize_chatbot(k, max_tokens, temp): embeddings = download_hf_embeddings() model_path = "TheBloke/Llama-2-7B-Chat-GGML" llm = CTransformers(model=model_path, model_type="llama", config={'max_new_tokens': max_tokens, 'temperature': temp}) # initialize pinecone pc = Pinecone(api_key=PINECONE_API_KEY) index = pc.Index(index_name) PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) chain_type_kwargs = {"prompt": PROMPT} docsearch = LangchainPinecone(index, embeddings.embed_query, "text") qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=docsearch.as_retriever(search_kwargs={'k': k}), return_source_documents=True, chain_type_kwargs=chain_type_kwargs) return qa qa = initialize_chatbot(k_value, max_new_tokens, temperature) # Chat interface user_input = st.text_input("Ask your question:") if st.button("Send", key="send"): if user_input: with st.spinner("Thinking..."): result = qa({"query": user_input}) response = result["result"] st.session_state.chat_history.append(("You", user_input)) st.session_state.chat_history.append(("Bot", response)) # Display chat history st.subheader("Chat History") for role, message in st.session_state.chat_history: if role == "You": st.markdown(f"**You:** {message}") else: st.markdown(f"**Bot:** {message}") # Animated loading for visual appeal def load_animation(): with st.empty(): for i in range(3): for j in ["⋅", "⋅⋅", "⋅⋅⋅", "⋅⋅⋅⋅"]: st.write(f"Loading{j}") time.sleep(0.2) st.write("") # Footer with social links st.markdown(""" """, unsafe_allow_html=True) # Load Font Awesome for icons st.markdown('', unsafe_allow_html=True)