FastAPI 端点中的 Llama-index 聊天机器人抛出“事件循环已在运行”

问题描述 投票:0回答:1

端点实现是这样的:

@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)

感谢您的帮助!

fastapi llama-index ollama llama3
1个回答
0
投票

我猜 my_chatbot.chatbot.chat() 是一个同步包装器,在循环中运行异步函数。因此,您需要使用此方法的异步替代方案。

尝试改变

        ans = my_chatbot.chatbot.chat(question)

        ans = await my_chatbot.chatbot.achat(question)
© www.soinside.com 2019 - 2024. All rights reserved.