Spring AI Alibaba ChatModel使用

news2025/3/24 23:21:07

一、对话模型(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技术开拓新方向,关键是紧跟趋势,持续学习和实践。

如果你有具体的方向或问题,欢迎进一步讨论!

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于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 …

3DMAX曲线生成器插件CurveGenerator使用方法

1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具&#xff0c;用户可以通过简单的UI界面输入参数&#xff0c;快速生成多条样条线。每条样条线的高度值随机生成&#xff0c;且可以自定义以下参数&#xff1a; 顶点数量&#xff1a;每条…

六十天前端强化训练之第二十六天之Vue Router 动态路由参数大师级详解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 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 的不同&#xff1f;的最后&#xff0c;我们有提到和 Callable 配合的有一个 Future 类&#xff0c;通过 Future 可以了解任务执行情况&#xff0c;或者取消任务的执行&#xff0c;还可获取任务执行的结果&#xff0c;这些功能都是 Runnable…

DeepSeek本地搭建

1. 软件下载安装 Miniconda Miniconda下载地址 选择对应的版本下载&#xff0c;此处下载如下版本 Python 3.10 conda 25.1.1 安装完成后&#xff0c;配置环境变量&#xff0c;打开cmd命令窗口验证 Python Python的版本为 3.10 PyTorch PyTorch下载地址 后面通过命令下…

维普AIGC降重方法有哪些?

在学术写作和论文创作中&#xff0c;重复率过高是许多人面临的一大难题。随着科技的发展&#xff0c;维普 AIGC 为我们提供了一系列有效的降重方法。那么&#xff0c;维普AIGC降重方法有哪些呢&#xff1f;接下来就为大家详细介绍。 语义理解与改写 维普 AIGC 具备强大的语义理…

南京审计大学:《 面向工程审计行业的DeepSeek大模型应用指南》.pdf(免费下载)

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享的是由南京审计大学出品的《面向工程审计行业的DeepSeek大模型应用指南》&#xff0c;这份报告与《面向审计行业DeepSeek大模型操作指南》不同&#xff0c;这份报告更多的讲述DeepSeek怎么与工程审计行业结合&#xff0c;应该…

【前端】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是针对干线上三层网络设备&#xff08;如&#xff1a;路由器、防火墙等&#xff09;的网络虚拟化技术&#xff0c;提供冗余和状态监测等功能。确保在网络中的单点故障发生时&#xff0c;能够快速切换到备份设备&#xff0c;从而保证网络通信的连续性和可靠性。‌ VRRP通过…

封装一个分割线组件

最终样式 Vue2代码 <template><div class"sep-line"><div class"sep-label"><span class"sep-box-text"><slot>{{ title }}</slot> <!-- 默认插槽内容&#xff0c;如果没有传递内容则使用title -->&…

网络HTTPS协议

Https HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是 HTTP 协议的加密版本&#xff0c;它使用 SSL/TLS 协议来加密客户端和服务器之间的通信。具体来说&#xff1a; • 加密通信&#xff1a;在用户请求访问一个 HTTPS 网站时&#xff0c;客户端&#x…

OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)

文章目录 摘要abstract论文摘要方法损失函数实验结论 总结 摘要 本周阅读了一篇关于新型图像风格化的论文《One-Shot Structure-Aware Stylized Image Synthesis》&#xff0c;旨在解决现有GAN模型在风格化过程中难以保持输入图像结构的问题。通过分离图像的结构和语义信息&am…

C++学习之网盘项目单例模式

目录 1.知识点概述 2.单例介绍 3.单例饿汉模式 4.饿汉模式四个版本 5.单例类的使用 6.关于token的作用和存储 7.样式表使用方法 8.qss文件中选择器介绍 9.qss文件样式讲解和测试 10.qss美化登录界面补充 11.QHTTPMULTIPART类的使用 12.文件上传协议 13.文件上传协议…

Apache Flink技术原理深入解析:任务执行流程全景图

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 思维导图 📌 引言 Apache Flink 作为一款高性能的分布式流处理引擎,其内部执行机制精妙而复杂。本文将…

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

嘿&#xff0c;亲爱的算法工程师们&#xff01;今天咱们聊一聊PDF解析的那些事儿&#xff0c;简直就像是在玩一场“信息捉迷藏”游戏&#xff01;PDF文档就像是个调皮的小精灵&#xff0c;表面上看起来规规矩矩&#xff0c;但当你想要从它那里提取信息时&#xff0c;它就开始跟…

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

GpuGeek:破解算力难题,赋能AI创新与普及

文章目录 一、引言二、填补算力资源供需缺口&#xff0c;降低使用门槛三、提升算力资源利用率&#xff0c;推动高效协作四、满足多样化需求&#xff0c;支持AI技术落地五、推动算力市场创新&#xff0c;促进生态良性发展六、助力AI人才培养&#xff0c;推动行业长远发展七、结语…