使用 Spring AI 构建高效代理 (第 1 部分)

工程 | Christian Tzolov | 2025 年 1 月 21 日 | ...

在最近的一篇研究论文《构建高效代理》中,Anthropic 分享了关于构建高效大型语言模型 (LLM) 代理的宝贵见解。这项研究特别有趣的是,它强调了简单性和可组合性,而非复杂的框架。让我们探讨一下这些原则如何使用 Spring AI 转化为实际实现。

Agent Systems

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

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

代理系统

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

  1. 工作流:LLM 和工具通过预定义代码路径(例如,规范系统)进行协调的系统
  2. 代理:LLM 动态指导自身流程和工具使用的系统

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

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

1. 链式工作流

链式工作流模式是分解复杂任务为更简单、更易管理步骤的原则的典范。

Prompt Chaining Workflow

何时使用

  • 具有清晰顺序步骤的任务
  • 当您希望以延迟换取更高的准确性时
  • 当每个步骤都基于上一步的输出时

以下是 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 可以同时处理任务,并以编程方式聚合其输出。并行化工作流以两种主要变体体现:

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

Parallelization Workflow

何时使用

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

并行化工作流模式演示了多个大型语言模型(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. 路由工作流

路由模式实现智能任务分发,为不同类型的输入提供专门的处理。

Routing Workflow

此模式专为复杂任务而设计,其中不同类型的输入通过专门的流程进行更好地处理。它使用 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. 编排器-工作者

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

  • 中央 LLM 编排任务分解
  • 专业工作者处理特定子任务
  • 清晰的边界维护系统可靠性

Orchestration Workflow

何时使用

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

该实现使用 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:分析响应并提供详细的改进反馈

Evaluator-Optimizer Workflow

何时使用

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

该实现使用 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 建议相符的几项优势:

  1. 模型可移植性
<!-- Easy model switching through dependencies -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
  1. 结构化输出
// Type-safe handling of LLM responses
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 的有效系统提供了强大的框架。通过遵循这些模式和原则,开发人员可以创建健壮、可维护和有效的 AI 应用程序,在避免不必要的复杂性的同时提供真正的价值。

关键是记住,有时最简单的解决方案最有效。从基本模式开始,彻底理解您的用例,并且仅在可证明地提高系统性能或功能时才增加复杂性。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有