llama_index [Bug]: RaptorRetriever查询错误:运行时错误:此事件循环已经在运行,

piztneat  于 6个月前  发布在  其他
关注(0)|答案(6)|浏览(44)

错误描述

使用sanic作为Web服务器提供接口。使用RetrieverQueryEngine查询query_engine.query(""),报告RuntimeError:此事件循环已经运行。

版本

0.10.52

重现步骤

retriever = RaptorRetriever(
[],
embed_model=OpenAIEmbedding(
model="text-embedding-3-small", api_key=api_key, api_base=base_url
), # 用于嵌入聚类
llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1,
api_key=api_key, api_base=base_url),

用于生成摘要

vector_store=vector_store, # 用于存储
similarity_top_k=2, # 每层的前k个,或整体的前k个折叠
mode="tree_traversal", # 设置默认模式
)
query_engine = RetrieverQueryEngine.from_args(
retriever, llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1,
api_key=api_key,
api_base=base_url),
text_qa_template=CHAT_TEXT_QA_PROMPT,
streaming=True,
response_synthesizer=synth,
use_async=True
)
@app.route("/test", methods=['POST'])
async def test(req: request):
res = query_engine.query("who are you").response_gen
return res
if name == "main":
app.run(host='0.0.0.0', port=8777, workers=1, access_log=False)

相关日志/回溯

File "/raptor/venv/lib/python3.11/site-packages/nest_asyncio.py", line 35, in run
    loop.run_until_complete(task)
  File "uvloop/loop.pyx", line 1511, in uvloop.loop.Loop.run_until_complete
  File "uvloop/loop.pyx", line 1504, in uvloop.loop.Loop.run_until_complete
  File "uvloop/loop.pyx", line 1377, in uvloop.loop.Loop.run_forever
  File "uvloop/loop.pyx", line 518, in uvloop.loop.Loop._run
RuntimeError: this event loop is already running.
chhqkbe1

chhqkbe11#

你好,@ljhssga!👋我在这里帮助你解决任何bug、问题或贡献。我是一个Maven机器人,旨在协助你在等待人类维护者时提供帮助。
要解决在使用Sanic作为网络服务器并使用RetrieverQueryEngine查询时出现的RuntimeError: this event loop is already running问题,你可以使用nest_asyncio库。这个库允许你在已经运行的事件循环中嵌套asyncio事件循环,这可以帮助你在一个已经运行的事件循环中运行事件循环。
以下是如何修改你的代码:

  1. 安装nest_asyncio:
pip install nest_asyncio
  1. 在你的代码中应用nest_asyncio:
import nest_asyncio
nest_asyncio.apply()
  1. 更新你的Sanic应用:
import nest_asyncio
from sanic import Sanic
from sanic.response import json
from your_module import RaptorRetriever, RetrieverQueryEngine, OpenAIEmbedding, OpenAI, vector_store, CHAT_TEXT_QA_PROMPT, synth

# Apply nest_asyncio
nest_asyncio.apply()

app = Sanic("MyApp")

retriever = RaptorRetriever(
    [],
    embed_model=OpenAIEmbedding(
        model="text-embedding-3-small", api_key=api_key, api_base=base_url
    ),
    llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    vector_store=vector_store,
    similarity_top_k=2,
    mode="tree_traversal",
)

query_engine = RetrieverQueryEngine.from_args(
    retriever, llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    text_qa_template=CHAT_TEXT_QA_PROMPT,
    streaming=True,
    response_synthesizer=synth,
    use_async=True
)

@app.route("/test", methods=['POST'])
async def test(req):
    res = await query_engine.aretrieve("who are you")
    return json(res)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8777, workers=1, access_log=False)

通过应用nest_asyncio,你可以避免RuntimeError并运行你的Sanic网络服务器,同时与其他异步任务一起进行。

  • 要继续与我交谈,请提及@dosu。*
wvmv3b1j

wvmv3b1j2#

我看到uvloop,所以我猜你正在使用fastapi。
尝试设置循环类型 unicorn.run(...., loop="asyncio")

gg58donl

gg58donl3#

我看到uvloop,所以我猜你正在使用fastapi。
尝试设置循环类型unicorn.run(...., loop="asyncio")
我使用的是Sanic。

