Mishab commited on
Commit
2facc44
1 Parent(s): 9efed07

Updated code

Browse files
Files changed (2) hide show
  1. app.py +13 -5
  2. utils.py +65 -22
app.py CHANGED
@@ -58,7 +58,7 @@ if "ensemble_retriver" not in st.session_state:
58
  st.session_state["ensemble_retriver"] = load_ensemble_retriver(text_chunks=st.session_state["text_chunks"], embeddings=st.session_state["embeddings"], chroma_vectorstore=st.session_state["vector_db"] )
59
 
60
  if "conversation_chain" not in st.session_state:
61
- st.session_state["conversation_chain"] = load_conversational_retrievel_chain(retriever=st.session_state["ensemble_retriver"], llm=st.session_state["llm"])
62
 
63
 
64
 
@@ -193,8 +193,9 @@ if st.session_state["vector_db"] and st.session_state["llm"]:
193
 
194
 
195
  def generate_llm_response(conversation_chain, prompt_input):
196
- output= conversation_chain({'question': prompt_input})
197
- return output['answer']
 
198
 
199
 
200
  # User-provided prompt
@@ -214,9 +215,13 @@ if st.session_state["vector_db"] and st.session_state["llm"]:
214
  for item in response:
215
  full_response += item
216
  placeholder.markdown(full_response)
 
 
 
 
 
217
  if response:
218
  st.text("-------------------------------------")
219
- #Getting source docs
220
  docs= st.session_state["ensemble_retriver"].get_relevant_documents(prompt)
221
  source_doc_list= []
222
  for doc in docs:
@@ -233,6 +238,9 @@ if st.session_state["vector_db"] and st.session_state["llm"]:
233
  st.write("---") # Add a separator between entries
234
  message = {"role": "assistant", "content": full_response, "Source":merged_source_doc}
235
  st.session_state.messages.append(message)
236
-
 
 
 
237
  end = timeit.default_timer()
238
  print(f"Time to retrieve response: {end - start}")
 
58
  st.session_state["ensemble_retriver"] = load_ensemble_retriver(text_chunks=st.session_state["text_chunks"], embeddings=st.session_state["embeddings"], chroma_vectorstore=st.session_state["vector_db"] )
59
 
60
  if "conversation_chain" not in st.session_state:
61
+ st.session_state["conversation_chain"] = load_conversational_retrievel_chain(retriever=st.session_state["ensemble_retriver"], llm=st.session_state["llm"])
62
 
63
 
64
 
 
193
 
194
 
195
  def generate_llm_response(conversation_chain, prompt_input):
196
+ # output= conversation_chain({'question': prompt_input})
197
+ res = conversation_chain(prompt_input)
198
+ return res['result']
199
 
200
 
201
  # User-provided prompt
 
215
  for item in response:
216
  full_response += item
217
  placeholder.markdown(full_response)
218
+ # The following logic will work in the way given below.
219
+ # -- Check if intermediary steps are present in the output of the given prompt.
220
+ # -- If not, we can conclude that, agent has used internet search as tool.
221
+ # -- Check if intermediary steps are present in the output of the prompt.
222
+ # -- If intermediary steps are present, it means agent has used exising custom knowledge base for iformation retrival and therefore we need to give souce docs as output along with LLM's reponse.
223
  if response:
224
  st.text("-------------------------------------")
 
225
  docs= st.session_state["ensemble_retriver"].get_relevant_documents(prompt)
226
  source_doc_list= []
227
  for doc in docs:
 
238
  st.write("---") # Add a separator between entries
239
  message = {"role": "assistant", "content": full_response, "Source":merged_source_doc}
240
  st.session_state.messages.append(message)
241
+ # else:
242
+ # with st.expander("source"):
243
+ # message = {"role": "assistant", "content": full_response, "Source":""}
244
+ # st.session_state.messages.append(message)
245
  end = timeit.default_timer()
246
  print(f"Time to retrieve response: {end - start}")
utils.py CHANGED
@@ -30,6 +30,9 @@ from langchain.agents.agent_toolkits import create_conversational_retrieval_agen
30
  from langchain.utilities import SerpAPIWrapper
31
  from langchain.agents import Tool
32
  from langchain.agents import load_tools
 
 
 
33
 
34
  load_dotenv()
35
 
@@ -251,30 +254,70 @@ def load_text_chunks(text_chunks_pkl_dir):
251
  def load_ensemble_retriver(text_chunks, embeddings, chroma_vectorstore):
252
  """Load ensemble retiriever with BM25 and Chroma as individual retrievers"""
253
  bm25_retriever = BM25Retriever.from_documents(text_chunks)
254
- bm25_retriever.k = 2
255
- chroma_retriever = chroma_vectorstore.as_retriever(search_kwargs={"k": 2})
256
  ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, chroma_retriever], weights=[0.3, 0.7])
257
- return ensemble_retriever
 
 
258
 
