我花了 3 小时吃透:Spring AI 核心三剑客 ChatModel、Prompt、ChatResponse 到底怎么用?
·
你在学习 Spring AI 的时候,肯定遇到过这三个类:ChatModel、Prompt、ChatResponse看着眼熟,却总搞不清谁负责干嘛、代码里为啥要这么写?
接下来就是我的理解。
一、先搞懂:这三个东西是什么关系?
在开始写代码前,我先在脑子里建立了一个超级简单的模型:
我想让 AI 回答问题 → 必须经过三步:
- 我要把问题整理好 → 对应 Prompt
- 我要一个能调用 AI 的工具 → 对应 ChatModel
- AI 把答案返回给我 → 对应 ChatResponse
所以它们的关系是固定死的:
Prompt(提问) → ChatModel(发送) → ChatResponse(回答)
是不是一下就清晰了?下面我们一个一个拆开讲。
二、第一个核心:ChatModel —— 你调用 AI 的 “统一入口”
我的思考
我最开始好奇:Spring AI 怎么能同时支持豆包、OpenAI、通义千问、文心一言?
后来我才明白:它把所有模型的调用都抽象成了一个统一接口:ChatModel
也就是说:你写一套代码,切换模型只改配置,不用动业务代码。
这就是 Spring AI 的强大之处:统一 API。
代码
// 注入 Spring AI 提供的统一聊天模型
@Autowired
private ChatModel chatModel;
我理解的本质
- ChatModel 是一个接口,不是具体实现
- 底层可以是:OpenAiChatModel、DouBaoChatModel、TongYiChatModel 等
- 你不用关心底层是谁,统一用 chatModel.call () 就行
通俗一句话
ChatModel = 通往所有大模型的 “万能入口”
三、第二个核心:Prompt —— 你给 AI 的 “提问包裹”
我的思考
我一开始很傻:直接把字符串扔给模型不行吗?为什么要搞一个 Prompt 对象?
试了才知道:AI 不只需要 “问题”,还需要角色、上下文、历史对话。这些东西必须用一个结构化对象包装 → 这就是 Prompt。
最简单写法
Prompt prompt = new Prompt("解释一下 Kafka 增量聚合");
实用的写法
Prompt prompt = new Prompt(
List.of(
// 给AI设定角色
new SystemMessage("你是一名Java后端工程师,回答通俗简洁"),
// 用户真正的问题
new UserMessage(question)
)
);
为什么要这么写?
因为:
- SystemMessage:设定 AI 性格
- UserMessage:真正的问题
- 未来还能加 AssistantMessage:历史对话
Prompt = 给 AI 的完整指令包
四、第三个核心:ChatResponse —— AI 给你的 “答案包裹”
我的思考
我最开始以为返回的是字符串,结果发现是个对象:ChatResponse
AI 返回的不只是文字,还有:
- token 用量
- 模型信息
- 停止原因
- 多候选结果所以必须用一个对象封装。
代码怎么取答案?
// 调用AI
ChatResponse response = chatModel.call(prompt);
// 从返回结果里一层一层拆出内容
String answer = response
.getResult()
.getOutput()
.getContent();
我的理解
response:整个返回体getResult():第一个结果(默认)getOutput():AI 输出内容getContent():真正的文字答案
五、三者整合:一段完整可运行代码
下面是我在真实项目里最常用的写法,你直接复制就能跑。
@Service
public class SpringAiDemoService {
// 1. 注入统一聊天模型
@Autowired
private ChatModel chatModel;
public String askAI(String question) {
// 2. 构造 Prompt:角色 + 用户问题
Prompt prompt = new Prompt(
List.of(
new SystemMessage("你是专业的Java技术顾问,回答通俗、详细、有逻辑"),
new UserMessage(question)
)
);
// 3. 通过 ChatModel 发送请求,得到 ChatResponse
ChatResponse chatResponse = chatModel.call(prompt);
// 4. 从响应中解析出最终回答
return chatResponse
.getResult()
.getOutput()
.getContent();
}
}
我写这段代码时的思考过程
- 先注入工具:ChatModel
- 再整理问题:Prompt
- 发送请求:call (prompt)
- 接收答案:ChatResponse
- 拆包拿内容:getContent ()
完全符合正常思考逻辑!
六、我总结的最通俗记忆法(背会就不会忘)
ChatModel = 调用AI的工具(入口)
Prompt = 你给AI的问题(输入)
ChatResponse= AI 返回的答案(输出)
固定公式:
ChatModel.call(Prompt) → ChatResponse
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)