RAG-Chat / app.py
Nitish-py's picture
uI
01eb4d4
import chainlit as cl
from llama_index.llms import MonsterLLM
from llama_index import VectorStoreIndex,SimpleDirectoryReader, ServiceContext
from monsterapi import client as mclient
import json
def indexing(llm,path):
documents = SimpleDirectoryReader(input_files=[path]).load_data()
service_context = ServiceContext.from_defaults(
chunk_size=1024, llm=llm, embed_model="local:BAAI/bge-small-en-v1.5"
)
index = VectorStoreIndex.from_documents(documents, service_context=service_context, use_async=True)
query_engine = index.as_query_engine()
cl.user_session.set("engine", query_engine)
def qa(sp,message):
engine=cl.user_session.get("engine")
message=message.content
ques=sp+" "+message
response=engine.query(ques)
return response
@cl.on_chat_start
async def factory():
url = await cl.AskUserMessage(author="Beast",content="Enter API endpoint of your LLM Deployment on MonsterAPI. For any questions, checkout our \"Read Me\" section.").send()
index_ai = url['output'].find(".monsterapi.ai")
url_ai = url['output'][:index_ai + len(".monsterapi.ai")]
auth = await cl.AskUserMessage(author="Beast",content="Enter auth-token of your deployment").send()
model = 'deploy-llm'
llm = MonsterLLM(model=model,base_url=url_ai,monster_api_key=auth['output'],temperature=0.75, context_window=1024)
service_client = mclient(api_key = auth['output'], base_url = url_ai)
cl.user_session.set("service_client",service_client)
cl.user_session.set("llm", llm)
res = await cl.AskActionMessage(author="Beast",
content="Do you want to enter system prompt?",
actions=[
cl.Action(name="yes", value="yes", label="βœ… Yes"),
cl.Action(name="no", value="no", label="❌ No"),
],
).send()
if res and res.get("value") == "yes":
sp = await cl.AskUserMessage(author="Beast",content="Enter system prompt").send()
msg=cl.Message(author="Beast",content="Noted. Go ahead as your questions!!")
await msg.send()
cl.user_session.set("sp", sp["output"])
else:
await cl.Message(author="Beast",content="Okay, then you can start asking your questions!!").send()
@cl.on_message
async def main(message: cl.Message):
service_client=cl.user_session.get("service_client")
engine = cl.user_session.get("engine")
llm=cl.user_session.get("llm")
sp=cl.user_session.get("sp")
if sp==None:
sp=""
if message.elements:
go=True
for file in message.elements:
if "pdf" in file.mime:
pdf=file
else:
await cl.Message(author="Beast",content="We only support PDF for now").send()
go=False
break
if go:
msg = cl.Message(author="Beast",content=f"Processing `{pdf.name}`...")
await msg.send()
await cl.make_async(indexing)(llm,pdf.path)
msg.content = f"`{pdf.name}` processed."
await msg.update()
msg = cl.Message(author="Beast",content=f"Generating Response...")
await msg.send()
response =await cl.make_async(qa)(sp,message)
print(response)
msg.content = str(response)
await msg.update()
comp = await cl.AskActionMessage(author="Beast",
content="Do you want answer without RAG?",
actions=[
cl.Action(name="yes", value="yes", label="βœ… Yes"),
cl.Action(name="no", value="no", label="❌ No"),
],
).send()
elif not message.elements and engine!=None:
msg = cl.Message(author="Beast",content=f"Generating Response...")
await msg.send()
response =await cl.make_async(qa)(sp,message)
print(response)
msg.content = str(response)
await msg.update()
comp = await cl.AskActionMessage(author="Beast",
content="Do you want answer without RAG?",
actions=[
cl.Action(name="yes", value="yes", label="βœ… Yes"),
cl.Action(name="no", value="no", label="❌ No"),
],
).send()
if (not message.elements and engine==None) or (comp.get("value") == "yes"):
msg = cl.Message(author="Beast",content=f"Generating Response...")
await msg.send()
payload = {
"input_variables": {"system": sp,
"prompt":message.content},
"stream": False,
"temperature": 0.6,
"max_tokens": 512
}
output = service_client.generate(model = "deploy-llm", data = payload)
msg.content = str(output['text'][0])
await msg.update()
else:
cl.Message(author="Beast",content="Broken ;(")