MetaGPT 与开源 LLM 的整合:让你的 AI 团队更强大

在之前的教程中,我们学习了如何创建和使用智能体、工具以及人机协作。但 MetaGPT 的真正强大之处在于它能够灵活地整合各种大型语言模型 (LLM),包括开源模型。

本教程将带你学习如何将开源 LLM 整合到 MetaGPT 中,并利用它们来生成项目输出。

注意:

由于开源模型本身的限制,本教程中描述的内容无法保证稳定的代码生成。如果你按照本教程进行实验,意味着你已经了解这一点。同时,我们也在探索如何在开源模型下获得更稳定、更高质量的输出。如果你也对此感兴趣,可以加入我们的 Discord 或微信社区群组。相信随着开源模型的更新,这一目标很快就能实现。

整合流程

我们将按照以下步骤介绍本教程:

  1. 模型部署: 使用 LLaMA-Factory、FastChat、ollama 等推理库部署相应的 LLM 模型。
  2. LLM 配置: 配置 MetaGPT 以使用部署的 LLM 模型。
  3. 可选:修复 LLM 输出: 修复开源 LLM 输出,以提高执行成功率。
  4. 运行: 运行 MetaGPT,并观察结果。

模型部署

建议使用 OpenAI 兼容的接口进行模型部署。这样,请求和响应可以直接使用 OpenAI SDK 处理,简化了整合过程。以下推理库支持发布 OpenAI 兼容的接口(ollama 除外):

注意: 默认情况下,你需要有显卡资源进行部署,否则 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/chathttp://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 中软件公司中的 ProductManagerArchitect 角色)将会被修复。日志中会出现 repair_ 关键字,你可以关注它。

运行

完成上述步骤后,你就可以正式开始使用了。

metagpt "write a snake game"

扩展

MetaGPT 本身是一个多智能体框架,并不局限于软件项目生成。你也可以结合整合的开源模型,构建相应的智能体,用于自己的应用场景。开始你的智能体之旅吧!

发表评论