Spring AI Agent 漫画实战
第 01 话 WORLD VIEW

范式迁移:从 CRUD 到 Agent 先把世界观立住 —— 你面对的不是"一个新 SDK",而是一次控制权的让渡

十年 Java 经验最大的优势不是语法,而是对分层的直觉。这一话我们只做一件事:搞清楚 Spring AI 在你熟悉的分层里,究竟站在哪一层、替你挡掉了什么。

老 K
Agent?我查了下,不就是 循环调用 LLM + 调函数 吗。我写个 while(true) 不就完了。
小 S
你说的那个 while(true),在生产上叫「死循环 + 无限账单 + 不可复现 bug」 三件套。
循环本身只占 Agent 的 20%,剩下 80% 是:什么时候停、调什么工具、状态怎么存、错了怎么退、花多少钱、能不能审计。
旁白:老 K 的直觉并不算错 —— Agent 的执行骨架确实是一个循环(ReAct loop)。但他忽略了一件事: 当循环的每一步决策权从代码转移到模型手里时,你必须用工程手段把"不确定性"重新约束回来。这正是 Spring AI 存在的意义。

一、四层抽象栈:你到底在哪一层写代码?

把 AI 应用拆成四层,你会发现每一层都对应一个你已经熟悉的 Spring 概念:

L4 · Agent 层(你写编排与策略) 循环 / 规划 / 工具编排 / 记忆策略 / 护栏 —— Spring AI 1.x 官方无图编排框架,需用 Spring Bean 自行组合(第 09 话) 类比:你自己写的 @Service 业务编排 L3 · ChatClient 层(流式 API + Advisor 拦截链) ChatClient.builder(...).defaultSystem(...).defaultAdvisors(...) —— 与 JdbcClient / RestClient 同构的 Fluent API 类比:RestClient / JdbcClient(模板 + 拦截器) L2 · ChatModel 层(可替换的 Port 接口) ChatModel#call(Prompt) → ChatResponse;EmbeddingModel;ImageModel;VectorStore —— 全部是接口 类比:JDBC Driver 接口 / javax.sql.DataSource L1 · 厂商协议层(HTTP / JSON / SSE / gRPC ...) OpenAI / Anthropic / DashScope(通义) / Ollama / Bedrock ... 各自的报文、鉴权、流式格式完全不同 类比:MySQL / Oracle / PG 各自的线协议 ↑ 抽象↑
架构解剖

Spring AI 的骨架是 Ports & Adapters(六边形架构)。

这意味着:换模型 = 换 Starter + 改 yml,业务代码零改动。跟换数据库驱动是一模一样的套路。

你熟悉的 Spring 概念Spring AI 对应物为什么这样设计
DataSource / JDBC DriverChatModel屏蔽厂商协议差异,让上层只依赖接口
JdbcClient / RestClientChatClientFluent 链式 API,把"构造请求-执行-解析响应"模板化
Servlet Filter / MVC InterceptorAdvisor横切关注点(记忆、RAG、日志、护栏)可插拔、可排序
@Bean 方法 / SPI@Tool + ToolCallbackProvider把 Spring 管理的对象方法暴露给模型调用,天然享受 IoC/AOP/事务
CrudRepositoryVectorStore / ChatMemoryRepository状态持久化抽象,内存实现用于测试,JDBC/Redis 等用于生产
Micrometer / ActuatorChatModelObservationContext观测指标与 token 计量进入既有监控体系
老 K
这套路我熟。那"Agent"在第几层?Spring AI 有没有个 Agent 接口?
小 S
没有。而且这是故意的。

二、Agent 的严格定义:四个必要条件

别再被营销词糊弄。一个系统能被称作 Agent,至少具备这四样东西:

① BRAIN

一个推理引擎(LLM)

负责理解目标、拆解步骤、判断"下一步做什么"。注意:它不负责执行。

② HANDS

一组受控工具(Tools)

查询、写入、计算、发消息。工具是 Agent 与真实世界唯一的接触面,因此权限必须在代码侧刚性约束。

③ MEMORY

状态与记忆

短期(会话窗口)+ 长期(摘要/向量/业务库)。没有记忆的 Agent 每次都是"初次见面",无法承担长流程任务。

④ LOOP

一个带终止条件的循环

