from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.llms import CTransformers from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate import chainlit as cl age = 15 name = 'Fidva' grade = 10 context = '{context}' question = '{question}' DB_FAISS_PATH = 'vectorstore/db_faiss/geo-10-whole_book' # OPENAI_API_KEY = "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" custom_prompt_template = """Use the following pieces of information to answer the user's question in a friendly way. If you don't know the answer, just say that you don't know, don't try to make up an answer. Also refer to the user by their name, and keep in mind their age while answering the question. Name of user: {name} Age of user: {age} Grade of user: {grade} Context: {context} Question: {question} Return the Helpful Answer, and then also give the user a Knowledge Check Question related to what he just asked. Returning the helpful answer is a must and takes higher priority. Helpful answer: """ custom_prompt_template = PromptTemplate.from_template(custom_prompt_template) formatted_prompt = custom_prompt_template.format( name=name, age=age, grade=grade, context=context, question=question) def set_custom_prompt(): """ Prompt template for QA retrieval for each vectorstore """ prompt = PromptTemplate(template=formatted_prompt, input_variables=['context', 'question']) return prompt # Retrieval QA Chain def retrieval_qa_chain(llm, prompt, db): qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type='stuff', retriever=db.as_retriever( search_kwargs={'k': 1}), return_source_documents=True, chain_type_kwargs={'prompt': prompt} ) return qa_chain # Loading the model def load_llm(): # config = AutoConfig.from_pretrained("TheBloke/Llama-2-7B-Chat-GGML") # config.max_seq_len = 4096 # config.max_answer_len = 1024 # Load the locally downloaded model here llm = CTransformers( model="TheBloke/Llama-2-7B-Chat-GGML", # model = "zephyr-7b-beta.Q5_K_S.gguf", model_type="llama", config={ 'context_length': 4096, 'temperature': 0.3, 'max_new_tokens': 512, }, ) # llm = AutoModelForCausalLM.from_pretrained( # "TheBloke/Llama-2-7B-Chat-GGML", # model_type="llama", # config=config, # temperature=0.5 # ) return llm # QA Model Function def qa_bot(): embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2", model_kwargs={'device': 'cpu'}) db = FAISS.load_local(DB_FAISS_PATH, embeddings) llm = load_llm() qa_prompt = set_custom_prompt() qa = retrieval_qa_chain(llm, qa_prompt, db) return qa # output function def final_result(query): qa_result = qa_bot() response = qa_result({'query': query}) return response # chainlit code @cl.on_chat_start async def start(): chain = qa_bot() msg = cl.Message(content="Starting the bot...") await msg.send() msg.content = "Hi, Welcome to Geo Bot. What is your query?" await msg.update() cl.user_session.set("chain", chain) @cl.on_message async def main(message: cl.Message): chain = cl.user_session.get("chain") cb = cl.AsyncLangchainCallbackHandler( stream_final_answer=True, answer_prefix_tokens=["FINAL", "ANSWER"] ) cb.answer_reached = True res = await chain.acall(message.content, callbacks=[cb]) answer = res["result"] sources = res["source_documents"] if sources: answer += f"\nSources:" + str(sources) else: answer += "\nNo sources found" await cl.Message(content=answer).send()