使用 Spring AI 构建高效的AI Agent(Part 1)

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

虽然模式描述和图表来源于Anthropic的原始出版物,但我们将重点放在如何使用Spring AI的模型可移植性和结构化输出功能来实现这些模式。我们建议先阅读原始论文。

agentic-patterns项目实现了下面讨论的模式。

代理系统

研究出版物在两种类型的代理系统之间做出了重要的架构区分:

  1. 工作流:通过预定义的代码路径(例如,规定性系统)来编排LLM和工具的系统。
  2. 代理:LLM动态指导其自身过程和工具使用的系统。

关键的见解是,虽然完全自主的代理可能看起来很有吸引力,但对于定义明确的任务,工作流通常提供更好的可预测性和一致性。这与企业需求完美契合,因为企业需要可靠性和可维护性。

让我们通过五个基本模式来探讨Spring AI如何实现这些概念,每个模式都服务于特定的用例:

1. 链式工作流

链式工作流模式体现了将复杂任务分解为更简单、更易管理的步骤的原则。

使用场景:

  • 具有明确顺序步骤的任务
  • 当您希望以延迟换取更高的准确性时
  • 当每个步骤都建立在前一个步骤的输出基础上时

以下是Spring AI实现中的一个实际示例:

java 复制代码
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);
            // 通过LLM处理并捕获输出
            response = chatClient.prompt(input).call().content();
        }
        return response;
    }
}

此实现展示了几个关键原则:

  • 每个步骤都有明确的职责
  • 一个步骤的输出成为下一个步骤的输入
  • 链易于扩展和维护

2. 并行化工作流

LLM可以同时处理任务,并通过编程方式聚合它们的输出。并行化工作流体现在两个关键变体中:

  • 分段:将任务分解为独立的子任务以进行并行处理
  • 投票:运行同一任务的多个实例以达成共识

使用场景:

  • 处理大量相似但独立的项目
  • 需要多个独立视角的任务
  • 当处理时间至关重要且任务可并行化时

并行化工作流模式展示了多个大型语言模型(LLM)操作的高效并发处理。此模式特别适用于需要并行执行LLM调用并自动聚合输出的场景。

以下是使用并行化工作流的基本示例:

java 复制代码
List<String> parallelResponse = new ParallelizationWorkflow(chatClient)
    .parallel(
        "分析市场变化将如何影响这个利益相关者群体。",
        List.of(
            "客户:...",
            "员工:...",
            "投资者:...",
            "供应商:..."
        ),
        4
    );

此示例展示了利益相关者分析的并行处理,其中每个利益相关者群体被并发分析。

3. 路由工作流

路由模式实现了智能任务分配,使不同类型的输入能够被专门处理。

此模式专为复杂任务设计,其中不同类型的输入最好由专门的流程处理。它使用LLM分析输入内容并将其路由到最合适的专门提示或处理程序。

使用场景:

  • 具有不同输入类别的复杂任务
  • 当不同输入需要专门处理时
  • 当分类可以准确处理时

以下是使用路由工作流的基本示例:

java 复制代码
@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. 协调器-工作者

此模式展示了如何在保持控制的同时实现更复杂的类似代理的行为:

  • 一个中央LLM协调任务分解
  • 专门的工作者处理特定的子任务
  • 清晰的边界保持系统的可靠性

使用场景:

  • 无法提前预测子任务的复杂任务
  • 需要不同方法或视角的任务
  • 需要适应性解决问题的情况

实现使用Spring AI的ChatClient进行LLM交互,并包括:

java 复制代码
public class OrchestratorWorkersWorkflow {
    public WorkerResponse process(String taskDescription) {
        // 1\. 协调器分析任务并确定子任务
        OrchestratorResponse orchestratorResponse = // ...

        // 2\. 工作者并行处理子任务
        List<String> workerResponses = // ...

        // 3\. 结果合并为最终响应
        return new WorkerResponse(/*...*/);
    }
}

使用示例:

java 复制代码
ChatClient chatClient = // ... 初始化聊天客户端
OrchestratorWorkersWorkflow workflow = new OrchestratorWorkersWorkflow(chatClient);

// 处理任务
WorkerResponse response = workflow.process(
    "为REST API端点生成技术和用户友好的文档"
);

// 访问结果
System.out.println("分析:" + response.analysis());
System.out.println("工作者输出:" + response.workerResponses());

5. 评估器-优化器

评估器-优化器模式实现了一个双LLM过程,其中一个模型生成响应,而另一个模型在迭代循环中提供评估和反馈,类似于人类作家的精炼过程。该模式由两个主要组件组成:

  • 生成器LLM:生成初始响应并根据反馈进行改进
  • 评估器LLM:分析响应并提供详细的改进反馈

