learnai2.0 / model.py
V15h's picture
initial commit
888d109
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()