MetaGPT day01: MetaGPT作者代码走读、软件公司初始示例

LLM发展历史

  • 2013年word2vec提出,但效果不好

  • 2017年Transformer结构提出,降低网络复杂度

  • 2018年BERT预训练语言模型效果显著提升

  • 2019年GPT-3推出,采用大规模预训练

  • 2020年Instruction Tuning提出,实现零样本学习

  • 2022年InstructGPT解决模型毒性问题

  • 当前GPT-4成本高但效果最好

SOP

python 复制代码
# 定义
所谓SOP,是 Standard Operation Procedure三个单词中首字母的大写,即'标准作业程序'(标准操作程序),就是将某一事件的标准操作步骤和要求以统一的格式描述出来,用来指导和规范日常的工作。

metagpt设计哲学

python 复制代码
# metagpt定位:
多智能体框架。Metagpt是一个多智能体框架,构建了由多个智能体组成的软件公司。这些智能体在软件公司内协同工作完成实际项目。

# metagpt设计哲学:
软件公司核心资产:
	1.可运行的代码
	2.SOP(标准操作程序)
	3.团队
可运行的代码的实现取决于SOP和团队的协同努力。这三者构成了软件公司的核心资产,形成了Metagpt的设计哲学。
可运行的代码=sop+团队

# SOP的价值
SOP的重要性体现在其价值上,如华为花费100亿美元找ABIBN做SOP。
SOP是一项困难的工作,因为它涉及到对工作的抽象和总结。

例如,让一个创业公司编写今日头条的推荐系统。这样的工作对于一个架构师可能需要数月时间,需要绘制今日头条推荐系统的架构图。今日头条的推荐系统的架构图具有很高的价值,但是闭源。LLM可以通过互联网上的信息和各种猜测,进行整体总结翻译推理,最终得到一个架构图。(如下图所示)

# SOP提高智能体能力
例如,使用llm推理数学公式、证明数学假设,gpt4推理一次有20%成功率,如果有sop监督,1000次测试能做到80%成功率。
SOP在提高智能体推理和执行任务的准确性和效率方面有重要作用。

示例:启动一个创业公司

安装可以参考官方文档:MetaGPT: 多智能体框架 | MetaGPT (deepwisdom.ai)

python 复制代码
import asyncio
from metagpt.roles import (
    Architect,
    Engineer,
    ProductManager,
    ProjectManager,
)
from metagpt.team import Team

async def startup(idea: str):
    company = Team()
    company.hire(
        [
            ProductManager(),
            Architect(),
            ProjectManager(),
            Engineer(),
        ]
    )
    company.invest(investment=3.0)  # 提供3美元的资金,如果超出就停止
    company.run_project(idea=idea)

    await company.run(n_round=5)  # 这个项目跑5轮

asyncio.run(startup(idea="write a cli blackjack game"))  # blackjack: 二十一点

'''
问题:
UserWarning: Pydantic serializer warnings in Pydantic V2
解决:
pip install -U pydantic datamodel-code-generator

问题:
metagpt.utils.common:log_it:438 - Finished call to 'metagpt.actions.action_node.ActionNode._aask_v1' after 285.140(s)
原因:
通过调试,我确定了问题的关键,这可能是由两个原因引起的。
1.zhipuAPI在很多情况下都无法返回正确的JSON格式。
例如:
	"标题": "MySQL教程",
	"目录": [{
			"目录1": [{
					"标题1": "MySQL简介",
					"内容1": "本章节将介绍MySQL的基本概念、特点和应用场景。"

2.太小的 LLM 模型(<13b 等)可能无法识别 json 是什么。
例如:
# MySQL 教程
## 一、MySQL概述
### 1.1 MySQL简介
### 1.2 MySQL的发展历程
### 1.3 MySQL的应用场景
### 1.4 MySQL的优势
解决:
开启重试 REPAIR_LLM_OUTPUT: true 
由于它是一个多代理/多操作管道,我们需要从 llm 输出中解析的结构来继续该过程。也许您可以定义自定义解析器来处理输出,但这会花费时间。
'''

运行代码会自动创建workspace和以下文件:(建议不要修改config.yaml,新建key.yaml配置apikey,靠上面的api优先使用。)

gpt-3.5-turbo上下文长度不够,使用gpt-3.5-turbo-16k跑通,给了8轮运行,结果写出来的代码不能运行。
zhipuai 跑不通,github上issue提到因为无法返回正确的JSON格式。

metagpt项目结构

python 复制代码
# metagpt产品规划蓝图(road map)
长远目标:希望metagpt能够实现自我进化,不断提升自身的智能水平和适应能力。
短期目标:实现2000行左右代码的自动化,通过精细化的编程,使metagpt在短期内能够执行各种任务和行为。

