ChatModel和ChatClient ChatModel和ChatClient一、ChatModel1. 基础定位2. 核心能力3. 适用场景二、ChatClient1. 基础定位2. 核心能力3. 适用场景三、二者核心区别对比四、示例1.application.yml2.DemoApplication3.Record4.ChatModelController5.ChatClientController一、ChatModel1. 基础定位ChatModel是Spring AI体系中最底层的核心接口直接与通义千问、OpenAI等大模型服务商通信是所有大模型交互的基础能力抽象。2. 核心能力仅提供两个核心原生方法call(Prompt prompt)同步返回完整的ChatResponse结果stream(Prompt prompt)以流式方式逐块返回响应内容它支持自定义组装Prompt、手动配置ChatOptions参数能完全控制请求的每一个细节。3. 适用场景适合简单的单次大模型调用、需要高度定制请求逻辑的场景开发者可完全自主管理消息组装、响应解析等全流程。二、ChatClient1. 基础定位ChatClient是构建在ChatModel之上的高层封装Fluent API设计风格对标Spring生态的WebClient通过链式调用隐藏底层通信细节抹平不同大模型厂商的接口差异。2. 核心能力除基础的同步/流式调用外内置大量开箱即用的高级功能结构化输出直接将大模型返回内容映射为Java POJO/Record无需手动解析JSON对话记忆集成ChatMemory支持内存存储或Redis持久化的多轮上下文管理函数调用内置Function Calling能力可对接外部工具RAG集成原生支持检索增强生成流程快速实现文档问答场景3. 适用场景适合快速开发企业级智能客服、聊天机器人、结构化数据提取等标准化AI应用大幅减少样板代码编写量。三、二者核心区别对比对比维度ChatModelChatClient抽象层级底层原子API高层服务封装API开发效率需手动组装Prompt、解析响应代码量大链式Fluent调用自动处理交互细节代码量极少内置高级功能无需手动集成记忆、RAG等能力原生支持对话记忆、结构化输出、函数调用等灵活度极高可完全控制请求全流程中等标准化流程下开发效率最优上手难度中等需掌握Prompt、Message等基础概念低符合Spring开发者的编码习惯实际项目中二者可混合使用简单场景直接用ChatModel复杂业务场景优先用ChatClient提升开发效率四、示例1.application.ymlserver:port:8080spring:application:name:spring-ai-alibaba-demoai:dashscope:# 请替换为你的阿里云 DashScope API Keyapi-key:${AI_DASHSCOPE_API_KEY:your-api-key-here}chat:options:# 默认模型model:qwen-plus# 默认温度参数temperature:0.72.DemoApplicationpackagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}3.Recordpackagecom.example.demo.model;importjava.util.List;/** * 用于演示 ChatClient 结构化输出功能的 Record 类 */publicrecordActorMovies(Stringactor,ListStringmovies){}4.ChatModelControllerpackagecom.example.demo.controller;importorg.springframework.ai.chat.model.ChatModel;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.chat.prompt.SystemPromptTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;/** * ChatModel 是 Spring AI 的底层核心接口直接与大模型交互。 * 适合需要高度自定义 Prompt 组装和响应处理的场景。 */RestControllerRequestMapping(/api/model)publicclassChatModelController{privatefinalChatModelchatModel;AutowiredpublicChatModelController(ChatModelchatModel){this.chatModelchatModel;}/** * 简单同步调用 * 直接发送字符串获取返回内容 */GetMapping(/simple)publicStringsimpleChat(RequestParam(valuemessage,defaultValue你好)Stringmessage){// call 方法直接返回 ChatResponse通过 getResult().getOutput().getContent() 获取文本returnchatModel.call(message).getResult().getOutput().getContent();}/** * 使用 Prompt 和 System Message * 展示如何构建更复杂的请求包含系统指令和用户消息 */GetMapping(/prompt)publicStringpromptChat(RequestParam(valuetopic,defaultValueJava)Stringtopic){// 定义系统提示词模板StringsystemText你是一个专业的{role}请用简洁的语言回答用户的问题。;SystemPromptTemplatesystemTemplatenewSystemPromptTemplate(systemText);// 创建 Prompt包含系统消息和用户消息PromptpromptnewPrompt(systemTemplate.createMessage(Map.of(role,技术专家)),neworg.springframework.ai.chat.messages.UserMessage(请解释什么是 topic));// 调用模型并获取响应varresponsechatModel.call(prompt);returnresponse.getResult().getOutput().getContent();}}5.ChatClientControllerpackagecom.example.demo.controller;importcom.example.demo.model.ActorMovies;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/** * ChatClient 是基于 ChatModel 封装的高阶 Fluent API。 * 提供链式调用支持结构化输出、对话记忆等高级功能开发效率更高。 */RestControllerRequestMapping(/api/client)publicclassChatClientController{privatefinalChatClientchatClient;AutowiredpublicChatClientController(ChatClient.BuilderchatClientBuilder){// 使用 Builder 构建 ChatClient 实例this.chatClientchatClientBuilder.build();}/** * 基础链式调用 * 语法简洁类似 WebClient */GetMapping(/simple)publicStringsimpleChat(RequestParam(valuemessage,defaultValue你好)Stringmessage){returnchatClient.prompt()// 开始构建提示词.user(message)// 设置用户消息.call()// 发起调用.content();// 直接获取字符串内容}/** * 结构化输出示例 * 直接将大模型的返回结果映射为 Java 对象 (ActorMovies)无需手动解析 JSON */GetMapping(/structured)publicActorMoviesstructuredOutput(RequestParam(valueactor,defaultValue成龙)Stringactor){StringpromptText请列出演员 actor 主演的三部著名电影以JSON格式返回包含actor名字和movies列表。;returnchatClient.prompt(promptText).call().entity(ActorMovies.class);// 自动反序列化为 Record 对象}/** * 带系统指令的调用 * 动态设置 System Message控制 AI 的人设 */GetMapping(/role-play)publicStringrolePlay(RequestParam(valuequestion,defaultValue怎么学习编程)Stringquestion){returnchatClient.prompt().system(你是一位幽默风趣的编程导师喜欢用比喻来解释复杂概念。).user(question).call().content();}}