当前位置: 首页 > news >正文

ChatModel和ChatClient

ChatModel和ChatClient

  • 一、ChatModel
    • 1. 基础定位
    • 2. 核心能力
    • 3. 适用场景
  • 二、ChatClient
    • 1. 基础定位
    • 2. 核心能力
    • 3. 适用场景
  • 三、二者核心区别对比
  • 四、示例
    • 1.application.yml
    • 2.DemoApplication
    • 3.Record
    • 4.ChatModelController
    • 5.ChatClientController

一、ChatModel

1. 基础定位

ChatModel是Spring AI体系中最底层的核心接口,直接与通义千问、OpenAI等大模型服务商通信,是所有大模型交互的基础能力抽象。

2. 核心能力

仅提供两个核心原生方法:

  • call(Prompt prompt):同步返回完整的ChatResponse结果
  • stream(Prompt prompt):以流式方式逐块返回响应内容
    它支持自定义组装Prompt、手动配置ChatOptions参数,能完全控制请求的每一个细节。

3. 适用场景

适合简单的单次大模型调用、需要高度定制请求逻辑的场景,开发者可完全自主管理消息组装、响应解析等全流程。

二、ChatClient

1. 基础定位

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.yml

server: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.7

2.DemoApplication

packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}

3.Record

packagecom.example.demo.model;importjava.util.List;/** * 用于演示 ChatClient 结构化输出功能的 Record 类 */publicrecordActorMovies(Stringactor,List<String>movies){}

4.ChatModelController

packagecom.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 组装和响应处理的场景。 */@RestController@RequestMapping("/api/model")publicclassChatModelController{privatefinalChatModelchatModel;@AutowiredpublicChatModelController(ChatModelchatModel){this.chatModel=chatModel;}/** * 简单同步调用 * 直接发送字符串,获取返回内容 */@GetMapping("/simple")publicStringsimpleChat(@RequestParam(value="message",defaultValue="你好")Stringmessage){// call 方法直接返回 ChatResponse,通过 getResult().getOutput().getContent() 获取文本returnchatModel.call(message).getResult().getOutput().getContent();}/** * 使用 Prompt 和 System Message * 展示如何构建更复杂的请求,包含系统指令和用户消息 */@GetMapping("/prompt")publicStringpromptChat(@RequestParam(value="topic",defaultValue="Java")Stringtopic){// 定义系统提示词模板StringsystemText="你是一个专业的{role},请用简洁的语言回答用户的问题。";SystemPromptTemplatesystemTemplate=newSystemPromptTemplate(systemText);// 创建 Prompt,包含系统消息和用户消息Promptprompt=newPrompt(systemTemplate.createMessage(Map.of("role","技术专家")),neworg.springframework.ai.chat.messages.UserMessage("请解释什么是 "+topic));// 调用模型并获取响应varresponse=chatModel.call(prompt);returnresponse.getResult().getOutput().getContent();}}

5.ChatClientController

packagecom.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。 * 提供链式调用,支持结构化输出、对话记忆等高级功能,开发效率更高。 */@RestController@RequestMapping("/api/client")publicclassChatClientController{privatefinalChatClientchatClient;@AutowiredpublicChatClientController(ChatClient.BuilderchatClientBuilder){// 使用 Builder 构建 ChatClient 实例this.chatClient=chatClientBuilder.build();}/** * 基础链式调用 * 语法简洁,类似 WebClient */@GetMapping("/simple")publicStringsimpleChat(@RequestParam(value="message",defaultValue="你好")Stringmessage){returnchatClient.prompt()// 开始构建提示词.user(message)// 设置用户消息.call()// 发起调用.content();// 直接获取字符串内容}/** * 结构化输出示例 * 直接将大模型的返回结果映射为 Java 对象 (ActorMovies),无需手动解析 JSON */@GetMapping("/structured")publicActorMoviesstructuredOutput(@RequestParam(value="actor",defaultValue="成龙")Stringactor){StringpromptText="请列出演员 "+actor+" 主演的三部著名电影,以JSON格式返回,包含actor名字和movies列表。";returnchatClient.prompt(promptText).call().entity(ActorMovies.class);// 自动反序列化为 Record 对象}/** * 带系统指令的调用 * 动态设置 System Message,控制 AI 的人设 */@GetMapping("/role-play")publicStringrolePlay(@RequestParam(value="question",defaultValue="怎么学习编程?")Stringquestion){returnchatClient.prompt().system("你是一位幽默风趣的编程导师,喜欢用比喻来解释复杂概念。").user(question).call().content();}}
http://www.jsqmd.com/news/1152651/

相关文章:

  • 基于Spring Boot的茶叶信息展示与销售系统设计与实现
  • 微流控多孔基质荧光标记原料 AATOM 532 TCO,直观表征固相内生物分子扩散分布特征
  • Blender到UE5数字孪生实战:高精度建模、实时数据对接与性能优化全流程解析
  • 一文看懂 AdsPower 的浏览器指纹技术实现
  • 如何高效使用oee_archive:从目录结构到文件获取的完整指南 [特殊字符]
  • 软件测试入门——第二十八课(Linux系统环境搭建实战)
  • 手把手编写儿童手机远程监控App之webrtc建立通信后无法再分享音视频
  • AI Agent颠覆认知!告别简单问答,解锁“能办事”的数字同事时代!
  • ChatGPT o1的“思考时间”真能提升准确率? vs DeepSeek R1的零样本迁移能力——来自5家头部AIGC公司的AB测试原始数据
  • 当下你的门店靠什么竞争?
  • AIGC Agent技术架构解析:从任务规划到旅行Agent实战
  • 如何在Windows上高效部署Poppler:实用PDF处理工具配置指南
  • AI 电动搅拌机智能功率 高效率、快速响应 完整选型方案
  • 解决leetcode第3985题回文数组求和
  • 选高性价比公墓设计商犯难?专业之选究竟藏在哪?
  • jsx和tsx的区别和关系是啥,后端程序员学前端
  • Boss-Key老板键:Windows隐私保护神器,一键隐藏所有敏感窗口
  • MetaTube插件:Jellyfin和Emby媒体库的终极元数据自动刮削解决方案
  • STM32/L298N 电机控制:3种隔离方案实测对比,反电动势抑制率超95%
  • 小米的设计系统,已经进化到能自己写代码了?
  • Midjourney与DALL-E中文提示工程实战对比(附18组对照测试图+Prompt调优清单):92%的设计师还在用错误语法喂模型
  • 逆向工程侦察利器:Detect It Easy文件指纹识别实战指南
  • 2026年AI培训观察:普通人选课避坑,从认清这三种需求开始
  • 计算机毕业设计之面向小微企业的简历管理系统
  • BiliNote - 强大的AI视频笔记神器(markdown 笔记 思维导图)
  • GitHub 代码仓库镜像同步到阿里云 Codeup 实施指南
  • Blender查看所有材质名称
  • 谷歌地图AI点餐技术解析:Gemini集成与智能路径规划实践
  • Buck电路CCM/DCM模式仿真对比:Multisim分析轻载振铃与假负载设计
  • openeuler/yocto-meta-qt5扩展开发:如何快速添加自定义Qt5模块和功能