观察 → 思考 → 行动 → 观察…… 终止条件比循环本身更重要:最大步数、Token 预算、成本上限、置信度阈值、人工中断。

用户输入目标 Goal + Context 思考 / 规划 LLM 决定下一步 调用工具 @Tool / MCP 观察结果 写入记忆 / 日志 循环回到"思考",直到满足终止条件 终止? 步数 / 预算 / 置信
认知纠偏

Agent ≠ LLM Chatbot。判断标准只有一条:这个系统的控制流,是不是由模型的输出决定的?

工程实践里,90% 的场景应该用 Workflow,只有 10% 需要真正的 Agent。能用确定编排解决的,绝不让模型自由发挥 —— 这是成本、稳定性、可测试性的三重胜利。第 09 话会展开这五种模式。

三、与经典后端的三大本质差异

维度传统后端(确定性)LLM 应用(概率性)
正确性 输入 A 必得输出 B;单测断言可全覆盖 同输入可能不同输出;只能做统计意义上的质量保证:评测集 + 打分器 + 回归基线
失败模式 抛异常、超时、5xx —— 显式且可捕获 静默错误:格式对、逻辑错、编造事实(幻觉)。必须引入 Evaluator 与人工抽检
成本模型 CPU/内存,边际成本趋近于 0 按 Token 计费,每次重试、每条历史、每份 RAG 上下文都在烧钱。需要 Token 预算与缓存
延迟 毫秒级 秒级到分钟级;必须用流式输出改善体验,且流式与拦截链、工具调用的组合是难点
安全边界 参数校验 + 权限框架 多出提示词注入与工具滥用两类新攻击面:模型可能被一段网页/文档"洗脑"去调用危险工具
旁白:看清这张表,你就明白了为什么 Spring AI 要提供 Advisor、Evaluator、Observation、Guardrail 这些"看起来多余"的东西 —— 它们不是框架炫技,而是为概率性系统补上确定性系统本来免费拥有的那些保障。

四、Spring AI 模块地图(别乱引依赖)

核心
  • spring-ai-bom —— 必须引入,统一版本
  • spring-ai-starter-model-* —— 模型适配器(openai / anthropic / ollama / 阿里云 dashscope 等)
  • spring-ai-starter-vector-store-* —— pgvector / redis / elasticsearch / milvus / chroma
  • spring-ai-rag —— 模块化检索增强(1.1 起)
扩展
  • spring-ai-starter-mcp-client / -server-webmvc —— MCP 协议
  • spring-ai-starter-model-chat-memory-repository-jdbc —— 会话持久化
  • spring-ai-tika-document-reader / -pdf-document-reader —— 文档 ETL
  • spring-ai-spring-boot-docs —— 把自家文档喂给 Agent(挺香)

版本基线(照抄即可)

<dependencyManagement>
  <dependencies>
    <dependency>                                //!hl
      <groupId>org.springframework.ai</groupId> //!hl
      <artifactId>spring-ai-bom</artifactId>    //!hl
      <version>1.1.2</version>                  //!hl
      <type>pom</type>                          //!hl
      <scope>import</scope>                     //!hl
    </dependency>                               //!hl
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!-- 模型适配器:换一家厂商只需换这个 artifactId -->
  <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
  </dependency>
</dependencies>

Spring AI 未进入 Spring Boot 官方依赖管理,必须显式 import BOM;否则各模块版本错位,报一堆 NoSuchMethodError。

版本注意

五、写给十年老兵的五条"防坑心法"

  1. 把 Prompt 当代码资产管。进 Git、进 Code Review、有版本号、有测试。写死在 Java 字符串里的 Prompt,三个月后没人敢改。
  2. 把模型当"不可信的外部服务"。它的输出要校验、要结构化、要限流、要超时、要降级。跟调用第三方支付接口一个态度。
  3. 工具是新的 API 边界。工具描述 = API 文档,参数 = DTO,返回值 = 响应体。按设计 REST 接口的标准去设计它,别糊弄。
  4. 一切都要可观测。没有 token 计量与 trace 的 AI 功能上线,等于把信用卡交给一个看不见的人。
  5. 先做 Workflow,再做 Agent。自由度是奢侈品,只有在确定性编排确实解决不了时才购买。
小 S
一句话收尾:Spring AI 不创造智能,它创造秩序。智能在模型里,秩序在你手里。
← 返回目录 下一话:三十行跑通 →