使用 Spring AI 构建有效智能体(第一部分)

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

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

Agent Systems

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

下面讨论的模式已在 agentic-patterns 项目中实现。

智能体系统

这项研究出版物对两类智能体系统进行了重要的架构区分:

  1. 工作流(Workflows):大型语言模型和工具通过预定义的代码路径进行协调的系统(例如,规定性系统)
  2. 智能体(Agents):大型语言模型动态指导其自身流程和工具使用的系统

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

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

1. 链式工作流(Chain Workflow)

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

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. 并行化工作流(Parallelization Workflow)

大型语言模型可以同时处理任务,并通过编程方式聚合其输出。并行化工作流主要有两种变体:

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

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)

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

Routing Workflow

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

何时使用

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

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

@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)

此模式演示了如何在保持控制的同时实现更复杂的智能体行为:

  • 中心大型语言模型编排任务分解
  • 专门的工作器处理特定的子任务
  • 清晰的边界维护系统可靠性

Orchestration Workflow

何时使用

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

该实现使用 Spring AI 的 ChatClient 进行大型语言模型交互,并包括:

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. 评估器-优化器(Evaluator-Optimizer)

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

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

Evaluator-Optimizer Workflow

何时使用

  • 存在清晰的评估标准
  • 迭代润色提供可衡量的价值
  • 任务得益于多轮评审

该实现使用 Spring AI 的 ChatClient 进行大型语言模型交互,并包括:

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
  • 跨不同大型语言模型提供商的统一接口
  • 内置错误处理和重试机制
  • 灵活的提示管理

最佳实践和建议

基于 Anthropic 的研究和 Spring AI 的实现,以下是构建有效大型语言模型系统的一些关键建议:

  • 从简单开始

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

    • 实现清晰的错误处理
    • 尽可能使用类型安全的响应
    • 在每个步骤中加入验证
  • 权衡利弊

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

未来工作

在本系列的第二部分,我们将探讨如何构建更高级的智能体,将这些基础模式与复杂特性结合起来:

模式组合

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

高级智能体内存管理

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

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

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

敬请关注这些高级特性的详细实现和最佳实践。

Tanzu 生成式 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 的实际实现相结合,为构建有效的基于大型语言模型的系统提供了一个强大的框架。遵循这些模式和原则,开发者可以创建健壮、可维护且高效的 AI 应用,提供实际价值,同时避免不必要的复杂性。

关键在于记住,有时最简单的解决方案也是最有效的。从基本模式开始,彻底理解你的用例,并且只有在能够明显提升系统性能或能力时才增加复杂性。

获取 Spring 资讯

订阅 Spring 资讯,保持联系

订阅

先行一步

VMware 提供培训和认证,助你快速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部