使用场景:

  • 存在明确的评估标准
  • 迭代改进提供了可衡量的价值
  • 任务受益于多轮批评

实现使用Spring AI的ChatClient进行LLM交互,并包括:

java 复制代码
public class EvaluatorOptimizerWorkflow {
    public RefinedResponse loop(String task) {
        // 1\. 生成初始解决方案
        Generation generation = generate(task, context);

        // 2\. 评估解决方案
        EvaluationResponse evaluation = evaluate(generation.response(), task);

        // 3\. 如果通过,返回解决方案
        // 4\. 如果需要改进,合并反馈并生成新的解决方案
        // 5\. 重复直到满意
        return new RefinedResponse(finalSolution, chainOfThought);
    }
}

使用示例:

java 复制代码
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建议一致的几个好处:

  1. 模型可移植性
xml 复制代码
<!-- 通过依赖项轻松切换模型 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
  1. 结构化输出
java 复制代码
// 类型安全的LLM响应处理
EvaluationResponse response = chatClient.prompt(prompt)
    .call()
    .entity(EvaluationResponse.class);
  1. 一致的API
  • 跨不同LLM提供商的统一接口
  • 内置的错误处理和重试机制
  • 灵活的提示管理

最佳实践和建议

基于Anthropic的研究和Spring AI的实现,以下是构建有效的基于LLM的系统的关键建议:

  • 从简单开始

    • 在添加复杂性之前从基本工作流开始
    • 使用满足您要求的最简单模式
    • 仅在需要时添加复杂性
  • 设计可靠性

    • 实施清晰的错误处理
    • 尽可能使用类型安全的响应
    • 在每个步骤中构建验证
  • 考虑权衡

    • 平衡延迟与准确性
    • 评估何时使用并行处理
    • 在固定工作流和动态代理之间选择

未来工作

在本系列的第2部分中,我们将探讨如何构建更高级的代理,将这些基础模式与复杂功能结合起来:

模式组合

  • 结合多个模式以创建更强大的工作流
  • 构建混合系统,利用每个模式的优势
  • 创建能够适应不断变化需求的灵活架构

高级代理内存管理

  • 在对话中实现持久内存
  • 高效管理上下文窗口
  • 开发长期知识保留策略

工具和模型上下文协议(MCP)集成

  • 通过标准化接口利用外部工具
  • 实现MCP以增强模型交互
  • 构建可扩展的代理架构

请继续关注这些高级功能的详细实现和最佳实践。

Tanzu Gen AI解决方案

VMware Tanzu Platform 10 Tanzu AI Server,由Spring AI提供支持,提供:

  • 企业级AI部署:在您的VMware Tanzu环境中部署AI应用程序的生产就绪解决方案
  • 简化的模型访问:通过统一界面简化对Amazon Bedrock Nova模型的访问
  • 安全与治理:企业级安全控制和治理功能
  • 可扩展的基础设施:基于Spring AI的集成支持AI应用程序的可扩展部署,同时保持高性能

有关使用Tanzu AI Server部署AI应用程序的更多信息,请访问VMware Tanzu AI文档

结论

Anthropic的研究见解与Spring AI的实际实现相结合,为构建有效的基于LLM的系统提供了一个强大的框架。通过遵循这些模式

原文:spring.io/blog/2025/0...

SpringAI集成代码: github.com/jingsewu

相关推荐
小杨4044 分钟前
springboot框架项目实践应用十九(nacos配置中心)
spring boot·后端·spring cloud
清同趣科研5 分钟前
R绘图|6种NMDS(非度量多维分析)绘图保姆级模板——NMDS从原理到绘图,看师兄这篇教程就够了
人工智能·算法
凡人的AI工具箱10 分钟前
PyTorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(三)
人工智能·pytorch·python·深度学习·学习·生成对抗网络
workworkwork勤劳又勇敢11 分钟前
Adversarial Attack对抗攻击--李宏毅机器学习笔记
人工智能·笔记·深度学习·机器学习
乌旭1 小时前
从Ampere到Hopper:GPU架构演进对AI模型训练的颠覆性影响
人工智能·pytorch·分布式·深度学习·机器学习·ai·gpu算力
声网1 小时前
从开发者视角解读 Google Cloud Next 25
人工智能
终身学习基地2 小时前
第二篇:go包管理
开发语言·后端·golang
图南随笔2 小时前
Spring Boot(二十一):RedisTemplate的String和Hash类型操作
java·spring boot·redis·后端·缓存
吃饭了呀呀呀2 小时前
🐳 《Android》 安卓开发教程 - 三级地区联动
android·java·后端