在最近的研究出版物中,https://www.anthropic.com/research/building-effective-agents[构建有效的代理],Anthropic 分享了关于构建有效的大型语言模型(LLM)代理的宝贵见解。 这项研究特别有趣的是它强调简单性和可组合性,而不是复杂的框架。 让我们探索这些原则如何通过 Spring AI 转化为实际实现。

虽然模式描述和图表来自 Anthropic 的原始出版物,但我们将重点介绍如何使用 Spring AI 的模型可移植性和结构化输出功能来实现这些模式。 我们建议先阅读原始论文。
agentic-patterns 目录在 spring-ai-examples 仓库中包含以下示例的所有代码。
代理系统
研究出版物对两种类型的代理系统做出了重要的架构区分:
-
工作流:通过预定义代码路径编排 LLM 和工具的系统(例如,规范性系统)
-
代理:LLM 动态指导自己的过程和工具使用的系统
关键见解是,虽然完全自主的代理可能看起来很吸引人,但对于明确定义的任务,工作流通常提供更好的可预测性和一致性。 这与企业要求完美契合,因为可靠性和可维护性至关重要。
让我们通过五个基本模式来研究 Spring AI 如何实现这些概念,每个模式都服务于特定的用例:
1. 链式工作流
链式工作流模式体现了将复杂任务分解为更简单、更易于管理的步骤的原则。

何时使用: - 具有明确顺序步骤的任务 - 当您想用延迟换取更高的准确性时 - 当每个步骤都建立在前一个步骤的输出之上时
以下是来自 Spring AI 实现的实践示例:
public class ChainWorkflow {
private final ChatClient chatClient;
private final 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(
"分析市场变化将如何影响这个利益相关者群体。",
List.of(
"客户:...",
"员工:...",
"投资者:...",
"供应商:..."
),
4
);
3. 路由工作流
路由模式实现了智能任务分发,使不同类型的输入能够进行专门处理。

何时使用: - 具有不同输入类别的复杂任务 - 当不同输入需要专门处理时 - 当分类可以准确处理时
@Autowired
private ChatClient chatClient;
RoutingWorkflow workflow = new RoutingWorkflow(chatClient);
Map<String, String> routes = Map.of(
"billing", "您是账单专家。帮助解决账单问题...",
"technical", "您是技术支持工程师。帮助解决技术问题...",
"general", "您是客户服务代表。帮助处理一般查询..."
);
String input = "我的账户上周被重复收费了";
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(
"为 REST API 端点生成技术和用户友好的文档"
);
System.out.println("分析:" + response.analysis());
System.out.println("工作者输出:" + 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(
"创建一个实现线程安全计数器的 Java 类"
);
System.out.println("最终解决方案:" + response.solution());
System.out.println("演进过程:" + 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 提供商的统一接口
-
内置错误处理和重试
-
灵活的提示管理
最佳实践和建议
-
从简单开始
-
在添加复杂性之前从基本工作流开始
-
使用满足您要求的最简单模式
-
仅在需要时添加复杂性
-
为可靠性而设计
-
实现清晰的错误处理
-
尽可能使用类型安全的响应
-
在每个步骤中构建验证
-
考虑权衡
-
平衡延迟与准确性
-
评估何时使用并行处理
-
在固定工作流和动态代理之间选择