这篇文章介绍一下
spingai的核心概念
我们先铺垫一下信息量
读前面的文章,可以了解到
ai可以感知人类意图,整合信息,然后调用工具补齐信息量
这里就派生出一个问题
之前的逻辑是,可以用ai辅助it项目推进
在各个阶段都有用
有没有可以让ai代替接口逻辑,
所谓的 写代码的逻辑,
本质上,就是拿到用户id,然后经过各种标识符判断,然后ifelse整理出一个数据的信息结果
返回给用户
有没有可能,在代码里塞入一个ai
把用户id给他,让他去找信息,和用户沟通呢
有的,兄弟,有的
那就是springai
这篇文章核心就3个
1.把握springai的核心概念
2.知道这些核心概念怎么落地到springboot上
3.知道这个springai的应用场景
spirngai接入springboot
是按照常规技术栈的思路接入点
1.引入依赖
2.做配置
3.拿到依赖提供的对象,做开发
我们梳理一下,要在代码中构建一个智能体
感受代码,sql里面的数据要做的事情
这里要普及一下
要在代码中构建这么一个智能体需要的要素
这里还是补齐上下文
这个本质是,还是拿着apikey,消耗token
或者使用ollma,自己部署一个llm
所以,这个实际上,还是在用户和llm之间构建一个中间层
1.给llm一个氛围和身份,提示词工程
springai提供的机制,可以让用户和llm沟通
多轮,llm还记得用户是谁
智能体的记忆系统
3.让llm可以感知到id和sql中的数据
(tools)(functioncalling)
4.让llm可以拿到专业数据(向量数据库)
5.这个有个东西,日志监控
Spring AI 核心概念:让你的代码拥有"智能"
从一段"笨拙"的代码说起
想象一下,你正在开发一个用户信息查询接口。传统逻辑是这样的:
java
@GetMapping("/user-info")
public UserInfo getUserInfo(@RequestParam String userId) {
// 1. 查数据库
User user = userRepository.findById(userId);
// 2. 各种if-else判断
if (user.getVipLevel() > 3) {
// 查VIP专属权益
}
if (user.getOrderCount() > 10) {
// 查老用户优惠
}
// 3. 组装返回结果
return userInfo;
}
这段代码本质上是 "根据ID查数据 → 做一堆判断 → 返回固定结构的结果"。问题是:
- 用户想要的信息格式变了,你得改代码
- 用户问"我为什么是VIP3级?",你得写新接口
- 用户说"帮我看看我值不值得续费",你得再写一套逻辑
有没有可能,在代码里塞一个"AI大脑",把用户ID扔给它,让它自己去理解意图、去查数据、去和用户沟通?
有的,兄弟,有的。那就是 Spring AI。
什么是 Spring AI?
一句话定义:Spring AI 是一个让 Java 应用轻松集成 AI 能力的框架,核心是帮你把大模型(LLM)变成代码中的一个"智能组件"。
它不是一个独立的AI服务,而是 Spring Boot 生态里的一个"中间层" 。它做的事情就是:在你的业务代码和大模型之间,搭建一座桥梁。
你不需要关心大模型怎么部署(可以调用OpenAI、通义千问,也可以本地部署Ollama),你只需要像用Spring Data JPA操作数据库一样,用Spring AI操作大模型。
Spring AI 的四大核心支柱
要在代码里构建一个真正"能用"的智能体,需要搞定四件事:
1. 提示词工程(Prompt Engineering):给 AI 一个"人设"和"剧本"
大模型就像一个世界顶级的演员,你给它什么样的剧本,它就演什么样的角色。
java
// 给AI设定一个"身份"和"任务"
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("""
你是黑马程序员的AI智能客服,名字叫"小马"。
你的任务是帮助学员了解培训课程、预约试听。
你说话要热情、专业,像一位耐心的课程顾问。
""")
.build();
}
本质: 通过 System Prompt 控制AI的行为边界和角色定位。这就是把业务规则"翻译"成AI能理解的指令。
2. 对话记忆(ChatMemory):让 AI 有"记性"
大模型本身是"健忘"的------每次请求都是独立的,它不记得你上一句说了什么。
java
// 配置记忆:让AI记住多轮对话
@Bean
public ChatClient chatClient(ChatClient.Builder builder, ChatMemory chatMemory) {
return builder
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
.build();
}
有了记忆,AI才能聊出"人味":
- 用户:"我叫张三。"
- AI:"好的张三,我记住了!"
- 用户:"我叫什么?"
- AI:"你叫张三啊!"
本质: Spring AI 通过 Advisor 拦截器机制,在每次请求前自动把历史消息拼接到Prompt里。记忆可以存在内存里,也可以存到Redis或数据库。
3. 工具调用(Function Calling):让 AI 感知你的"内部数据"
这是让AI真正"干活"的关键。大模型不懂你的数据库,但你可以通过工具调用,让AI学会"使用"你的Java方法。
java
@Service
public class OrderTools {
// 告诉AI:这个工具是"查订单"用的
@Tool(description = "根据订单号查询订单的物流状态")
public String queryOrder(@ToolParam(description = "订单编号") String orderId) {
// 这里是真正的业务逻辑:查数据库、调API
Order order = orderRepository.findById(orderId);
return "订单" + orderId + "当前状态:" + order.getStatus();
}
}
// 把工具注册给AI
@Bean
public ChatClient chatClient(ChatClient.Builder builder, OrderTools orderTools) {
return builder.defaultTools(orderTools).build();
}
运行流程:
用户说:"帮我看看订单12345到哪了?"
↓
AI分析意图:"他是在查订单状态,需要调用 queryOrder 工具"
↓
AI提取参数:orderId = "12345"
↓
Spring AI执行 queryOrder("12345") → 查数据库 → 返回结果
↓
AI把结果翻译成:"您的订单12345已发货,预计明天送达。"
本质: 你写的Java方法变成了AI的"双手"。AI不懂SQL和API,但它知道"什么时候该用什么工具"。
4. 向量检索(RAG/Vector Store):让 AI 读懂你的"私有知识"
大模型的训练数据是公开的,它不知道你公司内部的规章制度、产品手册、技术文档。
RAG(检索增强生成) 解决的就是这个问题:先把你的私有文档向量化存入数据库,当用户提问时,先检索相关文档片段,再让AI基于这些片段回答。
java
// 1. 知识入库:把PDF切成小块,转成向量,存入向量库
@PostConstruct
public void ingestDocuments() {
var pdfReader = new PagePdfDocumentReader(pdfResource);
var documents = pdfReader.get();
var splitDocuments = new TokenTextSplitter().apply(documents);
vectorStore.add(splitDocuments); // 自动调用EmbeddingModel完成向量化
}
// 2. 检索回答:用户提问时,先去向量库搜索相关内容
@GetMapping("/ask")
public String ask(@RequestParam String question) {
return chatClient.prompt()
.user(question)
.advisors(new QuestionAnswerAdvisor(vectorStore)) // 自动检索并拼接到Prompt
.call()
.content();
}
本质: 把"文本搜索"变成了"语义搜索"。传统关键词搜索只能匹配"Java",而向量搜索能理解"用什么语言开发后端"也指向"Java"。
Spring AI 怎么接入 Spring Boot?
和其他Spring生态的组件一样,标准的 三步走:
1. 引入依赖
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M4</version>
</dependency>
2. 做配置
yaml
spring:
ai:
openai:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${OPENAI_API_KEY}
chat:
options:
model: qwen-max-latest
embedding:
options:
model: text-embedding-v3
dimensions: 1024
3. 拿对象写代码
java
@Autowired
private ChatClient chatClient;
public String chat(String message) {
return chatClient.prompt().user(message).call().content();
}
应用场景:Spring AI 到底能做什么?
| 场景 | 传统方式 | Spring AI方式 |
|---|---|---|
| 智能客服 | 写死问答库,维护成本高 | AI理解意图,调用订单/课程查询工具,动态回答 |
| 文档问答 | 用户自己翻PDF/手册 | 上传PDF → 向量化入库 → AI基于文档回答 |
| 数据查询 | 写各种 /query-by-xxx 接口 |
用户说人话,AI调Tools查SQL,返回自然语言结果 |
| 内容生成 | 模板引擎生成固定格式 | AI根据上下文生成个性化文案 |
| 代码辅助 | 手动写模板代码 | AI理解需求,生成/补全代码片段 |
一句话总结
Spring AI 的本质是:在用户和大模型之间,用 Spring Boot 的方式构建一个"中间层",把提示词、记忆、工具调用、知识库这四件事标准化、组件化,让开发者能像搭积木一样组装出有智能的应用。