geekan / MetaGPT

🌟 The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming
https://deepwisdom.ai/
MIT License
44.23k stars 5.26k forks source link

about metagpt's output in the web #1301

Open kiedeng opened 4 months ago

kiedeng commented 4 months ago

麻烦大佬们了!! 目的:假设想弄一个简易化的多智能体平台,用户能创建类似于gtps和助手工具,或者是coze的那种效果,然后在web界面上能实现这些功能并使用,不是只能在终端进行操作

具体的操作:在应用的数据解释器的过程中,我想将关键信息的输出和交互放到web界面进行操作,我使用的flask做后端,我希望实现是当用户问问题的时候,能将 打印执行计划,执行结果或者是需要人工介入的部分通过流式方法返回给前端,让前端能在界面上显示。 我想到了一个方案是使用队列,当前端访问路由 /stream 的时候,我异步请求完generate_async_stream就一直轮询查看队列的数据,当 DataInterpreter 有我需要的数据的时候,我就将该数据put到队列中,直到流程结束,输出一个流结束的标识。

对于我想有几个问题:

  1. 有没有其他办法使用我想要的目的呢?能给我一些参考资源或者其他知识吗?
  2. 如果我方案可行的话,我该怎么在DataInterpreter 中传入这个队列 对象进去,让它能在metagpt中自由put数据,然后流式输出到前端?或者是其他办法?
  3. 人工需要介入的部分,使用flask的话应该怎么交互呢?

下面是示例代码:

from flask import Flask, Response, stream_with_context, render_template
import asyncio
import threading
import queue as sync_queue

from metagpt.roles.di.data_interpreter import DataInterpreter

app = Flask(__name__)

async def generate_async_stream(queue):
    requirement = "解决这个数学问题:正整数m和n的最大公约数是6。m和n的最小公倍数是126。m + n的最小可能值是多少?"
    di = DataInterpreter(data_queue=queue)
    await di.run(requirement)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    queue = sync_queue.Queue()

    def run_loop(queue):
        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        loop.run_until_complete(generate_async_stream(queue))

    thread = threading.Thread(target=run_loop, args=(queue,))
    thread.start()

    def generate_sync_stream():
        while True:
            message = queue.get()
            if message is None:
                break
            yield f"data: {message}\n\n"

    return Response(stream_with_context(generate_sync_stream()), content_type='text/event-stream')

if __name__ == '__main__':
    app.run(debug=True, threaded=True)
qwas982 commented 4 months ago

我认为架构都要重新设计,

大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画,

但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是;

1给大模型增添输入/输出访问能力的外部插件,

2大模型必须得具备多模态的能力,

你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助.

摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

qwas982 commented 4 months ago

剩下的就是用comfyUI这种通过节点_连线_图形块_增删改查算法参数的方式创造一种任务管理器,
让大模型根据任务管理器里用户写好的任务,顺序或跳转地执行.直到完成一个项目或任务,这样地做事.
我刚刚又想到的.

garylin2099 commented 4 months ago

麻烦大佬们了!! 目的:假设想弄一个简易化的多智能体平台,用户能创建类似于gtps和助手工具,或者是coze的那种效果,然后在web界面上能实现这些功能并使用,不是只能在终端进行操作

具体的操作:在应用的数据解释器的过程中,我想将关键信息的输出和交互放到web界面进行操作,我使用的flask做后端,我希望实现是当用户问问题的时候,能将 打印执行计划,执行结果或者是需要人工介入的部分通过流式方法返回给前端,让前端能在界面上显示。 我想到了一个方案是使用队列,当前端访问路由 /stream 的时候,我异步请求完generate_async_stream就一直轮询查看队列的数据,当 DataInterpreter 有我需要的数据的时候,我就将该数据put到队列中,直到流程结束,输出一个流结束的标识。

对于我想有几个问题:

  1. 有没有其他办法使用我想要的目的呢?能给我一些参考资源或者其他知识吗?
  2. 如果我方案可行的话,我该怎么在DataInterpreter 中传入这个队列 对象进去,让它能在metagpt中自由put数据,然后流式输出到前端?或者是其他办法?
  3. 人工需要介入的部分,使用flask的话应该怎么交互呢?

下面是示例代码:

from flask import Flask, Response, stream_with_context, render_template
import asyncio
import threading
import queue as sync_queue

from metagpt.roles.di.data_interpreter import DataInterpreter

app = Flask(__name__)

