跟我一起学Spring AI:构建有效的Agent
构建有效的代理
在最近的研究出版物《构建有效的代理》中,Anthropic 分享了关于构建有效的大型语言模型(LLM)代理的宝贵见解。这项研究特别有趣的一点是它强调简单性和可组合性,而不是复杂的框架。让我们探讨这些原则如何通过 Spring AI 转化为实际实现。【AI大模型教程】
代理系统
虽然模式描述和图解来源于 Anthropic 的原始出版物,但我们将重点放在如何使用 Spring AI 的模型可移植性和结构化输出功能来实现这些模式。我们建议先阅读原始论文。
spring-ai-examples 仓库中的 agentic-patterns 目录包含以下所有示例的代码。
代理系统
该研究出版物在两种类型的代理系统之间做出了重要的架构区分:
- 工作流:通过预定义的代码路径编排 LLM 和工具的系统(例如,规定性系统)
- 代理:LLM 动态指导自身过程和工具使用的系统
关键的见解是,虽然完全自主的代理可能看起来很吸引人,但对于明确定义的任务,工作流通常能提供更好的可预测性和一致性。这与企业需求完美契合,因为企业需要可靠性和可维护性。
让我们通过五个基本模式来研究 Spring AI 如何实现这些概念,每个模式服务于特定的用例:
1. 链式工作流
链式工作流模式体现了将复杂任务分解为更简单、更易于管理的步骤的原则。
提示链工作流
何时使用:
- 具有清晰顺序步骤的任务
- 当您希望用延迟换取更高准确性时
- 当每个步骤都建立在前一个步骤的输出之上时
以下是 Spring AI 实现中的一个实际示例:
public class ChainWorkflow { privatefinal ChatClient chatClient; privatefinal String[] systemPrompts; public String chain(String userInput) { String response = userInput; for (String prompt : systemPrompts) { String input = String.format("{%s}\n {%s}", prompt, response); response = chatClient.prompt(input).call().content(); } return response; }}
此实现展示了几个关键原则:
- 每个步骤都有明确的职责
- 一个步骤的输出成为下一个步骤的输入
- 链易于扩展和维护
2. 并行化工作流
LLM 可以同时处理任务,并通过编程方式聚合它们的输出。
并行化工作流
何时使用:
- 处理大量相似但独立的项目
- 需要多个独立视角的任务
- 当处理时间很关键且任务可并行化时
List<String> parallelResponse = new ParallelizationWorkflow(chatClient) .parallel( "Analyze how market changes will impact this stakeholder group.", List.of( "Customers: ...", "Employees: ...", "Investors: ...", "Suppliers: ..." ), 4 );
3. 路由工作流
路由模式实现了智能的任务分发,支持对不同类型的输入进行专门处理。
路由工作流
何时使用:
- 具有不同输入类别的复杂任务
- 当不同的输入需要专门处理时
- 当分类可以准确处理时
@Autowiredprivate ChatClient chatClient;RoutingWorkflow workflow = new RoutingWorkflow(chatClient);Map<String, String> routes = Map.of( "billing", "You are a billing specialist. Help resolve billing issues...", "technical", "You are a technical support engineer. Help solve technical problems...", "general", "You are a customer service representative. Help with general inquiries...");String input = "My account was charged twice last week";String response = workflow.route(input, routes);
4. 编排器-工作者模式
编排工作流
何时使用:
- 无法提前预测子任务的复杂任务
- 需要不同方法或视角的任务
- 需要适应性解决问题的情况
public class OrchestratorWorkersWorkflow { public WorkerResponse process(String taskDescription) { // 1. 编排器分析任务并确定子任务 OrchestratorResponse orchestratorResponse = // ... // 2. 工作者并行处理子任务 List<String> workerResponses = // ... // 3. 结果合并为最终响应 return new WorkerResponse(/*...*/); }}
使用示例:
ChatClient chatClient = // ... 初始化聊天客户端OrchestratorWorkersWorkflow workflow = new OrchestratorWorkersWorkflow(chatClient);WorkerResponse response = workflow.process( "Generate both technical and user-friendly documentation for a REST API endpoint");System.out.println("Analysis: " + response.analysis());System.out.println("Worker Outputs: " + response.workerResponses());
5. 评估器-优化器模式
评估器-优化器工作流
何时使用:
- 存在清晰的评估标准
- 迭代优化提供可衡量的价值
- 任务受益于多轮批判
public class EvaluatorOptimizerWorkflow { public RefinedResponse loop(String task) { Generation generation = generate(task, context); EvaluationResponse evaluation = evaluate(generation.response(), task); return new RefinedResponse(finalSolution, chainOfThought); }}
使用示例:
ChatClient chatClient = // ... 初始化聊天客户端EvaluatorOptimizerWorkflow workflow = new EvaluatorOptimizerWorkflow(chatClient);RefinedResponse response = workflow.loop( "Create a Java class implementing a thread-safe counter");System.out.println("Final Solution: " + response.solution());System.out.println("Evolution: " + response.chainOfThought());
Spring AI 的实现优势
Spring AI 对这些模式的实现提供了几个与 Anthropic 建议相一致的好处:
模型可移植性
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>
结构化输出
EvaluationResponse response = chatClient.prompt(prompt) .call() .entity(EvaluationResponse.class);
一致的 API
- 跨不同 LLM 提供商的统一接口
- 内置错误处理和重试机制
- 灵活的提示管理
最佳实践和建议
- 从简单开始
- 在添加复杂性之前从基本工作流开始
- 使用满足您需求的最简单模式
- 仅在需要时增加复杂性
- 为可靠性设计
- 实现清晰的错误处理
- 尽可能使用类型安全的响应
- 在每个步骤中构建验证
- 考虑权衡
- 平衡延迟与准确性
- 评估何时使用并行处理
- 在固定工作流和动态代理之间进行选择
未来工作
这些指南将更新,以探索如何将这些基础模式与复杂功能相结合来构建更高级的代理:
模式组合
- 组合多个模式以创建更强大的工作流
- 构建利用每种模式优势的混合系统
- 创建能够适应变化需求的灵活架构
高级代理内存管理
- 在对话中实现持久内存
- 高效管理上下文窗口
- 制定长期知识保留策略
工具和模型上下文协议(MCP)集成
- 通过标准化接口利用外部工具
- 实现 MCP 以增强模型交互
- 构建可扩展的代理架构
结论
Anthropic 的研究见解与 Spring AI 的实践实现相结合,为构建有效的基于 LLM 的系统提供了一个强大的框架。
通过遵循这些模式和原则,开发人员可以创建健壮、可维护且有效的 AI 应用程序,这些应用程序能够提供真正的价值,同时避免不必要的复杂性。
关键在于要记住,有时最简单的解决方案是最有效的。从基本模式开始,彻底了解您的用例,并且只有在复杂性能够明显提高系统性能或能力时才添加它。