你在学习 Spring AI 的时候,肯定遇到过这三个类:ChatModel、Prompt、ChatResponse看着眼熟,却总搞不清谁负责干嘛、代码里为啥要这么写?

接下来就是我的理解。

一、先搞懂:这三个东西是什么关系?

在开始写代码前,我先在脑子里建立了一个超级简单的模型:

我想让 AI 回答问题 → 必须经过三步:

  1. 我要把问题整理好 → 对应 Prompt
  2. 我要一个能调用 AI 的工具 → 对应 ChatModel
  3. 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();
    }
}

我写这段代码时的思考过程

  1. 先注入工具:ChatModel
  2. 再整理问题:Prompt
  3. 发送请求:call (prompt)
  4. 接收答案:ChatResponse
  5. 拆包拿内容:getContent ()

完全符合正常思考逻辑!

六、我总结的最通俗记忆法(背会就不会忘)

ChatModel   = 调用AI的工具(入口)
Prompt      = 你给AI的问题(输入)
ChatResponse= AI 返回的答案(输出)

固定公式:

ChatModel.call(Prompt) → ChatResponse
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