端点实现是这样的:
@app.post("/api/chat/{question}", dependencies=[Depends(sessionValidator)])
async def chat(question: str = Path(...), my_chatbot=Depends(chatbotProvider)):
# Generate response
try:
logger.info(f"Getting LLM response..")
ans = my_chatbot.chatbot.chat(question)
logger.info(f"SUCCESS! Chatbot responded: {ans.response}")
return ans.response
except Exception as e:
logger.error(f"FAILED! Got no response from chatbot! Err {e}")
raise HTTPException(status_code=500, detail="Chatbot gave no response!")
聊天机器人(我调用了其
chat
方法)是基于向量索引的 llama-index 聊天引擎。它是 BaseChatEngine
中的 llama_index.core.chat_engine.types
类的实例,并使用 llama_index.llms.ollama
中的 Ollama Lllama3 模型。
这是在我的包装类
MyChatAssistant
中创建聊天机器人的代码,该类具有 llama-index 的 BaseChatEngine
实例作为属性 chatbot
:
self.chatbot = self.index.as_chat_engine(
chat_mode = self._chat_mode,
verbose = True,
similarity_top_k = 6,
filters = MetadataFilters(filters=[
ExactMatchFilter(key="transcript_id", value=self.transcript_id),]
)
)
有趣的是,我在 Jupyter 笔记本中广泛测试了聊天机器人(减去 Rest API 端点包装器)。我使用了:
import nest_asyncio
nest_asyncio.apply()
这解决了所有问题。同样的情况在 FastAPI 中不起作用,因为 FastAPI 使用的事件循环似乎是不同的类型。
我尝试过以下方法:
4.
ans = asyncio.get_event_loop().run_until_complete(my_chatbot.chatbot.chat(question))
# or
loop = asyncio.get_event_loop()
ans = loop.create_task(my_chatbot.chatbot.chat(question))
await and
错误:此事件循环已经在运行
3.
ans = asyncio.to_thread(my_chatbot.chatbot.chat(question))
# or
ans = await asyncio.to_thread(my_chatbot.chatbot.chat(question))
错误:此事件循环已经在运行
2.
loop = asyncio.get_event_loop()
ans = await loop.run_in_executor(None, my_chatbot.chatbot.chat, question)
ans = my_chatbot.chatbot.chat(question)
# or
ans = await my_chatbot.chatbot.chat(question)
感谢您的帮助!
我猜 my_chatbot.chatbot.chat() 是一个同步包装器,在循环中运行异步函数。因此,您需要使用此方法的异步替代方案。
尝试改变
ans = my_chatbot.chatbot.chat(question)
到
ans = await my_chatbot.chatbot.achat(question)