Spring AI Alibaba ChatModel使用
一、对话模型(Chat Model)简介
1、对话模型(Chat Model)
对话模型(Chat Model)接收一系列消息(Message)作为输入,与模型 LLM 服务进行交互,并接收返回的聊天消息(Chat Message)作为输出。
相比于普通的程序输入,模型的输入与输出消息(Message)支持纯字符文本,还支持包括语音、图片、视频等作为输入输出。
同时,在 Spring AI Alibaba 中,消息中还支持包含不同的角色,帮助底层模型区分来自模型、用户和系统指令等的不同消息。
Spring AI Alibaba 复用了 Spring AI 抽象的 Model API,并与通义系列大模型服务进行适配(如通义千问、通义万相等),目前支持纯文本聊天、文生图、文生语音、语音转文本等。
以下是框架定义的几个核心 API:
- ChatModel,文本聊天交互模型,支持纯文本格式作为输入,并将模型的输出以格式化文本形式返回。
- ImageModel,接收用户文本输入,并将模型生成的图片作为输出返回。
- AudioModel,接收用户文本输入,并将模型合成的语音作为输出返回。
Spring AI Alibaba 支持以上 Model 抽象与通义系列模型的适配,并通过 spring-ai-alibaba-starter AutoConfiguration 自动初始化了默认实例,因此我们可以在应用程序中直接注入 ChatModel、ImageModel 等 bean,当然在需要的时候也可以自定义 Model 实例。
2、Chat Model
ChatModel API 让应用开发者可以非常方便的与 AI 模型进行文本交互,它抽象了应用与模型交互的过程,包括使用 Prompt 作为输入,使用 ChatResponse 作为输出等。
ChatModel 的工作原理是接收 Prompt 或部分对话作为输入,将输入发送给后端大模型,模型根据其训练数据和对自然语言的理解生成对话响应,应用程序可以将响应呈现给用户或用于进一步处理。

二、ChatModel使用
Spring AI Alibaba对话模型(Chat Model):https://java2ai.com/docs/1.0.0-M5.1/tutorials/chat-model/
1、编写 Controller接口
在普通 Controller Bean 中注入 ChatModel 实例,实现下面几个功能:
- 简单调用
- 流式调用
- 自定义 LLMs ChatOptions 参数调用。
- 查看 ChatResponse信息,打印token的信息。