async def generate_async_stream(queue):
    requirement = "解决这个数学问题:正整数m和n的最大公约数是6。m和n的最小公倍数是126。m + n的最小可能值是多少?"
    di = DataInterpreter(data_queue=queue)
    await di.run(requirement)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    queue = sync_queue.Queue()

    def run_loop(queue):
        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        loop.run_until_complete(generate_async_stream(queue))

    thread = threading.Thread(target=run_loop, args=(queue,))
    thread.start()

    def generate_sync_stream():
        while True:
            message = queue.get()
            if message is None:
                break
            yield f"data: {message}\n\n"

    return Response(stream_with_context(generate_sync_stream()), content_type='text/event-stream')

if __name__ == '__main__':
    app.run(debug=True, threaded=True)

可使用 https://github.com/geekan/MetaGPT/blob/main/metagpt/logs.py 这里的set_llm_stream_logfunc,改写_llm_stream_log函数,将其从本地终端print,改写为向你需要的地方上报

2495165664 commented 4 months ago

可以看看这次提交的,有个实现你说的这个构想,#1118

kiedeng commented 4 months ago

我认为架构都要重新设计,

大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画,

但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是;

1给大模型增添输入/输出访问能力的外部插件,

2大模型必须得具备多模态的能力,

你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助.

摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

我认为架构都要重新设计,

大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画,

但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是;

1给大模型增添输入/输出访问能力的外部插件,

2大模型必须得具备多模态的能力,

你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助.

摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

暂时没打算让它自动取控制我电脑的操作呢,,我只是打算弄一个web ui,让它能对结果流式输出

kiedeng commented 4 months ago

麻烦大佬们了!! 目的:假设想弄一个简易化的多智能体平台,用户能创建类似于gtps和助手工具,或者是coze的那种效果,然后在web界面上能实现这些功能并使用,不是只能在终端进行操作 具体的操作:在应用的数据解释器的过程中,我想将关键信息的输出和交互放到web界面进行操作,我使用的flask做后端,我希望实现是当用户问问题的时候,能将 打印执行计划,执行结果或者是需要人工介入的部分通过流式方法返回给前端,让前端能在界面上显示。 我想到了一个方案是使用队列,当前端访问路由 /stream 的时候,我异步请求完generate_async_stream就一直轮询查看队列的数据,当 DataInterpreter 有我需要的数据的时候,我就将该数据put到队列中,直到流程结束,输出一个流结束的标识。 对于我想有几个问题:

  1. 有没有其他办法使用我想要的目的呢?能给我一些参考资源或者其他知识吗?
  2. 如果我方案可行的话,我该怎么在DataInterpreter 中传入这个队列 对象进去,让它能在metagpt中自由put数据,然后流式输出到前端?或者是其他办法?
  3. 人工需要介入的部分,使用flask的话应该怎么交互呢?

下面是示例代码:

from flask import Flask, Response, stream_with_context, render_template
import asyncio
import threading
import queue as sync_queue

from metagpt.roles.di.data_interpreter import DataInterpreter

app = Flask(__name__)

async def generate_async_stream(queue):
    requirement = "解决这个数学问题:正整数m和n的最大公约数是6。m和n的最小公倍数是126。m + n的最小可能值是多少?"
    di = DataInterpreter(data_queue=queue)
    await di.run(requirement)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    queue = sync_queue.Queue()

    def run_loop(queue):
        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        loop.run_until_complete(generate_async_stream(queue))

    thread = threading.Thread(target=run_loop, args=(queue,))
    thread.start()

    def generate_sync_stream():
        while True:
            message = queue.get()
            if message is None:
                break
            yield f"data: {message}\n\n"

    return Response(stream_with_context(generate_sync_stream()), content_type='text/event-stream')

if __name__ == '__main__':
    app.run(debug=True, threaded=True)

可使用 https://github.com/geekan/MetaGPT/blob/main/metagpt/logs.py 这里的set_llm_stream_logfunc,改写_llm_stream_log函数,将其从本地终端print,改写为向你需要的地方上报

这种方式可能还是不大行,因为我在中途只是要流式得到一部分的打印数据,比如它的思考规划的日志,获取人工介入的情况,重置日志打印的通道的话,会将所有打印的日志输出

GalaxyNew commented 4 months ago

我认为架构都要重新设计,

大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画,

但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是;

1给大模型增添输入/输出访问能力的外部插件,

2大模型必须得具备多模态的能力,

你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助.

摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

### 把鼠标或键盘的输入控制交给大模型 这个怎么实现呢?

kiedeng commented 3 months ago

