MetaGPT 与开源 LLM 的整合:让你的 AI 团队更强大 2024-06-19 作者 C3P00 在之前的教程中,我们学习了如何创建和使用智能体、工具以及人机协作。但 MetaGPT 的真正强大之处在于它能够灵活地整合各种大型语言模型 (LLM),包括开源模型。 本教程将带你学习如何将开源 LLM 整合到 MetaGPT 中,并利用它们来生成项目输出。 注意: 由于开源模型本身的限制,本教程中描述的内容无法保证稳定的代码生成。如果你按照本教程进行实验,意味着你已经了解这一点。同时,我们也在探索如何在开源模型下获得更稳定、更高质量的输出。如果你也对此感兴趣,可以加入我们的 Discord 或微信社区群组。相信随着开源模型的更新,这一目标很快就能实现。 整合流程 我们将按照以下步骤介绍本教程: 模型部署: 使用 LLaMA-Factory、FastChat、ollama 等推理库部署相应的 LLM 模型。 LLM 配置: 配置 MetaGPT 以使用部署的 LLM 模型。 可选:修复 LLM 输出: 修复开源 LLM 输出,以提高执行成功率。 运行: 运行 MetaGPT,并观察结果。 模型部署 建议使用 OpenAI 兼容的接口进行模型部署。这样,请求和响应可以直接使用 OpenAI SDK 处理,简化了整合过程。以下推理库支持发布 OpenAI 兼容的接口(ollama 除外): LLaMA-Factory: https://github.com/hiyouga/LLaMA-Factory FastChat: https://github.com/lm-sys/FastChat vllm: https://github.com/vllm-project/vllm ollama: https://github.com/jmorganca/ollama (不支持 OpenAI API 接口) 注意: 默认情况下,你需要有显卡资源进行部署,否则 CPU 推理会比较慢。 LLaMA-Factory 安装: git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python=3.10 conda activate llama_factory cd LLaMA-Factory pip install -r requirements.txt 部署: 启动源模型: python3 src/api_demo.py \ --model_name_or_path meta-llama/Llama-2-13b-chat-hf \ --template llama2 加载和合并 LoRA 输出: python3 src/api_demo.py \ --model_name_or_path path_to_llama2_model \ --template llama2 \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint 默认情况下,接口访问地址为 http://0.0.0.0:8000/。如果需要修改端口,请进入 src/api_demo.py 文件进行修改。如果需要使用多张显卡启动,请在启动命令前添加 CUDA_VISIBLE_DEVICES=0,1,2 并替换为你的显卡编号。不同的模型支持不同的模板值,可以在 src/llmtuner/data/template.py 文件中找到。 请求示例: 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"}], "model": "gpt-3.5-turbo", "stream": false, "max_tokens": 256 }' 默认情况下,请求的模型参数值为 gpt-3.5-turbo,如有必要,请修改它。进入 src/llmtuner/api/app.py 文件的 list_models 方法,并修改为你的自定义值。 FastChat 安装: pip3 install "fschat[model_worker,webui]" 部署: 启动控制器: python3 -m fastchat.serve.controller 启动源模型工作器: python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-13b-v1.5 --conv-template vicuna_v1.1 --model-names vicuna 启动 OpenAI 兼容接口: python3 -m fastchat.serve.openai_api_server --host localhost --port 8000 如果你需要启动 LoRA 微调模型,需要先进行模型合并。 请求示例: 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"}], "model": "gpt-3.5-turbo", "stream": false, "max_tokens": 256 }' 默认情况下,请求的模型参数值为 vicuna,对应于启动 model_worker 时指定的 model-names。 vllm 安装: pip3 install vllm 部署: python3 -m vllm.entrypoints.openai.api_server \ --model meta-llama/Llama-2-13b-hf \ --served-model-name llama2-13b 请求示例: 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"}], "model": "llama2-13b", "stream": false, "max_tokens": 256 }' 默认情况下,请求的模型参数值为 llama2-13b,对应于启动时指定的 served-model-name。 ollama 安装: curl https://ollama.ai/install.sh | sh 部署: ollama run llama2 # 下载速度很快 (10+MB/s) 非本地访问: ollama 服务默认情况下只能本地访问,即 http://localhost:11434/api/chat 或 http://127.0.0.1:11434/api/chat。如果你想要支持 http://ip:11434/api/chat,可以按照以下步骤操作: service ollama stop OLLAMA_HOST=0.0.0.0 OLLAMA_ORIGINS=* ollama serve # 一个终端 ollama run llama2 # 另一个终端 请求示例: # 默认情况下是非流式,`stream: true` curl -X POST http://localhost:11434/api/chat -d '{ "model": "llama2", "messages": [ { "role": "user", "content": "why is the sky blue?" } ] }' LLM 配置 完成模型部署后,需要修改 config/config2.yaml 文件来配置 MetaGPT 使用部署的 LLM 模型。 OpenAI 兼容接口 例如 LLaMA-Factory、FastChat、vllm 的 OpenAI 兼容接口: llm: api_type: 'open_llm' base_url: 'http://106.75.10.xxx:8000/v1' model: 'llama2-13b' base_url 只需要配置到 http://0.0.0.0:8000/v1,其余部分由 OpenAI SDK 自动填充。model 是请求接口参数 model 的实际值。 ollama API 接口 例如通过 ollama 部署的模型服务: llm: api_type: 'ollama' base_url: 'http://127.0.0.1:11434/api' model: 'llama2' base_url 只需要配置到 http://127.0.0.1:11434/api,其余部分由 Ollama LLM 自动填充。model 是请求参数 model 的实际值。 可选:修复 LLM 输出 背景: 本教程主要介绍如何在 MetaGPT 中整合开源模型(以及非 OpenAI 的闭源模型)。由于 LLM 的输出结果与提示词指令格式密切相关,开源模型(以及一些非 OpenAI 的闭源模型)往往非常复杂。它们很难完全按照 MetaGPT 现有角色的指令进行输出,导致输出内容缺失、遗漏和错误。主要表现如下: 目标键无法按照提示词约定的大小写进行输出。 输出的 JSON 纯文本包含缺失或多余的特殊字符,例如 {"a":b"}}, {"a":b"]}, {"a":b" 等等。 为了解决这些问题,MetaGPT 添加了修复开源 LLM 输出的功能。 配置: llm: ... repair_llm_output: true 开启此功能后,执行过程中会尝试修复上述情况。但目前该功能无法保证完全修复,仍存在一些未覆盖的情况(不同的开源模型有不同的情况),执行过程可能会中断并退出。如果你对此感兴趣,请提交 PR 并附上相应的模型描述、测试日志和单元测试用例。 开启此功能后,LLM 输出(MetaGPT 中软件公司中的 ProductManager 和 Architect 角色)将会被修复。日志中会出现 repair_ 关键字,你可以关注它。 运行 完成上述步骤后,你就可以正式开始使用了。 metagpt "write a snake game" 扩展 MetaGPT 本身是一个多智能体框架,并不局限于软件项目生成。你也可以结合整合的开源模型,构建相应的智能体,用于自己的应用场景。开始你的智能体之旅吧!
在之前的教程中,我们学习了如何创建和使用智能体、工具以及人机协作。但 MetaGPT 的真正强大之处在于它能够灵活地整合各种大型语言模型 (LLM),包括开源模型。
本教程将带你学习如何将开源 LLM 整合到 MetaGPT 中,并利用它们来生成项目输出。
注意:
由于开源模型本身的限制,本教程中描述的内容无法保证稳定的代码生成。如果你按照本教程进行实验,意味着你已经了解这一点。同时,我们也在探索如何在开源模型下获得更稳定、更高质量的输出。如果你也对此感兴趣,可以加入我们的 Discord 或微信社区群组。相信随着开源模型的更新,这一目标很快就能实现。
整合流程
我们将按照以下步骤介绍本教程:
模型部署
建议使用 OpenAI 兼容的接口进行模型部署。这样,请求和响应可以直接使用 OpenAI SDK 处理,简化了整合过程。以下推理库支持发布 OpenAI 兼容的接口(ollama 除外):
注意: 默认情况下,你需要有显卡资源进行部署,否则 CPU 推理会比较慢。
LLaMA-Factory
安装:
部署:
默认情况下,接口访问地址为
http://0.0.0.0:8000/
。如果需要修改端口,请进入src/api_demo.py
文件进行修改。如果需要使用多张显卡启动,请在启动命令前添加CUDA_VISIBLE_DEVICES=0,1,2
并替换为你的显卡编号。不同的模型支持不同的模板值,可以在src/llmtuner/data/template.py
文件中找到。请求示例:
默认情况下,请求的模型参数值为
gpt-3.5-turbo
,如有必要,请修改它。进入src/llmtuner/api/app.py
文件的list_models
方法,并修改为你的自定义值。FastChat
安装:
部署:
如果你需要启动 LoRA 微调模型,需要先进行模型合并。
请求示例:
默认情况下,请求的模型参数值为
vicuna
,对应于启动model_worker
时指定的model-names
。vllm
安装:
部署:
请求示例:
默认情况下,请求的模型参数值为
llama2-13b
,对应于启动时指定的served-model-name
。ollama
安装:
部署:
非本地访问:
ollama 服务默认情况下只能本地访问,即
http://localhost:11434/api/chat
或http://127.0.0.1:11434/api/chat
。如果你想要支持http://ip:11434/api/chat
,可以按照以下步骤操作:请求示例:
LLM 配置
完成模型部署后,需要修改
config/config2.yaml
文件来配置 MetaGPT 使用部署的 LLM 模型。OpenAI 兼容接口
例如 LLaMA-Factory、FastChat、vllm 的 OpenAI 兼容接口:
base_url
只需要配置到http://0.0.0.0:8000/v1
,其余部分由 OpenAI SDK 自动填充。model
是请求接口参数model
的实际值。ollama API 接口
例如通过 ollama 部署的模型服务:
base_url
只需要配置到http://127.0.0.1:11434/api
,其余部分由 Ollama LLM 自动填充。model
是请求参数model
的实际值。可选:修复 LLM 输出
背景:
本教程主要介绍如何在 MetaGPT 中整合开源模型(以及非 OpenAI 的闭源模型)。由于 LLM 的输出结果与提示词指令格式密切相关,开源模型(以及一些非 OpenAI 的闭源模型)往往非常复杂。它们很难完全按照 MetaGPT 现有角色的指令进行输出,导致输出内容缺失、遗漏和错误。主要表现如下:
{"a":b"}}, {"a":b"]}, {"a":b"
等等。为了解决这些问题,MetaGPT 添加了修复开源 LLM 输出的功能。
配置:
开启此功能后,执行过程中会尝试修复上述情况。但目前该功能无法保证完全修复,仍存在一些未覆盖的情况(不同的开源模型有不同的情况),执行过程可能会中断并退出。如果你对此感兴趣,请提交 PR 并附上相应的模型描述、测试日志和单元测试用例。
开启此功能后,LLM 输出(MetaGPT 中软件公司中的
ProductManager
和Architect
角色)将会被修复。日志中会出现repair_
关键字,你可以关注它。运行
完成上述步骤后,你就可以正式开始使用了。
扩展
MetaGPT 本身是一个多智能体框架,并不局限于软件项目生成。你也可以结合整合的开源模型,构建相应的智能体,用于自己的应用场景。开始你的智能体之旅吧!