@Slf4j
@RestController
@RequestMapping("/dashscope/chat-model")
public class DashScopeChatModelController {private static final String DEFAULT_PROMPT = "你好,介绍下你自己!";private final ChatModel dashScopeChatModel;/*** 使用如下的方式自动注入 ChatModel** @param chatModel*/public DashScopeChatModelController(ChatModel chatModel) {this.dashScopeChatModel = chatModel;}/*** 最简单调用方式,没有任何 LLMs 参数注入。*/@GetMapping("/simple/chat")public String simpleChat(String userInputPrompt) {if (StringUtils.isBlank(userInputPrompt)) {userInputPrompt = DEFAULT_PROMPT;}String aiOutput = dashScopeChatModel.call(new Prompt(userInputPrompt,DashScopeChatOptions.builder()// 指定使用的模型,默认使用 qwen-plus 模型.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel()).build())).getResult().getOutput().getText();log.info("\n simpleChat --> userInputPrompt ={}, \n aiOutput = {}", userInputPrompt, aiOutput);return aiOutput;}/*** Stream 流式调用。* 可以使大模型的输出信息实现打字机效果。*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response, String userInputPrompt) {if (StringUtils.isBlank(userInputPrompt)) {userInputPrompt = DEFAULT_PROMPT;}// 避免接口返回乱码response.setCharacterEncoding("UTF-8");log.info("\n streamChat --> userInputPrompt ={},", userInputPrompt);Flux<ChatResponse> stream = dashScopeChatModel.stream(new Prompt(userInputPrompt,DashScopeChatOptions.builder()// 指定使用的模型,默认使用 qwen-plus 模型.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel()).build()));Flux<String> flux = stream.map(chatResponse -> chatResponse.getResult().getOutput().getText());return flux;}/*** 使用编程方式自定义 LLMs ChatOptions 参数,* {@link com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions}* 优先级高于在 application.yml 中配置的 LLMs 参数!*/@GetMapping("/customOptions/chat")public String customOptionsChat(String userInputPrompt) {if (StringUtils.isBlank(userInputPrompt)) {userInputPrompt = DEFAULT_PROMPT;}// 自定义 LLMs ChatOptions 参数DashScopeChatOptions customOptions = DashScopeChatOptions.builder()// 指定使用 qwen-turbo 模型.withModel(DashScopeApi.ChatModel.QWEN_TURBO.getModel()).withTopP(0.7).withTopK(50).withTemperature(0.8).build();//return dashScopeChatModel.call(new Prompt(userInputPrompt, customOptions)).getResult().getOutput().getText();/*** AI 模型的响应是一种由ChatResponse类型定义的丰富结构。* 它包含响应生成相关的元数据,同时它还可以包含多个子响应(称为Generation),每个子响应都有自己的元数据。* 元数据包括用于创建响应的令牌(token)数量信息(在英文中,每个令牌大约为一个单词的 3/4),了解令牌信息很重要,因为 AI 模型根据每个请求使用的令牌数量收费。**/ChatResponse chatResponse = dashScopeChatModel.call(new Prompt(userInputPrompt, customOptions));Usage usage = chatResponse.getMetadata().getUsage();Integer totalTokens = usage.getTotalTokens();log.info("\n customOptionsChat --> chatResponse = {}", usage);String aiOutput = chatResponse.getResult().getOutput().getText();log.info("\n customOptionsChat --> userInputPrompt ={}, totalTokens ={} \n aiOutput = {}", userInputPrompt, totalTokens, aiOutput);return aiOutput;}}


自定义 LLMs ChatOptions 参数调用,完整输出内容如下:
在人工智能(AI)时代,技术的发展日新月异,作为Java开发者,需要主动适应和拥抱变化,以保持竞争力。以下是一些关键的建议和方向:---### 1. **理解AI与Java的关系**- **Java与AI的结合**:虽然Java不是专门为AI设计的语言,但它在构建大规模分布式系统、后端服务和企业级应用方面表现出色。因此,许多AI项目可能会使用Java作为后端或基础设施的一部分。- **AI框架与工具**:熟悉一些基于Java的AI框架,例如:- **DL4J (Deeplearning4j)**:一个用于深度学习的Java库。- **Weka**:一个机器学习库,适合数据挖掘任务。- **Apache Mahout**:一个专注于机器学习的分布式计算框架。---### 2. **提升数据科学能力**- AI的核心是数据驱动的决策,因此掌握数据分析、数据处理和机器学习的基础知识至关重要。- 学习相关技能:- 数据清洗与预处理。- 统计学基础。- 常见的机器学习算法(如回归、分类、聚类等)。- 深度学习的基本概念。---### 3. **扩展技术栈**- **云平台**:随着AI项目的复杂性增加,云平台成为不可或缺的一部分。学习如何使用AWS、Azure或Google Cloud等平台来部署和管理AI模型。- **容器化与微服务**:熟悉Docker、Kubernetes等技术,以便更好地支持AI系统的可扩展性和可靠性。- **大数据技术**:AI通常需要处理海量数据,因此熟悉Hadoop、Spark等大数据技术非常重要。---### 4. **关注新兴领域**- **边缘计算**:AI模型正在向设备端迁移(例如IoT设备),学习如何在嵌入式系统中运行Java代码。- **自动化与DevOps**:AI项目需要高效的开发和运维流程,掌握CI/CD工具链(如Jenkins、GitLab CI)以及自动化测试技术。- **区块链与AI结合**:探索区块链技术如何增强AI的信任机制和数据隐私保护。---### 5. **学习新语言与工具**- 虽然Java仍然是主流语言之一,但为了应对AI领域的多样化需求,可以适当学习其他语言和技术:- Python:AI社区中最受欢迎的语言,拥有丰富的库(如TensorFlow、PyTorch)。- Kotlin:与Java无缝兼容,且语法更简洁。- JavaScript:如果涉及前端AI应用(如WebGL、TensorFlow.js)。---### 6. **培养软技能**- **沟通能力**:AI项目通常需要跨部门协作,良好的沟通能力有助于推动项目成功。- **创新思维**:尝试将AI技术与传统Java应用相结合,创造新的业务价值。- **终身学习**:技术更新迅速,保持好奇心和学习热情是长期发展的关键。---### 7. **参与开源社区**- 参与Java或AI相关的开源项目,不仅可以积累经验,还能扩大人脉圈。- GitHub是一个很好的起点,搜索与Java或AI相关的开源项目并贡献代码。---### 总结
AI时代对Java开发者既是挑战也是机遇。通过不断提升技术能力、扩展视野,并保持开放的心态,Java开发者完全可以在AI领域找到自己的定位。无论是继续深耕Java生态,还是结合AI技术开拓新方向,关键是紧跟趋势,持续学习和实践。如果你有具体的方向或问题,欢迎进一步讨论!
– 求知若饥,虚心若愚。
相关文章:
Spring AI Alibaba ChatModel使用
一、对话模型(Chat Model)简介 1、对话模型(Chat Model) 对话模型(Chat Model)接收一系列消息(Message)作为输入,与模型 LLM 服务进行交互,并接收返回的聊天…...
基于FPGA频率、幅度、相位可调的任意函数发生器(DDS)实现
基于FPGA实现频率、幅度、相位可调的DDS 1 摘要 直接数字合成器( DDS ) 是一种通过生成数字形式的时变信号并进行数模转换来产生模拟波形(通常为正弦波)的方法,它通过数字方式直接合成信号,而不是通过模拟信号生成技术。DDS主要被应用于信号生成、通信系统中的本振、函…...
k8s高可用集群安装
一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …...
WPF Reactive 数据绑定
文章目录 Combox 绑定List-通过枚举绑定方法一:方法二:Button 绑定TextBlock绑定NumericUpDown绑定Expander绑定checkbox绑定NumericUpDownCombox 绑定List-通过枚举绑定 方法一: ViewControl using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; usin…...
WSL 环境桥接与雷达通信配置笔记
作者: DWDROME 维护时间: 2025-03-22 参考文章:Windows子系统(WSL)通过桥接网络实现被外部局域网主机直接访问 WSL 环境桥接与雷达通信配置笔记 环境说明 Windows 11 专业版(启用 Hyper-V)WSL2 Ubuntu 20.04物理网线(…...
3DMAX曲线生成器插件CurveGenerator使用方法
1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具,用户可以通过简单的UI界面输入参数,快速生成多条样条线。每条样条线的高度值随机生成,且可以自定义以下参数: 顶点数量:每条…...
六十天前端强化训练之第二十六天之Vue Router 动态路由参数大师级详解
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Vue Router 核心概念 2. 动态路由参数原理 3. 参数传递方案对比 二、核心代码示例 1. 完整路由配置 2. 参数接收组件 3. 导航操作示例 三、实现效果示…...
Model Context Protocol:下一代AI系统集成范式革命
在2023年全球AI工程化报告中,开发者面临的核心痛点排名前三的分别是:模型与业务系统集成复杂度(58%)、上下文管理碎片化(42%)、工具调用标准化缺失(37%)。传统API集成模式在对接大语言模型时暴露明显短板:RESTful接口无法承载动态上下文,GraphQL缺乏工具编排能力,gR…...
Java多线程与高并发专题——Future 是什么?
引入 在上一篇Callable 和 Runnable 的不同?的最后,我们有提到和 Callable 配合的有一个 Future 类,通过 Future 可以了解任务执行情况,或者取消任务的执行,还可获取任务执行的结果,这些功能都是 Runnable…...
DeepSeek本地搭建
1. 软件下载安装 Miniconda Miniconda下载地址 选择对应的版本下载,此处下载如下版本 Python 3.10 conda 25.1.1 安装完成后,配置环境变量,打开cmd命令窗口验证 Python Python的版本为 3.10 PyTorch PyTorch下载地址 后面通过命令下…...
维普AIGC降重方法有哪些?
在学术写作和论文创作中,重复率过高是许多人面临的一大难题。随着科技的发展,维普 AIGC 为我们提供了一系列有效的降重方法。那么,维普AIGC降重方法有哪些呢?接下来就为大家详细介绍。 语义理解与改写 维普 AIGC 具备强大的语义理…...
设计模式之命令模式:原理、实现与应用
引言 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使你可以用不同的请求对客户进行参数化。命令模式支持请求的排队、记录日志、撤销操作等功能。本文将深入探讨命令模式的原理、实现方式以及实际应用…...
2025年十大AI工具对比
2025年十大AI工具对比 以下是2025年各大AI工具的详细对比,涵盖性能、功能、用户评价等方面,并以表格形式呈现。数据来源于多个权威来源,确保信息全面且准确。 对比表格 排名AI工具名称主要功能性能特点用户评价适用场景1DeepSeek多模态AI、…...
100道C#高频经典面试题及答案解析:C#程序员面试题库分类总结
分类一:C#基础语法 1. 值类型与引用类型的核心区别? 答案: 存储位置:值类型存栈/堆内联,引用类型存堆赋值方式:值类型复制内容,引用类型复制地址示例类型:int(值类型&…...
南京审计大学:《 面向工程审计行业的DeepSeek大模型应用指南》.pdf(免费下载)
大家好,我是吾鳴。 今天吾鳴要给大家分享的是由南京审计大学出品的《面向工程审计行业的DeepSeek大模型应用指南》,这份报告与《面向审计行业DeepSeek大模型操作指南》不同,这份报告更多的讲述DeepSeek怎么与工程审计行业结合,应该…...
DeepSeek AI大模型工作机制及未来方向
DeepSeek模型作为一款先进的人工智能模型,其工作原理结合了深度学习的前沿技术与工程优化策略,以下是其核心工作机制的分步解析: 1. 模型架构:基于Transformer的演进 - 核心结构:采用多层Transformer解码器堆叠&am…...
第十七章:Future Directions_《C++ Templates》notes
Future Directions 核心重难点:示例代码: 设计题多选题答案设计题详解 核心重难点: 泛型非类型模板参数 允许任意类型作为非类型模板参数(如template<typename T, auto N>)需解决类型推导和链接问题 编译期控制…...
NVIDIA Dynamo源码编译
Ref https://github.com/PyO3/maturin Rust 程序设计语言 代码库: https://github.com/ai-dynamo/dynamo https://github.com/ai-dynamo/nixl dynamo/container/Dockerfile.vllm 相关whl包 官方提供了4个whl包 ai_dynamo # 这个包ubuntu 22.04也可以用&…...
【前端】Canvas画布实现在线的唇膏换色功能
【前端】Canvas画布实现在线的唇膏换色功能 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【前端】Canvas画布实现在线的唇膏换色功能背景概述以下是我们的实现方法!第一步 — 找…...
arcgispro加载在线地图
World_Imagery (MapServer)https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer添加arcgis server WMTS 服务 by xdcxdc.at xdc的个人站点。博客请转至 http://i.xdc.at/ http://xdc.at/map/wmts 添加WMTS服务器...
华为网路设备学习-16 虚拟路由器冗余协议(VRRP)
VRRP是针对干线上三层网络设备(如:路由器、防火墙等)的网络虚拟化技术,提供冗余和状态监测等功能。确保在网络中的单点故障发生时,能够快速切换到备份设备,从而保证网络通信的连续性和可靠性。 VRRP通过…...
使用请求调用本地部署的stable-diffusion接口
stable-diffusion-webui项目地址 具体部署教程请去B站寻找或者直接使用整合包 这里直接编写工具类 public class StableDiffusionUtil {private static final String BASE_URL "http://127.0.0.1:7860";private static final OkHttpClient CLIENT new OkHttpClien…...
封装一个分割线组件
最终样式 Vue2代码 <template><div class"sep-line"><div class"sep-label"><span class"sep-box-text"><slot>{{ title }}</slot> <!-- 默认插槽内容,如果没有传递内容则使用title -->&…...
网络HTTPS协议
Https HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议的加密版本,它使用 SSL/TLS 协议来加密客户端和服务器之间的通信。具体来说: • 加密通信:在用户请求访问一个 HTTPS 网站时,客户端&#x…...
CMake 函数和宏
CMake 函数 CMake 函数定义语法如下, 其中 name 为函数名, <arg1> 为参数名, <commands> 为函数体. 函数定义后, 可以通过 name 调用函数. 函数名允许字母数字下划线, 不区分大小写. function(name [<arg1> ...])<commands> endfunction()如下的样例…...
OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)
文章目录 摘要abstract论文摘要方法损失函数实验结论 总结 摘要 本周阅读了一篇关于新型图像风格化的论文《One-Shot Structure-Aware Stylized Image Synthesis》,旨在解决现有GAN模型在风格化过程中难以保持输入图像结构的问题。通过分离图像的结构和语义信息&am…...
C++学习之网盘项目单例模式
目录 1.知识点概述 2.单例介绍 3.单例饿汉模式 4.饿汉模式四个版本 5.单例类的使用 6.关于token的作用和存储 7.样式表使用方法 8.qss文件中选择器介绍 9.qss文件样式讲解和测试 10.qss美化登录界面补充 11.QHTTPMULTIPART类的使用 12.文件上传协议 13.文件上传协议…...
Leetcode—15. 三数之和(哈希表—基础算法)
题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…...
Apache Flink技术原理深入解析:任务执行流程全景图
前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 思维导图 📌 引言 Apache Flink 作为一款高性能的分布式流处理引擎,其内部执行机制精妙而复杂。本文将…...
DeepBI:重构流量逻辑,助力亚马逊广告实现高效流量增长
在日益激烈的跨境电商竞争环境中,广告投放早已从“粗放撒网”走向“精细化运营”。尤其是在亚马逊这样一个成熟且竞争白热化的平台,如何在广告预算有限的前提下实现高效曝光、精准触达、稳定转化,成为众多卖家和运营团队面临的核心挑战。 De…...