# 项目目录说明
actions
定义了metagpt执行的各种行为。
例如写一篇文章、进行代码审查等。actions和工具不同,而是一种操作模式。

document_store
用于统一管理和存储各种文档和信息。
类似于腾讯文档或飞书文档,是一个聚拢所有智能体输入键的地方。

learn
包含了标准化的学习流程和复用流程。
指导大模型如何学习并提高性能。为metagpt提供更高效的学习路径。

management
用于自动化生成智能体角色。
类似于人类世界通过职业培训培养各种人才,management模块旨在标准化和完整撰写智能体的培训过程,以完成团队的生产和管理。

memory
包括短期记忆和长期记忆。
使metagpt能够更好地理解和记忆先前的信息,实现更加智能和连贯的交互。

prompt
定义了提示词。
用于触发metagpt执行特定的任务或生成特定类型的内容。

provider
规定了如何调用第三方API。
使metagpt能够支持更多的LLM(Language Model)并且不耦合于本地LLM或组件,提高灵活性。

roles
定义了各种角色。
metagpt不局限于多智能体,也就是说可以将多智能体中的某个角色拿出来单独使用,在不同场景中灵活应用。
比如程序员可以在公司工作也可以在外面接单。
例如,销售、客服在多个场景都有用处。

tools
定义了第三方工具、api。
比如:stable diffusion、Midjourney等

utils
表示实现通用功能或算法的代码,这些功能或算法可以被多个模块或应用程序使用。

environment.py:环境,这个环境是有记忆的。承载一批角色,角色可以向环境发布消息,可以被其他角色观察到。类比于工作群:微信群、飞书群。

inspect_module.py:为了后续进行已有模块接管的工作。比如我们有一个已有的工程,我们希望能够接管已有的模块。
先反解已有模块的数据结构和api -反解-> 画出流程图、写出需求文档 
在此之上进行思考如何修改代码。
比如将贪吃蛇的颜色改成红色,这看起来程序员直接修改即可,但是实际上不行,需要产品经理先改需求文档,这涉及到了工作流。
因此我们需要将某个具体事情,反解出来,因此需要inspect_module.py。

company.run_project(idea=idea):每次去看看有没有余额,然后让环境中的每个智能体都跑起来。
hire:往环境里面雇佣(增加)智能体。
invest:设置一个最大预算。
check_balance:查看当前开销是否高于最大预算。   

QA

整场直播回放:https://www.bilibili.com/video/BV1Ru411V7XL/

python 复制代码
# https://github.com/geekan/MetaGPT/blob/main/docs/ROADMAP.md
Q: 智能体在运行中可以加入反馈吗?
A: 支持人类确认和修改。
贪吃蛇软件。人类提出意见,修改贪吃蛇颜色为橙色。
这需要一个路由系统确定这个意见给谁?
比如给了程序员,但是ui角色已经将贪吃蛇的图画成了绿色。
所有应该按照顺序:
意见 --> 产品经理 --> 架构师 --> 程序员评估哪些重写、哪些不重写

Q: METAGPT不需要其他模型的训练过程吗?
A: metagpt的训练和运行是独立的。训练的部分在标准化产品act里:https://act-canary.test.metadl.com/。
Metagpt只有运用的功能,如果需要训练需要调这个act平台的api。

补充:

python 复制代码
# ReAct
# 来源: https://juejin.cn/post/7259018705786339385

ReAct是Reasoning and Acting缩写,意思是大模型可以根据逻辑推理(Reason),构建完整系列行动(Act),从而达成期望目标。
ReAct方式的关键就是协调大语言模型和外部的信息获取,与其他功能交互:大模型是大脑,通过ReAct框架可以让大脑来控制手和脚。

在ReAct流程中,我们可以抓住三个关键的元素:
思考(Thought): 思考是由大模型创建的,为其行为和决定提供理论支撑。我们可以通过分析大模型的思考过程,来评估其即将采取的行动是否符合逻辑。它作为一个关键指标,能够帮助我们判断其决策的合理性。相比于人类的决策,Thought的存在赋予了大模型更出色的可解释性和可信度。

行动(Act): 行动代表大模型认为需要采取的具体行为。行动一般由两个部分构成:动作和目标,这在编程中对应着API名称和其输入参数。大模型的一大优点在于,它可以根据思考的结果,选择合适的API并生成所需的参数。这确保了ReAct框架在执行方面的实用性。

观察(Obs): 观察代表大模型如何获取外部输入。它就像大模型的感知系统,将环境的反馈信息同步给大模型,帮助它进一步进行分析或者决策。