259
 
260
  def load_conversational_retrievel_chain(retriever, llm):
261
- '''Load Conversational Retrievel chain,'''
262
- _template= """
263
- You are a helpful assistant. You do not respond as 'User' or pretend to be 'User'. You only respond once as 'Assistant'.
264
- Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language.
265
- Chat History:
266
- {chat_history}
267
- Follow Up Input: {question}
268
- Standalone question:"""
269
-
270
- CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
271
- memory = ConversationBufferMemory(return_messages=True,memory_key="chat_history")
272
- conversation_chain = ConversationalRetrievalChain.from_llm(
273
- llm=st.session_state["llm"],
274
- retriever=st.session_state["ensemble_retriver"],
275
- condense_question_prompt=CONDENSE_QUESTION_PROMPT,
276
- memory=memory,
277
- verbose=True,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  )
279
- return conversation_chain
280
-
 
30
  from langchain.utilities import SerpAPIWrapper
31
  from langchain.agents import Tool
32
  from langchain.agents import load_tools
33
+ from langchain.chat_models import ChatOpenAI
34
+ from langchain.retrievers.multi_query import MultiQueryRetriever
35
+ from langchain.chains import RetrievalQA
36
 
37
  load_dotenv()
38
 
 
254
  def load_ensemble_retriver(text_chunks, embeddings, chroma_vectorstore):
255
  """Load ensemble retiriever with BM25 and Chroma as individual retrievers"""
256
  bm25_retriever = BM25Retriever.from_documents(text_chunks)
257
+ bm25_retriever.k = 1
258
+ chroma_retriever = chroma_vectorstore.as_retriever(search_kwargs={"k": 1})
259
  ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, chroma_retriever], weights=[0.3, 0.7])
260
+ retriever_from_llm = MultiQueryRetriever.from_llm(retriever=ensemble_retriever, llm=ChatOpenAI()
261
+ )
262
+ return retriever_from_llm
263
 
264
 
265
  def load_conversational_retrievel_chain(retriever, llm):
266
+ '''Load Conversational Retrievel agent with following tasks as tools,
267
+ 1) OPM Knowledge base query
268
+ 2) INternet search with SerpAPI
269
+ This agent combines RAG, chat interfaces, agents.
270
+ '''
271
+ # retriever_tool = create_retriever_tool(
272
+ # retriever,
273
+ # "Search_US_Office_of_Personnel_Management_Document",
274
+ # "Searches and returns documents regarding the U.S. Office of Personnel Management (OPM).")
275
+ # search_api = SerpAPIWrapper()
276
+ # search_api_tool = Tool(
277
+ # name = "Current_Search",
278
+ # func=search_api.run,
279
+ # description="useful for when you need to answer questions about current events or the current state of the world"
280
+ # )
281
+ # tools = [retriever_tool]
282
+ # agent_executor = create_conversational_retrieval_agent(llm, tools, verbose=True, max_token_limit=512)
283
+ # return agent_executor
284
+ # string_dialogue = "You are a helpful assistant. You do not respond as 'User' or pretend to be 'User'. You only respond once as 'Assistant'."
285
+ # _template= """
286
+ # You are a helpful assistant. You do not respond as 'User' or pretend to be 'User'. You only respond once as 'Assistant'.
287
+ # Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question, in its original language.
288
+ # Your answer should in English language only.
289
+ # Chat History:
290
+ # {chat_history}
291
+ # Follow Up Input: {question}
292
+ # Standalone question:"""
293
+
294
+ # CONDENSE_QUESTION_PROMPT = PromptTemplate.from_template(_template)
295
+ # memory = ConversationBufferMemory(return_messages=True,memory_key="chat_history")
296
+ # conversation_chain = ConversationalRetrievalChain.from_llm(
297
+ # llm=st.session_state["llm"],
298
+ # retriever=st.session_state["ensemble_retriver"],
299
+ # condense_question_prompt=CONDENSE_QUESTION_PROMPT,
300
+ # memory=memory,
301
+ # verbose=True,
302
+ # )
303
+ template = """You are a helpful assistant. You do not respond as 'User' or pretend to be 'User'. You only respond once as 'Assistant'.
304
+ Use the following pieces of context to answer the question at the end. If you don't know the answer,\
305
+ just say that you don't know, don't try to make up an answer.
306
+
307
+ {context}
308
+
309
+ {history}
310
+ Question: {question}
311
+ Helpful Answer:"""
312
+
313
+ prompt = PromptTemplate(input_variables=["history", "context", "question"], template=template)
314
+ memory = ConversationBufferMemory(input_key="question", memory_key="history")
315
+
316
+ qa = RetrievalQA.from_chain_type(
317
+ llm=llm,
318
+ chain_type="stuff",
319
+ retriever=retriever,
320
+ return_source_documents=True,
321
+ chain_type_kwargs={"prompt": prompt, "memory": memory},
322
  )
323
+ return qa