1yjd4xko

1yjd4xko4#

你好,@ljhssga!👋我在这里帮助你解决任何bug、问题或贡献。我是一个Maven机器人,旨在协助你在等待人类维护者时提供帮助。
要解决在使用Sanic作为网络服务器并使用RetrieverQueryEngine查询时出现的RuntimeError: this event loop is already running问题,你可以使用nest_asyncio库。这个库允许你在已经运行的事件循环中嵌套asyncio事件循环,这可以帮助你在一个已经运行的事件循环中运行事件循环。
以下是如何修改你的代码:

  1. 安装nest_asyncio:
pip install nest_asyncio
  1. 在你的代码中应用nest_asyncio:
import nest_asyncio
nest_asyncio.apply()
  1. 更新你的Sanic应用:
import nest_asyncio
from sanic import Sanic
from sanic.response import json
from your_module import RaptorRetriever, RetrieverQueryEngine, OpenAIEmbedding, OpenAI, vector_store, CHAT_TEXT_QA_PROMPT, synth

# Apply nest_asyncio
nest_asyncio.apply()

app = Sanic("MyApp")

retriever = RaptorRetriever(
    [],
    embed_model=OpenAIEmbedding(
        model="text-embedding-3-small", api_key=api_key, api_base=base_url
    ),
    llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    vector_store=vector_store,
    similarity_top_k=2,
    mode="tree_traversal",
)

query_engine = RetrieverQueryEngine.from_args(
    retriever, llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    text_qa_template=CHAT_TEXT_QA_PROMPT,
    streaming=True,
    response_synthesizer=synth,
    use_async=True
)

@app.route("/test", methods=['POST'])
async def test(req):
    res = await query_engine.aretrieve("who are you")
    return json(res)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8777, workers=1, access_log=False)

通过应用nest_asyncio,你可以避免RuntimeError并在其他异步任务 1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_06_02_23.json) 2(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_05_25_23.json) 的同时运行你的Sanic网络服务器。

  • 要继续与我交谈,请提及@dosu。*

它不起作用

a8jjtwal

a8jjtwal5#

要解决在使用Sanic和RetrieverQueryEngine时出现的RuntimeError: this event loop is already running问题,你可以尝试以下步骤:

  1. 确保nest_asyncio被正确应用:
import nest_asyncio
nest_asyncio.apply()
  1. 修改你的Sanic路由以使用异步方法:
from sanic import Sanic, response
from sanic.exceptions import SanicException
from your_module import RaptorRetriever, RetrieverQueryEngine, OpenAIEmbedding, OpenAI, vector_store, CHAT_TEXT_QA_PROMPT, synth

app = Sanic("MyApp")

retriever = RaptorRetriever(
    [],
    embed_model=OpenAIEmbedding(
        model="text-embedding-3-small", api_key=api_key, api_base=base_url
    ),
    llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    vector_store=vector_store,
    similarity_top_k=2,
    mode="tree_traversal",
)

query_engine = RetrieverQueryEngine.from_args(
    retriever, llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=api_key, api_base=base_url),
    text_qa_template=CHAT_TEXT_QA_PROMPT,
    streaming=True,
    response_synthesizer=synth,
    use_async=True
)

@app.route("/test", methods=['POST'])
async def test(req):
    try:
        res = await query_engine.aretrieve("who are you")
        return response.json(res)
    except Exception as e:
        raise SanicException(f"Error processing query: {str(e)}", status_code=500)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8777, workers=1, access_log=False)
  • 确保没有运行冲突的事件循环 :
  • 确保你的代码中没有其他部分试图并发运行事件循环。通过应用nest_asyncio并确保使用异步方法,你应该能够避免RuntimeError并运行你的Sanic Web服务器,同时处理其他异步任务1(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_06_02_23.json)2(https://github.com/run-llama/llama_index/blob/main/docs/docs/examples/discover_llamaindex/document_management/discord_dumps/help_channel_dump_05_25_23.json)。
  • 要继续与Dosu交流,请提及@dosu。
yc0p9oo0

yc0p9oo06#

我尝试添加

import nest_asyncio
nest_asyncio.apply()

但它仍然不起作用。

相关问题