在最近的研究成果《构建高效代理》中,Anthropic 分享了关于构建高效大型语言模型 (LLM) 代理的宝贵见解。这项研究的特别之处在于,它强调简单性和可组合性,而非复杂的框架。让我们探索如何使用Spring AI将这些原则转化为实际应用。
虽然这些模式描述和图表源自 Anthropic 的原始出版物,但我们将重点介绍如何使用 Spring AI 的功能来实现这些模式,以实现模型的可移植性和结构化输出。我们建议您先阅读原始论文。
agentic-patterns项目实现了下面讨论的模式。
代理系统
该研究出版物对两种类型的代理系统进行了重要的架构区分:
- 工作流程:通过预定义代码路径(例如,规范系统)协调 LLM 和工具的系统
- 代理:LLM 动态指导其自身流程和工具使用的系统
关键在于,虽然完全自主的代理看似诱人,但工作流通常能为定义明确的任务提供更好的可预测性和一致性。这完全符合企业对可靠性和可维护性至关重要的需求。
让我们来看看 Spring AI 如何通过五种基本模式实现这些概念,每种模式都服务于特定的用例:
1.链式工作流程
链式工作流模式体现了将复杂任务分解为更简单、更易于管理的步骤的原则。
何时使用:
- 具有明确顺序步骤的任务
- 当你想牺牲延迟来换取更高的准确度时
- 当每一步都建立在前一步的输出之上时
以下是 Spring AI 实现的一个实际示例:
public class ChainWorkflow {
private final ChatClient chatClient;
private final String[] systemPrompts;
// Processes input through a series of prompts, where each step's output
// becomes input for the next step in the chain.
public String chain(String userInput) {
String response = userInput;
for (String prompt : systemPrompts) {
// Combine the system prompt with previous response
String input = String.format("{%s}\n {%s}", prompt, response);
// Process through the LLM and capture output
response = chatClient.prompt(input).call().content();
}
return response;
}
}
此实施体现了几个关键原则:
- 每一步都有重点责任
- 一个步骤的输出成为下一个步骤的输入
- 该链易于扩展和维护
2.并行化工作流程
LLM 可以同时处理多个任务,并以编程方式聚合其输出。并行化工作流程体现在两个关键方面:
- 分段:将任务分解为独立的子任务,以便并行处理
- 投票:运行同一任务的多个实例以达成共识
何时使用:
- 处理大量相似但独立的物品
- 需要多个独立视角的任务
- 当处理时间至关重要且任务可并行时
并行化工作流模式演示了如何高效并发处理多个大型语言模型 (LLM) 操作。此模式尤其适用于需要并行执行 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.路由工作流程
路由模式实现了智能任务分配,可以针对不同类型的输入进行专门处理。
此模式专为复杂任务而设计,其中不同类型的输入可以通过专门的流程更好地处理。它使用 LLM 分析输入内容并将其路由到最合适的专用提示符或处理程序。
何时使用:
- 具有不同输入类别的复杂任务
- 当不同的输入需要专门处理时
- 当分类可以准确处理时
以下是使用路由工作流的基本示例:
@Autowired
private ChatClient chatClient;
// Create the workflow
RoutingWorkflow workflow = new RoutingWorkflow(chatClient);
// Define specialized prompts for different types of input
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..."
);
// Process input
String input = "My account was charged twice last week";
String response = workflow.route(input, routes);
4. Orchestrator-Workers
此模式演示了如何在保持控制的同时实现更复杂的类似代理的行为:
- 中央 LLM 协调任务分解
- 专业工人处理特定的子任务
- 清晰的边界维护系统可靠性
何时使用:
- 无法提前预测子任务的复杂任务
- 需要不同方法或视角的任务
- 需要适应性解决问题的情况
该实现使用 Spring AI 的 ChatClient 进行 LLM 交互,包括:
public class OrchestratorWorkersWorkflow {
public WorkerResponse process(String taskDescription) {
// 1. Orchestrator analyzes task and determines subtasks
OrchestratorResponse orchestratorResponse = // ...
// 2. Workers process subtasks in parallel
List<String> workerResponses = // ...
// 3. Results are combined into final response
return new WorkerResponse(/*...*/);
}
}
使用示例:
ChatClient chatClient = // ... initialize chat client
OrchestratorWorkersWorkflow workflow = new OrchestratorWorkersWorkflow(chatClient);
// Process a task
WorkerResponse response = workflow.process(
"Generate both technical and user-friendly documentation for a REST API endpoint"
);
// Access results
System.out.println("Analysis: " + response.analysis());
System.out.println("Worker Outputs: " + response.workerResponses());
5.评估器-优化器
评估器-优化器模式实现了双 LLM 流程,其中一个模型生成响应,而另一个模型则以迭代循环的方式提供评估和反馈,类似于人类写作者的改进过程。该模式由两个主要组件组成:
- 生成器 LLM:生成初始响应并根据反馈进行改进
- 评估员 LLM:分析回复并提供详细的反馈以供改进
何时使用:
- 存在明确的评估标准
- 迭代改进提供可衡量的价值
- 任务受益于多轮批评
该实现使用 Spring AI 的 ChatClient 进行 LLM 交互,包括:
public class EvaluatorOptimizerWorkflow {
public RefinedResponse loop(String task) {
// 1. Generate initial solution
Generation generation = generate(task, context);
// 2. Evaluate the solution
EvaluationResponse evaluation = evaluate(generation.response(), task);
// 3. If PASS, return solution
// 4. If NEEDS_IMPROVEMENT, incorporate feedback and generate new solution
// 5. Repeat until satisfactory
return new RefinedResponse(finalSolution, chainOfThought);
}
}
使用示例:
ChatClient chatClient = // ... initialize chat client
EvaluatorOptimizerWorkflow workflow = new EvaluatorOptimizerWorkflow(chatClient);
// Process a task
RefinedResponse response = workflow.loop(
"Create a Java class implementing a thread-safe counter"
);
// Access results
System.out.println("Final Solution: " + response.solution());
System.out.println("Evolution: " + response.chainOfThought());
Spring AI 的实现优势
Spring AI 对这些模式的实现提供了几个与 Anthropic 的建议一致的好处:
<!-- Easy model switching through dependencies -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
// Type-safe handling of LLM responses
EvaluationResponse response = chatClient.prompt(prompt)
.call()
.entity(EvaluationResponse.class);
- 不同 LLM 提供商之间的统一接口
- 内置错误处理和重试
- 灵活的提示管理
最佳实践和建议
根据 Anthropic 的研究和 Spring AI 的实现,以下是构建有效的基于 LLM 的系统的关键建议:
-
从简单开始
- 从基本工作流程开始,然后再增加复杂性
- 使用满足您要求的最简单的模式
- 仅在需要时添加复杂性
-
可靠性设计
- 实施清晰的错误处理
- 尽可能使用类型安全的响应
- 在每一步建立验证
-
考虑权衡
- 平衡延迟与准确性
- 评估何时使用并行处理
- 在固定工作流程和动态代理之间进行选择
未来工作
在本系列的第 2 部分中,我们将探讨如何构建将这些基础模式与复杂功能相结合的更高级的代理:
图案组合
- 结合多种模式来创建更强大的工作流程
- 构建利用每种模式优势的混合系统
- 创建能够适应不断变化的需求的灵活架构
高级代理内存管理
- 跨对话实现持久记忆
- 有效管理上下文窗口
- 制定长期知识保留策略
工具和模型上下文协议 (MCP) 集成
- 通过标准化接口利用外部工具
- 实施 MCP 以增强模型交互
- 构建可扩展的代理架构
请继续关注这些高级功能的详细实现和最佳实践。
Tanzu Gen AI解决方案
由 Spring AI 提供支持的VMware Tanzu Platform 10 Tanzu AI Server 提供:
- 企业级 AI 部署:用于在 VMware Tanzu 环境中部署 AI 应用程序的生产就绪解决方案
- 简化模型访问:通过统一界面简化对 Amazon Bedrock Nova 模型的访问
- 安全和治理:企业级安全控制和治理功能
- 可扩展基础设施:该集成基于 Spring AI 构建,支持可扩展部署 AI 应用程序,同时保持高性能
有关使用 Tanzu AI Server 部署 AI 应用程序的更多信息,请访问VMware Tanzu AI 文档。
结论
Anthropic 的研究见解与 Spring AI 的实际应用相结合,为构建基于 LLM 的有效系统提供了强大的框架。通过遵循这些模式和原则,开发人员可以创建健壮、可维护且高效的 AI 应用程序,在提供真正价值的同时避免不必要的复杂性。
关键在于记住,有时最简单的解决方案才是最有效的。从基本模式入手,彻底了解你的用例,并且只有当复杂性能够明显提升系统性能或功能时才添加。
文章出自 Spring 官方博客,由软件翻译。
原文链接:https://spring.io/blog/2025/01/21/spring-ai-agentic-patterns