knowledge-base / app /utils.py
gavinzli's picture
Remove obsolete router and controller files; update application structure and dependencies
af08824
raw
history blame
1.59 kB
"""Module containing utility functions for the chatbot application."""
import json
from chain import RAGChain, FollowUpChain
from schema import ReqData
from retriever import DocRetriever
followUpChain = FollowUpChain()
async def generate(req: ReqData):
"""
Asynchronously generates responses based on the provided request data.
This function uses different processing chains depending on the `web` attribute of the request.
It streams chunks of data and yields server-sent events (SSE) for answers and contexts.
Additionally, it generates follow-up questions and updates citations.
Args:
req (ReqData): Request data containing user and chat info, query, and other parameters.
Yields:
str: Server-sent events (SSE) for answers, contexts, and follow-up questions in JSON format.
"""
chain = RAGChain(DocRetriever(req=req))
session_id = "/".join([req.user_id, req.chat_id])
contexts = []
for chunk in chain.stream({"input": req.query},
config={"configurable": {"session_id": session_id}}):
if 'answer' in chunk:
yield "event: answer\n"
yield f"data: {json.dumps(chunk)}\n\n"
print(chunk['answer'], end="", flush=True)
elif 'context' in chunk:
for context in chunk['context']:
yield "event: context\n"
yield f"data: {json.dumps({'context': context.metadata})}\n\n"
yield "event: questions\n"
yield f"data: {json.dumps({'questions': followUpChain.invoke(req.query, contexts)})}\n\n"