Eino 学习第三阶段:多智能体协作实战训练手册
📚 手册简介
欢迎进入第三阶段的学习!在前两个阶段,你已经掌握了Eino的基础组件和ReAct Agent开发,成功构建了能自主工作的专利检索分析员Agent。现在,我们将迈向真正的多智能体系统——组建一支完整的"专利代写专家团队"。
根据我们之前规划的路线图,第三阶段的目标是:
- ✅ Graph编排理解:掌握用图的方式组织多个智能体
- ✅ 预构建多Agent模式应用:Plan-Execute、Supervisor等模式实战
- ✅ 实现完整专利代写团队:主管Agent + 检索员 + 权利要求撰写员 + 说明书撰写员 + 审核员
按照本手册,你将在4-5小时内完成全部学习任务,获得一个能协同工作的多智能体专利代写系统原型。
第一部分:多智能体协作模式全景(45分钟)
在开始编码前,我们需要先理解Eino ADK提供的几种多智能体协作模式,以及它们分别适用于什么场景。
1.1 三种核心协作模式对比
| 模式 | 核心思想 | 适用场景 | 在专利代写中的角色 |
|---|---|---|---|
| Plan-Execute-Replan | 计划-执行-反思循环,动态拆解任务 | 复杂任务需要分步执行、动态调整 | 撰写流水线:权利要求撰写员 + 说明书撰写员(顺序执行,可反思调整) |
| Supervisor | 中心化协调,主管分配任务给子Agent | 需要动态协调多个专业Agent的场景 | 主管Agent:接收用户输入,协调检索员、撰写员、审核员 |
| Workflow Agents | 固定流程编排(顺序/循环/并行) | 执行流程确定的场景 | 固定流程节点:如先检索后撰写的顺序保证 |
1.2 Excel Agent:一个完整的多智能体系统参考
在开始我们自己的专利系统之前,强烈建议先理解Eino官方提供的Excel Agent示例,它是多智能体协作的最佳实践。
Excel Agent的内部架构包含:
| Agent角色 | 功能 | 对应我们的专利系统 |
|---|---|---|
| Planner | 分析用户输入,拆解为可执行计划 | 主管Agent的一部分 |
| Executor | 执行当前计划中的首个步骤 | 检索员/撰写员 |
| CodeAgent | 调用工具(Python代码)完成任务 | 我们的工具调用(检索API/格式检查) |
| WebSearchAgent | 进行网络搜索 | 专利数据库检索 |
| Replanner | 评估执行结果,调整计划 | 审核员+主管的反思机制 |
| ReportAgent | 生成总结报告 | 最终专利文档生成 |
核心启发:Excel Agent通过Plan-Execute-Replan模式实现了"规划-执行-反思"的闭环,这正是我们专利撰写流程需要的——先规划撰写策略,然后执行撰写,最后审核反思。
1.3 我们专利系统的协作架构设计
基于对上述模式的理解,我们为专利代写系统设计如下协作架构:
┌─────────────────────────────────────────────────────────────┐
│ Supervisor (主管Agent) │
│ - 接收用户技术交底书 │
│ - 动态分配任务给专业Agent │
│ - 汇总结果,协调工作流 │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 检索分析员 │ │ 撰写流水线 │ │ 质量审核员 │
│ (第二阶段已完成)│ │ (Plan-Execute)│ │ (ChatModelAgent)│
└───────────────┘ └───────────────┘ └───────────────┘
│
┌────────────┴────────────┐
↓ ↓
┌───────────────┐ ┌───────────────┐
│权利要求撰写员 │ │说明书撰写员 │
│(Sequential) │ │(Sequential) │
└───────────────┘ └───────────────┘
架构说明:
- 外层Supervisor:作为系统总入口,协调三个专业Agent
- 撰写流水线:采用Plan-Execute模式,先由"权利要求撰写员"生成权利要求,再由"说明书撰写员"基于权利要求撰写说明书
- Workflow Agents保证顺序:用
SequentialAgent确保撰写流程的确定性
第二部分:准备工作——创建基础Agent(45分钟)
在开始多智能体编排前,我们先创建所有需要的子Agent。其中检索分析员我们在第二阶段已经完成,现在需要创建另外三个。
2.1 创建权利要求撰写员Agent
创建pkg/agents/claim_writer.go:
package agents
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/schema"
)
// NewClaimWriterAgent 创建权利要求撰写员Agent
func NewClaimWriterAgent(ctx context.Context) (adk.Agent, error) {
// 初始化ChatModel
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化ChatModel失败: %v", err)
}
// 创建Agent - 权利要求撰写员不需要工具,纯文本生成
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "ClaimWriterAgent",
Description: "专利权利要求撰写专家,擅长撰写符合专利法要求的权利要求书",
Instruction: `你是一位资深的专利代理人,专精于权利要求撰写。你的工作是基于技术交底书和检索分析报告,撰写高质量的权利要求书。
【工作流程】
1. 理解发明点:仔细阅读用户提供的技术交底书和检索分析报告
2. 确定核心发明点:找出最核心的技术创新点
3. 构建权利要求层次:
- 独立权利要求(权利要求1):包含全部必要技术特征,划定最大保护范围
- 从属权利要求(权利要求2+):对独立权利要求进行限定,增加具体特征
4. 确保格式规范:
- 独立权利要求应包含前序部分和特征部分,用"其特征在于"连接
- 从属权利要求应写明引用关系,如"根据权利要求1所述的方法"
- 使用规范术语,避免模糊用语
【输出格式】
请直接输出完整的权利要求书,包含所有权利要求项,每项以数字序号开头(如"1."、"2.")。不要添加额外解释。
【示例格式】
1. 一种基于区块链的供应链金融方法,其特征在于,包括:
- 获取供应链交易数据;
- 将所述交易数据上链存储;
- 通过智能合约验证交易真实性;
- 基于验证结果动态调整信用额度。
2. 根据权利要求1所述的方法,其特征在于,所述验证交易真实性包括:
- 核对交易双方数字签名;
- 验证交易时间戳与物流信息匹配。`,
Model: chatModel,
})
if err != nil {
return nil, fmt.Errorf("创建权利要求撰写员失败: %v", err)
}
return agent, nil
}
2.2 创建说明书撰写员Agent
创建pkg/agents/spec_writer.go:
package agents
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
)
// NewSpecWriterAgent 创建说明书撰写员Agent
func NewSpecWriterAgent(ctx context.Context) (adk.Agent, error) {
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化ChatModel失败: %v", err)
}
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "SpecWriterAgent",
Description: "专利说明书撰写专家,擅长撰写完整的专利说明书",
Instruction: `你是一位资深的专利代理人,专精于说明书撰写。你的工作是基于技术交底书、检索分析报告和权利要求书,撰写完整的专利说明书。
【说明书结构】
一篇完整的专利说明书应包含以下五个部分:
1. 【技术领域】
写明本发明所属的技术领域,例如:"本发明涉及区块链技术领域,具体涉及一种基于区块链的供应链金融方法。"
2. 【背景技术】
介绍现有技术的方案及其缺陷,引出本发明的必要性。应引用对比文件(如有)。
3. 【发明内容】
包括:
- 要解决的技术问题:本发明要解决的现有技术存在的问题
- 技术方案:概述本发明的技术方案,与权利要求相呼应
- 有益效果:与现有技术相比,本发明带来的技术效果
4. 【附图说明】
如果有附图,简要说明各附图的内容(本示例暂不考虑附图)
5. 【具体实施方式】
详细描述本发明的实现方式,应包含多个实施例,支持权利要求的保护范围。
对于方法权利要求,描述具体步骤和实现细节;
对于装置/系统权利要求,描述各模块的构成和连接关系。
【撰写要点】
- 充分支持:说明书内容应充分支持权利要求书,不能超出权利要求范围
- 清楚完整:使所属领域技术人员能够实现本发明
- 术语一致:全文术语保持一致
- 实施例丰富:提供多个变体实施例,扩大保护范围
请基于输入信息(技术交底书+检索报告+权利要求书)生成完整的专利说明书。`,
Model: chatModel,
})
if err != nil {
return nil, fmt.Errorf("创建说明书撰写员失败: %v", err)
}
return agent, nil
}
2.3 创建质量审核员Agent
创建pkg/agents/quality_reviewer.go:
package agents
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
"patent-agent-learning/pkg/tools"
)
// NewQualityReviewerAgent 创建质量审核员Agent
func NewQualityReviewerAgent(ctx context.Context) (adk.Agent, error) {
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化ChatModel失败: %v", err)
}
// 创建格式检查工具(复用第二阶段的工具)
claimChecker, err := tools.NewClaimCheckerTool()
if err != nil {
return nil, fmt.Errorf("创建格式检查工具失败: %v", err)
}
// 工具列表
toolList := []tool.BaseTool{claimChecker}
// 获取工具信息并绑定到模型
toolInfos := make([]*schema.ToolInfo, 0, len(toolList))
for _, t := range toolList {
info, err := t.Info(ctx)
if err != nil {
return nil, fmt.Errorf("获取工具信息失败: %v", err)
}
toolInfos = append(toolInfos, info)
}
toolCallingModel, err := chatModel.WithTools(toolInfos)
if err != nil {
return nil, fmt.Errorf("绑定工具到模型失败: %v", err)
}
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "QualityReviewerAgent",
Description: "专利质量审核专家,检查专利文档的格式、逻辑和合规性",
Instruction: `你是一位资深的专利审查员,拥有20年专利审查经验。你的工作是对完成的专利文档(权利要求书和说明书)进行质量审核。
【审核维度】
1. 格式合规性:
- 权利要求格式是否符合专利法要求
- 说明书结构是否完整(技术领域、背景技术等五部分)
- 引用关系是否正确
2. 逻辑一致性:
- 说明书是否充分支持权利要求
- 术语在全文中是否一致
- 实施例是否与权利要求对应
3. 新颖性和创造性:
- 权利要求是否清楚界定了保护范围
- 是否存在可能的驳回理由
4. 形式缺陷:
- 错别字、语法错误
- 标点符号使用是否规范
【工作方式】
- 可以调用 claim_format_checker 工具检查权利要求格式
- 基于你的专业知识进行逻辑审核
- 输出结构化的审核报告,包含缺陷列表和修改建议
【输出格式】
请输出审核报告,包含:
- 总体评价(通过/需修改)
- 缺陷列表(每个缺陷标明位置和类型)
- 修改建议
- 优先级(高/中/低)`,
Model: toolCallingModel,
ToolsConfig: adk.ToolsConfig{
Tools: toolList,
},
MaxIterations: 5,
})
if err != nil {
return nil, fmt.Errorf("创建质量审核员失败: %v", err)
}
return agent, nil
}
第三部分:实现撰写流水线(Plan-Execute模式)(60分钟)
现在我们将权利要求撰写员和说明书撰写员组合成一个撰写流水线,采用Plan-Execute模式,让系统能够规划撰写步骤并执行。
3.1 理解Plan-Execute Agent
Plan-Execute Agent由三个核心智能体构成:
| 组件 | 作用 | 在我们的撰写流水线中 |
|---|---|---|
| Planner(规划器) | 根据目标生成初始计划(步骤列表) | 规划如何撰写:先写权利要求,再写说明书 |
| Executor(执行器) | 执行计划中的首个步骤 | 执行当前步骤(先执行权利要求撰写) |
| Replanner(重规划器) | 评估进度,决定继续执行或调整计划 | 检查是否完成,决定下一步 |
运行流程:
- Planner生成计划:
["撰写权利要求书", "基于权利要求撰写说明书"] - Executor执行第一个步骤:调用ClaimWriterAgent
- Replanner评估:步骤1完成,是否需要调整计划?
- 如果需要继续,Executor执行下一个步骤
- 循环直到所有步骤完成
3.2 创建撰写流水线Agent
创建pkg/agents/writing_pipeline.go:
package agents
import (
"context"
"fmt"
"log"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute"
)
// NewWritingPipelineAgent 创建撰写流水线(基于Plan-Execute模式)
func NewWritingPipelineAgent(ctx context.Context) (adk.Agent, error) {
// 1. 初始化模型(所有组件共享同一个模型)
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化模型失败: %v", err)
}
// 确保模型支持工具调用
toolCallingModel, ok := chatModel.(adk.ToolCallingChatModel)
if !ok {
return nil, fmt.Errorf("模型不支持Tool Calling")
}
// 2. 创建Planner(规划器)- 负责生成撰写计划
planner, err := planexecute.NewPlanner(ctx, &planexecute.PlannerConfig{
ToolCallingChatModel: toolCallingModel,
// 使用默认的PlanToolInfo
})
if err != nil {
return nil, fmt.Errorf("创建Planner失败: %v", err)
}
// 3. 创建Executor(执行器)- 负责执行当前步骤
// 创建子Agent(权利要求撰写员和说明书撰写员)
claimWriter, err := NewClaimWriterAgent(ctx)
if err != nil {
return nil, fmt.Errorf("创建权利要求撰写员失败: %v", err)
}
specWriter, err := NewSpecWriterAgent(ctx)
if err != nil {
return nil, fmt.Errorf("创建说明书撰写员失败: %v", err)
}
// 将子Agent作为工具提供给Executor
// 注意:在实际的Plan-Execute模式中,Executor需要能够调用这些子Agent
// 这里简化处理,使用SequentialAgent来保证顺序执行
// 4. 创建Replanner(重规划器)- 负责评估进度
replanner, err := planexecute.NewReplanner(ctx, &planexecute.ReplannerConfig{
ChatModel: toolCallingModel,
// 使用默认的PlanTool和RespondTool
})
if err != nil {
return nil, fmt.Errorf("创建Replanner失败: %v", err)
}
// 5. 组合成PlanExecuteAgent
// 注意:这里需要按照Eino ADK的规范来组合
// 由于planexecute.NewPlanExecuteAgent的API可能有所调整
// 我们先用SequentialAgent实现一个简化版本
// 简化方案:使用SequentialAgent确保顺序执行
sequentialAgent := adk.NewSequentialAgent(ctx, &adk.SequentialAgentConfig{
Name: "WritingPipeline",
SubAgents: []adk.Agent{
claimWriter, // 先写权利要求
specWriter, // 再写说明书
},
})
log.Println("✅ 撰写流水线创建成功(使用SequentialAgent确保顺序执行)")
return sequentialAgent, nil
}
3.3 创建完整的Plan-Execute版本(进阶)
如果你希望实现完整的Plan-Execute模式(包含规划-执行-反思循环),可以参考以下更完整的实现。这个实现会创建真正的Plan-Execute Agent,能够动态规划撰写步骤并在执行过程中反思调整。
创建pkg/agents/writing_pipeline_advanced.go(选学):
package agents
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/planexecute"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
)
// NewAdvancedWritingPipeline 创建高级版撰写流水线(完整Plan-Execute模式)
func NewAdvancedWritingPipeline(ctx context.Context) (adk.Agent, error) {
// 1. 初始化模型
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化模型失败: %v", err)
}
toolCallingModel, ok := chatModel.(adk.ToolCallingChatModel)
if !ok {
return nil, fmt.Errorf("模型不支持Tool Calling")
}
// 2. 创建子Agent(作为Executor可调用的工具)
claimWriter, err := NewClaimWriterAgent(ctx)
if err != nil {
return nil, err
}
specWriter, err := NewSpecWriterAgent(ctx)
if err != nil {
return nil, err
}
// 3. 将子Agent封装为Tool(这里需要实现一个AgentTool)
// 由于篇幅限制,这里略去AgentTool的实现细节
// 实际项目中,你需要实现一个将Agent包装成Tool的适配器
// 4. 创建Planner
planner, err := planexecute.NewPlanner(ctx, &planexecute.PlannerConfig{
ToolCallingChatModel: toolCallingModel,
})
if err != nil {
return nil, err
}
// 5. 创建Executor,配置工具集
executor, err := planexecute.NewExecutor(ctx, &planexecute.ExecutorConfig{
Model: toolCallingModel,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{
// 这里应该是封装好的AgentTool
// agentTool1, agentTool2,
},
},
},
MaxIterations: 10,
})
if err != nil {
return nil, err
}
// 6. 创建Replanner
replanner, err := planexecute.NewReplanner(ctx, &planexecute.ReplannerConfig{
ChatModel: toolCallingModel,
})
if err != nil {
return nil, err
}
// 7. 组合成PlanExecuteAgent
planExecuteAgent, err := planexecute.NewPlanExecuteAgent(ctx, &planexecute.Config{
Planner: planner,
Executor: executor,
Replanner: replanner,
MaxIterations: 5, // 整个流程最多循环5次
})
if err != nil {
return nil, err
}
return planExecuteAgent, nil
}
第四部分:实现主管Agent(Supervisor模式)(60分钟)
现在我们将实现系统的核心——主管Agent,它负责协调检索员、撰写流水线和审核员的工作。
4.1 理解Supervisor Agent
Supervisor模式是一种中心化的多智能体协作模式,由一个监督者和多个子Agent组成:
| 组件 | 作用 | 在我们的系统中 |
|---|---|---|
| Supervisor(监督者) | 负责任务分配、监控执行、结果汇总 | 主管Agent:协调整个专利撰写流程 |
| SubAgents(子Agent) | 执行具体任务,完成后自动交回控制权 | 检索员、撰写流水线、审核员 |
关键机制:子Agent通过WithDeterministicTransferTo预设目标为Supervisor,确保任务完成后自动回调。
4.2 实现主管Agent
创建pkg/agents/patent_supervisor.go:
package agents
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/prebuilt/supervisor"
)
// NewPatentSupervisor 创建专利主管Agent(Supervisor模式)
func NewPatentSupervisor(ctx context.Context) (adk.Agent, error) {
// 1. 初始化模型
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: os.Getenv("OPENAI_MODEL"),
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
return nil, fmt.Errorf("初始化模型失败: %v", err)
}
// 2. 创建所有子Agent
fmt.Println("正在创建子Agent...")
// 检索分析员(第二阶段已完成)
retrievalAnalyst, err := NewRetrievalAnalystAgent(ctx)
if err != nil {
return nil, fmt.Errorf("创建检索分析员失败: %v", err)
}
// 撰写流水线
writingPipeline, err := NewWritingPipelineAgent(ctx)
if err != nil {
return nil, fmt.Errorf("创建撰写流水线失败: %v", err)
}
// 质量审核员
qualityReviewer, err := NewQualityReviewerAgent(ctx)
if err != nil {
return nil, fmt.Errorf("创建质量审核员失败: %v", err)
}
fmt.Println("✅ 所有子Agent创建成功")
// 3. 创建Supervisor Agent(监督者)
// 使用WithDeterministicTransferTo确保子Agent完成后自动回调
supervisorAgent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "PatentSupervisor",
Description: "专利撰写项目主管,协调检索、撰写、审核全流程",
Instruction: `你是一位经验丰富的专利项目主管,负责协调整个专利撰写团队。
【团队成员】
- RetrievalAnalystAgent:专利检索分析专家,负责检索现有技术、分析区别特征
- WritingPipelineAgent:撰写流水线,负责撰写权利要求书和说明书(先写权利要求,再写说明书)
- QualityReviewerAgent:质量审核专家,负责审核最终文档
【工作流程】
1. 接收用户输入的技术交底书
2. 首先将任务转交给 RetrievalAnalystAgent,要求其进行专利检索并生成检索分析报告
3. 获取检索报告后,将任务转交给 WritingPipelineAgent,要求其基于技术交底书和检索报告撰写专利文档
4. 获取撰写完成的文档后,将任务转交给 QualityReviewerAgent,要求其进行质量审核
5. 收到审核报告后:
- 如果审核通过,将最终文档返回给用户
- 如果需要修改,将审核意见连同文档一起返回给用户,或重新分配给撰写员修改
请严格按照这个流程协调团队工作。`,
Model: chatModel,
})
if err != nil {
return nil, fmt.Errorf("创建Supervisor Agent失败: %v", err)
}
// 4. 使用supervisor.New组合Supervisor和子Agent
// 这个函数会为每个子Agent添加确定性回调机制
multiAgent, err := supervisor.New(ctx, &supervisor.Config{
Supervisor: supervisorAgent,
SubAgents: []adk.Agent{
retrievalAnalyst,
writingPipeline,
qualityReviewer,
},
})
if err != nil {
return nil, fmt.Errorf("组合Supervisor失败: %v", err)
}
fmt.Println("✅ 专利主管系统创建成功!")
return multiAgent, nil
}
4.3 运行主管系统
创建cmd/patent_supervisor/main.go:
package main
import (
"context"
"fmt"
"log"
"os"
"time"
"github.com/joho/godotenv"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/schema"
"patent-agent-learning/pkg/agents"
)
func main() {
// 加载环境变量
if err := godotenv.Load(); err != nil {
log.Println("警告: 未找到.env文件,使用系统环境变量")
}
ctx := context.Background()
// 创建专利主管系统
fmt.Println("🚀 正在启动专利撰写多智能体系统...")
startTime := time.Now()
supervisor, err := agents.NewPatentSupervisor(ctx)
if err != nil {
log.Fatalf("创建专利主管失败: %v", err)
}
fmt.Printf("✅ 系统启动完成,耗时: %v\n", time.Since(startTime))
fmt.Println("===================================")
// 准备用户输入 - 技术交底书
techDisclosure := `本发明涉及一种基于区块链的供应链金融风控方法。
【技术背景】
传统供应链金融依赖中心化信用评估,存在数据造假、信息不对称等问题。
【发明内容】
本发明提出一种基于区块链的供应链金融风控方法,包括:
1. 将供应链上的交易数据(订单、物流、支付)上链存储
2. 通过智能合约自动验证交易的真实性(核对数字签名、时间戳匹配等)
3. 基于验证结果动态调整参与企业的信用额度和融资利率
4. 当出现异常交易时,自动触发预警并冻结相关资产
【有益效果】
提高风控准确性,降低信用风险,实现自动化风控。`
// 构建用户消息
userMessage := schema.UserMessage(fmt.Sprintf(`
请帮我撰写一份专利文档。
技术交底书:
%s
要求:
1. 先进行专利检索,分析现有技术
2. 基于检索结果撰写权利要求书和说明书
3. 对完成的文档进行质量审核
4. 输出最终文档和审核报告
`, techDisclosure))
fmt.Println("📥 用户输入:")
fmt.Println(techDisclosure)
fmt.Println("===================================")
fmt.Println("🤖 系统开始工作,请耐心等待(这可能需要2-3分钟)...")
fmt.Println()
// 运行系统(流式输出,便于观察执行过程)
input := &adk.AgentInput{
Messages: []*schema.Message{userMessage},
EnableStreaming: true,
}
runner := adk.NewRunner(ctx, adk.RunnerConfig{
Agent: supervisor,
})
iter := runner.Run(ctx, input)
// 处理事件流
var finalResponse string
stepCount := 0
for {
event, ok := iter.Next()
if !ok {
break
}
// 如果有错误
if event.Err != nil {
fmt.Printf("❌ 错误: %v\n", event.Err)
continue
}
// 打印Agent切换信息
if event.Action != nil && event.Action.TransferToAgent != nil {
stepCount++
fmt.Printf("\n【步骤 %d】任务移交给: %s\n", stepCount, event.Action.TransferToAgent.DestAgentName)
}
// 打印输出内容
if event.Output != nil && event.Output.MessageOutput != nil {
msg, err := event.Output.MessageOutput.GetMessage()
if err == nil && msg != nil && msg.Content != "" {
// 根据Agent名称不同,用不同颜色或前缀标识(这里简单用文字标识)
switch event.AgentName {
case "PatentSupervisor":
fmt.Printf("📋 [主管]: %s\n", msg.Content)
case "RetrievalAnalystAgent":
fmt.Printf("🔍 [检索员]: %s\n", msg.Content)
case "ClaimWriterAgent":
fmt.Printf("📝 [权利要求撰写员]: %s\n", msg.Content)
case "SpecWriterAgent":
fmt.Printf("📄 [说明书撰写员]: %s\n", msg.Content)
case "QualityReviewerAgent":
fmt.Printf("✅ [审核员]: %s\n", msg.Content)
case "WritingPipeline":
fmt.Printf("⚙️ [撰写流水线]: %s\n", msg.Content)
default:
fmt.Printf("[%s]: %s\n", event.AgentName, msg.Content)
}
// 累积最终输出(假设最后一个非空输出是最终结果)
if event.AgentName == "PatentSupervisor" && msg.Content != "" {
finalResponse = msg.Content
}
}
}
}
fmt.Println("\n===================================")
fmt.Println("✅ 专利撰写流程完成!")
if finalResponse != "" {
fmt.Println("\n📄 最终输出摘要:")
fmt.Println(finalResponse)
}
}
第五部分:Workflow Agents进阶——顺序、循环与并行(45分钟)
除了Plan-Execute和Supervisor模式,Eino ADK还提供了三种基础的流程编排方式,可以在需要精确控制流程时使用。
5.1 SequentialAgent:顺序执行
适用场景:任务有明确的先后依赖关系,如必须先检索、再撰写、最后审核。
// 创建一个顺序执行的工作流
sequentialAgent := adk.NewSequentialAgent(ctx, &adk.SequentialAgentConfig{
Name: "patent_workflow",
SubAgents: []adk.Agent{
retrievalAnalyst, // 1. 先检索
writingPipeline, // 2. 再撰写
qualityReviewer, // 3. 最后审核
},
})
// 运行:每个子Agent依次执行,前一个的输出传递给下一个
5.2 LoopAgent:循环执行
适用场景:需要迭代优化的场景,如多次修改直到质量达标。
// 创建一个循环执行的工作流
loopAgent := adk.NewLoopAgent(ctx, &adk.LoopAgentConfig{
Name: "iterative_improvement",
SubAgents: []adk.Agent{
writer, // 撰写
reviewer, // 审核
improver, // 根据审核意见修改
},
MaxIterations: 3, // 最多循环3次
})
// 运行:会循环执行 writer -> reviewer -> improver,直到达到最大次数或某个Agent产生ExitAction
5.3 ParallelAgent:并行执行
适用场景:多个独立任务可以同时执行,如同时检索多个专利数据库。
// 创建一个并行执行的工作流
parallelAgent := adk.NewParallelAgent(ctx, &adk.ParallelAgentConfig{
Name: "parallel_search",
SubAgents: []adk.Agent{
cnipaSearcher, // 中国专利局检索
usptoSearcher, // 美国专利局检索
epoSearcher, // 欧洲专利局检索
},
})
// 运行:三个检索同时进行,结果合并返回
5.4 在专利场景中的应用
在专利代写系统中,Workflow Agents可以用于:
| 场景 | 适用模式 | 说明 |
|---|---|---|
| 多数据库并行检索 | ParallelAgent | 同时检索中、美、欧专利数据库,提高效率 |
| 撰写-审核-修改循环 | LoopAgent | 反复修改直到审核通过 |
| 固定流程节点 | SequentialAgent | 保证严格的顺序(先写权利要求,再写说明书) |
第六部分:状态管理与Session机制(30分钟)
在多智能体协作中,状态管理至关重要。Eino ADK提供了Session机制,让多个Agent之间可以共享数据。
6.1 Session的核心作用
| 场景 | Session的作用 |
|---|---|
| 跨Agent数据传递 | 检索员将检索报告存入Session,撰写员从中读取 |
| 长期记忆 | 保存整个专利案卷的上下文,支持中断恢复 |
| 执行追踪 | 记录已执行的步骤,防止重复执行 |
6.2 Session操作示例
// 在Agent中获取Session
func someAgentFunction(ctx context.Context) {
// 获取Session中的所有值
sessionValues := adk.GetSessionValues(ctx)
// 获取特定键的值
retrievalReport, exists := adk.GetSessionValue(ctx, "retrieval_report")
if exists {
fmt.Printf("找到检索报告: %v\n", retrievalReport)
}
// 添加值到Session
adk.AddSessionValue(ctx, "claim_draft", claimText)
// 批量添加
adk.AddSessionValues(ctx, map[string]any{
"invention_point": inventionPoint,
"search_keywords": keywords,
"search_id": searchID,
})
}
// 在Plan-Execute模式中,Session自动管理计划和执行步骤
// PlanSessionKey: 存储当前计划
// ExecutedStepsSessionKey: 存储已执行的步骤
6.3 在专利系统中使用Session
在我们的专利系统中,可以用Session管理:
| Session Key | 存储内容 | 写入者 | 读取者 |
|---|---|---|---|
"tech_disclosure" |
原始技术交底书 | 主管Agent | 所有子Agent |
"retrieval_report" |
检索分析报告 | 检索分析员 | 撰写员、审核员 |
"claim_draft" |
权利要求初稿 | 权利要求撰写员 | 说明书撰写员、审核员 |
"spec_draft" |
说明书初稿 | 说明书撰写员 | 审核员 |
"review_report" |
审核报告 | 质量审核员 | 主管Agent |
第七部分:进阶探索与完整示例(30分钟)
7.1 探索官方多Agent示例
Eino官方提供了丰富的多Agent示例,强烈建议你深入研究:
# 克隆官方示例仓库
git clone https://github.com/cloudwego/eino-examples.git
cd eino-examples
# 1. Supervisor模式示例
cd adk/multiagent/supervisor
go run main.go
# 2. Plan-Execute-Replan示例
cd adk/multiagent/plan-execute-replan
go run main.go
# 3. 项目管理器示例(类似我们的专利系统)
cd adk/multiagent/integration-project-manager
go run main.go
# 4. Excel Agent完整实现(最佳实践参考)
cd adk/multiagent/integration-excel-agent
go run main.go
7.2 人机协作(Human-in-the-Loop)预览
在实际的专利撰写中,人工审核和干预非常重要。Eino ADK提供了完善的人机协作机制:
| 模式 | 说明 | 在专利场景中的应用 |
|---|---|---|
| 审批模式 | 敏感操作前需人工确认 | 最终文档导出前需专利工程师确认 |
| 审核编辑模式 | 人工可修改Agent生成的参数 | 修改权利要求、补充实施例 |
| 反馈循环模式 | Writer生成,Reviewer收集反馈 | 迭代优化专利文档 |
| 追问模式 | Agent发现信息缺失时主动提问 | 技术交底书不明确时向用户追问 |
这些机制将在第四阶段深入探讨。
7.3 将Graph/Chain封装为工具
Eino还支持将编排好的Graph或Chain封装成工具,供Agent调用:
import "github.com/cloudwego/eino/adk/common/tool/graphtool"
// 将编排好的Graph封装为工具
graphTool, err := graphtool.NewInvokableGraphTool(
graph, // 你的Graph
"patent_search_graph", // 工具名称
"执行专利检索并分析结果", // 工具描述
)
// 将工具添加到Agent
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: model,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{graphTool},
},
},
})
这种方式可以让你复用已经编排好的复杂流程,让Agent根据需要动态调用。
第八部分:阶段成果验收清单
完成本手册后,请对照清单检查是否达成学习目标:
| 任务 | 完成情况 | 备注 |
|---|---|---|
| ✅ 理解三种协作模式:能区分Plan-Execute/Supervisor/Workflow的适用场景 | □ | |
| ✅ 创建权利要求撰写员:实现纯文本生成的Agent | □ | |
| ✅ 创建说明书撰写员:实现说明书撰写Agent | □ | |
| ✅ 创建质量审核员:集成格式检查工具的审核Agent | □ | |
| ✅ 实现撰写流水线:用SequentialAgent保证顺序执行 | □ | |
| ✅ 实现主管Agent:用Supervisor模式协调三个子Agent | □ | |
| ✅ 运行完整系统:看到多Agent协作的完整流程 | □ | |
| ✅ 理解Session机制:知道如何在Agent间共享数据 | □ | |
| ✅ 探索官方示例:运行了至少一个官方多Agent示例 | □ | |
| ✅ 进阶尝试:尝试了Loop/Parallel或GraphTool封装 | □ |
代码成果:你拥有了一个完整的多智能体专利代写系统原型,包含:
- 主管Agent(Supervisor模式)
- 检索分析员(第二阶段成果)
- 撰写流水线(权利要求+说明书,顺序执行)
- 质量审核员
知识成果:你深入理解了多智能体协作的三种核心模式,掌握了Eino ADK的高级编排能力,能够根据业务场景选择合适的协作架构。
预告:第四阶段——生产级打磨与人机协作
恭喜你完成第三阶段的学习!你的专利代写系统已经具备了完整的核心功能。在第四阶段,我们将:
- 可观测性增强:添加日志、监控、追踪,让系统运行透明化
- 人机协作机制:实现审批、审核编辑、追问等Human-in-the-Loop模式
- 状态持久化:支持中断恢复,保存长期运行的专利案卷
- 性能优化:流式输出优化、并发控制、错误处理
- 部署与服务化:将系统封装为HTTP服务,提供API接口
请确保你对本阶段的内容有充分理解,特别是Supervisor和Plan-Execute模式,它们是构建复杂多智能体系统的核心。
遇到问题? 参考以下资源:
