ParallelAgent并行调用agent

2026年4月14日 · 426 字 · 2 分钟

这里讲了Eino创建一个agent并行调用多个agent的方法

ParallelAgent并行调用agent

ParallelAgent 是一种能够并行调用多个子 Agent 的代理模式。它的执行遵循以下设定:

并行执行:多个 SubAgents 同时执行,而不是按顺序执行

结果汇聚:所有子 Agent 的执行结果会被收集和汇总

高效处理:适用于需要从多个角度同时分析同一问题的场景

这里演示一个产品方案分析的场景,创建多个专业化的 Agent 并行分析一个产品方案,包括技术架构分析、功能需求分析、风险评估等维度。

注意在parallelAgent中:

  • Panic 恢复:每个 goroutine 都有独立的 panic 恢复机制
  • 错误隔离:单个子 Agent 的错误不会影响其他子 Agent 的执行
  • 中断处理:支持子 Agent 的中断和恢复机制

创建子 Agent

我们需要创建多个专业化的子 Agent,每个 Agent 负责从不同维度分析产品方案:

// 技术架构分析 Agent
func NewTechArchAnalyzerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "TechArchAnalyzer",
		Description: "分析技术架构的合理性和可行性",
		Instruction: `你是一个技术架构专家。请从以下维度分析产品方案的技术架构:

1. 技术选型是否合理
2. 架构设计是否清晰
3. 技术栈的优缺点
4. 可能的技术风险
5. 改进建议

请给出详细的技术架构分析报告。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

// 功能需求分析 Agent
func NewFeatureAnalyzerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "FeatureAnalyzer",
		Description: "分析功能需求的完整性和可行性",
		Instruction: `你是一个产品功能专家。请从以下维度分析产品方案的功能需求:

1. 功能列表是否完整
2. 功能优先级是否合理
3. 功能之间的依赖关系
4. 实现复杂度评估
5. 用户价值分析

请给出详细的功能需求分析报告。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

// 风险评估 Agent
func NewRiskAnalyzerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "RiskAnalyzer",
		Description: "评估项目的潜在风险",
		Instruction: `你是一个项目风险评估专家。请从以下维度分析产品方案的潜在风险:

1. 技术风险
2. 业务风险
3. 资源风险
4. 时间风险
5. 外部依赖风险

请给出详细的风险评估报告,并为每个风险提供缓解建议。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

// 成本估算 Agent
func NewCostAnalyzerAgent() adk.Agent {
	a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
		Name:        "CostAnalyzer",
		Description: "估算项目的开发成本",
		Instruction: `你是一个项目成本估算专家。请从以下维度分析产品方案的开发成本:

1. 人力成本估算
2. 基础设施成本
3. 第三方服务成本
4. 维护运营成本
5. 总成本估算

请给出详细的成本分析报告。`,
		Model: llm.CreateDeepseekModel(),
	})
	if err != nil {
		log.Fatal(err)
	}
	return a
}

创建 ParallelAgent

创建 ParallelAgent,将多个子 Agent 组合在一起:

func NewParalletAgent(ctx context.Context) (adk.Agent, error) {
	return adk.NewParallelAgent(ctx, &adk.ParallelAgentConfig{
		Name:        "product_analyzer",
		Description: "产品方案综合分析器,并行从多个维度分析产品方案",
		SubAgents: []adk.Agent{
			NewTechArchAnalyzerAgent(),
			NewFeatureAnalyzerAgent(),
			NewRiskAnalyzerAgent(),
			NewCostAnalyzerAgent(),
		},
	})
}

运行 ParallelAgent

创建运行函数,执行 ParallelAgent 并收集结果:

func PARunner(ctx context.Context, agent adk.Agent, messages []adk.Message) (map[string]string, error) {
	runner := adk.NewRunner(ctx, adk.RunnerConfig{
		Agent: agent,
	})

	iter := runner.Run(ctx, messages)
	results := make(map[string]string)

	for {
		event, ok := iter.Next()
		if !ok {
			break
		}
		if event.Err != nil {
			return nil, event.Err
		}
		if event.Output != nil && event.Output.MessageOutput != nil {
			msg, err := event.Output.MessageOutput.GetMessage()
			if err != nil {
				return nil, err
			}
			if msg.Role == schema.Assistant && len(msg.Content) > 0 {
				results[event.AgentName] = msg.Content
			}
		}
	}
	return results, nil
}

测试示例

func TestParallelAgent(t *testing.T) {
	ctx := context.Background()

	parallelAgent, err := NewParalletAgent(ctx)
	if err != nil {
		t.Fatal(err)
	}
	res, err := PARunner(ctx, parallelAgent, []adk.Message{
		schema.UserMessage("请分析以下产品方案:\n" + `
产品方案:智能客服系统

概述:开发一个基于大语言模型的智能客服系统,能够自动回答用户问题,处理常见业务咨询,并在必要时转接人工客服。

主要功能:
1. 自然语言理解和回复
2. 多轮对话管理
3. 知识库集成
4. 情感分析
5. 人工客服转接
6. 对话历史记录
7. 多渠道接入(网页、微信、APP)

技术架构:
- 前端:React + TypeScript
- 后端:Go + Gin 框架
- 数据库:PostgreSQL + Redis
- AI模型:GPT-4 API
- 部署:Docker + Kubernetes
`),
	})
	if err != nil {
		t.Fatal(err)
	}
	for k, v := range res {
		fmt.Println(k, v)
	}
}

总结

ParallelAgent 的优势:

  1. 效率提升:多个 Agent 并行执行,大幅缩短分析时间
  2. 专业分工:每个 Agent 专注于特定领域,分析更深入
  3. 结果全面:从多个维度分析,结论更全面可靠
  4. 易于扩展:可以根据需要添加更多专业 Agent

适用场景:

  • 产品方案评审
  • 代码质量分析
  • 多角度问题诊断
  • 综合决策支持