你在 AI 超级智能体项目中如何利用 Spring AI 开发应用?用到了哪些特性?
- 标签:后端、编程导航
🏛 业务架构师
我按"交付了什么业务能力"来讲用了哪些特性,而不是罗列 API:
- ChatClient + 流式(stream):对话主链路。SSE 流式输出把首字响应从"等完整答案的 20 秒"压到 1~2 秒——首 token 时间是 AI 应用的体验生命线,直接决定用户留存;
- Advisor 链:把"查询重写、RAG 增强、敏感词审查、会话记忆"做成可插拔的 Advisor 串在调用链上——新增一种增强能力=加一个 Advisor 类,主流程零改动。这个结构我直接借鉴了责任链/过滤器的治理经验;
- ChatMemory + 持久化:多轮对话上下文按会话 ID 管理、落库——支持"续聊"与跨设备一致;
- 结构化输出:让模型输出路线规划、数据分析结论时直接映射成业务对象——下游正常走代码逻辑(校验、存库、渲染),AI 的不确定性被关在类型边界内;
- VectorStore + Embedding:RAG 知识库的底座;
- Tool Calling:联网搜索、文件生成等工具,让智能体执行真实动作。
取舍说明(架构师必备的自省):我刻意没用一些花哨能力——比如一开始就上多 Agent 编排,因为当时业务只有问答场景,单链路 + RAG 已经满足 90% 需求;后来"自动规划任务"需求出现才引入 ReAct。特性引入跟着用户需求走,不跟着 release notes 走——AI 框架每个版本都有新玩具,克制是架构纪律。
🏗 系统架构师
我在项目里把 Spring AI 当作智能体层的基础设施,具体用到的特性按链路串讲:
1. ChatClient + 多模型接入:用 ChatClient.builder() 构建统一调用入口,配置 OpenAI/DeepSeek 等多个模型(不同任务用不同模型——规划用强模型、摘要用便宜模型,成本优化)。
2. Advisor 链做横切增强(用得最深的特性):自定义 Advisor 实现——对话记忆注入(ChatMemoryAdvisor)、RAG 检索增强(自定义 QuestionAnswerAdvisor 扩展)、ReReading Advisor(输出前重读问题提升准确率)、日志与 token 统计。调用链像 Filter 一样可插拔组合。
3. 结构化输出:让模型返回 List<SearchQuery>、路由决策枚举等 POJO,entity(new ParameterizedTypeReference<>(){}) 直接拿对象,省去手写 JSON 解析与校验。
4. RAG 管道:ETL(TikaDocumentReader → TokenTextSplitter → EmbeddingModel → VectorStore)构建知识库;检索时 QuestionAnswerAdvisor 自动拼上下文。
5. Tool Calling 与 MCP:@Tool 注解暴露联网搜索、PDF 生成等本地工具;McpClient 接入地图、图片搜索的远程 MCP Server。
6. 流式输出:.stream() 返回 Flux<String>,接 SseEmitter 实现打字机效果。
工程体会:Spring AI 的价值在抽象稳定性——模型供应商一年换三茬,业务代码里的 ChatClient/Advisor/Tool 接口不动,只改配置,这是框架层解耦的典型收益。
💻 全栈开发专家
我按实际代码里用的特性清单答:
1. ChatClient + Advisor 链(编排核心):
java
@Bean
ChatClient chatClient(ChatClient.Builder builder,
VectorStore vectorStore, ChatMemory memory) {
return builder
.defaultSystem("你是 xxx 助手,回答要基于知识库内容")
.defaultAdvisors(
new MessageChatMemoryAdvisor(memory), // 多轮记忆
new QuestionAnswerAdvisor(vectorStore, // RAG 检索增强
SearchRequest.builder().topK(5).build()),
new SimpleLoggerAdvisor()) // 调试日志
.build();
}2. 结构化输出:模型生成的内容直接 .entity(AnalysisResult.class),拿到类型安全的结果,用于后续业务处理。
3. Tool Calling:联网搜索、PDF 生成等工具用 @Tool 注解,.tools(searchTool, pdfTool) 注册,模型自主决定调用。
4. RAG 全套:TikaDocumentReader 解析上传文档 → TokenTextSplitter 切分 → KeywordMetadataEnricher 打元信息 → EmbeddingModel 向量化 → VectorStore.add() 入库;查询侧走 QuestionAnswerAdvisor。
5. 流式输出:.stream() 返回 Flux,接 SseEmitter 实现逐 token 打字机效果。
6. 多模型切换:OpenAI 兼容接口接 DeepSeek/通义,本地测试用 Ollama,配置文件一改即切。
踩坑经验:Advisor 有顺序(记忆要在 RAG 前处理指代);tool 的描述写不清楚模型就会乱选或不用;流式 + 工具调用混合时注意边界情况。