from langchain.chains import create_history_aware_retriever from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder def history_aware_retriever(llm, retriever): """ Create a chain that takes conversation history and returns documents. If there is no chat_history, then the input is just passed directly to the retriever. If there is chat_history, then the prompt and LLM will be used to generate a search query. That search query is then passed to the retriever. Args: llm: The language model. retriever: The retriever to use for finding relevant documents. """ contextualize_q_system_prompt = ( "Given a chat history and the latest user question " "which might reference context in the chat history, " "formulate a standalone question which can be understood " "without the chat history. Do NOT answer the question, just " "reformulate it if needed and otherwise return it as is." ) contextualize_q_prompt = ChatPromptTemplate.from_messages( [ ("system", contextualize_q_system_prompt), MessagesPlaceholder("chat_history"), ("human", "{input}"), ] ) history_aware_retriever = create_history_aware_retriever( llm, retriever, contextualize_q_prompt ) return history_aware_retriever def documents_retriever(llm): """ Create a chain for passing a list of Documents to a model. Args: llm: The language model. """ system_prompt = ( "You are an helpfull assistant. " "Use the following pieces of retrieved context to answer the question. " "If you don't know the answer or the context is not retrieved, SAY THAT YOU DON'T KNOW!!. " "Always response in Bahasa Indonesia or Indonesian Language. " "Context: {context}" ) qa_prompt = ChatPromptTemplate.from_messages( [ ("system", system_prompt), MessagesPlaceholder("chat_history"), ("human", "{input}"), ] ) question_answer_chain = create_stuff_documents_chain(llm, qa_prompt) return question_answer_chain