ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

AI - ChatModel和ChatClient

AI - ChatModel和ChatClient 一、ChatModel和ChatClientChatModel底层模型交互层只负责和大模型通信纯原始 API 封装无会话、无工具、无记忆、无便捷构建器。ChatClient上层应用门面封装基于 ChatModel 构建提供流式 / 同步、记忆、工具调用、Prompt 模板、会话管理、链式调用等业务能力开发更简单。Chat ModelChatModel API 让应用开发者可以非常方便的与 AI 模型进行文本交互它抽象了应用与模型交互的过程包括使用Prompt作为输入使用ChatResponse作为输出等。ChatModel 的工作原理是接收 Prompt 或部分对话作为输入将输入发送给后端大模型模型根据其训练数据和对自然语言的理解生成对话响应应用程序可以将响应呈现给用户或用于进一步处理。ChatModel文档地址对话模型(Chat Model)-阿里云Spring AI Alibaba官网官网ChatClientChatClient提供了与 AI 模型通信的 Fluent API它支持同步和反应式Reactive编程模型。与ChatModel、Message、ChatMemory等原子 API 相比使用ChatClient可以将与 LLM 及其他组件交互的复杂性隐藏在背后因为基于 LLM 的应用程序通常要多个组件协同工作例如提示词模板、聊天记忆、LLM Model、输出解析器、RAG 组件嵌入模型和存储并且通常涉及多个交互因此协调它们会让编码变得繁琐。当然使用ChatModel等原子 API 可以为应用程序带来更多的灵活性成本就是您需要编写大量样板代码。ChatClient 类似于应用程序开发中的服务层它为应用程序直接提供AI 服务开发者可以使用 ChatClient Fluent API 快速完成一整套 AI 交互流程的组装。包括一些基础功能如定制和组装模型的输入Prompt格式化解析模型的输出Structured Output调整模型交互参数ChatOptions还支持更多高级功能聊天记忆Chat Memory工具/函数调用Function CallingRAGChatClient 文档地址Chat Client-阿里云Spring AI Alibaba官网官网二、分层关系业务代码 → ChatClient上层门面 ↓ 内部持有 ChatModel底层模型驱动 ↓ 大模型APIOpenAI/通义千问/DeepSeek等ChatClient 依赖 ChatModelChatModel 可以单独脱离 ChatClient 使用。三、详细对比1. 定位与职责ChatModel底层原始接口对应厂商原生对话接口仅处理发送消息列表ListMessage→ 返回ChatResponse只做请求组装、网络调用、响应解析不封装会话、记忆、工具、prompt 优化、流式便捷 API每个大模型对应一个实现OpenAiChatModel、DashScopeChatModel、QwenChatModelChatClient面向开发者的高层工具类包装 ChatModel一站式封装对话全流程同步 / 流式输出统一 API内置聊天记忆Memory工具函数调用Function CallingPrompt 模板、变量替换构建器链式调用ChatClient.create().prompt().user(xxx).call()会话上下文简化管理不绑定具体模型传入任意 ChatModel 即可切换大模型2. 使用代码对比Spring AI① 直接用 ChatModel底层写法繁琐// 1. 初始化底层模型 ChatModel chatModel new DashScopeChatModel(...); // 2. 手动拼接消息 ListMessage messages List.of( new UserMessage(介绍Spring AI) ); // 3. 手动构建请求、调用、提取结果 ChatResponse response chatModel.call(new Prompt(messages)); String content response.getResult().getOutput().getText();缺点每次手动拼消息、流式要自己处理 Stream、记忆 / 工具需要自己实现。② 使用 ChatClient推荐业务写法// 1. 传入ChatModel构建客户端 ChatClient chatClient ChatClient.create(chatModel); // 2. 链式极简调用内置封装 String res chatClient.prompt() .user(介绍Spring AI) .call() .content(); // 流式输出 FluxString stream chatClient.prompt() .user(长篇故事) .stream() .content();自带记忆、工具、模板代码量大幅减少。3. 核心能力差异表能力ChatModelChatClient底层模型通信✅ 核心能力❌ 内部委托 ChatModel链式 Prompt 构建❌ 无✅ 完整 Builder流式输出简化 API❌ 原生底层流需手动处理✅ 统一 stream () 方法聊天记忆Memory❌ 需手动维护消息列表✅ 内置支持自动追加历史Function Calling 工具调用❌ 手动组装工具参数✅ 简单注册工具即可自动调度Prompt 模板变量渲染❌ 无封装✅ .promptTemplate () 直接传参多轮会话简化❌ 手动拼接历史 Message✅ 自动管理上下文业务友好 API❌ 原始底层✅ 面向业务开发四、LangChain4j 同名ChatLanguageModel SpringAIChatModel底层模型客户端AiServices/ChatClientLangChain4j 新版 SpringAIChatClient高层封装提供记忆、工具、代理、接口封装五、开发选型建议底层自定义框架、精细控制请求参数用 ChatModel业务开发、快速搭建对话机器人、RAG、工具 Agent优先 ChatClient二者关系ChatClient 是对 ChatModel 的增强封装不会替代 ChatModel底层通信依然依赖 ChatModel。六、Spring AI Alibaba ChatModel 与 ChatClient 核心区别基于spring-ai-alibaba-starter通义千问 DashScope完整区分底层依赖 Spring AI 原生规范Alibaba 只是实现 DashScope 厂商模型。一层级依赖关系业务代码 ↓ ChatClient上层门面、工具集、业务封装 内部持有 ChatModel ↓ DashScopeChatModelChatModel 实现类底层通信裸接口 ↓ DashScope OpenAPI阿里云通义千问接口ChatClient必须依赖 ChatModel才能工作ChatModel可独立使用不需要 ChatClient。二两者定位本质1. DashScopeChatModel实现 ChatModel 接口底层裸通信层只负责一件事拼装Prompt、调用 DashScope HTTP 接口、解析原始返回体。 无任何上层能力所有上下文、工具、记忆、模板都要自己手写。2. ChatClientSpring AI 通用高层封装Alibaba 复用业务开发工具门面对 ChatModel 做全套增强封装链式构建、记忆、工具调用、Prompt 模板、流式简化、结构化输出、会话管理。 不绑定阿里云切换 DeepSeek、OpenAI 只需替换内部 ChatModel。三代码对比纯 DashScopeChatModel 底层写法1. 配置 BeanBean public DashScopeChatModel dashScopeChatModel(DashScopeProperties properties) { return new DashScopeChatModel(properties); }2. 原始调用繁琐Autowired private DashScopeChatModel chatModel; public String chatByModel() { // 1. 手动组装消息 ListMessage messages List.of( new SystemMessage(你是专业Java助手), new UserMessage(解释Spring AI Alibaba) ); Prompt prompt new Prompt(messages); // 2. 原始调用接口 ChatResponse response chatModel.call(prompt); // 3. 手动提取文本 return response.getResult().getOutput().getText(); }缺点多轮对话必须自己缓存历史消息每次手动拼接messages工具调用手动拼装 ToolDefinition、解析工具返回、二次请求流式输出调用stream()返回 FluxChatResponse自己循环取内容无变量模板字符串拼接 Prompt 极易出错没有统一简化 API每个场景都要重复样板代码。四代码对比ChatClient 高层写法推荐业务用ChatClient 基于上面同一个DashScopeChatModel构建Bean public ChatClient chatClient(DashScopeChatModel dashScopeChatModel) { return ChatClient.builder(dashScopeChatModel) .defaultSystem(你是专业Java开发专家) // 全局系统提示 .build(); }1. 普通对话极简调用Autowired private ChatClient chatClient; public String chatByClient() { return chatClient.prompt() .user(解释Spring AI Alibaba) .call() .content(); }2. 内置高阶能力ChatModel 原生不提供① Prompt 变量模板String res chatClient.prompt() .user(用{lang}解释{tech}) .param(lang, 中文) .param(tech, Spring AI Alibaba ChatClient) .call() .content();② 流式输出一行 APIFluxString stream chatClient.prompt() .user(写一篇长文介绍大模型) .stream() .content();③ 聊天记忆自动维护多轮对话不用手动存消息// 绑定内存记忆自动追加历史上下文 ChatClient memoryClient ChatClient.builder(dashScopeChatModel) .defaultSystem(你是聊天助手) .build() .mutate() .chatMemory(InMemoryChatMemory.create()) .build(); memoryClient.prompt().user(我的名字是张三).call(); // 无需手动拼接历史模型自动记住名字 memoryClient.prompt().user(我叫什么).call();④ 工具函数调用一行注册自动调度// 注册自定义工具 String res chatClient.prompt() .tools(new WeatherTool()) .user(北京今天天气) .call() .content();五Spring AI Alibaba 场景下能力对比表能力点DashScopeChatModel(ChatModel)ChatClient阿里云通义千问接口通信✅ 核心底层能力❌ 委托内部 ChatModel 执行链式 Builder 构建 prompt❌ 无手动 ListMessage✅ .prompt().user().param()Prompt 变量模板渲染❌ 自己字符串拼接✅ 内置 param 模板极简流式 content ()❌ 原始 FluxChatResponse✅ .stream().content()内置 ChatMemory 多轮记忆❌ 需手动维护消息列表✅ 一行绑定记忆简化 Function Calling 工具❌ 手动组装工具定义、二次请求✅ 直接注册 tools () 自动处理全局默认 System 提示词❌ 每次调用手动加 SystemMessage✅ Bean 构建时统一配置结构化输出POJO 解析❌ 手动 JSON 转对象✅ .entity(ClassT) 自动映射厂商无关切换模型绑定 DashScope 实现替换内部 ChatModel 即可无缝切换六使用场景选型选用 DashScopeChatModelChatModel需要精细控制 DashScope 原生请求参数top_p、temperature、seed、输入图片、多模态参数自研上层对话框架自己封装记忆 / 工具只做单次简单调用不需要多轮、工具、模板。选用 ChatClient业务首选对话机器人、RAG、Agent、多轮聊天需要工具调用、会话记忆、Prompt 模板希望代码简洁减少重复样板代码未来可能切换其他大模型DeepSeek、OpenAI 等。
返回列表