二、Spring AI Alibaba · ChatModel
整理时间2026-10-09适用版本Spring AI 1.1.0 / Spring AI Alibaba 1.1.2.xspring-ai-alibaba-starter-dashscope一、整体定位ChatModel API 的作用把发一段自然语言给模型、拿回一段补全文本这件事标准化。它建立在Generic Model API之上提供 Chat 特有的抽象通过Prompt输入封装与ChatResponse输出封装统一与各类 AI 模型的通信屏蔽请求拼装与响应解析的复杂度换模型只需换 Starter 改配置业务代码基本不动。一句话记忆「ChatModel 吃 Prompt吐 ChatResponse」。二、Generic Model API地基publicinterfaceModelTReqextendsModelRequest?,TResextendsModelResponse?{TRescall(TReqrequest);}publicinterfaceStreamingModelTReqextendsModelRequest?,TResChunkextendsModelResponse?{FluxTResChunkstream(TReqrequest);}四个配套抽象接口职责关键方法ModelRequestT封装请求T getInstructions()输入、ModelOptions getOptions()参数ModelOptions可定制选项标记接口无方法ModelResponseT extends ModelResult?封装响应getResult()、getResults()、getMetadata()ModelResultT单个结果T getOutput()、getMetadata()泛型是这套 API 的灵魂ModelPrompt, ChatResponse就是 ChatModel 的精确描述。三、Chat Model API3.1 两个核心接口publicinterfaceChatModelextendsModelPrompt,ChatResponse,StreamingChatModel{defaultStringcall(Stringmessage){...}// 便捷版OverrideChatResponsecall(Promptprompt);// 正式版}publicinterfaceStreamingChatModelextendsStreamingModelPrompt,ChatResponse{defaultFluxStringstream(Stringmessage){...}OverrideFluxChatResponsestream(Promptprompt);}call(String)/stream(String)快速尝鲜用返回纯文本拿不到元数据和 token 用量。call(Prompt)/stream(Prompt)**生产使用」可携带 System/多轮消息 运行时选项。3.2 PromptpublicclassPromptimplementsModelRequestListMessage{privatefinalListMessagemessages;privateChatOptionsmodelOptions;// getInstructions() → messagesgetOptions() → modelOptions}Prompt 消息列表 可选 ChatOptions。多轮对话就是把历史一条条塞进messages。3.3 Message 体系publicinterfaceContent{StringgetText();MapString,ObjectgetMetadata();}publicinterfaceMessageextendsContent{MessageTypegetMessageType();}publicinterfaceMediaContentextendsContent{CollectionMediagetMedia();}// 多模态实现类角色场景SystemMessagesystem人设、规则、输出格式约束UserMessageuser用户输入对无角色概念的模型作为标准类别兜底AssistantMessageassistant模型回复也是流式输出的载体FunctionMessagefunction函数调用结果旧式ToolResponseMessagetool工具执行结果Agent 场景MessageType不是数据格式而是这条消息在对话中扮演的角色。3.4 ChatOptions可移植选项publicinterfaceChatOptionsextendsModelOptions{StringgetModel();FloatgetFrequencyPenalty();// -2.0~2.0降低重复 tokenIntegergetMaxTokens();// 最大生成 tokenFloatgetPresencePenalty();// -2.0~2.0鼓励谈新主题ListStringgetStopSequences();// 停止序列FloatgetTemperature();// 0.0~2.0采样温度IntegergetTopK();// Top-K 采样FloatgetTopP();// Top-P 核采样ChatOptionscopy();}各厂商实现可追加私有选项如 OpenAI 的logitBias、seed、user这就是统一接口 厂商扩展的设计。3.5 选项合并流程重要① 启动配置 ChatModel 初始化时设置 defaultOptions全局默认 ↓ ② 运行时配置 Prompt 里携带的 ChatOptions本次请求 ↓ ③ 合并 merge运行时选项 优先 于 启动选项 ↓ ④ 转换输入 转成厂商原生的请求格式如 DashScope 的 payload ↓ ⑤ 转换输出 厂商响应 → 标准化 ChatResponse意义全局一套默认参数个别请求可临时微调defaultOptionsPrompt(messages, runtimeOptions)。本项目正是这样全局application.yml配enable-thinking每次调用在Prompt里单独传temperature(0.7)。3.6 ChatResponse / GenerationpublicclassChatResponseimplementsModelResponseGeneration{privatefinalChatResponseMetadatachatResponseMetadata;// token 用量、速率限制等privatefinalListGenerationgenerations;// n 个候选结果}publicclassGenerationimplementsModelResultAssistantMessage{privatefinalAssistantMessageassistantMessage;privateChatGenerationMetadatachatGenerationMetadata;// 结束原因等}取值链路必须记牢StringtextchatResponse.getResult()// Generation第一个候选.getOutput()// AssistantMessage.getText();// 文本getResults()拿全部候选对应 n1getResult()是getResults().get(0)的快捷方式。四、支持的模型提供商全部走统一的ChatModel/StreamingChatModel接口提供商流式多模态函数调用OpenAI Chat Completion✓✓✓Azure OpenAI✓—✓Alibaba DashScope✓—✓Ollama✓✓✓Hugging Face✗——Google Vertex AI Gemini✓✓✓Amazon Bedrock———Mistral AI✓—✓Anthropic✓—✓五、DashScopeChatModel通义千问5.1 前置条件exportAI_DASHSCOPE_API_KEYyour_api_key# 阿里云百炼申请dependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-dashscope/artifactIdversion1.1.2.1/version/dependency5.2 创建与调用DashScopeApidashScopeApiDashScopeApi.builder().apiKey(System.getenv(AI_DASHSCOPE_API_KEY)).build();ChatModelchatModelDashScopeChatModel.builder().dashScopeApi(dashScopeApi).build();// 简化调用Stringr1chatModel.call(介绍一下Spring框架);// 正式调用PromptpromptnewPrompt(newUserMessage(解释什么是微服务架构));ChatResponseresponsechatModel.call(prompt);Stringanswerresponse.getResult().getOutput().getText();在 Spring Boot 中不需要手写 builder引入 starter 后自动装配DashScopeChatModel直接Autowired/构造器注入即可本项目就是构造器注入方式。5.3 启动选项 vs 运行时选项// 启动选项全局默认DashScopeChatOptionsoptionsDashScopeChatOptions.builder().withModel(qwen-plus).withTemperature(0.7).withMaxToken(2000).withTopP(0.9).build();ChatModelchatModelDashScopeChatModel.builder().dashScopeApi(dashScopeApi).defaultOptions(options).build();// 运行时选项覆盖默认值DashScopeChatOptionsruntimeOptionsDashScopeChatOptions.builder().withTemperature(0.3)// 更确定、更适合评分/抽取.withMaxToken(500).build();PromptpromptnewPrompt(newUserMessage(用一句话总结Java的特点),runtimeOptions);ChatResponseresponsechatModel.call(prompt);5.4 流式响应FluxChatResponseresponseStreamchatModel.stream(newPrompt(详细解释Spring Boot的自动配置原理));responseStream.subscribe(chatResponse-System.out.print(chatResponse.getResult().getOutput().getText()),error-System.err.println(错误: error.getMessage()),()-System.out.println(\n流式响应完成));5.5 多轮对话ListMessagemessagesList.of(newSystemMessage(你是一个Java专家),newUserMessage(什么是Spring Boot?),newAssistantMessage(Spring Boot是...),// 历史回复要显式回填newUserMessage(它有什么优势?));ChatResponseresponsechatModel.call(newPrompt(messages));ChatModel 是无状态的上下文靠你自己维护消息列表需要自动记忆请用ChatMemory或 ReactAgent 的Saver。5.6 函数调用Function CallingToolCallbackweatherFunctionFunctionToolCallback.builder(getWeather,(Stringcity)-晴朗25°C).description(获取指定城市的天气)// 描述决定模型何时调用必须写准.inputType(String.class).build();DashScopeChatOptionsoptionsDashScopeChatOptions.builder().withToolCallbacks(List.of(weatherFunction)).build();ChatResponseresponsechatModel.call(newPrompt(北京的天气怎么样?,options));5.7 支持的模型模型特点qwen-turbo速度快、成本低适合高频短任务qwen-plus增强版综合性价比高qwen-max旗舰版复杂推理最强qwen-max-longcontext长文本场景选型建议出题/创作类用 plus简历评分、答案评估这类需要稳定判定 长 JSON 输出的场景建议qwen-max 低温度0.2~0.3。5.8 与 ReactAgent 集成ReactAgentagentReactAgent.builder().name(my_agent).model(chatModel)// 复用同一个 ChatModel 实例.systemPrompt(你是一个有帮助的AI助手).build();AssistantMessageresponseagent.call(帮我分析这个问题);六、对照本项目xs-interview-agentMockInterviewService是这套 API 的标准用法范本ListMessagemessagesnewArrayList();messages.add(newSystemMessage(resumeAnalysisSystemPromptResource));// system 角色messages.add(newUserMessage(promptTemplate.render(...)));// user 角色PromptpromptnewPrompt(messages,// 运行时选项DashScopeChatOptions.builder().temperature(0.7).build());StringresponsechatModel.call(prompt).getResult().getOutput().getText();// 标准取值链路对照笔记可做的三处优化温度分场景出题保持 0.7评分与评估改 0.2new Prompt(messages, lowTempOptions)稳定性明显提升。别丢ChatResponse当前链式取值直接丢弃了中间对象等于丢弃ChatResponseMetadatatoken 消耗、finishReason。建议先接住再做日志/成本统计ChatResponsecrchatModel.call(prompt);log.info(tokens{},cr.getMetadata().getUsage());Stringtextcr.getResult().getOutput().getText();长任务改流式chatModel.stream(prompt) SSE 推送到interview.html解决评估阶段长时间白屏或用outputType/BeanOutputConverter让框架帮你做结构化输出替掉手写的JsonNode解析与 JSON 去围栏逻辑。七、速查卡// 1. 注入Spring Boot 自动装配推荐privatefinalChatModelchatModel;// 构造器注入// 2. 极简StringtextchatModel.call(你好);// 3. 系统提示 用户消息 运行时参数ListMessagemsgsList.of(newSystemMessage(...),newUserMessage(...));PromptpromptnewPrompt(msgs,DashScopeChatOptions.builder().withModel(qwen-plus).withTemperature(0.2).withMaxToken(4096).build());// 4. 取值StringoutchatModel.call(prompt).getResult().getOutput().getText();FluxChatResponsefluxchatModel.stream(prompt);取值链路ChatResponse → getResult() → Generation → getOutput() → AssistantMessage → getText()合并优先级运行时Prompt的 ChatOptions覆盖启动时defaultOptions。

相关新闻

基于SSM框架的体育器材管理系统设计与实现:从数据库到权限控制全解析

基于SSM框架的体育器材管理系统设计与实现:从数据库到权限控制全解析

1. 项目概述与需求拆解“体育器材管理系统”这个题目,在Java相关的毕业设计和课程设计选题里,算是一个经久不衰的经典款。我前前后后帮人看过不少套这个题目的代码,也回答过很多“SSM怎么整合”“借还流程怎么写”这类问题。选它的人理由其实…

2026/10/11 7:48:00 阅读更多 →
现在mathtype 7官网安装太坑人了,先下载安装一个3.71Mb的软件mathtype.exe,出现一个mathtype 安装助手,点击助手,弹出广告窗下载一个43MB的MathType-win-

现在mathtype 7官网安装太坑人了,先下载安装一个3.71Mb的软件mathtype.exe,出现一个mathtype 安装助手,点击助手,弹出广告窗下载一个43MB的MathType-win-

现在mathtype 7官网安装太坑人了,先下载安装一个3.71Mb的软件mathtype.exe,出现一个mathtype 安装助手,点击助手,弹出广告窗下载一个43MB的MathType-win-zh-7.12.2.466,-官方试用版-免费30天,为什么搞两次&…

2026/10/11 7:48:00 阅读更多 →
本科课程论文|高效完成期末作业

本科课程论文|高效完成期末作业

期末阶段好几门课的课程论文扎堆截止,压力一下子就上来了。一边要备考专业课,一边还要赶多篇课程小论文,时间和精力完全不够用。 想静下心精读文献、梳理写作思路,可实在抽不出太多时间,草草写出来的内容单薄、逻辑松散…

2026/10/11 7:48:00 阅读更多 →

最新新闻

计算机组成原理第1章 计算机系统概述

计算机组成原理第1章 计算机系统概述

计算机组成原理第1章 计算机系统概述素材整理自:戴志涛,白中英.《计算机组成原理(第七版)》,科学出版社,“十二五”普通高等教育本科国家级规划教材。本文为本科课程作业,仅对教材内容进行梳理总…

2026/10/11 8:36:34 阅读更多 →
提示词定生死:给阿里代码评审 agent 定制评审规则与结构化输出

提示词定生死:给阿里代码评审 agent 定制评审规则与结构化输出

提示词定生死:给阿里代码评审 agent 定制评审规则与结构化输出 【免费下载链接】open-code-review Secure, fast, efficient, battle-tested at Alibabas scale. Hybrid architecture code review tool: deterministic pipelines LLM Agent, precise line-level co…

2026/10/11 8:36:34 阅读更多 →
视频剪辑怎么自学:从工具选择到完整成片的90天入门指南

视频剪辑怎么自学:从工具选择到完整成片的90天入门指南

视频剪辑怎么自学?这是我这几年被身边朋友问得最多的一个问题,没有之一。很多人收藏了一堆教程、下载了五六个剪辑软件,最后却连一条一分钟的片子都没剪出来。问题不在努力程度,而在学习方法:把“自学”等同于“看教程…

2026/10/11 8:36:34 阅读更多 →
diagram-design:从示意图到可执行设计系统的演进路径

diagram-design:从示意图到可执行设计系统的演进路径

1. 为什么“diagram-design”不是一张图,而是一套系统性思维工具“diagram-design”这个词组乍看像某个UI组件库的命名,或是某款绘图软件的内部代号——但实际在一线技术协作场景中,它早已脱离了“画流程图”的初级认知,演变为一种…

2026/10/11 8:36:34 阅读更多 →
Windows、Linux、macOS全平台玩转EAC-Desktop:下载、便携版与安装方式完全指南

Windows、Linux、macOS全平台玩转EAC-Desktop:下载、便携版与安装方式完全指南

Windows、Linux、macOS全平台玩转EAC-Desktop:下载、便携版与安装方式完全指南 【免费下载链接】EAC-Desktop Embracing All Creation (Desktop) — Dedicated to the Harmonious Coexistence of Hundreds of DSH Plugins / 揽尽万象(桌面版)…

2026/10/11 8:36:34 阅读更多 →
MyBatisPlus分页失效与500条限制:从原理到实战的完整排查指南

MyBatisPlus分页失效与500条限制:从原理到实战的完整排查指南

1. 项目概述:MyBatisPlus,一把梭还是深水区?如果你做Java后端开发,近两年几乎绕不开MyBatisPlus这个名字。它不是一个全新的ORM框架,而是站在MyBatis的肩膀上,把日常CRUD、分页、条件构造、逻辑删除这些高频…

2026/10/11 8:35:34 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →