首页 > 编程问答 >子进程中的超时参数在 chainlit 应用程序中不起作用

子进程中的超时参数在 chainlit 应用程序中不起作用

时间:2024-07-29 05:51:57浏览次数:10  
标签:python chainlit graphrag

我有一个脚本可以为在 Windows 中运行的 GraphRAG 应用程序构建 Chainlit UI。 GraphRAG 查询在终端中运行良好,尽管需要大约 120 秒(附有屏幕截图)。但是,当我运行此 Chainlit 脚本时,subprocess.run 中的 timeout=300 无法按预期工作。相反,我在大约 60 秒后收到“无法到达服务器”错误,尽管最终返回了结果(还附上了终端屏幕截图)。如何强制脚本等待收到响应?

import chainlit as cl
import subprocess
import shlex

@cl.on_chat_start
def start():
    cl.user_session.set("history", [])
    # cl.set_theme(cl.Theme(background="white"))
    # cl.set_header("Duality Expert Chat")


@cl.on_message
async def main(message: cl.Message):
    history = cl.user_session.get("history")

    query = message.content

    cmd = [
        "python", "-m", "graphrag.query",
        "--root", r"C:\Users\Lei Shang\Documents\Projects\LLM_RAG\GraphRAG_ollama_LMStudio_chainlit\graphRag\mistral-large\graphRag-mistral-large",
        "--method", "global",
    ]

    cmd.append(shlex.quote(query))

    try:
        print(cmd)
        result = subprocess.run(cmd, capture_output=True, text=True, check=True, timeout=300)
        print(result)
        output = result.stdout

        # extract content tailing "SUCCESS: Global Search Response:" 
        response = output.split("SUCCESS: Global Search Response:", 1)[-1].strip()

        history.append((query, response))
        cl.user_session.set("history", history)

        await cl.Message(content=response).send()
    except subprocess.CalledProcessError as e:
        error_message = f"An error occurred: {e.stderr}"
        await cl.Message(content=error_message).send()


if __name__ == "__main__":
    cl.run()

enter image description here

enter image description here

enter image description here


遇到的问题似乎与 subprocess 中的超时参数无关,而是与 Chainlit 如何处理长时间运行的请求有关。 默认情况下,Chainlit 可能有一个比 60 秒短的超时时间,即使 subprocess.run 允许该进程运行 300 秒,也会导致“无法到达服务器”错误。

可以尝试以下几种解决方案:

1. 增加 Chainlit 超时:

不幸的是,Chainlit 目前没有提供直接增加超时时间的方法。 可以尝试以下方法:

  • 使用自定义服务器: 可以使用像 Flask 或 FastAPI 这样的框架创建自己的 Chainlit 服务器,并在其中设置更长的超时时间。
  • 联系 Chainlit 开发人员: 可以联系 Chainlit 开发人员,看看他们是否计划在未来版本中添加对自定义超时的支持。

2. 使用异步执行:

与其使用 subprocess.run 同步运行 GraphRAG 查询,不如尝试使用 asyncio 模块异步运行它。 这将允许 Chainlit 在等待响应时继续处理其他请求。

以下是如何使用 asyncio 运行 GraphRAG 查询的示例:

import asyncio
import chainlit as cl
import shlex

@cl.on_chat_start
def start():
    cl.user_session.set("history", [])


@cl.on_message
async def main(message: cl.Message):
    history = cl.user_session.get("history")
    query = message.content

    cmd = [
        "python", "-m", "graphrag.query",
        "--root", r"C:\Users\Lei Shang\Documents\Projects\LLM_RAG\GraphRAG_ollama_LMStudio_chainlit\graphRag\mistral-large\graphRag-mistral-large",
        "--method", "global",
        shlex.quote(query),
    ]

    try:
        print(cmd)
        # 使用 asyncio 创建一个子进程
        proc = await asyncio.create_subprocess_exec(
            *cmd,
            stdout=asyncio.subprocess.PIPE,
            stderr=asyncio.subprocess.PIPE,
        )

        # 异步读取输出
        stdout, stderr = await proc.communicate()
        output = stdout.decode()

        # ... 处理输出并发送回复 ...

    except Exception as e:
        error_message = f"An error occurred: {e}"
        await cl.Message(content=error_message).send()


