多 Agent 系统 (Multi-Agent System)
多 Agent 系统是 trpc-agent-go 框架的核心功能之一,允许您创建由多个专门化 Agent 组成的复杂系统。这些 Agent 可以以不同的方式协作,实现从简单到复杂的各种应用场景。
概述
多 Agent 系统基于 SubAgent 概念构建,通过 WithSubAgents
option 实现各种协作模式:
基础概念
- SubAgent - 通过
WithSubAgents
option 配置的专门化 Agent,是构建复杂协作模式的基础
核心协作模式
- 链式 Agent (ChainAgent) - 使用 SubAgent 按顺序执行,形成处理流水线
- 并行 Agent (ParallelAgent) - 使用 SubAgent 同时处理同一输入的不同方面
- 循环 Agent (CycleAgent) - 使用 SubAgent 在循环中迭代,直到满足特定条件
辅助功能
- Agent 工具 (AgentTool) - 将 Agent 包装成工具,供其他 Agent 调用
- Agent 委托 (Agent Transfer) - 通过
transfer_to_agent
工具实现 Agent 间的任务委托
SubAgent 基础
SubAgent 是多 Agent 系统的核心概念,通过 WithSubAgents
option 实现。它允许您将多个专门化的 Agent 组合在一起,构建复杂的协作模式。
SubAgent 的作用
- 专业化分工:每个 SubAgent 专注于特定领域或任务类型
- 模块化设计:将复杂系统分解为可管理的组件
- 灵活组合:可以根据需要组合不同的 SubAgent
- 统一接口:所有协作模式都基于相同的
WithSubAgents
机制
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent"
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
)
// 创建 SubAgent
mathAgent := llmagent.New(
"math-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("处理数学计算和数值问题"),
llmagent.WithInstruction("你是数学专家,专注于数学运算和数值推理..."),
)
weatherAgent := llmagent.New(
"weather-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("提供天气信息和建议"),
llmagent.WithInstruction("你是天气专家,提供天气分析和活动建议..."),
)
// 使用 WithSubAgents option 配置 SubAgent
mainAgent := llmagent.New(
"coordinator-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("协调者 Agent,负责任务委托"),
llmagent.WithInstruction("你是协调者,分析用户请求并委托给合适的专家..."),
llmagent.WithSubAgents([]agent.Agent{mathAgent, weatherAgent}),
)
|
核心协作模式
所有协作模式都基于 SubAgent 概念,通过不同的执行策略实现:
链式 Agent (ChainAgent)
链式 Agent 使用 SubAgent 按顺序连接,形成处理流水线。每个 SubAgent 专注于特定任务,并将结果传递给下一个 SubAgent。
使用场景
- 内容创作流程:规划 → 研究 → 写作
- 问题解决流程:分析 → 设计 → 实现
- 数据处理流程:收集 → 清洗 → 分析
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent"
"trpc.group/trpc-go/trpc-agent-go/agent/chainagent"
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
)
// 创建 SubAgent
planningAgent := llmagent.New("planning-agent", ...)
researchAgent := llmagent.New("research-agent", ...)
writingAgent := llmagent.New("writing-agent", ...)
// 创建链式 Agent,使用 WithSubAgents 配置 SubAgent
chainAgent := chainagent.New(
"multi-agent-chain",
chainagent.WithSubAgents([]agent.Agent{
planningAgent,
researchAgent,
writingAgent,
}),
)
|
示例会话
| 🔗 多 Agent 链式演示
链式流程:规划 → 研究 → 写作
==================================================
👤 用户:解释可再生能源的好处
📋 规划 Agent:我将创建一个结构化的分析计划...
🔍 研究 Agent:
🔧 使用工具:
• web_search (ID: call_123)
🔄 执行中...
✅ 工具结果:最新的可再生能源数据...
✍️ 写作 Agent:基于规划和研究:
[结构化的综合回答]
|
并行 Agent (ParallelAgent)
并行 Agent 使用 SubAgent 同时处理同一输入的不同方面,提供多角度的分析。
使用场景
- 商业决策分析:市场分析、技术评估、风险评估、机会分析
- 多维度评估:不同专家同时评估同一问题
- 快速并行处理:需要同时获得多个视角的场景
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent/parallelagent"
)
// 创建 SubAgent
marketAgent := llmagent.New("market-analysis", ...)
technicalAgent := llmagent.New("technical-assessment", ...)
riskAgent := llmagent.New("risk-evaluation", ...)
opportunityAgent := llmagent.New("opportunity-analysis", ...)
// 创建并行 Agent,使用 WithSubAgents 配置 SubAgent
parallelAgent := parallelagent.New(
"parallel-demo",
parallelagent.WithSubAgents([]agent.Agent{
marketAgent,
technicalAgent,
riskAgent,
opportunityAgent,
}),
)
|
示例会话
| ⚡ 并行多 Agent 演示
Agent:市场 📊 | 技术 ⚙️ | 风险 ⚠️ | 机会 🚀
==================================================
💬 用户:我们应该为供应链跟踪实施区块链吗?
🚀 开始并行分析:"我们应该为供应链跟踪实施区块链吗?"
📊 Agent 正在分析不同角度...
────────────────────────────────────────────────────────────────────────────────
📊 [market-analysis] 开始分析...
⚙️ [technical-assessment] 开始分析...
⚠️ [risk-evaluation] 开始分析...
🚀 [opportunity-analysis] 开始分析...
📊 [market-analysis]: 区块链供应链市场正在经历强劲增长,年复合增长率为67%...
⚙️ [technical-assessment]: 实施需要分布式账本基础设施和共识机制...
⚠️ [risk-evaluation]: 主要风险包括40%目标市场的监管不确定性...
🚀 [opportunity-analysis]: 战略优势包括增强透明度,可带来15-20%的成本降低...
🎯 所有并行分析成功完成!
────────────────────────────────────────────────────────────────────────────────
✅ 多角度分析在4.1秒内完成
|
循环 Agent (CycleAgent)
循环 Agent 使用 SubAgent 在迭代循环中运行,直到满足特定条件(如质量阈值或最大迭代次数)。
使用场景
- 内容优化:生成 → 评估 → 改进 → 重复
- 问题解决:提出 → 评估 → 增强 → 重复
- 质量保证:草稿 → 审查 → 修订 → 重复
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent/cycleagent"
)
// 创建 SubAgent
generateAgent := llmagent.New("generate-agent", ...)
criticAgent := llmagent.New("critic-agent", ...)
// 创建循环 Agent,使用 WithSubAgents 配置 SubAgent
cycleAgent := cycleagent.New(
"cycle-demo",
cycleagent.WithSubAgents([]agent.Agent{
generateAgent,
criticAgent,
}),
cycleagent.WithMaxIterations(3),
cycleagent.WithEscalationFunc(qualityEscalationFunc),
)
|
示例会话
| 🔄 多 Agent 循环演示
最大迭代次数:3
循环:生成 → 评估 → 改进 → 重复
==================================================
👤 用户:写一个短笑话
🤖 循环响应:
🤖 生成 Agent:为什么骷髅不互相打架?
因为它们没有胆量!
👀 评估 Agent:
🔧 使用工具:
• record_score (ID: call_123)
🔄 执行中...
✅ 质量评分:75/100
⚠️ 需要改进 - 继续迭代
🔄 **第2次迭代**
🤖 生成 Agent:这是一个改进版本,有新的转折:
**为什么骷髅从不赢得争论?**
因为它们总是在中途失去脊梁!
👀 评估 Agent:
🔧 使用工具:
• record_score (ID: call_456)
🔄 执行中...
✅ 质量评分:85/100
🎉 质量阈值达到 - 循环完成
🏁 循环在2次迭代后完成
|
辅助功能
Agent 工具是构建复杂多 Agent 系统的重要基础功能,它允许您将任何 Agent 包装成可调用的工具,供其他 Agent 或应用程序使用。
使用场景
- 专业化委托:不同 Agent 处理特定类型的任务
- 工具集成:Agent 可以作为工具集成到更大的系统中
- 模块化设计:可重用的 Agent 组件可以组合在一起
- 复杂工作流:涉及多个专门化 Agent 的复杂工作流
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/tool"
agenttool "trpc.group/trpc-go/trpc-agent-go/tool/agent"
"trpc.group/trpc-go/trpc-agent-go/tool/function"
)
// 创建专门的 Agent
mathAgent := llmagent.New(
"math-specialist",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("专门处理数学运算的 Agent"),
llmagent.WithInstruction("你是一个数学专家,专注于数学运算、计算和数值推理..."),
llmagent.WithTools([]tool.Tool{calculatorTool}),
)
// 将 Agent 包装成工具
agentTool := agenttool.NewTool(
mathAgent,
agenttool.WithSkipSummarization(false),
)
// 在主 Agent 中使用 Agent 工具
mainAgent := llmagent.New(
"chat-assistant",
llmagent.WithTools([]tool.Tool{timeTool, agentTool}),
)
|
Agent工具架构
| 聊天助手 (主 Agent)
├── 时间工具 (函数)
└── 数学专家 Agent 工具 (Agent)
└── 数学专家 Agent (专门化 Agent)
└── 计算器工具 (函数)
|
示例会话
| 🚀 Agent 工具示例
模型:deepseek-chat
可用工具:current_time, math-specialist
==================================================
👤 用户:计算 923476 * 273472354
🤖 助手:我将使用数学专家 Agent 来计算这个结果。
🔧 工具调用已启动:
• math-specialist (ID: call_0_e53a77e9-c994-4421-bfc3-f63fe85678a1)
参数:{"request":"计算 923476 乘以 273472354"}
🔄 执行工具中...
✅ 工具响应 (ID: call_0_e53a77e9-c994-4421-bfc3-f63fe85678a1):
"计算 923,476 乘以 273,472,354 的结果是:
\[
923,\!476 \times 273,\!472,\!354 = 252,\!545,\!155,\!582,\!504
\]"
✅ 工具执行完成。
|
Agent 委托 (Agent Transfer)
Agent 委托通过 transfer_to_agent
工具实现 Agent 间的任务委托,允许主 Agent 根据任务类型自动选择合适的 SubAgent。
使用场景
- 任务分类:根据用户请求自动选择合适的 SubAgent
- 智能路由:将复杂任务路由到最合适的处理者
- 专业化处理:每个 SubAgent 专注于特定领域
- 无缝切换:在 SubAgent 之间无缝切换,保持对话连续性
基本用法
| import (
"trpc.group/trpc-go/trpc-agent-go/agent"
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/tool"
"trpc.group/trpc-go/trpc-agent-go/tool/function"
)
// 创建 SubAgent
mathAgent := llmagent.New(
"math-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("处理数学计算和数值问题"),
llmagent.WithInstruction("你是数学专家,专注于数学运算和数值推理..."),
llmagent.WithTools([]tool.Tool{calculatorTool}),
)
weatherAgent := llmagent.New(
"weather-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("提供天气信息和建议"),
llmagent.WithInstruction("你是天气专家,提供天气分析和活动建议..."),
llmagent.WithTools([]tool.Tool{weatherTool}),
)
// 创建协调者 Agent,使用 WithSubAgents 配置 SubAgent
coordinatorAgent := llmagent.New(
"coordinator-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("协调者 Agent,负责任务委托"),
llmagent.WithInstruction("你是协调者,分析用户请求并委托给合适的专家..."),
llmagent.WithSubAgents([]agent.Agent{mathAgent, weatherAgent}),
)
|
Agent委托架构
| 协调者 Agent (主入口)
├── 分析用户请求
├── 选择合适的 SubAgent
└── 使用 transfer_to_agent 工具委托任务
├── 数学 SubAgent (数学计算)
├── 天气 SubAgent (天气信息)
└── 研究 SubAgent (信息搜索)
|
示例会话
| 🔄 Agent 委托演示
可用 SubAgent:math-agent, weather-agent, research-agent
==================================================
👤 用户:计算复利,本金5000美元,年利率6%,期限8年
🎯 协调者:我将把这个任务委托给我们的数学专家进行准确计算。
🔄 启动委托...
🔄 委托事件:将控制权转移给 Agent:math-agent
🧮 数学专家:我将帮助您逐步计算复利。
🔧 🧮 执行工具:
• calculate ({"operation":"power","a":1.06,"b":8})
✅ 工具完成
🔧 🧮 执行工具:
• calculate ({"operation":"multiply","a":5000,"b":1.593})
✅ 工具完成
复利计算结果:
- 本金:$5,000
- 年利率:6%
- 期限:8年
- 结果:$7,969.24(利息约$2,969.24)
|
环境变量配置
所有多 Agent 示例都需要以下环境变量:
变量名 |
必需 |
默认值 |
说明 |
OPENAI_API_KEY |
是 |
- |
OpenAI API 密钥 |
OPENAI_BASE_URL |
否 |
https://api.openai.com/v1 |
OpenAI API 基础URL |
运行示例
所有示例代码位于 examples
核心协作模式示例
链式 Agent 示例
| cd examples/multiagent/chain
export OPENAI_API_KEY="your-api-key"
go run main.go -model deepseek-chat
|
并行 Agent 示例
| cd examples/multiagent/parallel
export OPENAI_API_KEY="your-api-key"
go run main.go -model deepseek-chat
|
循环 Agent 示例
| cd examples/multiagent/cycle
export OPENAI_API_KEY="your-api-key"
go run main.go -model deepseek-chat -max-iterations 5
|
辅助功能示例
Agent 工具示例
| cd examples/agenttool
export OPENAI_API_KEY="your-api-key"
go run main.go -model deepseek-chat
|
Agent 委托示例
| cd examples/transfer
export OPENAI_API_KEY="your-api-key"
go run main.go -model deepseek-chat
|
自定义和扩展
添加新的 Agent
| import (
"trpc.group/trpc-go/trpc-agent-go/agent"
"trpc.group/trpc-go/trpc-agent-go/agent/chainagent"
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/tool"
)
// 创建自定义 Agent
customAgent := llmagent.New(
"custom-agent",
llmagent.WithModel(modelInstance),
llmagent.WithDescription("自定义 Agent 描述"),
llmagent.WithInstruction("自定义指令"),
llmagent.WithTools([]tool.Tool{customTool}),
)
// 集成到多 Agent 系统中
chainAgent := chainagent.New(
"custom-chain",
chainagent.WithSubAgents([]agent.Agent{
existingAgent,
customAgent, // 添加自定义 Agent
}),
)
|
配置工具
| import (
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/tool"
"trpc.group/trpc-go/trpc-agent-go/tool/function"
)
// 创建自定义工具
customTool := function.NewFunctionTool(
customFunction,
function.WithName("custom_tool"),
function.WithDescription("自定义工具描述"),
)
// 为 Agent 分配工具
agent := llmagent.New(
"tool-agent",
llmagent.WithTools([]tool.Tool{customTool}),
)
|
调整参数
| import (
"trpc.group/trpc-go/trpc-agent-go/agent/llmagent"
"trpc.group/trpc-go/trpc-agent-go/model"
)
// 配置生成参数
genConfig := model.GenerationConfig{
MaxTokens: intPtr(500),
Temperature: floatPtr(0.7),
Stream: true,
}
// 应用到 Agent
agent := llmagent.New(
"configured-agent",
llmagent.WithGenerationConfig(genConfig),
)
|