File size: 6,212 Bytes
4b7893b 4bfe10b f7842a2 4bfe10b f7842a2 4bfe10b f7842a2 4bfe10b f7842a2 4bfe10b f7842a2 4b7893b f7842a2 fe9f836 29eec6c 4bfe10b f7842a2 4bfe10b 29eec6c fe9f836 f7842a2 17dad20 fe9f836 4b7893b fe9f836 4bfe10b fe9f836 f7842a2 17dad20 fe9f836 29eec6c fe9f836 4bfe10b 4b7893b f7842a2 4b7893b fe9f836 4b7893b 4bfe10b 29eec6c 4b7893b 29eec6c fe9f836 29eec6c f7842a2 4b7893b 4bfe10b f7842a2 4b7893b 4bfe10b f7842a2 4bfe10b f7842a2 4b7893b 4bfe10b f7842a2 4bfe10b f7842a2 4b7893b 4bfe10b f7842a2 4bfe10b f7842a2 d98df44 f7842a2 4b7893b 4bfe10b f7842a2 4b7893b f7842a2 4b7893b 4bfe10b f7842a2 29eec6c 4bfe10b fe9f836 4bfe10b 29eec6c 4bfe10b 29eec6c 4bfe10b ddbcdf4 4bfe10b b3bd92b 4bfe10b f7842a2 29eec6c 4b7893b 29eec6c 4b7893b 29eec6c 4b7893b 29eec6c 4b7893b 4bfe10b 4b7893b f7842a2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
import streamlit as st
import os
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceBgeEmbeddings
from langchain_together import Together # Updated import
from langchain import hub
from operator import itemgetter
from langchain.schema import RunnableParallel, format_document # Updated import paths
from typing import List, Tuple
from langchain.chains import LLMChain, RetrievalQA, ConversationalRetrievalChain
from langchain.schema.output_parser import StrOutputParser
from langchain.memory import StreamlitChatMessageHistory, ConversationBufferMemory, ConversationSummaryMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder, PromptTemplate
from langchain.schema import RunnableLambda, RunnablePassthrough
# Load the embedding function
model_name = "BAAI/bge-base-en"
encode_kwargs = {'normalize_embeddings': True}
embedding_function = HuggingFaceBgeEmbeddings(
model_name=model_name,
encode_kwargs=encode_kwargs
)
# Load the ChromaDB vector store
# persist_directory="./mrcpchromadb/"
# vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="mrcppassmednotes")
# Load the LLM
llm = Together(
model="mistralai/Mixtral-8x22B-Instruct-v0.1",
temperature=0.2,
max_new_tokens=22000,
top_k=12,
together_api_key=os.environ['pilotikval']
)
# Load the summarizeLLM
llmc = Together(
model="mistralai/Mixtral-8x22B-Instruct-v0.1",
temperature=0.2,
max_new_tokens=1000,
top_k=3,
together_api_key=os.environ['pilotikval']
)
msgs = StreamlitChatMessageHistory(key="langchain_messages")
memory = ConversationBufferMemory(chat_memory=msgs)
DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}")
def _combine_documents(docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\n\n"):
doc_strings = [format_document(doc, document_prompt) for doc in docs]
return document_separator.join(doc_strings)
chistory = []
def store_chat_history(role: str, content: str):
chistory.append({"role": role, "content": content})
# Define the Streamlit app
def app():
with st.sidebar:
st.title("dochatter")
option = st.selectbox(
'Which retriever would you like to use?',
('General Medicine', 'RespiratoryFishman', 'RespiratoryMurray', 'MedMRCP2', 'OldMedicine')
)
if option == 'RespiratoryFishman':
persist_directory="./respfishmandbcud/"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="fishmannotescud")
retriever = vectordb.as_retriever(search_kwargs={"k": 5})
elif option == 'RespiratoryMurray':
persist_directory="./respmurray/"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="respmurraynotes")
retriever = vectordb.as_retriever(search_kwargs={"k": 5})
elif option == 'MedMRCP2':
persist_directory="./medmrcp2store/"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="medmrcp2notes")
retriever = vectordb.as_retriever(search_kwargs={"k": 5})
elif option == 'General Medicine':
persist_directory="./oxfordmedbookdir/"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="oxfordmed")
retriever = vectordb.as_retriever(search_kwargs={"k": 7})
else:
persist_directory="./mrcpchromadb/"
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function, collection_name="mrcppassmednotes")
retriever = vectordb.as_retriever(search_kwargs={"k": 5})
if "messages" not in st.session_state:
st.session_state.messages = [{"role": "assistant", "content": "How may I help you?"}]
_template = """Given the following conversation and a follow-up question, rephrase the follow-up question to be a standalone question which contains the themes of the conversation. Do not write the question. Do not write the answer.
Chat History:
{chat_history}
Follow Up Input: {question}
Standalone question:"""
CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
template = """You are helping a doctor. Answer with what you know from the context provided. Please be as detailed and thorough. Answer the question based on the following context:
{context}
Question: {question}
"""
ANSWER_PROMPT = ChatPromptTemplate.from_template(template)
_inputs = RunnableParallel(
standalone_question=RunnablePassthrough.assign(
chat_history=lambda x: chistory
)
| CONDENSE_QUESTION_PROMPT
| llmc
| StrOutputParser(),
)
_context = {
"context": itemgetter("standalone_question") | retriever | _combine_documents,
"question": lambda x: x["standalone_question"],
}
conversational_qa_chain = _inputs | _context | ANSWER_PROMPT | llm
st.header("Hello Doctor, How can I help?")
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
store_chat_history(message["role"], message["content"])
prompts2 = st.chat_input("Say something")
if prompts2:
st.session_state.messages.append({"role": "user", "content": prompts2})
with st.chat_message("user"):
st.write(prompts2)
if st.session_state.messages[-1]["role"] != "assistant":
with st.chat_message("assistant"):
with st.spinner("Thinking..."):
response = conversational_qa_chain.invoke(
{
"question": prompts2,
"chat_history": chistory,
}
)
st.write(response)
message = {"role": "assistant", "content": response}
st.session_state.messages.append(message)
if __name__ == '__main__':
app()
|