if __name__ == "__main__":
    cl.run()

3. 将 GraphRAG 查询移至后台任务:

可以将 GraphRAG 查询移至单独的后台任务或工作队列中。 这将允许 Chainlit 立即返回响应,并在后台任务完成后更新 UI。 可以使用 Celery 或 Redis Queue 等工具来管理后台任务。

请注意,这些解决方案都需要对的代码进行更广泛的更改。 选择最适合的方法取决于的具体需求和应用程序的体系结构。

标签:python,chainlit,graphrag
From: 78804834

相关文章

  • Python Discord Bot 的应用程序命令的区域设置名称(多语言别名)
    如何根据用户的语言设置,使应用程序命令的名称具有不同的名称例如,如果一个用户将其discord的语言设置为英语,则用户可以看到英语的应用程序命令名称。另一方面,如果另一个用户将其不和谐语言设置为法语,则用户可以看到法语中的相同应用程序命令的名称。为此,我尝试使用ap......
  • 如何在Python中添加热键?
    我正在为游戏制作一个机器人,我想在按下热键时调用该函数。我已经尝试了一些解决方案,但效果不佳。这是我的代码:defstart():whileTrue:ifkeyboard.is_pressed('alt+s'):break...defmain():whileTrue:ifkeyboard.is_pr......
  • 在Python中解压文件
    我通读了zipfile文档,但不明白如何解压缩文件,只了解如何压缩文件。如何将zip文件的所有内容解压缩到同一目录中?importzipfilewithzipfile.ZipFile('your_zip_file.zip','r')aszip_ref:zip_ref.extractall('target_directory')将......
  • 如何在Python中从RSA公钥中提取N和E?
    我有一个RSA公钥,看起来像-----BEGINPUBLICKEY-----MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAvm0WYXg6mJc5GOWJ+5jkhtbBOe0gyTlujRER++cvKOxbIdg8So3mV1eASEHxqSnp5lGa8R9Pyxz3iaZpBCBBvDB7Fbbe5koVTmt+K06o96ki1/4NbHGyRVL/x5fFiVuTVfmk+GZNakH5dXDq0fwvJyVmUtGYA......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • 使用 Matplotlib 的 Python 代码中出现意外的控制流
    Ubuntu22.04上的此Python3.12代码的行为符合预期,除非我按q或ESC键退出。代码如下:importnumpyasnp,matplotlib.pyplotaspltfrompathlibimportPathfromcollectionsimportnamedtuplefromskimage.ioimportimreadfrommatplotlib.widgets......
  • 参考 - Python 类型提示
    这是什么?这是与在Python中使用类型提示主题相关的问题和答案的集合。这个问题本身就是一个社区维基;欢迎大家参与维护。这是为什么?Python类型提示是一个不断增长的话题,因此许多(可能的)新问题已经被提出,其中许多甚至已经有了答案。该集合有助于查找现有内容。范......
  • 我的 Python 程序中解决 UVa 860 的运行时错误 - 熵文本分析器
    我正在尝试为UVa860编写一个解决方案,但是当我通过vJudge发送它时,它一直显示“运行时错误”。fromsysimportstdinimportmathdefmain():end_of_input=Falselambda_words=0dictionary={}text_entropy=0relative_entropy=0whilenotend_of_in......
  • Python进度条
    当我的脚本正在执行某些可能需要时间的任务时,如何使用进度条?例如,一个需要一些时间才能完成并在完成后返回True的函数。如何在函数执行期间显示进度条?请注意,我需要实时显示进度条,所以我不知道该怎么办。我需要thread为此吗?我不知道。现在在执行函数......
  • 此 Python 代码给出了超出时间限制的错误。由于其中使用的输入或输出方法而在其中传递
    N=int(input())L1=input()L=L1.split()s=set(L)d={}foreins:d[e]=L.count(e)print(d)max_value=max(d.values())print(max_value)L=list(d.values())print(L)res=L.count(max_value)print(res)/在提供正常输入时,它运行良好,但在提......