麻烦大佬们了!! 目的:假设想弄一个简易化的多智能体平台,用户能创建类似于gtps和助手工具,或者是coze的那种效果,然后在web界面上能实现这些功能并使用,不是只能在终端进行操作 具体的操作:在应用的数据解释器的过程中,我想将关键信息的输出和交互放到web界面进行操作,我使用的flask做后端,我希望实现是当用户问问题的时候,能将 打印执行计划,执行结果或者是需要人工介入的部分通过流式方法返回给前端,让前端能在界面上显示。 我想到了一个方案是使用队列,当前端访问路由 /stream 的时候,我异步请求完generate_async_stream就一直轮询查看队列的数据,当 DataInterpreter 有我需要的数据的时候,我就将该数据put到队列中,直到流程结束,输出一个流结束的标识。 对于我想有几个问题:

  1. 有没有其他办法使用我想要的目的呢?能给我一些参考资源或者其他知识吗?
  2. 如果我方案可行的话,我该怎么在DataInterpreter 中传入这个队列 对象进去,让它能在metagpt中自由put数据,然后流式输出到前端?或者是其他办法?
  3. 人工需要介入的部分,使用flask的话应该怎么交互呢?

下面是示例代码:

from flask import Flask, Response, stream_with_context, render_template
import asyncio
import threading
import queue as sync_queue

from metagpt.roles.di.data_interpreter import DataInterpreter

app = Flask(__name__)

async def generate_async_stream(queue):
    requirement = "解决这个数学问题:正整数m和n的最大公约数是6。m和n的最小公倍数是126。m + n的最小可能值是多少?"
    di = DataInterpreter(data_queue=queue)
    await di.run(requirement)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/stream')
def stream():
    queue = sync_queue.Queue()

    def run_loop(queue):
        asyncio.set_event_loop(asyncio.new_event_loop())
        loop = asyncio.get_event_loop()
        loop.run_until_complete(generate_async_stream(queue))

    thread = threading.Thread(target=run_loop, args=(queue,))
    thread.start()

    def generate_sync_stream():
        while True:
            message = queue.get()
            if message is None:
                break
            yield f"data: {message}\n\n"

    return Response(stream_with_context(generate_sync_stream()), content_type='text/event-stream')

if __name__ == '__main__':
    app.run(debug=True, threaded=True)

可使用 https://github.com/geekan/MetaGPT/blob/main/metagpt/logs.py 这里的set_llm_stream_logfunc,改写_llm_stream_log函数,将其从本地终端print,改写为向你需要的地方上报

可以看看这次提交的,有个实现你说的这个构想,#1118

哥,我在使用的过程中,好像无法使用 if self.stream_pipe: self.stream_pipe.set_message(self.main_title) 这种方式将信息加入Pipe队列中,我应该怎么写呢?能麻烦给我一个样例吗?

qwas982 commented 3 months ago

我认为架构都要重新设计, 大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画, 但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是; 1给大模型增添输入/输出访问能力的外部插件, 2大模型必须得具备多模态的能力, 你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助. 摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

### 把鼠标或键盘的输入控制交给大模型 这个怎么实现呢?

我认为是调用系统的I/O相关API, 就像屏幕键盘一样可以完成物理键盘一般的输入效果

qwas982 commented 3 months ago

我认为架构都要重新设计, 大模型它不可能自动访问周边的工具,虽然都在电脑里,在操作系统里, 在这种情况下,用py写一些代码去控制大模型做事,有些疲于奔命 南辕北辙. 最好的方式是让大模型自动识别代理工作流的各步骤,让它模仿人的操作流程, 让它写码就在VSCode里写,访问网页就在浏览器里浏览,画图就用blender画, 但是大模型没长手,这种情况下怎么办? 大模型如何去启动这些工具,如何在工具里操作? 微软最近的发布会Build 2024给出了答案,

放一个摄像头照屏幕,把图像实时传输给大模型,把鼠标或键盘的输入控制交给大模型,

这里得出的结论是; 1给大模型增添输入/输出访问能力的外部插件, 2大模型必须得具备多模态的能力, 你懂吧? 不能光靠软件的形式创造出代理工作流,"用py写一些代码去控制大模型做事",这根本不够. 还要有物理的辅助. 摄像头现在几乎每个人都有,那就是手机上的3到5个摄像头,连上电脑就能用.你对准屏幕就是, 但是多模态的大模型就难了点,现在能像GPT4o用得这么圆滑 圆润的仅此一家, 要是开源的,本地能跑的,几乎没有. ollama我试过,本地跑速度也不够快,因为没有优化过,光靠ollama一家也不够. 在线大模型必须要联网,还要钱,这就阻挡了大部分人, 现实里的大部分人都是小白,动手能力也差,对这些懂得很少,成本高的望而却步, 复杂的东西,普通的人注意力都不会集中. 但你不能否认的是,如果普通人参与得多才能建立起更多大模型生态, 仅靠现在业内的这点儿人,你连找个问题的解决方案都找不到,普通使用问题的答案你也求不到, 一点想法, 欢迎探讨.

### 把鼠标或键盘的输入控制交给大模型 这个怎么实现呢?

我认为是调用系统的I/O相关API, 就像屏幕键盘一样可以完成物理键盘一般的输入效果