从零构建多智能体应用:基于AgentScope框架的AI Agent开发实战

发布时间:2026/9/2 8:18:35
从零构建多智能体应用:基于AgentScope框架的AI Agent开发实战 大家好我是专注于AI应用开发与实战分享的技术博主。在探索AI Agent智能体开发的过程中你是否遇到过这样的困境想快速搭建一个多智能体协作的应用却苦于框架选择、环境配置和模型集成的复杂性网上资料要么过于学术化要么是零散的代码片段难以形成完整的项目闭环。今天我们就来深入剖析一个由清华大学和智谱AI联合推出的开源AI Agent框架——AgentScope并以其官方示例项目QwenPaw为蓝本手把手带你从零开始构建一个功能完整、可复现的多智能体应用。无论你是想入门AI Agent开发的学生还是寻求项目落地的工程师这篇文章都将为你提供一套从环境搭建、代码解读到部署优化的完整实战指南。1. AgentScope与QwenPawAI Agent开发的新利器在深入代码之前我们有必要厘清几个核心概念理解我们即将使用的工具能解决什么问题。AI Agent智能体是什么简单来说它是一个能够感知环境、进行决策并执行行动以实现特定目标的软件实体。在LLM大语言模型的加持下AI Agent具备了理解自然语言、进行复杂推理和规划的能力。单个Agent可以完成特定任务而多个Agent协作Multi-Agent则能处理更复杂的场景如辩论、游戏、软件开发等。AgentScope正是为了简化多智能体应用的开发而生的。它不是一个模型而是一个开发框架。你可以把它想象成Spring之于Java后端开发它提供了一套标准化的编程范式、丰富的内置组件如Agent、消息、环境和便捷的工具集让开发者能更专注于业务逻辑而非底层通信和状态管理。其核心优势在于易用性提供高层次API几行代码就能构建智能体。灵活性支持多种模型后端OpenAI API、智谱、DashScope、Ollama本地模型等。可复现性内置分布式并行处理和容错机制便于实验和评估。QwenPaw是AgentScope团队提供的一个示例项目Demo。它生动地展示了如何利用AgentScope框架快速搭建一个有趣的多智能体应用。在这个Demo中多个扮演不同角色如画家、诗人、评论家的Agent会围绕一个主题进行协作创作。通过这个项目我们可以直观地学习AgentScope的核心用法。接下来我们将进入实战环节。请确保你有一台可以连接互联网的计算机并准备好你的开发环境。2. 环境准备与项目初始化一个稳定的环境是成功的第一步。本节将详细说明所需的软硬件环境并带你初始化项目。2.1 基础环境要求操作系统推荐使用 Linux (Ubuntu 20.04) 或 macOS。Windows系统可通过WSL2获得最佳体验。Python版本Python 3.8 或更高版本。这是运行绝大多数AI框架的基础。包管理工具pip或conda。本文使用pip。网络需要能访问互联网以下载包和模型如果使用在线API。硬件如果计划使用本地大模型如通过Ollama部署Qwen则需要具备足够显存的GPU如RTX 3060 12G以上。如果仅使用在线API如OpenAI、智谱则对本地硬件要求不高。2.2 创建虚拟环境强烈推荐使用虚拟环境可以隔离项目依赖避免包冲突。# 1. 创建项目目录并进入 mkdir agentscope-demo cd agentscope-demo # 2. 创建Python虚拟环境以venv为例 python -m venv venv # 3. 激活虚拟环境 # Linux/macOS source venv/bin/activate # Windows venv\Scripts\activate # 激活后命令行提示符前通常会显示 (venv)2.3. 安装AgentScopeAgentScope可以通过pip直接安装。为了获得完整功能我们安装标准版。pip install agentscope安装完成后可以通过以下命令验证是否安装成功python -c “import agentscope; print(agentscope.__version__)”如果输出版本号如0.1.0说明安装成功。2.4. 获取QwenPaw示例代码QwenPaw的代码托管在GitHub上。我们将其克隆到本地。# 克隆AgentScope仓库其中包含examples git clone https://github.com/modelscope/agentscope.git cd agentscope # QwenPaw示例位于 examples/qwen_paw 目录下 ls examples/qwen_paw/你会看到类似app.py,config.yaml,requirements.txt等文件。app.py就是应用的主入口。2.5. 安装项目特定依赖进入示例目录并根据其要求安装额外依赖。cd examples/qwen_paw pip install -r requirements.txtrequirements.txt里通常包含一些示例运行所需的额外库如用于图像处理的Pillow。至此基础环境已经就绪。但要让智能体真正“智能”起来我们还需要为其配置“大脑”——大语言模型。3. 模型配置为智能体注入灵魂Agent支持多种模型服务。你需要根据自身情况选择一种并完成配置。这里我们介绍两种最常用的方式使用在线API和部署本地模型。3.1 方式一使用在线API以OpenAI为例这种方式最简单无需本地GPU但需要API Key和产生费用。获取API Key访问 OpenAI 平台 (platform.openai.com) 注册并获取API Key。配置模型信息在QwenPaw示例中模型配置通常在config.yaml或通过代码参数指定。我们需要修改配置以使用OpenAI。让我们查看并修改config.yaml如果存在或者直接理解app.py中的配置逻辑。假设我们需要在代码中配置# 示例在app.py中或单独配置脚本里设置模型 import agentscope from agentscope.models import OpenAIChatWrapper # 初始化AgentScope指定模型配置 agentscope.init( model_configs{ “config_name”: “my_openai”, # 配置名称 “model_type”: “openai_chat”, # 模型类型 “model_name”: “gpt-3.5-turbo”, # 或 “gpt-4” “api_key”: “sk-your-openai-api-key-here”, # 替换为你的真实Key “organization”: “your-org-id”, # 可选 } )重要永远不要将真实的API Key提交到版本控制系统如Git。建议通过环境变量读取# 在终端中设置环境变量临时 export OPENAI_API_KEY“sk-your-real-key”然后在代码中读取import os api_key os.environ.get(“OPENAI_API_KEY”)3.2 方式二使用本地模型以Ollama Qwen2.5为例这种方式数据隐私性好无网络延迟但对本地算力有要求。安装OllamaOllama是一个简化本地大模型运行的工具。访问 ollama.com 下载并安装。安装后在终端运行ollama --version检查。拉取并运行模型例如运行Qwen2.5 7B模型。# 拉取模型首次运行会自动下载 ollama pull qwen2.5:7b # 运行模型服务默认在本地11434端口启动 ollama run qwen2.5:7b保持这个终端运行模型服务就在后台启动了。配置AgentScope使用Ollama AgentScope通过OpenAIChatWrapper兼容Ollama的OpenAI格式API。import agentscope from agentscope.models import OpenAIChatWrapper agentscope.init( model_configs{ “config_name”: “my_ollama”, “model_type”: “openai_chat”, “model_name”: “qwen2.5:7b”, # 与Ollama中的模型名一致 “api_key”: “ollama”, # Ollama不需要key但字段必填可写任意值 “base_url”: “http://localhost:11434/v1”, # Ollama的API地址 } )3.3 模型配置验证编写一个简单的测试脚本test_model.py来验证配置是否成功。# test_model.py import agentscope from agentscope.models import OpenAIChatWrapper import os # 方式1: 使用环境变量中的OpenAI Key (注释掉则为方式2) # api_key os.environ.get(“OPENAI_API_KEY”) # base_url None # model_name “gpt-3.5-turbo” # 方式2: 使用本地Ollama api_key “ollama” base_url “http://localhost:11434/v1” model_name “qwen2.5:7b” agentscope.init( model_configs{ “config_name”: “test_config”, “model_type”: “openai_chat”, “model_name”: model_name, “api_key”: api_key, “base_url”: base_url, } ) # 创建模型实例 model OpenAIChatWrapper(config_name“test_config”) # 发送测试消息 response model(“Hello, who are you?”) print(“Model Response:”, response)运行python test_model.py如果看到模型返回的自我介绍恭喜你模型配置成功4. QwenPaw项目核心代码解读与运行环境与模型都已就绪现在让我们打开app.py深入理解QwenPaw是如何工作的。4.1 项目结构概览在examples/qwen_paw/目录下通常包含以下文件app.py主程序定义了智能体、工作流程和运行逻辑。config.yaml/config.py配置文件存放模型、Agent参数等。requirements.txt项目依赖列表。assets/或output/可能存放生成的图片、文本等输出结果。4.2 核心代码分步解析我们以典型的QwenPaw协作场景为例拆解其实现。请注意实际代码可能随版本更新但核心逻辑相通。第一步初始化框架与模型import agentscope from agentscope.agents import AgentBase from agentscope.message import Msg from agentscope.models import OpenAIChatWrapper import os # 1. 初始化AgentScope加载模型配置 # 这里假设我们从config.yaml读取或直接像之前那样用init函数 model_config { “config_name”: “qwen”, “model_type”: “openai_chat”, # … 具体参数参考上一节 } agentscope.init(model_configsmodel_config)第二步创建自定义智能体Agent一个智能体通常包含身份Role、系统提示System Prompt和模型。class PainterAgent(AgentBase): “”“画家智能体负责根据描述生成图片”“” def __init__(self, name, model_config_name): super().__init__(namename) # 为该Agent指定使用的模型配置 self.model OpenAIChatWrapper(config_namemodel_config_name) # 系统提示词定义Agent的角色和能力 self.system_prompt “““你是一位天才画家。你擅长将文字描述转化为生动、富有艺术感的画面描述。 用户会给你一个主题或一段文字请你用精炼的语言描述出一幅对应的画作场景。 只输出画面描述不要输出其他内容。”“” def reply(self, x): “”“处理传入的消息并返回回复”“” # 构造给模型的完整消息 messages [ {“role”: “system”, “content”: self.system_prompt}, {“role”: “user”, “content”: x.content} # x是传入的Msg对象 ] # 调用模型获取回复 response self.model(messages) # 将回复封装成Msg对象返回 return Msg(self.name, response)第三步定义工作流程Pipeline工作流程规定了多个Agent之间如何交互。这里是一个简单的顺序流程诗人 - 画家 - 评论家。def qwen_paw_pipeline(topic): “”“QwenPaw核心流程诗人作诗画家作画评论家点评”“” # 1. 创建各个智能体实例 poet PoetAgent(name“李白”, model_config_name“qwen”) painter PainterAgent(name“达芬奇”, model_config_name“qwen”) critic CriticAgent(name“评论家”, model_config_name“qwen”) # 2. 启动流程诗人接收主题 print(f“主题: {topic}”) poem_msg poet(Msg(“user”, f”请围绕‘{topic}’创作一首短诗。”)) print(f“{poet.name}: {poem_msg.content}”) # 3. 画家根据诗歌创作画面描述 painting_desc_msg painter(poem_msg) print(f“{painter.name}: {painting_desc_msg.content}”) # 4. 评论家对整个过程进行点评 review_msg critic(Msg(“user”, f”诗歌{poem_msg.content}\n画面描述{painting_desc_msg.content}”)) print(f“{critic.name}: {review_msg.content}”) return { “poem”: poem_msg.content, “painting_desc”: painting_desc_msg.content, “review”: review_msg.content }PoetAgent和CriticAgent的定义与PainterAgent类似只需更改system_prompt和名字。第四步主函数与执行if __name__ “__main__”: # 设置一个创作主题 topic “春天的夜晚” # 运行流程 result qwen_paw_pipeline(topic) print(“\n 创作成果 ”) for key, value in result.items(): print(f“{key}: {value}”)4.3 运行示例在examples/qwen_paw/目录下运行主程序python app.py观察终端输出你应该能看到类似以下的对话流主题: 春天的夜晚 李白: 《春夜》 细雨润无声花香潜入梦。… 达芬奇: 一幅水墨画朦胧的夜色下细雨如丝… 评论家: 李白的诗抓住了春夜的静谧达芬奇的画面描述… 创作成果 poem: 《春夜》… painting_desc: 一幅水墨画… review: 李白的诗…至此你已经成功运行了一个多智能体协作应用每个Agent各司其职共同完成了一次创作。5. 进阶实战为画家Agent集成文生图功能前面的画家Agent只输出了文字描述。如何让它真正“画”出图来我们可以集成一个文生图模型例如使用diffusers库或调用 Stable Diffusion API。5.1 方案设计我们将改造PainterAgent保留其生成画面描述的能力。新增一个步骤将画面描述通过文生图模型生成图片。将图片保存到本地。5.2 代码实现首先安装文生图相关依赖例如使用Hugging Facediffusers。pip install diffusers accelerate transformers pillow然后修改PainterAgentfrom diffusers import StableDiffusionPipeline import torch from PIL import Image import uuid class AdvancedPainterAgent(AgentBase): def __init__(self, name, model_config_name, sd_model_path“runwayml/stable-diffusion-v1-5”): super().__init__(namename) self.model OpenAIChatWrapper(config_namemodel_config_name) self.system_prompt “““你是一位天才画家…”“” # 同上 # 初始化Stable Diffusion管道 (如果本地有GPU) self.device “cuda” if torch.cuda.is_available() else “cpu” print(f”Painter using device: {self.device}“) if self.device “cuda”: self.pipe StableDiffusionPipeline.from_pretrained( sd_model_path, torch_dtypetorch.float16 # 半精度节省显存 ).to(self.device) # 启用内存优化可选 self.pipe.enable_attention_slicing() else: self.pipe None print(“Warning: No GPU found, will only generate text description.”) def text_to_image(self, prompt): “”“使用Stable Diffusion生成图片”“” if self.pipe is None: return None # 生成图像 image self.pipe(prompt, num_inference_steps30).images[0] return image def reply(self, x): # 1. 生成画面描述原有逻辑 messages [ {“role”: “system”, “content”: self.system_prompt}, {“role”: “user”, “content”: x.content} ] text_description self.model(messages) # 2. 根据描述生成图片 image self.text_to_image(text_description) # 3. 保存图片 image_path None if image is not None: filename f”painting_{uuid.uuid4().hex[:8]}.png” image.save(filename) image_path filename print(f”{self.name}: 画作已保存至 {filename}“) # 4. 返回消息包含文字描述和图片路径 # AgentScope的Msg支持复杂内容这里我们简单返回一个字典 reply_content { “description”: text_description, “image_path”: image_path } return Msg(self.name, reply_content)在主流程中将PainterAgent替换为AdvancedPainterAgent并处理其返回的包含图片路径的消息。注意本地运行Stable Diffusion对GPU显存要求较高至少6GB。如果没有GPU可以调用在线的文生图API如百度文心、阿里通义等其集成方式与调用OpenAI聊天API类似。6. 常见问题与排查思路FAQ在开发和运行过程中你可能会遇到以下问题。这里提供一份排查清单。问题现象可能原因解决思路ModuleNotFoundError: No module named ‘agentscope’1. AgentScope未安装。2. 未在正确的虚拟环境中。1. 运行pip install agentscope。2. 检查终端提示符前是否有(venv)使用source venv/bin/activate激活环境。openai.error.AuthenticationError1. API Key错误或过期。2. 未设置环境变量或代码中Key有误。3. 账号余额不足。1. 在OpenAI官网检查Key有效性。2. 确认代码或环境变量中的Key正确无误。3. 检查OpenAI平台账单。连接Ollama失败 (ConnectionError)1. Ollama服务未启动。2. 端口号或地址错误。1. 在终端运行ollama serve或ollama run model启动服务。2. 确认base_url为http://localhost:11434/v1。模型响应慢或无响应1. 网络问题API方式。2. 本地GPU算力不足Ollama方式。3. 提示词过于复杂。1. 检查网络连接。2. 换用更小的模型如qwen2.5:7b-qwen2.5:1.5b。3. 简化system_prompt或设置max_tokens限制。RuntimeError: CUDA out of memory本地模型或文生图模型显存不足。1. 换用更小的模型。2. 减少batch_size。3. 使用CPU模式性能会下降。4. 为扩散模型启用enable_attention_slicing()。智能体回复不符合预期1.system_prompt设计不清晰。2. 模型能力有限。1. 优化提示词明确指令和输出格式。2. 尝试更强大的模型如GPT-4。3. 在reply方法中加入后处理逻辑过滤无关输出。多智能体协作陷入循环或混乱工作流程Pipeline设计有缺陷缺乏终止条件或仲裁机制。1. 引入一个“主持人”或“协调者”Agent来管理流程。2. 设置对话轮次上限。3. 定义明确的成功/失败判定条件。7. 最佳实践与工程化建议当你掌握了基础用法后以下建议能帮助你将AI Agent应用做得更健壮、更易维护。7.1 提示词工程智能体的表现极大程度依赖于提示词。角色定义清晰在system_prompt中明确告诉AI“你是谁”例如“你是一位严谨的代码评审专家”。任务指令具体使用明确的指令如“请列出三个要点”、“用JSON格式输出”。提供示例在复杂任务中在提示词里提供一两个输入输出示例Few-shot Learning能显著提升效果。格式化输出要求AI按特定格式如Markdown、JSON回复便于后续程序解析。迭代优化将提示词单独保存在配置文件或数据库中方便测试和调整。7.2 配置与密钥管理分离配置将所有配置模型API地址、密钥、超时时间、Agent参数集中到config.yaml或环境变量中不要硬编码在代码里。密钥安全使用.env文件配合python-dotenv库管理密钥并将.env加入.gitignore。# .env 文件 OPENAI_API_KEYsk-xxx DASHSCOPE_API_KEYsk-xxx# app.py from dotenv import load_dotenv load_dotenv() api_key os.environ.get(“OPENAI_API_KEY”)7.3 错误处理与鲁棒性AI调用可能失败网络、限流、内容过滤代码必须健壮。重试机制为模型调用添加指数退避重试。from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def call_model_with_retry(model, messages): return model(messages)超时设置为网络请求设置合理的超时时间。异常捕获与降级捕获特定异常并提供默认回复或记录日志避免整个应用崩溃。try: response self.model(messages) except openai.error.RateLimitError: # 记录日志并返回一个友好的降级回复 logging.warning(“Rate limit hit, using fallback response.”) response “服务繁忙请稍后再试。”7.4 日志与监控结构化日志使用logging模块记录关键信息如Agent的输入输出、耗时、错误。import logging logging.basicConfig(levellogging.INFO) self.logger logging.getLogger(self.name) self.logger.info(f”Received message: {x.content}“)性能监控记录每个模型调用的延迟便于发现性能瓶颈。对话持久化将重要的多轮对话保存到数据库或文件用于后续分析和模型优化。7.5 项目结构优化对于正式项目建议采用更清晰的结构my_agent_project/ ├── config/ │ ├── __init__.py │ ├── settings.py # 主配置 │ └── model_configs.yaml # 模型配置 ├── agents/ │ ├── __init__.py │ ├── base_agent.py │ ├── poet_agent.py │ └── painter_agent.py ├── pipelines/ │ └── qwen_paw_pipeline.py ├── services/ │ └── image_generation.py ├── utils/ │ └── logger.py ├── tests/ # 单元测试 ├── requirements.txt └── main.py # 应用入口通过本文的详细拆解你应该已经掌握了使用AgentScope框架构建多智能体应用的核心流程从环境搭建、模型配置到自定义Agent开发、工作流编排再到错误处理和项目优化。AgentScope极大地降低了AI Agent开发的门槛让开发者能更专注于创造有价值的智能交互场景。下一步你可以尝试设计更复杂的场景如模拟一场辩论赛、构建一个软件开发团队产品经理、架构师、程序员、测试员。集成外部工具让Agent能够调用搜索引擎、数据库、API实现更强大的功能。加入记忆机制利用AgentScope的Memory组件让Agent拥有对话历史记忆。探索Web界面使用agentscope.web相关功能为你的多智能体应用构建一个交互式前端。AI Agent的世界充满可能现在就动手将你的创意付诸实践吧。如果在实践中遇到任何问题欢迎在评论区交流讨论。