十年 Java 经验最大的优势不是语法,而是对分层的直觉。这一话我们只做一件事:搞清楚 Spring AI 在你熟悉的分层里,究竟站在哪一层、替你挡掉了什么。
while(true) 不就完了。while(true),在生产上叫「死循环 + 无限账单 + 不可复现 bug」 三件套。把 AI 应用拆成四层,你会发现每一层都对应一个你已经熟悉的 Spring 概念:
Spring AI 的骨架是 Ports & Adapters(六边形架构)。
ChatModel、EmbeddingModel、VectorStore、ChatMemoryRepository —— 纯接口,位于核心模块。spring-ai-starter-model-openai、-anthropic、spring-ai-pgvector-store 等 —— 每个 Starter 就是一个适配器实现 + 自动装配。这意味着:换模型 = 换 Starter + 改 yml,业务代码零改动。跟换数据库驱动是一模一样的套路。
| 你熟悉的 Spring 概念 | Spring AI 对应物 | 为什么这样设计 |
|---|---|---|
DataSource / JDBC Driver | ChatModel | 屏蔽厂商协议差异,让上层只依赖接口 |
JdbcClient / RestClient | ChatClient | Fluent 链式 API,把"构造请求-执行-解析响应"模板化 |
Servlet Filter / MVC Interceptor | Advisor | 横切关注点(记忆、RAG、日志、护栏)可插拔、可排序 |
@Bean 方法 / SPI | @Tool + ToolCallbackProvider | 把 Spring 管理的对象方法暴露给模型调用,天然享受 IoC/AOP/事务 |
CrudRepository | VectorStore / ChatMemoryRepository | 状态持久化抽象,内存实现用于测试,JDBC/Redis 等用于生产 |
| Micrometer / Actuator | ChatModelObservationContext | 观测指标与 token 计量进入既有监控体系 |
Agent 接口?别再被营销词糊弄。一个系统能被称作 Agent,至少具备这四样东西:
负责理解目标、拆解步骤、判断"下一步做什么"。注意:它不负责执行。
查询、写入、计算、发消息。工具是 Agent 与真实世界唯一的接触面,因此权限必须在代码侧刚性约束。
短期(会话窗口)+ 长期(摘要/向量/业务库)。没有记忆的 Agent 每次都是"初次见面",无法承担长流程任务。
观察 → 思考 → 行动 → 观察…… 终止条件比循环本身更重要:最大步数、Token 预算、成本上限、置信度阈值、人工中断。
Agent ≠ LLM Chatbot。判断标准只有一条:这个系统的控制流,是不是由模型的输出决定的?
工程实践里,90% 的场景应该用 Workflow,只有 10% 需要真正的 Agent。能用确定编排解决的,绝不让模型自由发挥 —— 这是成本、稳定性、可测试性的三重胜利。第 09 话会展开这五种模式。
| 维度 | 传统后端(确定性) | LLM 应用(概率性) |
|---|---|---|
| 正确性 | 输入 A 必得输出 B;单测断言可全覆盖 | 同输入可能不同输出;只能做统计意义上的质量保证:评测集 + 打分器 + 回归基线 |
| 失败模式 | 抛异常、超时、5xx —— 显式且可捕获 | 静默错误:格式对、逻辑错、编造事实(幻觉)。必须引入 Evaluator 与人工抽检 |
| 成本模型 | CPU/内存,边际成本趋近于 0 | 按 Token 计费,每次重试、每条历史、每份 RAG 上下文都在烧钱。需要 Token 预算与缓存 |
| 延迟 | 毫秒级 | 秒级到分钟级;必须用流式输出改善体验,且流式与拦截链、工具调用的组合是难点 |
| 安全边界 | 参数校验 + 权限框架 | 多出提示词注入与工具滥用两类新攻击面:模型可能被一段网页/文档"洗脑"去调用危险工具 |
spring-ai-bom —— 必须引入,统一版本spring-ai-starter-model-* —— 模型适配器(openai / anthropic / ollama / 阿里云 dashscope 等)spring-ai-starter-vector-store-* —— pgvector / redis / elasticsearch / milvus / chromaspring-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 —— 文档 ETLspring-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。
repo.spring.io,正式版在 Maven Central。FunctionCallback(旧函数回调)已在 1.0 移除,统一到 @Tool;QuestionAnswerAdvisor 逐步让位于 RetrievalAugmentationAdvisor;VectorStoreChatMemoryAdvisor 已废弃。@Deprecated 注解的 replacement 说明,官方一般写得很清楚。第 02 话 —— 三十行代码跑通第一个 Agent 雏形。同时我们会把 ChatClient.Builder 这个 Bean 从哪来、为什么每次都要 .build()、ChatResponse 里到底藏了多少信息,全部拆开给你看。