Spaces:
Sleeping
Sleeping
File size: 4,083 Bytes
888d109 |
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 |
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()
|