diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 32deb48b..df5dafed 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -17,13 +17,13 @@ const Logo = ` `; const sources = ['blog', 'rfcs']; -const dests = ['zhcn', 'enus']; +const dests = ['zh', 'en']; // route based on fs, so copy files when deploy if (process.env.NODE_ENV === 'production') { /** for deploy */ cpSync( - resolve(__dirname, '../src/enus/index.md'), + resolve(__dirname, '../src/en/index.md'), resolve(__dirname, '../src/index.md') ); for (const source of sources) { @@ -89,24 +89,24 @@ export default defineConfig({ root: { label: 'English', lang: 'en', - link: '/enus/', + link: '/en/', themeConfig: { nav: [ { text: 'Docs', - link: '/enus/guide/get_started/introduction', - activeMatch: '/enus/guide/', + link: '/en/guide/get_started/introduction', + activeMatch: '/en/guide/', }, ...arrVisible( [ { text: 'Blog', - link: '/enus/blog/agents', + link: '/en/blog/agents', activeMatch: '/blog/', }, { text: 'RFCs', - link: '/enus/rfcs/RFC-116-MetaGPT优化方案', + link: '/en/rfcs/RFC-116-MetaGPT优化方案', activeMatch: '/euns/rfcs/', }, ], @@ -115,8 +115,8 @@ export default defineConfig({ ...getVersions(), ], sidebar: { - '/enus/guide/': { - base: '/enus/guide/', + '/en/guide/': { + base: '/en/guide/', items: [ { text: 'Get Started', @@ -231,8 +231,8 @@ export default defineConfig({ }, ], }, - '/enus/blog/': { - base: '/enus/blog/', + '/en/blog/': { + base: '/en/blog/', items: [ { text: 'Agents', @@ -240,8 +240,8 @@ export default defineConfig({ }, ], }, - '/enus/rfcs/': { - base: '/enus/rfcs/', + '/en/rfcs/': { + base: '/en/rfcs/', items: [ { text: 'RFC-116-MetaGPT优化方案', @@ -252,28 +252,28 @@ export default defineConfig({ }, }, }, - zhcn: { + zh: { label: '中文', - lang: 'zhcn', - link: '/zhcn/', + lang: 'zh', + link: '/zh/', themeConfig: { nav: [ { text: '文档', - link: '/zhcn/guide/get_started/introduction', - activeMatch: '/zhcn/guide/', + link: '/zh/guide/get_started/introduction', + activeMatch: '/zh/guide/', }, ...arrVisible( [ { text: '博客', - link: '/zhcn/blog/agents', - activeMatch: '/zhcn/blog/', + link: '/zh/blog/agents', + activeMatch: '/zh/blog/', }, { text: 'RFCs', - link: '/zhcn/rfcs/RFC-116-MetaGPT优化方案', - activeMatch: '/zhcn/rfcs/', + link: '/zh/rfcs/RFC-116-MetaGPT优化方案', + activeMatch: '/zh/rfcs/', }, ], blogAndRfcVisible @@ -281,8 +281,8 @@ export default defineConfig({ ...getVersions(), ], sidebar: { - '/zhcn/guide/': { - base: '/zhcn/guide/', + '/zh/guide/': { + base: '/zh/guide/', items: [ { text: '开始', @@ -418,8 +418,8 @@ export default defineConfig({ }, ], }, - '/zhcn/blog/': { - base: '/zhcn/blog/', + '/zh/blog/': { + base: '/zh/blog/', items: [ { text: 'Agents', @@ -427,8 +427,8 @@ export default defineConfig({ }, ], }, - '/zhcn/rfcs/': { - base: '/zhcn/rfcs/', + '/zh/rfcs/': { + base: '/zh/rfcs/', items: [ { text: 'RFC-116-MetaGPT优化方案', diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index c5368188..a9ad9873 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -152,10 +152,10 @@ } } -html[lang='zhcn'] .VPHome .text { +html[lang='zh'] .VPHome .text { line-height: 128px; } -/* html[lang='zhcn'] .VPHome .tagline { +/* html[lang='zh'] .VPHome .tagline { line-height: 72px; } */ diff --git a/src/enus/guide/api.md b/src/en/guide/api.md similarity index 100% rename from src/enus/guide/api.md rename to src/en/guide/api.md diff --git a/src/enus/guide/contribute/contribute_guide.md b/src/en/guide/contribute/contribute_guide.md similarity index 100% rename from src/enus/guide/contribute/contribute_guide.md rename to src/en/guide/contribute/contribute_guide.md diff --git a/src/enus/guide/contribute/rfc_template.md b/src/en/guide/contribute/rfc_template.md similarity index 100% rename from src/enus/guide/contribute/rfc_template.md rename to src/en/guide/contribute/rfc_template.md diff --git a/src/enus/guide/faq.md b/src/en/guide/faq.md similarity index 100% rename from src/enus/guide/faq.md rename to src/en/guide/faq.md diff --git a/src/enus/guide/get_started/installation.md b/src/en/guide/get_started/installation.md similarity index 100% rename from src/enus/guide/get_started/installation.md rename to src/en/guide/get_started/installation.md diff --git a/src/enus/guide/get_started/introduction.md b/src/en/guide/get_started/introduction.md similarity index 100% rename from src/enus/guide/get_started/introduction.md rename to src/en/guide/get_started/introduction.md diff --git a/src/enus/guide/get_started/quickstart.md b/src/en/guide/get_started/quickstart.md similarity index 100% rename from src/enus/guide/get_started/quickstart.md rename to src/en/guide/get_started/quickstart.md diff --git a/src/enus/guide/get_started/setup.md b/src/en/guide/get_started/setup.md similarity index 100% rename from src/enus/guide/get_started/setup.md rename to src/en/guide/get_started/setup.md diff --git a/src/enus/guide/getting-started.md b/src/en/guide/getting-started.md similarity index 100% rename from src/enus/guide/getting-started.md rename to src/en/guide/getting-started.md diff --git a/src/enus/guide/in_depth_guides/agent_communication.md b/src/en/guide/in_depth_guides/agent_communication.md similarity index 100% rename from src/enus/guide/in_depth_guides/agent_communication.md rename to src/en/guide/in_depth_guides/agent_communication.md diff --git a/src/enus/guide/in_depth_guides/memory.md b/src/en/guide/in_depth_guides/memory.md similarity index 100% rename from src/enus/guide/in_depth_guides/memory.md rename to src/en/guide/in_depth_guides/memory.md diff --git a/src/enus/guide/in_depth_guides/use_own_llm.md b/src/en/guide/in_depth_guides/use_own_llm.md similarity index 100% rename from src/enus/guide/in_depth_guides/use_own_llm.md rename to src/en/guide/in_depth_guides/use_own_llm.md diff --git a/src/enus/guide/tutorials/agent_101.md b/src/en/guide/tutorials/agent_101.md similarity index 100% rename from src/enus/guide/tutorials/agent_101.md rename to src/en/guide/tutorials/agent_101.md diff --git a/src/enus/guide/tutorials/agent_think_act.md b/src/en/guide/tutorials/agent_think_act.md similarity index 100% rename from src/enus/guide/tutorials/agent_think_act.md rename to src/en/guide/tutorials/agent_think_act.md diff --git a/src/enus/guide/tutorials/breakpoint_recovery.md b/src/en/guide/tutorials/breakpoint_recovery.md similarity index 100% rename from src/enus/guide/tutorials/breakpoint_recovery.md rename to src/en/guide/tutorials/breakpoint_recovery.md diff --git a/src/enus/guide/tutorials/concepts.md b/src/en/guide/tutorials/concepts.md similarity index 100% rename from src/enus/guide/tutorials/concepts.md rename to src/en/guide/tutorials/concepts.md diff --git a/src/enus/guide/tutorials/human_engagement.md b/src/en/guide/tutorials/human_engagement.md similarity index 100% rename from src/enus/guide/tutorials/human_engagement.md rename to src/en/guide/tutorials/human_engagement.md diff --git a/src/enus/guide/tutorials/integration_with_open_llm.md b/src/en/guide/tutorials/integration_with_open_llm.md similarity index 100% rename from src/enus/guide/tutorials/integration_with_open_llm.md rename to src/en/guide/tutorials/integration_with_open_llm.md diff --git a/src/enus/guide/tutorials/multi_agent_101.md b/src/en/guide/tutorials/multi_agent_101.md similarity index 100% rename from src/enus/guide/tutorials/multi_agent_101.md rename to src/en/guide/tutorials/multi_agent_101.md diff --git a/src/enus/guide/tutorials/use_memories.md b/src/en/guide/tutorials/use_memories.md similarity index 100% rename from src/enus/guide/tutorials/use_memories.md rename to src/en/guide/tutorials/use_memories.md diff --git a/src/enus/guide/use_cases/agent/creative.md b/src/en/guide/use_cases/agent/creative.md similarity index 100% rename from src/enus/guide/use_cases/agent/creative.md rename to src/en/guide/use_cases/agent/creative.md diff --git a/src/enus/guide/use_cases/agent/ml_engineer.md b/src/en/guide/use_cases/agent/ml_engineer.md similarity index 100% rename from src/enus/guide/use_cases/agent/ml_engineer.md rename to src/en/guide/use_cases/agent/ml_engineer.md diff --git a/src/enus/guide/use_cases/agent/photographer.md b/src/en/guide/use_cases/agent/photographer.md similarity index 100% rename from src/enus/guide/use_cases/agent/photographer.md rename to src/en/guide/use_cases/agent/photographer.md diff --git a/src/enus/guide/use_cases/agent/receipt_assistant.md b/src/en/guide/use_cases/agent/receipt_assistant.md similarity index 100% rename from src/enus/guide/use_cases/agent/receipt_assistant.md rename to src/en/guide/use_cases/agent/receipt_assistant.md diff --git a/src/enus/guide/use_cases/agent/researcher.md b/src/en/guide/use_cases/agent/researcher.md similarity index 100% rename from src/enus/guide/use_cases/agent/researcher.md rename to src/en/guide/use_cases/agent/researcher.md diff --git a/src/enus/guide/use_cases/agent/tutorial_assistant.md b/src/en/guide/use_cases/agent/tutorial_assistant.md similarity index 100% rename from src/enus/guide/use_cases/agent/tutorial_assistant.md rename to src/en/guide/use_cases/agent/tutorial_assistant.md diff --git a/src/enus/guide/use_cases/multi_agent/creative.md b/src/en/guide/use_cases/multi_agent/creative.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/creative.md rename to src/en/guide/use_cases/multi_agent/creative.md diff --git a/src/enus/guide/use_cases/multi_agent/debate.md b/src/en/guide/use_cases/multi_agent/debate.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/debate.md rename to src/en/guide/use_cases/multi_agent/debate.md diff --git a/src/enus/guide/use_cases/multi_agent/minecraft.md b/src/en/guide/use_cases/multi_agent/minecraft.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/minecraft.md rename to src/en/guide/use_cases/multi_agent/minecraft.md diff --git a/src/enus/guide/use_cases/multi_agent/software_company.md b/src/en/guide/use_cases/multi_agent/software_company.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/software_company.md rename to src/en/guide/use_cases/multi_agent/software_company.md diff --git a/src/enus/guide/use_cases/multi_agent/software_gallery.md b/src/en/guide/use_cases/multi_agent/software_gallery.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/software_gallery.md rename to src/en/guide/use_cases/multi_agent/software_gallery.md diff --git a/src/enus/guide/use_cases/multi_agent/virtual_town.md b/src/en/guide/use_cases/multi_agent/virtual_town.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/virtual_town.md rename to src/en/guide/use_cases/multi_agent/virtual_town.md diff --git a/src/enus/guide/use_cases/multi_agent/werewolf_game.md b/src/en/guide/use_cases/multi_agent/werewolf_game.md similarity index 100% rename from src/enus/guide/use_cases/multi_agent/werewolf_game.md rename to src/en/guide/use_cases/multi_agent/werewolf_game.md diff --git a/src/enus/index.md b/src/en/index.md similarity index 94% rename from src/enus/index.md rename to src/en/index.md index 0eb4749e..6101aa4a 100644 --- a/src/enus/index.md +++ b/src/en/index.md @@ -13,7 +13,7 @@ hero: actions: - theme: brand text: Get Started - link: /enus/guide/get_started/introduction + link: /en/guide/get_started/introduction - theme: alt text: View on Github link: https://github.com/geekan/MetaGPT diff --git a/src/zhcn/guide/api.md b/src/zh/guide/api.md similarity index 97% rename from src/zhcn/guide/api.md rename to src/zh/guide/api.md index dd44423e..869d0d14 100644 --- a/src/zhcn/guide/api.md +++ b/src/zh/guide/api.md @@ -1,2 +1,3 @@ # API + 即将更新,保持关注。 diff --git a/src/zhcn/guide/contribute/contribute_guide.md b/src/zh/guide/contribute/contribute_guide.md similarity index 97% rename from src/zhcn/guide/contribute/contribute_guide.md rename to src/zh/guide/contribute/contribute_guide.md index d2b435e5..85dc3050 100644 --- a/src/zhcn/guide/contribute/contribute_guide.md +++ b/src/zh/guide/contribute/contribute_guide.md @@ -1,2 +1,3 @@ # 贡献指南 + 即将更新,保持关注。 diff --git a/src/zh/guide/contribute/rfc_template.md b/src/zh/guide/contribute/rfc_template.md new file mode 100644 index 00000000..d3ac750e --- /dev/null +++ b/src/zh/guide/contribute/rfc_template.md @@ -0,0 +1,51 @@ +# 开发者RFC模版 + +文档修改历史 + +| 日期 | 版本 | 作者 | 修改内容 | +| ---------- | ------ | ---- | -------- | +| 2023/09/13 | v0.0.1 | | 初版 | +| | | | | + +本文档评审记录 + +| 审核人 | 邀请日期 | 审核日期 | 审核意见 | +| ------ | ---------- | -------- | -------- | +| @xxx | 2023/09/13 | | | +| | | | | + +# 背景 + +# 目标 + +## 定义 + +### 包括的 + +### 不包括的 + +## 有则更优 + +# 提案 + +3.1 + +3.2 + +# 里程碑[可选] + +# 开放讨论 + +# 附录[可选] + +## 术语 + +| 术语 | 全称 | 解释 | +| ---- | ---- | ---- | +| | | | +| | | | +| | | | +| | | | +| | | | + +## 参考 diff --git a/src/zh/guide/faq.md b/src/zh/guide/faq.md new file mode 100644 index 00000000..10938a3a --- /dev/null +++ b/src/zh/guide/faq.md @@ -0,0 +1,4 @@ +# 常见问题解答(FAQ) + +详见 +https://deepwisdom.feishu.cn/wiki/MsGnwQBjiif9c3koSJNcYaoSnu4 diff --git a/src/zhcn/guide/get_started/installation.md b/src/zh/guide/get_started/installation.md similarity index 95% rename from src/zhcn/guide/get_started/installation.md rename to src/zh/guide/get_started/installation.md index 33c515a1..3a895bb1 100644 --- a/src/zhcn/guide/get_started/installation.md +++ b/src/zh/guide/get_started/installation.md @@ -1,17 +1,17 @@ - # 安装 我们提供了几种安装MetaGPT的方式,请选择最适合你的方式。 ## 支持的系统和版本 -| 系统版本 | Python版本 | 是否支持 | -| ---- | ---- | ----- | -| macOS 13.x | python 3.9 | 是 | -| Windows 11 | python 3.9 | 是 | -| Ubuntu 22.04 | python 3.9 | 是 | +| 系统版本 | Python版本 | 是否支持 | +| ------------ | ---------- | -------- | +| macOS 13.x | python 3.9 | 是 | +| Windows 11 | python 3.9 | 是 | +| Ubuntu 22.04 | python 3.9 | 是 | 请确保你的系统已安装Python 3.9+。你可以通过以下命令进行检查: + ``` python3 --version ``` @@ -19,6 +19,7 @@ python3 --version ## 安装稳定版本 推荐大多数用户使用。你可以像使用任何python包一样导入MetaGPT,使用各种内置角色或团队,并构建自己的智能体来服务各种应用。 + ``` pip install metagpt ``` @@ -26,6 +27,7 @@ pip install metagpt ## 安装最新的开发版本 最适合体验最新功能的用户。 + ``` pip install git+https://github.com/geekan/MetaGPT ``` @@ -33,6 +35,7 @@ pip install git+https://github.com/geekan/MetaGPT ## 以开发模式安装 推荐给那些想要根据自己的独特需求定制框架、尝试新的想法或者利用框架创建复杂功能(如新颖的记忆机制)的开发者和研究者。 + ``` git clone https://github.com/geekan/MetaGPT.git cd /your/path/to/MetaGPT @@ -84,7 +87,6 @@ git clone https://github.com/geekan/MetaGPT.git cd MetaGPT && docker build -t metagpt:custom . ``` - ## 安装全部功能 如果你想生成一些图表,比如象限图,系统设计图,顺序流程图等,这非常有用。如果你运行[软件启动示例](https://github.com/geekan/MetaGPT/blob/main/metagpt/startup.py),它们将作为中间结果提供给你。 @@ -95,27 +97,35 @@ Mermaid是一种使用文本生成流程图、饼图、甘特图和其他图表 **nodejs** 通过nodejs直接安装mermaid-cli。MetaGPT调用命令行将Mermaid文本转换为图表。你需要先安装nodejs,然后使用npm进行安装: + ``` npm install -g @mermaid-js/mermaid-cli ``` + 这是mermaid提供的官方方法,通过nodejs安装,因此它基本上支持所有平台,也支持输出png/svg/pdf格式。然而,它需要安装nodejs和mermaid-cli,安装和使用有一定的成本,并且在运行时需要浏览器环境。 **pyppeteer** Mermaid也可以通过JavaScript调用,pyppeteer是一个用Python实现的web自动化测试工具,可以执行JavaScript脚本。因此,使用pyppeteer + mermaidjs可以将Mermaid文本转换为图表。你可以使用pip安装pyppeteer: + ``` pip install pyppeteer ``` + 这种方法安装相对简单,没有平台限制,并支持输出png/svg/pdf格式。然而,它需要依赖于浏览器,所以你需要先安装一个浏览器,并在运行时设置浏览器路径: + ``` export PUPPETEER_EXECUTABLE_PATH=/path/to/your/chromium # 或者edge或chrome ``` + (注意:pyppeteer已经不再维护) **playwright** 由于pyppeteer已经不再维护,它推荐使用playwright-python作为替代。使用playwright运行mermaid的原理与pyppeteer相同。然而,playwright-python需要安装其自己提供的浏览器,不能使用已经安装的浏览器。官方只支持以下平台: + - Windows 10+,Windows Server 2016+或Windows Subsystem for Linux (WSL)。 - MacOS 12 Monterey或MacOS 13 Ventura。 - Debian 11,Debian 12,Ubuntu 20.04或Ubuntu 22.04。 + ``` pip install playwright playwright install --with-deps chromium diff --git a/src/zhcn/guide/get_started/introduction.md b/src/zh/guide/get_started/introduction.md similarity index 100% rename from src/zhcn/guide/get_started/introduction.md rename to src/zh/guide/get_started/introduction.md diff --git a/src/zhcn/guide/get_started/quickstart.md b/src/zh/guide/get_started/quickstart.md similarity index 80% rename from src/zhcn/guide/get_started/quickstart.md rename to src/zh/guide/get_started/quickstart.md index bb869015..e053438a 100644 --- a/src/zhcn/guide/get_started/quickstart.md +++ b/src/zh/guide/get_started/quickstart.md @@ -1,29 +1,37 @@ - # 快速开始 + ## 安装 + ``` pip install metagpt ``` + 完整的安装方法可在 [安装](./installation) 部分找到。 ## 配置 + ``` import os os.environ["OPENAI_API_KEY"] = "sk-..." os.environ["OPENAI_API_MODEL"] = "gpt-4" ``` + 完整配置不同LLM API(比如OpenAI、Azure、Anthropic等)的方法可在 [配置](./setup) 部分找到。 ## 一句话需求的软件开发 ->注意: + +> 注意: > ->下面为 [software startup example](https://github.com/geekan/MetaGPT/blob/main/metagpt/startup.py) 的节选。如果你使用`git clone`方法进行安装,只需简单执行 ->``` ->metagpt --idea "write a cli blackjack game" ->``` -现在,让我们开始吧!我们将创建一个多智能体团队,根据我们的一句话需求编写软件。 +> 下面为 [software startup example](https://github.com/geekan/MetaGPT/blob/main/metagpt/startup.py) 的节选。如果你使用`git clone`方法进行安装,只需简单执行 +> +> ``` +> metagpt --idea "write a cli blackjack game" +> ``` +> +> 现在,让我们开始吧!我们将创建一个多智能体团队,根据我们的一句话需求编写软件。 首先,导入已实现的角色 + ```python import asyncio from metagpt.roles import ( @@ -34,7 +42,9 @@ from metagpt.roles import ( ) from metagpt.team import Team ``` + 然后,初始化公司团队,配置对应的智能体,设置对应的预算以及提供一个写一个小游戏的需求。 + ```python async def startup(idea: str): company = Team() @@ -51,7 +61,9 @@ async def startup(idea: str): await company.run(n_round=5) ``` + 最后,运行并得到生成的游戏代码! + ```python await startup(idea="write a cli blackjack game") # blackjack: 二十一点 ``` diff --git a/src/zhcn/guide/get_started/setup.md b/src/zh/guide/get_started/setup.md similarity index 93% rename from src/zhcn/guide/get_started/setup.md rename to src/zh/guide/get_started/setup.md index 78a97796..2fa468a8 100644 --- a/src/zhcn/guide/get_started/setup.md +++ b/src/zh/guide/get_started/setup.md @@ -1,36 +1,51 @@ # 配置 + MetaGPT的使用涉及到不同模型提供商的访问配置,我们将在本页中详细介绍该设置。 + ## 配置LLM API + 我们将使用OpenAI API作为例子。你可以通过下述方式完成配置: + 1. 使用环境变量,这是推荐的最快捷的方式。 2. 使用config或key配置文件,这是推荐的进行完整功能体验和开发的方式。 + ### 1. 使用环境变量 + 在命令行下执行: + ```shell export OPENAI_API_KEY="sk-..." # YOUR_API_KEY export OPENAI_API_MODEL="intended model" # gpt-4, gpt-3.5-turbo, etc. ``` + 或者在python代码中添加: + ```python import os os.environ["OPENAI_API_KEY"] = "sk-..." # YOUR_API_KEY os.environ["OPENAI_API_MODEL"] = "intended model" # gpt-4, gpt-3.5-turbo, etc. ``` + ### 2. 使用一个`config.yaml`或者`key.yaml`文件 + 1. 在当前项目的工作目录下,新建一个文件夹`config`并在该文件夹下添加一个`config.yaml`或`key.yaml`文件 2. 拷贝样例配置 [config.yaml](https://github.com/geekan/MetaGPT/blob/main/config/config.yaml) 中的内容到你的新文件中。 3. 在新文件内设置自己的OPENAI API KEY配置: + ```yaml -OPENAI_API_KEY: "sk-..." # YOUR_API_KEY -OPENAI_API_MODEL: "intended model" # gpt-4, gpt-3.5-turbo, etc. +OPENAI_API_KEY: 'sk-...' # YOUR_API_KEY +OPENAI_API_MODEL: 'intended model' # gpt-4, gpt-3.5-turbo, etc. ``` + 记住:如果你按照 [安装](./installation) 使用`git clone`的方法进行安装,`config/config.yaml`已经存在于目录中。只需要直接进行配置,或拷贝一个新文件 `config/key.yaml` 并进行配置。 这样你就不会因为不小心提交了API KEYT而导致泄露。 + > 注意: > MetaGPT将会按照下述优先级来读取你的配置:`config/key.yaml > config/config.yaml > environment variable` 现在你可以开始使用了!参考 [快速开始](./quickstart) 或 [教程](/guide/tutorials/agent_101) 进行第一个软件项目的生成。 ## 不同模型提供商的配置 + ### OpenAI ### Azure diff --git a/src/zhcn/guide/in_depth_guides/agent_communication.md b/src/zh/guide/in_depth_guides/agent_communication.md similarity index 98% rename from src/zhcn/guide/in_depth_guides/agent_communication.md rename to src/zh/guide/in_depth_guides/agent_communication.md index 048ed367..05beaf20 100644 --- a/src/zhcn/guide/in_depth_guides/agent_communication.md +++ b/src/zh/guide/in_depth_guides/agent_communication.md @@ -1,2 +1,3 @@ # 多智能体间通信 + 即将更新,保持关注。 diff --git a/src/zh/guide/in_depth_guides/memory.md b/src/zh/guide/in_depth_guides/memory.md new file mode 100644 index 00000000..9f1fa92e --- /dev/null +++ b/src/zh/guide/in_depth_guides/memory.md @@ -0,0 +1 @@ +# Memory diff --git a/src/zh/guide/in_depth_guides/use_own_llm.md b/src/zh/guide/in_depth_guides/use_own_llm.md new file mode 100644 index 00000000..6072e731 --- /dev/null +++ b/src/zh/guide/in_depth_guides/use_own_llm.md @@ -0,0 +1 @@ +# Use Your Own LLM diff --git a/src/zhcn/guide/tutorials/agent_101.md b/src/zh/guide/tutorials/agent_101.md similarity index 97% rename from src/zhcn/guide/tutorials/agent_101.md rename to src/zh/guide/tutorials/agent_101.md index 27fb7e37..eef6063b 100644 --- a/src/zhcn/guide/tutorials/agent_101.md +++ b/src/zh/guide/tutorials/agent_101.md @@ -1,9 +1,12 @@ # 智能体入门 + 完成本节,你将能够: + 1. 使用现成的智能体 2. 开发你的第一个能够执行一个或多个动作的智能体 ## 使用现成的智能体 + ```python # 可导入任何角色,初始化它,用一个开始的消息运行它,完成! import asyncio @@ -22,22 +25,27 @@ if __name__ == '__main__': ``` ## 开发你的第一个智能体 + 从实际使用的角度考虑,一个智能体要对我们有用,它必须具备哪些基本要素呢?从MetaGPT的观点来看,如果一个智能体能够执行某些动作(无论是由LLM驱动还是其他方式),它就具有一定的用途。简单来说,我们定义智能体应该具备哪些行为,为智能体配备这些能力,我们就拥有了一个简单可用的智能体!MetaGPT提供高度灵活性,以定义您自己所需的行为和智能体。我们将在本节的其余部分指导您完成这一过程。 ### 一个智能体运行周期的流程图 + ![flowchart](/public/image/guide/tutorials/agent_run_flowchart.png) ## 具有单一动作的智能体 + 假设我们想用自然语言编写代码,并想让一个智能体为我们做这件事。让我们称这个智能体为 SimpleCoder,我们需要两个步骤来让它工作: + 1. 定义一个编写代码的动作 2. 为智能体配备这个动作 ### 定义动作 -在 MetaGPT 中,类 `Action` 是动作的逻辑抽象。用户可以通过简单地调用 self._aask 函数令 LLM 赋予这个动作能力,即这个函数将在底层调用 LLM api。 + +在 MetaGPT 中,类 `Action` 是动作的逻辑抽象。用户可以通过简单地调用 self.\_aask 函数令 LLM 赋予这个动作能力,即这个函数将在底层调用 LLM api。 在我们的场景中,我们定义了一个 `SimpleWriteCode` 子类 `Action`。虽然它主要是一个围绕提示和 LLM 调用的包装器,但我们认为这个 `Action` 抽象更直观。在下游和高级任务中,使用它作为一个整体感觉更自然,而不是分别制作提示和调用 LLM,尤其是在智能体的框架内。 -```python +````python from metagpt.actions import Action class SimpleWriteCode(Action): @@ -67,12 +75,14 @@ class SimpleWriteCode(Action): match = re.search(pattern, rsp, re.DOTALL) code_text = match.group(1) if match else rsp return code_text -``` +```` ### 定义角色 + 在 MetaGPT 中,`Role` 类是智能体的逻辑抽象。一个 `Role` 能执行特定的 `Action`,拥有记忆、思考并采用各种策略行动。基本上,它充当一个将所有这些组件联系在一起的凝聚实体。目前,让我们只关注一个执行动作的智能体,并看看如何定义一个最简单的 `Role`。 在这个示例中,我们创建了一个 `SimpleCoder`,它能够根据人类的自然语言描述编写代码。步骤如下: + 1. 我们为其指定一个名称和配置文件。 2. 我们使用 `self._init_action` 函数为其配备期望的动作 `SimpleWriteCode`。 3. 我们覆盖 `_act` 函数,其中包含智能体具体行动逻辑。我们写入,我们的智能体将从最新的记忆中获取人类指令,运行配备的动作,MetaGPT将其作为待办事项 (`self._rc.todo`) 在幕后处理,最后返回一个完整的消息。 @@ -101,9 +111,11 @@ class SimpleCoder(Role): return msg ``` + 完成! ### 运行你的角色 + 现在我们可以让我们的智能体开始工作,只需初始化它并使用一个起始消息运行它。 ```python @@ -120,11 +132,13 @@ asyncio.run(main) ``` ## 具有多个动作的智能体 + 我们注意到一个智能体能够执行一个动作,但如果只有这些,实际上我们并不需要一个智能体。通过直接运行动作本身,我们可以得到相同的结果。智能体的力量,或者说`Role`抽象的惊人之处,在于动作的组合(以及其他组件,比如记忆,但我们将把它们留到后面的部分)。通过连接动作,我们可以构建一个工作流程,使智能体能够完成更复杂的任务。 假设现在我们不仅希望用自然语言编写代码,而且还希望生成的代码立即执行。一个拥有多个动作的智能体可以满足我们的需求。让我们称之为`RunnableCoder`,一个既写代码又立即运行的`Role`。我们需要两个`Action`:`SimpleWriteCode` 和 `SimpleRunCode` ### 定义动作 + 首先,定义 `SimpleWriteCode`。我们将重用上面创建的那个。 接下来,定义 `SimpleRunCode`。如前所述,从概念上讲,一个动作可以利用LLM,也可以在没有LLM的情况下运行。在`SimpleRunCode`的情况下,LLM不涉及其中。我们只需启动一个子进程来运行代码并获取结果。我们希望展示的是,对于动作逻辑的结构,我们没有设定任何限制,用户可以根据需要完全灵活地设计逻辑。 @@ -142,7 +156,9 @@ class SimpleRunCode(Action): ``` ### 定义角色 + 与定义单一动作的智能体没有太大不同!让我们来映射一下: + 1. 用 `self._init_actions` 初始化所有 `Action` 2. 指定每次 `Role` 会选择哪个 `Action`。我们将 `react_mode` 设置为 "by_order",这意味着 `Role` 将按照 `self._init_actions` 中指定的顺序执行其能够执行的 `Action`(有关更多讨论,请参见 [思考和行动](agent_think_act))。在这种情况下,当 `Role` 执行 `_act` 时,`self._rc.todo` 将首先是 `SimpleWriteCode`,然后是 `SimpleRunCode`。 3. 覆盖 `_act` 函数。`Role` 从上一轮的人类输入或动作输出中检索消息,用适当的 `Message` 内容提供当前的 `Action` (`self._rc.todo`),最后返回由当前 `Action` 输出组成的 `Message`。 @@ -174,6 +190,7 @@ class RunnableCoder(Role): ``` ### 运行你的角色 + 现在可以让你的智能体开始工作,只需初始化它并使用一个起始消息运行它。 ```python @@ -188,14 +205,17 @@ async def main(): asyncio.run(main) ``` + ## 本节完整脚本 + https://github.com/geekan/MetaGPT/blob/main/examples/build_customized_agent.py 通过以下命令运行: + ```shell python3 examples/build_customized_agent.py --msg "write a function that calculates the sum of a list" ``` 或在Colab上运行 -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1SF3bJiDjKw6Xwnz2Rf0j8Hc0U4KsSB2L?usp=sharing) \ No newline at end of file +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1SF3bJiDjKw6Xwnz2Rf0j8Hc0U4KsSB2L?usp=sharing) diff --git a/src/zhcn/guide/tutorials/agent_think_act.md b/src/zh/guide/tutorials/agent_think_act.md similarity index 62% rename from src/zhcn/guide/tutorials/agent_think_act.md rename to src/zh/guide/tutorials/agent_think_act.md index 72bc29eb..f23ac9f6 100644 --- a/src/zhcn/guide/tutorials/agent_think_act.md +++ b/src/zh/guide/tutorials/agent_think_act.md @@ -2,4 +2,4 @@ ## 三种反应模式 -## 自定义思维过程 \ No newline at end of file +## 自定义思维过程 diff --git a/src/zhcn/guide/tutorials/breakpoint_recovery.md b/src/zh/guide/tutorials/breakpoint_recovery.md similarity index 97% rename from src/zhcn/guide/tutorials/breakpoint_recovery.md rename to src/zh/guide/tutorials/breakpoint_recovery.md index 6003f3a3..dea950b9 100644 --- a/src/zhcn/guide/tutorials/breakpoint_recovery.md +++ b/src/zh/guide/tutorials/breakpoint_recovery.md @@ -1,9 +1,11 @@ # 断点恢复 ## 定义 + 断点恢复指在程序运行过程中,记录程序不同模块的产出并落盘,当程序碰到外部如`Ctrl-C`或内部执行异常如LLM Api网络异常导致退出等情况时。再次执行程序,能够从中断前的结果中恢复继续执行,而无需从0到1开始执行,降低开发者的时间和费用成本。 ## 序列化与反序列化 + 为了能支持断点恢复操作,需要对程序中的不同模块产出进行结构化存储即序列化的过程,保存后续用于恢复操作的现场。序列化的操作根据不同模块的功能有所区分,比如角色信息,初始化后即可以进行序列化,过程中不会发生改变。记忆信息,需要执行过程中,实时进行序列化保证完整性(序列化耗时在整个程序执行中的占比很低)。 ## 实现逻辑 @@ -15,10 +17,12 @@ - 人为的`Ctrl-C`对程序进行中断 ### 序列化存储结构 + 为了清晰化**整体项目的结构信息**,采用层级化的方式进行内容的序列化存储。 当程序发生中断后,对应不同模块在存储目录下的文件结构如下: -结构概要 +结构概要 + ```bash ./workspace storage @@ -34,7 +38,8 @@ role_info.json # 包括角色身份、执行动作、监听动作等信息 ``` -每个`xxx.json`下的为对应内容的数据概要示例。 +每个`xxx.json`下的为对应内容的数据概要示例。 + ```bash ./workspace storage @@ -102,31 +107,38 @@ ``` ### 恢复时的执行顺序 -由于MetaGPT是异步执行框架,对于下述几种典型的中断截点和恢复顺序。 + +由于MetaGPT是异步执行框架,对于下述几种典型的中断截点和恢复顺序。 1. 角色A(一个action)-> 角色B(2个action),角色A进行action选择时出现异常退出。 2. 角色A(一个action)-> 角色B(2个action),角色B第1个action执行正常,第2个action执行时出现异常退出。 + #### 情况1 + 执行入口重新执行后,各模块进行反序列化。角色A未观察到属于自己处理的Message,不处理。角色B恢复后,观察到一条之前未处理完毕的Message,则在`_observe`后重新执行对应的`react`操作,按react策略执行对应2个动作。 #### 情况2 -执行入口重新执行后,各模块进行反序列化。角色A未观察到属于自己处理的Message,不处理。角色B恢复后,`_observe`到一条之前未完整处理完毕的Message,在`react`中,知道自己在第2个action执行失败,则直接从第2个action开始执行。 +执行入口重新执行后,各模块进行反序列化。角色A未观察到属于自己处理的Message,不处理。角色B恢复后,`_observe`到一条之前未完整处理完毕的Message,在`react`中,知道自己在第2个action执行失败,则直接从第2个action开始执行。 ### 从中断前的Message开始重新执行 + 一般来说,Message是不同角色间沟通协作的桥梁,当在Message的执行过程中发生中断后,由于该Message已经被该角色存入环境(Environment)记忆(Memory)中。在进行恢复中,如果直接加载环境内的全部Memory,该角色的`_observe`将不会观察到中断时引发当时执行`Message`,从而不能恢复该Message的继续执行。 因此,为了保证该Message在恢复时能够继续执行,需要在发生中断后,从角色记忆中删除对应的该条Message。 ### 从中断前的Action开始重新执行 + 一般来说,Action是一个相对较小的执行模块粒度,当在Action的执行过程中发生中断后,需要知道多个Actions的执行顺序以及当前执行到哪个Action。当进行恢复时,定位到中断时的Action位置并重新执行该Action。 ## 结果 ### 断点恢复入口 -`python3 starup.py "xxx" --recover_path "./workspace/storage/team"` # 默认序列化到`./workspace/storage/team`中。 + +`python3 starup.py "xxx" --recover_path "./workspace/storage/team"` # 默认序列化到`./workspace/storage/team`中。 ### 恢复后继续执行结果 -`python3 -s tests/metagpt/serialize_deserialize/test_team.py`的`test_team_recover_multi_roles_save`的执行case + +`python3 -s tests/metagpt/serialize_deserialize/test_team.py`的`test_team_recover_multi_roles_save`的执行case `RoleB`的`ActionRaise`模拟Action异常,执行到该Action时发生异常,序列化项目后退出。 重新启动后,`RoleA`已经执行过,不继续执行。`RoleB`的`ActionOK`已经执行过,不继续执行。继续从`ActionRaise`执行,仍异常。 @@ -170,4 +182,4 @@ Traceback (most recent call last): File "/Users/xxxx/work/code/MetaGPT/tests/metagpt/serialize_deserialize/test_serdeser_base.py", line 50, in run raise RuntimeError("parse error in ActionRaise") RuntimeError: parse error in ActionRaise -``` \ No newline at end of file +``` diff --git a/src/zhcn/guide/tutorials/concepts.md b/src/zh/guide/tutorials/concepts.md similarity index 99% rename from src/zhcn/guide/tutorials/concepts.md rename to src/zh/guide/tutorials/concepts.md index de1c0809..f23ee5ef 100644 --- a/src/zhcn/guide/tutorials/concepts.md +++ b/src/zh/guide/tutorials/concepts.md @@ -1,5 +1,7 @@ # 概念简述 + 完成本节,你将能够: + - 理解MetaGPT关于智能体和环境的概念 - 理解智能体之间如何相互作用以及多智能体协作的形式 @@ -11,6 +13,7 @@ 如果你希望更严谨和完整的表述,欢迎浏览我们的[论文](https://arxiv.org/abs/2308.00352)。 ## 智能体 + 学术界和工业界对术语“智能体”提出了各种定义。大致来说,一个智能体应具备类似人类的思考和规划能力,拥有记忆甚至情感,并具备一定的技能以便与环境、智能体和人类进行交互。 在MetaGPT看来,可以将智能体想象成环境中的数字人,其中 @@ -26,10 +29,13 @@ 5. 记忆:智能体的记忆存储过去的经验。这对学习至关重要,因为它允许智能体参考先前的结果并据此调整未来的行动。 ## 多智能体 + 多智能体系统可以视为一个智能体社会,其中 + > 多智能体 = 智能体 + 环境 + 标准流程(SOP) + 通信 + 经济 这些组件各自发挥着重要的作用: + 1. 智能体:在上面单独定义的基础上,在多智能体系统中的智能体协同工作,每个智能体都具备独特有的LLM、观察、思考、行动和记忆。 2. 环境:环境是智能体生存和互动的公共场所。智能体从环境中观察到重要信息,并发布行动的输出结果以供其他智能体使用。 3. 标准流程(SOP):这些是管理智能体行动和交互的既定程序,确保系统内部的有序和高效运作。例如,在汽车制造的SOP中,一个智能体焊接汽车零件,而另一个安装电缆,保持装配线的有序运作。 @@ -37,9 +43,11 @@ 5. 经济:这指的是多智能体环境中的价值交换系统,决定资源分配和任务优先级。 ## 一个例子 + ![img](/image/guide/tutorials/concepts_example.png) 这是一个简单的例子,展示了智能体如何工作: + - 在环境中,存在三个智能体Alice、Bob和Charlie,它们相互作用。 - 他们可以将消息或行动的输出结果发布到环境中,同时也会被其他智能体观察到。 - 下面将揭示智能体Charlie的内部过程,该过程同样适用于Alice和Bob。 diff --git a/src/zhcn/guide/tutorials/human_engagement.md b/src/zh/guide/tutorials/human_engagement.md similarity index 96% rename from src/zhcn/guide/tutorials/human_engagement.md rename to src/zh/guide/tutorials/human_engagement.md index 0149419e..5f8e82aa 100644 --- a/src/zhcn/guide/tutorials/human_engagement.md +++ b/src/zh/guide/tutorials/human_engagement.md @@ -3,22 +3,26 @@ 当我们谈论智能体时,通常指的是由LLM驱动的。然而,在一些实际情境中,我们确实希望人类介入,无论是为了项目的质量保证,在关键决策中提供指导,还是在游戏中扮演角色。在本教程中,我们将讨论如何将人类纳入SOP。 完成本节,你将能够: + - 引入基于LLM的智能体和人类之间的交互 ## 在LLM和人类之间切换 + 我们将重用 [多智能体入门](multi_agent_101) 中的确切示例。 最初,LLM扮演 `SimpleReviewer` 的角色。假设我们想对更好地控制审阅过程,我们可以亲自担任这个`Role`。这只需要一个开关:在初始化时设置 `is_human=True`。代码变为: + ```python team.hire( [ SimpleCoder(), SimpleTester(), # SimpleReviewer(), # 原始行 - SimpleReviewer(is_human=True), # 更改为这一行 + SimpleReviewer(is_human=True), # 更改为这一行 ] ) ``` + 我们作为人类充当 `SimpleReviewer`,现在与两个基于LLM的智能体 `SimpleCoder` 和 `SimpleTester` 进行交互。我们可以对`SimpleTester`写的单元测试进行评论,比如要求测试更多边界情况,让`SimpleTester`进行改写。这个切换对于原始的SOP和 `Role` 定义是完全不可见的(无影响),这意味着可以应用于任何场景。 每次轮到我们回应时,运行过程将暂停并等待我们的输入。只需输入我们想要输入的内容,然后就将消息发送给其他智能体了! @@ -30,9 +34,11 @@ team.hire( > 当前人类交互通过命令行终端进行,对人类提供多行或结构化的内容较为不便。同时,人类需要像LLM一样在格式或内容上遵循提示词,以使获得人类输入后的后续流程正常运行。我们会在后续更新中改善这两类问题。 ## 本教程的完整脚本 + https://github.com/geekan/MetaGPT/blob/main/examples/build_customized_multi_agents.py 使用以下命令运行 + ```sh python3 examples/build_customized_multi_agents.py --add_human True ``` @@ -41,4 +47,4 @@ python3 examples/build_customized_multi_agents.py --add_human True \ No newline at end of file + diff --git a/src/zhcn/guide/tutorials/integration_with_open_llm.md b/src/zh/guide/tutorials/integration_with_open_llm.md similarity index 96% rename from src/zhcn/guide/tutorials/integration_with_open_llm.md rename to src/zh/guide/tutorials/integration_with_open_llm.md index 9da377f5..3e439105 100644 --- a/src/zhcn/guide/tutorials/integration_with_open_llm.md +++ b/src/zh/guide/tutorials/integration_with_open_llm.md @@ -1,10 +1,11 @@ # 集成开源LLM -目前,如果要得到比较稳定的代码生成结果,需要使用OpenAI的GPT-3.5或GPT-4。但目前也有很多其他优秀的开源模型可以供实验,也能够得到令人相对满意的结果。因此,在本教程中,我们将探讨如何接入开源LLM并根据你的输入需求得到项目输出。 + +目前,如果要得到比较稳定的代码生成结果,需要使用OpenAI的GPT-3.5或GPT-4。但目前也有很多其他优秀的开源模型可以供实验,也能够得到令人相对满意的结果。因此,在本教程中,我们将探讨如何接入开源LLM并根据你的输入需求得到项目输出。 **注意** 本教程所述内容由于开源模型效果本身的局限性,并不能保证代码的稳定生成效果。如果你按该教程进行实验,表示你已知晓该点。 同时,我们也在探索如何在开源模型下得到更稳定、质量更好的输出。如果你对此也感兴趣,可以在discord或者微信社区群里联系我们。 -相信随着开源模型的更新,这一目标将很快到来。 +相信随着开源模型的更新,这一目标将很快到来。 我们将按照下述流程进行教程的整体介绍: @@ -16,14 +17,17 @@ 集成开源LLM和集成一些非openai的闭源模型(如文心一言、讯飞星火、智谱ChatGLM等)的方式都差不多,主要是配置差异。其他闭源LLM的配置具体可以参考文档站下的其他LLM配置相关文档。配置完成后的其他流程步骤与上述的保持一致。 ## 模型部署 + 注意,推荐使用openai兼容接口进行模型部署。这样,请求和返回处理都可以直接使用openai sdk进行处理,将会简化整体的集成流程。同时,下述几个推理仓库也支持发布为openai兼容的接口(除ollama外),需要改动的工作量很小。 -注意,这边默认你是有显卡资源进行部署,不然CPU推理会有点慢。 +注意,这边默认你是有显卡资源进行部署,不然CPU推理会有点慢。 ### LLaMA-Factory + 仓库:https://github.com/hiyouga/LLaMA-Factory ##### 安装 + ```shell git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python=3.10 @@ -35,10 +39,13 @@ pip install -r requirements.txt 具体的,可以看[安装](https://github.com/hiyouga/LLaMA-Factory#dependence-installation-optional) ##### 支持模型 + 常见的LLaMA、Llama2和中国的多数开源模型都支持,具体可看[模型列表](https://github.com/hiyouga/LLaMA-Factory#supported-models) ##### 部署启动 + 源模型启动 + ```shell python3 src/api_demo.py \ --model_name_or_path meta-llama/Llama-2-13b-chat-hf \ @@ -46,6 +53,7 @@ python3 src/api_demo.py \ ``` 加载合并lora产出启动 + ```shell python3 src/api_demo.py \ --model_name_or_path path_to_llama2_model \ @@ -61,6 +69,7 @@ python3 src/api_demo.py \ 具体的,可以看[API部署](https://github.com/hiyouga/LLaMA-Factory#api-demo) ##### 请求示例 + ```shell curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:application/json" -d '{ "messages":[{"role":"user","content":"who are you"}], @@ -69,12 +78,15 @@ curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:applicatio "max_tokens": 256 }' ``` + 默认的,请求的`model`参数值为`gpt-3.5-turbo`,如需修改。进入`src/llmtuner/api/app.py` 的`list_models`方法内修改为你的自定义值。 ### FastChat + 仓库:https://github.com/lm-sys/FastChat ##### 安装 + ```shell pip3 install "fschat[model_worker,webui]" ``` @@ -82,9 +94,11 @@ pip3 install "fschat[model_worker,webui]" 具体的,可以看[安装](https://github.com/lm-sys/FastChat#install) ##### 支持模型 + 常见的LLaMA、Llama2和中国的多数开源模型都支持,具体可看[模型列表](https://github.com/lm-sys/FastChat#supported-models) ##### 部署启动 + 流程 - 启动 controller,`python3 -m fastchat.serve.controller` @@ -96,6 +110,7 @@ pip3 install "fschat[model_worker,webui]" 具体的,可以看[API部署](https://github.com/lm-sys/FastChat/blob/main/docs/openai_api.md) ##### 请求示例 + ```shell curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:application/json" -d '{ "messages":[{"role":"user","content":"who are you"}], @@ -104,12 +119,15 @@ curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:applicatio "max_tokens": 256 }' ``` + 默认的,请求的`model`参数值为`vicuna`,对应启动`model_worker`时的`model-names`。 #### vllm + 仓库:https://github.com/vllm-project/vllm ##### 安装 + ```shell pip3 install vllm ``` @@ -117,9 +135,11 @@ pip3 install vllm 具体的,可以看[安装](https://docs.vllm.ai/en/latest/getting_started/installation.html) ##### 支持模型 + 常见的LLaMA、Llama2和中国的多数开源模型都支持,具体可看[模型列表](https://docs.vllm.ai/en/latest/models/supported_models.html) ##### 部署启动 + ```shell python3 -m vllm.entrypoints.openai.api_server \ --model meta-llama/Llama-2-13b-hf \ @@ -129,6 +149,7 @@ python3 -m vllm.entrypoints.openai.api_server \ 具体的,可以看[API部署](https://docs.vllm.ai/en/latest/getting_started/quickstart.html#openai-compatible-server) ##### 请求示例 + ```shell curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:application/json" -d '{ "messages":[{"role":"user","content":"who are you"}], @@ -137,14 +158,17 @@ curl -X POST http://0.0.0.0:8000/v1/chat/completions -H "content-type:applicatio "max_tokens": 256 }' ``` + 默认的,请求的`model`参数值为`llama2-13b`,对应启动时的`served-model-name`。 ### ollama + 仓库:https://github.com/jmorganca/ollama 该仓库不支持兼容openai api接口,后续MetaGPT会支持其本身提供的接口方式。 ##### 安装 + ```shell curl https://ollama.ai/install.sh | sh ``` @@ -152,9 +176,11 @@ curl https://ollama.ai/install.sh | sh 具体的,可以看[安装](https://github.com/jmorganca/ollama/blob/main/docs/linux.md) ##### 支持模型 + 主要支持Llama2及其衍生系列,具体可看[模型列表](https://github.com/jmorganca/ollama#model-library) ##### 部署启动 + ```shell ollama run llama2 ``` @@ -164,6 +190,7 @@ llama2[使用文档](https://ollama.ai/library/llama2) 具体的,可以看[API部署](https://github.com/jmorganca/ollama/blob/main/docs/api.md) ##### 请求示例 + ```shell curl -X POST http://localhost:11434/api/generate -d '{ "model": "llama2", @@ -172,20 +199,22 @@ curl -X POST http://localhost:11434/api/generate -d '{ ``` ## LLM配置 -由于上述部署为API接口,因此通过修改配置文件`config/key.yaml`进行生效。 + +由于上述部署为API接口,因此通过修改配置文件`config/key.yaml`进行生效。 #### openai兼容接口 -如 LLaMA-Factory、FastChat、vllm部署的openai兼容接口 + +如 LLaMA-Factory、FastChat、vllm部署的openai兼容接口 **config/key.yaml** + ```yaml -OPEN_LLM_API_BASE: "http://106.75.10.65:8001/v1" -OPEN_LLM_API_MODEL: "llama2-13b" +OPEN_LLM_API_BASE: 'http://106.75.10.65:8001/v1' +OPEN_LLM_API_MODEL: 'llama2-13b' ``` openapi接口的完整路由`http://0.0.0.0:8000/v1/chat/completions`,`OPEN_LLM_API_BASE`只需要配置到`http://0.0.0.0:8000/v1` ,剩余部分openai sdk会补齐。`OPEN_LLM_API_MODEL`为请求接口参数`model`的实际值。 - #### ollama api接口 **待更新** @@ -193,9 +222,11 @@ openapi接口的完整路由`http://0.0.0.0:8000/v1/chat/completions`,`OPEN_LL ## 可选的,修复LLM输出结果 ### 背景 -本教程主要是指导如何在MetaGPT中对接开源模型(以及非openai的闭源模型),由于LLM的输出结果与prompt指令格式有很大的关系,开源模型(部分非openai的闭源模型)往往很难跟随MetaGPT的现有角色指令进行输出。一方面,我们会优化角色指令,使得其在多数开闭源模型下有更好的指令结果输出兼容性,另一方面,针对现状情况,对开源LLM的输出内容进行修复,提升整体的执行成功率。 + +本教程主要是指导如何在MetaGPT中对接开源模型(以及非openai的闭源模型),由于LLM的输出结果与prompt指令格式有很大的关系,开源模型(部分非openai的闭源模型)往往很难跟随MetaGPT的现有角色指令进行输出。一方面,我们会优化角色指令,使得其在多数开闭源模型下有更好的指令结果输出兼容性,另一方面,针对现状情况,对开源LLM的输出内容进行修复,提升整体的执行成功率。 ### 开源模型指令输出主要问题 + 包括部分非openai闭源模型的问题。 MetaGPT的prompt对输出有较强的结构要求,开源模型输出时,往往很难按指令跟随完整输出,导致输出的内容会存在缺失遗漏、错误的情况,主要表现为: @@ -203,19 +234,22 @@ MetaGPT的prompt对输出有较强的结构要求,开源模型输出时,往 - 输出的json纯文本存在缺失或多出特殊字符。如,`{"a":b"}}`,`{"a":b"]}`,`{"a":b"` 等等。 针对上述情况,我们增加了修复开源LLM输出的功能,具体的 -**config/key.yaml** +**config/key.yaml** + ```yaml REPAIR_LLM_OUTPUT: true ``` -开启该功能后,执行过程中将尝试去修复上述情况。该开关目前并不能保证完整修复,仍会有些情况我们暂未覆盖(不同的开源模型的情况有所不同),执行过程会中断退出。如果你对此感兴趣,欢迎提PR,并附上对应的模型说明、测试日志和单测用例。 +开启该功能后,执行过程中将尝试去修复上述情况。该开关目前并不能保证完整修复,仍会有些情况我们暂未覆盖(不同的开源模型的情况有所不同),执行过程会中断退出。如果你对此感兴趣,欢迎提PR,并附上对应的模型说明、测试日志和单测用例。 -如果你开启了该功能,表示将会对LLM输出(MetaGPT里软件公司里的ProductManager、Architect角色)进行修复,日志中会出现`repair_`的关键词,你可以留意下。 +如果你开启了该功能,表示将会对LLM输出(MetaGPT里软件公司里的ProductManager、Architect角色)进行修复,日志中会出现`repair_`的关键词,你可以留意下。 ## 运行使用 + 按上述流程执行后,你就可以开始正式使用了。 `metagpt "write a snake game"` ### 延伸 + MetaGPT本身是一个多智能体框架,不局限于软件项目生成。你也可以结合集成的开源模型在自己的应用场景中构建对应的智能体进行使用。 开始你的智能体之旅吧~ diff --git a/src/zhcn/guide/tutorials/multi_agent_101.md b/src/zh/guide/tutorials/multi_agent_101.md similarity index 98% rename from src/zhcn/guide/tutorials/multi_agent_101.md rename to src/zh/guide/tutorials/multi_agent_101.md index 25ee867d..61e48d4b 100644 --- a/src/zhcn/guide/tutorials/multi_agent_101.md +++ b/src/zh/guide/tutorials/multi_agent_101.md @@ -1,19 +1,24 @@ # 多智能体入门 + 在上一章中,我们简要讨论了单智能体的创建。虽然对许多情况来说,单智能体可能已经足够,但更复杂的任务通常需要协作和团队合作,这也就是多智能体为什么必不可少的原因。MetaGPT的核心优势也在于轻松灵活地开发一个智能体团队。在MetaGPT框架下,用户可以通过少量代码实现智能体之间的交互。 完成本节,你将能够: + 1. 理解智能体之间如何进行交互 2. 开发你的第一个智能体团队 ## 运行“软件公司”示例 + ```shell metagpt --idea "write a function that calculates the product of a list" ``` ## 开发你的第一个智能体团队 + 希望你会发现软件创业示例很有启发。也许现在你已经有了灵感,想要开发一个根据你的独特需求而定制的智能体团队。在本节中,我们将继续在[智能体入门](agent_101)中的简单代码示例中添加更多角色,并引入智能体之间的交互协作。 让我们还雇佣一名测试人员和一名审阅人员携手与编码人员一起工作。这开始看起来像一个开发团队了,不是吗?总的来说,我们需要三个步骤来建立团队并使其运作: + 1. 定义每个角色能够执行的预期动作 2. 基于标准作业程序(SOP)确保每个角色遵守它。通过使每个角色观察上游的相应输出结果,并为下游发布自己的输出结果,可以实现这一点。 3. 初始化所有角色,创建一个带有环境的智能体团队,并使它们之间能够进行交互。 @@ -21,7 +26,9 @@ metagpt --idea "write a function that calculates the product of a list" 完整的代码在本教程的末尾可用 ### 定义动作和角色 + 与[智能体入门](agent_101)相同的过程,我们可以定义三个具有各自动作的`Role`: + - `SimpleCoder` 具有 `SimpleWriteCode` 动作,接收用户的指令并编写主要代码 - `SimpleTester` 具有 `SimpleWriteTest` 动作,从 `SimpleWriteCode` 的输出中获取主代码并为其提供测试套件 - `SimpleReviewer` 具有 `SimpleWriteReview` 动作,审查来自 `SimpleWriteTest` 输出的测试用例,并检查其覆盖范围和质量 @@ -29,9 +36,10 @@ metagpt --idea "write a function that calculates the product of a list" 通过上述概述,我们使得 SOP(标准作业程序)变得更加清晰明了。接下来,我们将详细讨论如何根据 SOP 来定义`Role`。 #### 定义动作 + 我们列举了三个 `Action`。 -```python +````python class SimpleWriteCode(Action): PROMPT_TEMPLATE = """ @@ -52,9 +60,9 @@ class SimpleWriteCode(Action): code_text = parse_code(rsp) return code_text -``` +```` -```python +````python class SimpleWriteTest(Action): PROMPT_TEMPLATE = """ @@ -76,7 +84,7 @@ class SimpleWriteTest(Action): code_text = parse_code(rsp) return code_text -``` +```` ```python class SimpleWriteReview(Action): @@ -99,7 +107,9 @@ class SimpleWriteReview(Action): ``` #### 定义角色 + 在许多多智能体场景中,定义`Role`可能只需几行代码。对于`SimpleCoder`,我们做了两件事: + 1. 使用 `_init_actions` 为`Role`配备适当的 `Action`,这与设置单智能体相同 2. 多智能体操作逻辑:我们使`Role` `_watch` 来自用户或其他智能体的重要上游消息。回想我们的SOP,`SimpleCoder`接收用户指令,这是由MetaGPT中的`UserRequirement`引起的`Message`。因此,我们添加了 `self._watch([UserRequirement])`。 @@ -121,10 +131,12 @@ init_actions([SimpleWriteCode]) ``` --- + 与上述相似,对于 `SimpleTester`,我们: + 1. 使用 `_init_actions` 为`SimpleTester`配备 `SimpleWriteTest` 动作 2. 使`Role` `_watch` 来自其他智能体的重要上游消息。回想我们的SOP,`SimpleTester`从 `SimpleCoder` 中获取主代码,这是由 `SimpleWriteCode` 引起的 `Message`。因此,我们添加了 `self._watch([SimpleWriteCode])`。 -> 一个扩展的问题:想一想如果我们使用 `self._watch([SimpleWriteCode, SimpleWriteReview])` 会意味着什么,可以尝试这样做 + > 一个扩展的问题:想一想如果我们使用 `self._watch([SimpleWriteCode, SimpleWriteReview])` 会意味着什么,可以尝试这样做 此外,你可以为智能体定义自己的操作逻辑。这适用于`Action`需要多个输入的情况,你希望修改输入,使用特定记忆,或进行任何其他更改以反映特定逻辑的情况。因此,我们: @@ -156,8 +168,11 @@ class SimpleTester(Role): return msg ``` + --- + 按照相同的过程定义 `SimpleReviewer`: + ```python class SimpleReviewer(Role): def __init__( @@ -172,9 +187,11 @@ class SimpleReviewer(Role): ``` ### 创建一个团队并添加角色 + 现在我们已经定义了三个 `Role`,是时候将它们放在一起了。我们初始化所有角色,设置一个 `Team`,并`hire` 它们。 运行 `Team`,我们应该会看到它们之间的协作! + ```python import asyncio import typer @@ -206,11 +223,13 @@ def main( if __name__ == '__main__': app() ``` + ## 本教程的完整脚本 https://github.com/geekan/MetaGPT/blob/main/examples/build_customized_multi_agents.py 使用以下命令运行: + ```sh python3 examples/build_customized_multi_agents.py --idea "write a function that calculates the product of a list" ``` @@ -219,8 +238,8 @@ python3 examples/build_customized_multi_agents.py --idea "write a function that [![在Colab中打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1-BqQ7PezLtv5QTIAvolI1d11_hTMED5q?usp=sharing) - ## 机制解释 + 虽然用户可以编写几行代码来设置运行的`Role`,但描述内部机制是有益的,这样用户就能理解设置代码的含义,并对框架有一个整体的了解。 ![img](/image/guide/tutorials/multi_agents_flowchart.png) diff --git a/src/zhcn/guide/tutorials/use_memories.md b/src/zh/guide/tutorials/use_memories.md similarity index 92% rename from src/zhcn/guide/tutorials/use_memories.md rename to src/zh/guide/tutorials/use_memories.md index ccced14c..afe405d3 100644 --- a/src/zhcn/guide/tutorials/use_memories.md +++ b/src/zh/guide/tutorials/use_memories.md @@ -1,15 +1,20 @@ # 使用记忆 + 如[概念](concepts)中所讨论的,记忆是智能体的核心组件之一。智能体需要记忆来获取做出决策或执行动作所需的基本上下文,还需要记忆来学习技能或积累经验。在本教程中,我们将介绍记忆的基本使用方法。 完成本节,你将能够: + 1. 理解MetaGPT中记忆的概念 2. 如何添加或检索记忆 ## 什么是记忆 + 在MetaGPT中,`Memory`类是智能体的记忆的抽象。当初始化时,`Role`初始化一个`Memory`对象作为`self._rc.memory`属性,它将在之后的`_observe`中存储每个`Message`,以便后续的检索。简而言之,`Role`的记忆是一个含有`Message`的列表。 ## 检索记忆 + 当需要获取记忆时(获取LLM输入的上下文),你可以使用`self.get_memories`。函数定义如下: + ```python def get_memories(self, k=0) -> list[Message]: """A wrapper to return the most recent k memories of this role, return all when k=0""" @@ -34,9 +39,11 @@ async def _act(self) -> Message: ``` ## 添加记忆 -可以使用```self._rc.memory.add(msg)```添加记忆,,其中`msg`必须是`Message`的实例。请查看上述的代码片段以获取示例用法。 + +可以使用`self._rc.memory.add(msg)`添加记忆,,其中`msg`必须是`Message`的实例。请查看上述的代码片段以获取示例用法。 建议在定义`_act`逻辑时将`Message`的动作输出添加到`Role`的记忆中。通常,`Role`需要记住它先前说过或做过什么,以便采取下一步的行动。 ## 下一步 -记忆是智能体中的一个重大主题。 准确来说,本教程中所说的记忆对应于“短时记忆”的概念。检索也是基于简单的近因性。然而,记忆有多个分支以及广泛的记忆生成和检索技术。请参阅[记忆](/guide/in_depth_guides/memories)以了解如何使用记忆并真正提升智能体的性能。 \ No newline at end of file + +记忆是智能体中的一个重大主题。 准确来说,本教程中所说的记忆对应于“短时记忆”的概念。检索也是基于简单的近因性。然而,记忆有多个分支以及广泛的记忆生成和检索技术。请参阅[记忆](/guide/in_depth_guides/memories)以了解如何使用记忆并真正提升智能体的性能。 diff --git a/src/zhcn/guide/use_cases/agent/creative.md b/src/zh/guide/use_cases/agent/creative.md similarity index 84% rename from src/zhcn/guide/use_cases/agent/creative.md rename to src/zh/guide/use_cases/agent/creative.md index 521058cc..63549a15 100644 --- a/src/zhcn/guide/use_cases/agent/creative.md +++ b/src/zh/guide/use_cases/agent/creative.md @@ -3,10 +3,17 @@ In this use case, we explore constructing any `Role` for fun. ## Albert Einstein + ## Warren Buffett + ## Superman + ## Wonder Woman + ## 李白 + ## 曹操 + ## 原神 - 温迪 -## 原神 - 神里绫华 \ No newline at end of file + +## 原神 - 神里绫华 diff --git a/src/zhcn/guide/use_cases/agent/ml_engineer.md b/src/zh/guide/use_cases/agent/ml_engineer.md similarity index 98% rename from src/zhcn/guide/use_cases/agent/ml_engineer.md rename to src/zh/guide/use_cases/agent/ml_engineer.md index a04858c7..bb0c7455 100644 --- a/src/zhcn/guide/use_cases/agent/ml_engineer.md +++ b/src/zh/guide/use_cases/agent/ml_engineer.md @@ -1,2 +1,3 @@ # 机器学习工程师:分析、可视化数据集和建模 + 即将更新,保持关注。 diff --git a/src/zhcn/guide/use_cases/agent/photographer.md b/src/zh/guide/use_cases/agent/photographer.md similarity index 98% rename from src/zhcn/guide/use_cases/agent/photographer.md rename to src/zh/guide/use_cases/agent/photographer.md index ba4f3be0..1a51d5c8 100644 --- a/src/zhcn/guide/use_cases/agent/photographer.md +++ b/src/zh/guide/use_cases/agent/photographer.md @@ -1,2 +1,3 @@ # 摄影师:根据提示词生成图像 + 即将更新,保持关注。 diff --git a/src/zhcn/guide/use_cases/agent/receipt_assistant.md b/src/zh/guide/use_cases/agent/receipt_assistant.md similarity index 95% rename from src/zhcn/guide/use_cases/agent/receipt_assistant.md rename to src/zh/guide/use_cases/agent/receipt_assistant.md index 871f5d51..1f69f1bc 100644 --- a/src/zhcn/guide/use_cases/agent/receipt_assistant.md +++ b/src/zh/guide/use_cases/agent/receipt_assistant.md @@ -4,19 +4,17 @@ ### 功能说明 -支持 `pdf`, `png`, `jpg`, `zip` 格式发票文件的 `ocr` 识别,生成收款人、城市、总金额、开票日期信息的 `csv` 文件。如果是 `pdf`, `png`, `jpg` 类型的发票文件,即单文件发票,可以提问发票内容相关的问题。同时,支持多语言发票结果生成。 +支持 `pdf`, `png`, `jpg`, `zip` 格式发票文件的 `ocr` 识别,生成收款人、城市、总金额、开票日期信息的 `csv` 文件。如果是 `pdf`, `png`, `jpg` 类型的发票文件,即单文件发票,可以提问发票内容相关的问题。同时,支持多语言发票结果生成。 ### 设计思路 - 对于 `pdf`, `png`, `jpg` 格式发票文件,通过开源的 `PaddleOCR API` 对发票文件进行 `ocr` 识别,再将 `ocr` 识别后的数据提供给 `llm` 大模型提取主要信息写入表格,最后提问 `llm` 大模型关于发票的内容。 -- 对于 `zip` 格式发票文件,先解压压缩包到指定目录,再递归遍历 `pdf`, `png`, `jpg` 格式发票文件进行 `ocr` 识别,再将 `ocr` 识别后的数据提供给 `llm` 大模型提取主要信息写入到同一个表格。多个文件不支持提问内容。 +- 对于 `zip` 格式发票文件,先解压压缩包到指定目录,再递归遍历 `pdf`, `png`, `jpg` 格式发票文件进行 `ocr` 识别,再将 `ocr` 识别后的数据提供给 `llm` 大模型提取主要信息写入到同一个表格。多个文件不支持提问内容。 ### 源码 [GitHub Source Code](https://github.com/geekan/MetaGPT/blob/main/metagpt/roles/invoice_ocr_assistant.py) - - ## 角色定义 1. 定义角色类,继承 `Role` 基类,重写 `__init__` 初始化方法。`__init__` 方法必须包含`name`、`profile`、`goal`、`constraints` 参数。第一行代码使用`super().__init__(name, profile, goal, constraints)` 调用父类的构造函数,实现 `Role` 的初始化。使用 `self._init_actions([InvoiceOCR])` 添加初始的 `action` 和 `states`,这里先添加 `ocr` 识别发票的 `action`。也可以自定义参数,这里加了 `language` 参数支持自定义语言。这里用 `filename`, `origin_query`, `orc_data` 分别暂存发票文件名、原始提问、`ocr` 识别结果。使用 `self._set_react_mode(react_mode="by_order")` 将 `_init_actions` 的 `action` 执行顺序设置为顺序。 @@ -26,7 +24,7 @@ """Invoice OCR assistant, support OCR text recognition of invoice PDF, png, jpg, and zip files, generate a table for the payee, city, total amount, and invoicing date of the invoice, and ask questions for a single file based on the OCR recognition results of the invoice. - + Args: name: The name of the role. profile: The role profile description. @@ -34,7 +32,7 @@ constraints: Constraints or requirements for the role. language: The language in which the invoice table will be generated. """ - + def __init__( self, name: str = "Stitch", @@ -57,7 +55,7 @@ ```python async def _act(self) -> Message: """Perform an action as determined by the role. - + Returns: A message containing the result of the action. """ @@ -69,7 +67,7 @@ self.filename = file_path.name if not file_path: raise Exception("Invoice file not uploaded") - + resp = await todo.run(file_path) if len(resp) == 1: # Single file support for questioning based on OCR recognition results @@ -77,13 +75,13 @@ self.orc_data = resp[0] else: self._init_actions([GenerateTable]) - + self._rc.todo = None content = INVOICE_OCR_SUCCESS elif isinstance(todo, GenerateTable): ocr_results = msg.instruct_content resp = await todo.run(ocr_results, self.filename) - + # Convert list to Markdown format string df = pd.DataFrame(resp) markdown_table = df.to_markdown(index=False) @@ -91,14 +89,12 @@ else: resp = await todo.run(self.origin_query, self.orc_data) content = resp - + msg = Message(content=content, instruct_content=resp) self._rc.memory.add(msg) return msg ``` - - ## Action定义 1. 定义 `action`,每个 `action` 对应一个 `class` 对象,继承 `Action` 基类,重写 `__init__` 初始化方法。。`__init__` 方法包含 `name` 参数。第一行代码使用 `super().__init__(name, *args, **kwargs)` 调用父类的构造函数,实现 `action` 的初始化。这里使用 `args`、`kwargs` 将其他参数传递给父类的构造函数,比如 `context`、`llm`。 @@ -106,31 +102,31 @@ ```python class InvoiceOCR(Action): """Action class for performing OCR on invoice files, including zip, PDF, png, and jpg files. - + Args: name: The name of the action. Defaults to an empty string. language: The language for OCR output. Defaults to "ch" (Chinese). - + """ - + def __init__(self, name: str = "", *args, **kwargs): super().__init__(name, *args, **kwargs) ``` -2. 重写 `run` 方法。`run` 方法是 `action` 执行的主要函数。`InvoiceOCR` 对于 `pdf`, `png`, `jpg` 格式发票文件,通过开源的 `PaddleOCR API` 对发票文件进行 `ocr` 识别,对于 `zip` 格式发票文件,先解压压缩包到指定目录,再递归遍历 `pdf`, `png`, `jpg` 格式发票文件分别进行 `ocr` 识别。 +2. 重写 `run` 方法。`run` 方法是 `action` 执行的主要函数。`InvoiceOCR` 对于 `pdf`, `png`, `jpg` 格式发票文件,通过开源的 `PaddleOCR API` 对发票文件进行 `ocr` 识别,对于 `zip` 格式发票文件,先解压压缩包到指定目录,再递归遍历 `pdf`, `png`, `jpg` 格式发票文件分别进行 `ocr` 识别。 ```python async def run(self, file_path: Path, *args, **kwargs) -> list: """Execute the action to identify invoice files through OCR. - + Args: file_path: The path to the input file. - + Returns: A list of OCR results. """ file_ext = await self._check_file_type(file_path) - + if file_ext == ".zip": # OCR recognizes zip batch files unzip_path = await self._unzip(file_path) @@ -143,38 +139,38 @@ ocr_result = await self._ocr(str(invoice_file_path)) ocr_list.append(ocr_result) return ocr_list - + else: # OCR identifies single file ocr_result = await self._ocr(file_path) return [ocr_result] - + @staticmethod async def _check_file_type(file_path: Path) -> str: """Check the file type of the given filename. - + Args: file_path: The path of the file. - + Returns: The file type based on FileExtensionType enum. - + Raises: Exception: If the file format is not zip, pdf, png, or jpg. """ ext = file_path.suffix if ext not in [".zip", ".pdf", ".png", ".jpg"]: raise Exception("The invoice format is not zip, pdf, png, or jpg") - + return ext - + @staticmethod async def _unzip(file_path: Path) -> Path: """Unzip a file and return the path to the unzipped directory. - + Args: file_path: The path to the zip file. - + Returns: The path to the unzipped directory. """ @@ -186,16 +182,16 @@ if relative_name.suffix: full_filename = file_directory / relative_name await File.write(full_filename.parent, relative_name.name, zip_ref.read(zip_info.filename)) - + logger.info(f"unzip_path: {file_directory}") return file_directory - + @staticmethod async def _ocr(invoice_file_path: Path): ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=1) ocr_result = ocr.ocr(str(invoice_file_path), cls=True) return ocr_result - + ``` 3. 其他 `action` 写法类似。`GenerateTable` 将 `ocr` 识别后的数据提供给 `llm` 大模型提取主要信息写入表格;`ReplyQuestion` 提问 `llm` 大模型关于发票的内容。 @@ -203,32 +199,32 @@ ```python class GenerateTable(Action): """Action class for generating tables from OCR results. - + Args: name: The name of the action. Defaults to an empty string. language: The language used for the generated table. Defaults to "ch" (Chinese). - + """ - + def __init__(self, name: str = "", language: str = "ch", *args, **kwargs): super().__init__(name, *args, **kwargs) self.language = language - + async def run(self, ocr_results: list, filename: str, *args, **kwargs) -> dict[str, str]: """Processes OCR results, extracts invoice information, generates a table, and saves it as an Excel file. - + Args: ocr_results: A list of OCR results obtained from invoice processing. filename: The name of the output Excel file. - + Returns: A dictionary containing the invoice information. - + """ table_data = [] pathname = INVOICE_OCR_TABLE_PATH pathname.mkdir(parents=True, exist_ok=True) - + for ocr_result in ocr_results: # Extract invoice OCR main information prompt = EXTRACT_OCR_MAIN_INFO_PROMPT.format(ocr_result=ocr_result, language=self.language) @@ -236,35 +232,35 @@ invoice_data = OutputParser.extract_struct(ocr_info, dict) if invoice_data: table_data.append(invoice_data) - + # Generate Excel file filename = f"{filename.split('.')[0]}.xlsx" full_filename = f"{pathname}/{filename}" df = pd.DataFrame(table_data) df.to_excel(full_filename, index=False) return table_data - - + + class ReplyQuestion(Action): """Action class for generating replies to questions based on OCR results. - + Args: name: The name of the action. Defaults to an empty string. language: The language used for generating the reply. Defaults to "ch" (Chinese). - + """ - + def __init__(self, name: str = "", language: str = "ch", *args, **kwargs): super().__init__(name, *args, **kwargs) self.language = language - + async def run(self, query: str, ocr_result: list, *args, **kwargs) -> str: """Reply to questions based on ocr results. - + Args: query: The question for which a reply is generated. ocr_result: A list of OCR results. - + Returns: A reply result of string type. """ @@ -273,8 +269,6 @@ return resp ``` - - ## 角色执行结果 ### 输入样例 @@ -292,7 +286,7 @@ await role.run(Message(content="Invoicing date", instruct_content={"file_path": path})) ``` -- 样例 2 +- 样例 2 - - 发票图片 @@ -315,8 +309,6 @@ ![image](/image/guide/use_cases/invoice_ocr_assistant/output.png) - - ## 注意点 该角色最好使用长文本限制较大的 `llm` 大模型 `api`,比如 `gpt-3.5-turbo-16k`,避免 `ocr` 识别结果太大与 `llm` 大模型交互时被限制。 diff --git a/src/zhcn/guide/use_cases/agent/researcher.md b/src/zh/guide/use_cases/agent/researcher.md similarity index 98% rename from src/zhcn/guide/use_cases/agent/researcher.md rename to src/zh/guide/use_cases/agent/researcher.md index b94cedc6..798a5ca6 100644 --- a/src/zhcn/guide/use_cases/agent/researcher.md +++ b/src/zh/guide/use_cases/agent/researcher.md @@ -27,7 +27,6 @@ 3. 点击需要进一步浏览的网页,判断网页内容对待研究的问题是否有帮助,提取有关的信息并记录 4. 聚合所有的记录下来的相关资料,针对待研究的问题撰写报告 - 因此,我们尝试让GPT模拟以上的调研流程,整体步骤如下: 1. 用户输入待调研问题 @@ -86,7 +85,7 @@ class CollectLinks(Action): except Exception as e: logger.exception(f"fail to get keywords related to the research topic \"{topic}\" for {e}") keywords = [topic] - + # 用搜索引擎对对子问题进行搜索 results = await asyncio.gather(*(self.search_engine.run(i, as_string=False) for i in keywords)) @@ -218,7 +217,7 @@ class Researcher(Role): **kwargs, ): super().__init__(name, profile, goal, constraints, **kwargs) - + # 添加`CollectLinks`、`WebBrowseAndSummarize`、`ConductResearch`三个Action self._init_actions([CollectLinks(name), WebBrowseAndSummarize(name), ConductResearch(name)]) @@ -288,9 +287,9 @@ class Researcher(Role): - SEARCH_ENGINE: 设置为serpapi - SERPAPI_API_KEY: 从https://serpapi.com/获取 - google - - SEARCH_ENGINE: 设置为google - - GOOGLE_API_KEY: 从https://console.cloud.google.com/apis/credentials获取 - - GOOGLE_CSE_ID: 从https://programmablesearchengine.google.com/controlpanel/create获取 +- SEARCH_ENGINE: 设置为google +- GOOGLE_API_KEY: 从https://console.cloud.google.com/apis/credentials获取 +- GOOGLE_CSE_ID: 从https://programmablesearchengine.google.com/controlpanel/create获取 - serper - SEARCH_ENGINE: 设置为serper - SERPER_API_KEY: 从https://serper.dev/获取 @@ -299,8 +298,6 @@ class Researcher(Role): `WebBrowserEngine`支持playwright/selenium引擎,要使用它们都需要安装额外的依赖,它们区别如下: - - | 名称 | 默认引擎 | 额外依赖包 | 安装 | 异步方式 | 支持的平台 | | -------------------------------------------- | -------- | ----------------------------------------- | --------------------------------- | -------- | --------------------------------------------------------------------- | | [playwright](https://playwright.dev/python/) | √ | playwright beautifulsoup4 | pip install metagpt\[playwright\] | 原生 | [支持部分平台](https://playwright.dev/docs/intro#system-requirements) | diff --git a/src/zhcn/guide/use_cases/agent/tutorial_assistant.md b/src/zh/guide/use_cases/agent/tutorial_assistant.md similarity index 99% rename from src/zhcn/guide/use_cases/agent/tutorial_assistant.md rename to src/zh/guide/use_cases/agent/tutorial_assistant.md index e5c5db75..a7aa15cd 100644 --- a/src/zhcn/guide/use_cases/agent/tutorial_assistant.md +++ b/src/zh/guide/use_cases/agent/tutorial_assistant.md @@ -14,8 +14,6 @@ [GitHub Source Code](https://github.com/geekan/MetaGPT/blob/main/metagpt/roles/tutorial_assistant.py) - - ## 角色定义 1. 定义角色类,继承 `Role` 基类,重写 `__init__` 初始化方法。`__init__` 方法必须包含`name`、`profile`、`goal`、`constraints` 参数。第一行代码使用`super().__init__(name, profile, goal, constraints)` 调用父类的构造函数,实现 `Role` 的初始化。使用 `self._init_actions([WriteDirectory(language=language)])` 添加初始的 `action` 和 `states`,这里先添加写目录的 `action`。同时,也可以自定义参数,这里加了 `language` 参数支持自定义语言。使用`self._set_react_mode(react_mode="by_order")` 将 `_init_actions` 的 `action` 执行顺序设置为顺序。 @@ -23,7 +21,7 @@ ```python class TutorialAssistant(Role): """Tutorial assistant, input one sentence to generate a tutorial document in markup format. - + Args: name: The name of the role. profile: The role profile description. @@ -31,7 +29,7 @@ constraints: Constraints or requirements for the role. language: The language in which the tutorial documents will be generated. """ - + def __init__( self, name: str = "Stitch", @@ -64,7 +62,7 @@ ```python async def _act(self) -> Message: """Perform an action as determined by the role. - + Returns: A message containing the result of the action. """ @@ -82,14 +80,14 @@ self.total_content += "\n\n\n" self.total_content += resp return Message(content=resp, role=self.profile) - + async def _handle_directory(self, titles: Dict) -> Message: """Handle the directories for the tutorial document. - + Args: titles: A dictionary containing the titles and directory structure, such as {"title": "xxx", "directory": [{"dir 1": ["sub dir 1", "sub dir 2"]}]} - + Returns: A message containing information about the directory. """ @@ -106,7 +104,6 @@ self._init_actions(actions) ``` - ## Action定义 1. 定义 `action`,每个 `action` 对应一个 `class` 对象,继承 `Action` 基类,重写 `__init__` 初始化方法。。`__init__` 方法包含 `name` 参数。第一行代码使用 `super().__init__(name, *args, **kwargs)` 调用父类的构造函数,实现 `action` 的初始化。这里使用 `args`、`kwargs` 将其他参数传递给父类的构造函数,比如 `context`、`llm`。 @@ -120,22 +117,22 @@ @File : tutorial_assistant.py @Describe : Actions of the tutorial assistant, including writing directories and document content. """ - + from typing import Dict - + from metagpt.actions import Action from metagpt.prompts.tutorial_assistant import DIRECTORY_PROMPT, CONTENT_PROMPT from metagpt.utils.common import OutputParser - - + + class WriteDirectory(Action): """Action class for writing tutorial directories. - + Args: name: The name of the action. language: The language to output, default is "Chinese". """ - + def __init__(self, name: str = "", language: str = "Chinese", *args, **kwargs): super().__init__(name, *args, **kwargs) self.language = language @@ -146,10 +143,10 @@ ```python async def run(self, topic: str, *args, **kwargs) -> Dict: """Execute the action to generate a tutorial directory according to the topic. - + Args: topic: The tutorial topic. - + Returns: the tutorial directory information, including {"title": "xxx", "directory": [{"dir 1": ["sub dir 1", "sub dir 2"]}]}. """ @@ -163,24 +160,24 @@ ```python class WriteContent(Action): """Action class for writing tutorial content. - + Args: name: The name of the action. directory: The content to write. language: The language to output, default is "Chinese". """ - + def __init__(self, name: str = "", directory: str = "", language: str = "Chinese", *args, **kwargs): super().__init__(name, *args, **kwargs) self.language = language self.directory = directory - + async def run(self, topic: str, *args, **kwargs) -> str: """Execute the action to write document content according to the directory and topic. - + Args: topic: The tutorial topic. - + Returns: The written tutorial content. """ @@ -188,8 +185,6 @@ return await self._aask(prompt=prompt) ``` - - ## 角色执行结果 ### 输入样例 @@ -210,8 +205,6 @@ ![image](/image/guide/use_cases/tutorial_assistant/output_zh_2.png) - - ## 注意点 该角色暂未支持联网搜索能力,内容生成依赖 `LLM` 大模型训练的数据。 diff --git a/src/zhcn/guide/use_cases/multi_agent/creative.md b/src/zh/guide/use_cases/multi_agent/creative.md similarity index 99% rename from src/zhcn/guide/use_cases/multi_agent/creative.md rename to src/zh/guide/use_cases/multi_agent/creative.md index 1fe2ddd3..eba73295 100644 --- a/src/zhcn/guide/use_cases/multi_agent/creative.md +++ b/src/zh/guide/use_cases/multi_agent/creative.md @@ -1,2 +1,3 @@ # 创意智能体 + 在此用例中,我们探索构建任何“角色”组以获取乐趣,并使它们能够相互交互。 diff --git a/src/zhcn/guide/use_cases/multi_agent/debate.md b/src/zh/guide/use_cases/multi_agent/debate.md similarity index 98% rename from src/zhcn/guide/use_cases/multi_agent/debate.md rename to src/zh/guide/use_cases/multi_agent/debate.md index 015ec340..50a018e7 100644 --- a/src/zhcn/guide/use_cases/multi_agent/debate.md +++ b/src/zh/guide/use_cases/multi_agent/debate.md @@ -5,14 +5,17 @@ 想象一下,如果我们模拟代表拜登和特朗普的智能体共同合作会怎样。这是一个有趣的实验,不是吗?考虑到他们已知的分歧,这样的组合可能导致一些生动的交流。这是一个展示如何设计多个智能体并促进它们之间的互动的理想例子。我们将称呼这个实验为“拜登-特朗普辩论”。 总体上,我们需要3个步骤来设定它们的辩论: -1. 定义一个具有发言行为的辩手角色,我们建议参考[智能体入门](/zhcn/guide/tutorials/agent_101) + +1. 定义一个具有发言行为的辩手角色,我们建议参考[智能体入门](/zh/guide/tutorials/agent_101) 2. 处理辩手之间的通信,也就是让拜登听特朗普说话,反之亦然 3. 初始化两个辩手实例,拜登和特朗普,创建一个带有环境的团队,并使它们能够相互交互 完整的代码可在本节末尾找到。 ### 定义动作 + 首先,我们需要定义一个`Action`。这是一个辩论场景,所以让我们将其命名为 `SpeakAloud` + ```python class SpeakAloud(Action): """动作:在辩论中大声说话(争吵)""" @@ -39,10 +42,13 @@ class SpeakAloud(Action): return rsp ``` + ### 定义角色 + 我们将定义一个通用的 `Role`,称为 `Debator`。 在这里,`_init_actions` 使我们的 `Role` 拥有我们刚刚定义的 `SpeakAloud` 动作。我们还使用 `_watch` 监视了 `SpeakAloud` 和 `UserRequirement`,因为我们希望每个辩手关注来自对手的 `SpeakAloud` 消息,以及来自用户的 `UserRequirement`(人类指令)。 + ```python class Debator(Role): def __init__( @@ -58,8 +64,10 @@ class Debator(Role): self.name = name self.opponent_name = opponent_name ``` + 接下来,我们使每个辩手听取对手的论点。这通过重写 `_observe` 函数完成。这是一个重要的点,因为在环境中将会有来自特朗普和拜登的 "SpeakAloud 消息"(由 `SpeakAloud` 触发的 `Message`)。 我们不希望特朗普处理自己上一轮的 "SpeakAloud 消息",而是处理来自拜登的消息,反之亦然。(在即将到来的更新中,我们将使用一般的消息路由机制来处理这个过程。在更新后,你将不再需要执行此步骤) + ```python async def _observe(self) -> int: await super()._observe() @@ -67,7 +75,9 @@ async def _observe(self) -> int: self._rc.news = [msg for msg in self._rc.news if msg.send_to == self.name] return len(self._rc.news) ``` + 最后,我们使每个辩手能够向对手发送反驳的论点。在这里,我们从消息历史中构建一个上下文,使 `Debator` 运行他拥有的 `SpeakAloud` 动作,并使用反驳论点内容创建一个新的 `Message`。请注意,我们定义每个 `Debator` 将把 `Message` 发送给他的对手。 + ```python async def _act(self) -> Message: logger.info(f"{self._setting}: ready to {self._rc.todo}") @@ -131,10 +141,13 @@ class Debator(Role): return msg ``` + ### 创建团队并添加角色 + 现在我们已经定义了我们的 `Debator`,让我们将它们组合起来看看会发生什么。我们建立一个 `Team` 并“雇佣”了拜登和特朗普。在这个例子中,我们将通过将我们的指令(作为 `UserRequirement`)发送给拜登,让他先开始。如果你想让特朗普先说话,将 `send_to` 设置为 "Trump"。 运行这个 `Team`,我们应该看到他们之间友好的对话! + ```python async def debate(idea: str, investment: float = 3.0, n_round: int = 5): """运行拜登-特朗普辩论,观看他们之间的友好对话 :) """ @@ -160,7 +173,7 @@ def main( n_round: int = typer.Option(default=5, help="Number of rounds for the simulation."), ): """ - :param idea: Debate topic, such as "Topic: The U.S. should commit more in climate change fighting" + :param idea: Debate topic, such as "Topic: The U.S. should commit more in climate change fighting" or "Trump: Climate change is a hoax" :param investment: contribute a certain dollar amount to watch the debate :param n_round: maximum rounds of the debate @@ -173,14 +186,17 @@ def main( if __name__ == '__main__': app() ``` + ### 本节的完整脚本 https://github.com/geekan/MetaGPT/blob/main/examples/debate.py 运行以下命令: + ```sh python3 examples/debate.py --idea "Talk about how the U.S. should respond to climate change" ``` + 运行结果如下: -![img](/image/guide/use_cases/debate_log.png) \ No newline at end of file +![img](/image/guide/use_cases/debate_log.png) diff --git a/src/zhcn/guide/use_cases/multi_agent/minecraft.md b/src/zh/guide/use_cases/multi_agent/minecraft.md similarity index 98% rename from src/zhcn/guide/use_cases/multi_agent/minecraft.md rename to src/zh/guide/use_cases/multi_agent/minecraft.md index 820bb006..aa48047f 100644 --- a/src/zhcn/guide/use_cases/multi_agent/minecraft.md +++ b/src/zh/guide/use_cases/multi_agent/minecraft.md @@ -1,2 +1,3 @@ # 我的世界:智能体集体探索世界 + 即将更新,保持关注。 diff --git a/src/zhcn/guide/use_cases/multi_agent/software_company.md b/src/zh/guide/use_cases/multi_agent/software_company.md similarity index 61% rename from src/zhcn/guide/use_cases/multi_agent/software_company.md rename to src/zh/guide/use_cases/multi_agent/software_company.md index 647f0528..ac0a1014 100644 --- a/src/zhcn/guide/use_cases/multi_agent/software_company.md +++ b/src/zh/guide/use_cases/multi_agent/software_company.md @@ -1,3 +1,3 @@ # 软件公司:一行需求完成软件开发 -即将更新,保持关注。 \ No newline at end of file +即将更新,保持关注。 diff --git a/src/zh/guide/use_cases/multi_agent/software_gallery.md b/src/zh/guide/use_cases/multi_agent/software_gallery.md new file mode 100644 index 00000000..b0217654 --- /dev/null +++ b/src/zh/guide/use_cases/multi_agent/software_gallery.md @@ -0,0 +1 @@ +# Gallery diff --git a/src/zhcn/guide/use_cases/multi_agent/virtual_town.md b/src/zh/guide/use_cases/multi_agent/virtual_town.md similarity index 98% rename from src/zhcn/guide/use_cases/multi_agent/virtual_town.md rename to src/zh/guide/use_cases/multi_agent/virtual_town.md index 151a41bf..4afcd9e8 100644 --- a/src/zhcn/guide/use_cases/multi_agent/virtual_town.md +++ b/src/zh/guide/use_cases/multi_agent/virtual_town.md @@ -1,2 +1,3 @@ # 虚拟小镇:多智能体社区的热闹日常生活 + 即将更新,保持关注。 diff --git a/src/zhcn/guide/use_cases/multi_agent/werewolf_game.md b/src/zh/guide/use_cases/multi_agent/werewolf_game.md similarity index 98% rename from src/zhcn/guide/use_cases/multi_agent/werewolf_game.md rename to src/zh/guide/use_cases/multi_agent/werewolf_game.md index a3d23c53..9b3abe40 100644 --- a/src/zhcn/guide/use_cases/multi_agent/werewolf_game.md +++ b/src/zh/guide/use_cases/multi_agent/werewolf_game.md @@ -1,2 +1,3 @@ # 狼人杀:多智能体玩策略游戏 + 即将更新,保持关注。 diff --git a/src/zhcn/index.md b/src/zh/index.md similarity index 93% rename from src/zhcn/index.md rename to src/zh/index.md index a26f5d3c..fa9b9c10 100644 --- a/src/zhcn/index.md +++ b/src/zh/index.md @@ -13,7 +13,7 @@ hero: actions: - theme: brand text: 开始 - link: /zhcn/guide/get_started/introduction + link: /zh/guide/get_started/introduction - theme: alt text: Github link: https://github.com/geekan/MetaGPT diff --git a/src/zhcn/guide/contribute/rfc_template.md b/src/zhcn/guide/contribute/rfc_template.md deleted file mode 100644 index 21b751bf..00000000 --- a/src/zhcn/guide/contribute/rfc_template.md +++ /dev/null @@ -1,54 +0,0 @@ -# 开发者RFC模版 - -文档修改历史 - -| 日期 | 版本 | 作者 | 修改内容 | -| --- | --- | --- | --- | -| 2023/09/13 | v0.0.1 | | 初版 | -| | | | | - -本文档评审记录 - -| 审核人 | 邀请日期 | 审核日期 | 审核意见 | -| --- | --- | --- | --- | -| @xxx | 2023/09/13 | | | -| | | | | - -# 背景 - -# 目标 - -## 定义 - -### 包括的 - - -### 不包括的 - - -## 有则更优 - - -# 提案 - -3.1 - -3.2 - -# 里程碑[可选] - -# 开放讨论 - -# 附录[可选] - -## 术语 - -| 术语 | 全称 | 解释 | -| --- | --- | --- | -| | | | -| | | | -| | | | -| | | | -| | | | - -## 参考 diff --git a/src/zhcn/guide/faq.md b/src/zhcn/guide/faq.md deleted file mode 100644 index 92e2fd0b..00000000 --- a/src/zhcn/guide/faq.md +++ /dev/null @@ -1,3 +0,0 @@ -# 常见问题解答(FAQ) -详见 -https://deepwisdom.feishu.cn/wiki/MsGnwQBjiif9c3koSJNcYaoSnu4 \ No newline at end of file diff --git a/src/zhcn/guide/in_depth_guides/memory.md b/src/zhcn/guide/in_depth_guides/memory.md deleted file mode 100644 index 107fe785..00000000 --- a/src/zhcn/guide/in_depth_guides/memory.md +++ /dev/null @@ -1 +0,0 @@ -# Memory \ No newline at end of file diff --git a/src/zhcn/guide/in_depth_guides/use_own_llm.md b/src/zhcn/guide/in_depth_guides/use_own_llm.md deleted file mode 100644 index d481ce73..00000000 --- a/src/zhcn/guide/in_depth_guides/use_own_llm.md +++ /dev/null @@ -1 +0,0 @@ -# Use Your Own LLM \ No newline at end of file diff --git a/src/zhcn/guide/use_cases/multi_agent/software_gallery.md b/src/zhcn/guide/use_cases/multi_agent/software_gallery.md deleted file mode 100644 index 07a30c26..00000000 --- a/src/zhcn/guide/use_cases/multi_agent/software_gallery.md +++ /dev/null @@ -1 +0,0 @@ -# Gallery \ No newline at end of file