1.什么是spring AI

Spring AI 是 Spring 官方推出的一个基于 Spring 生态的 AI 应用开发框架,旨在简化将人工智能(如大语言模型、生成式 AI)集成到 Java 应用中的过程。它提供了统一的 API 和工具,让开发者能更轻松地调用 AI 模型

2.项目集成Spring ai

本篇文章需使用JDK17 以上的版本 ,spring boot 版本为3.2.5 ,且在通义百炼申请了大模型的api-key请大家务必与我的版本一致

引入spring AI Alibaba的maven坐标

<!--Spring Ai alibaba-->
<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M6.1</version>
</dependency>

application.yml

api-key需要使用自己的我这里是错误的api-key演示

spring:ai:dashscope:api-key: "sk-5sadd21dsanbd1321ndsakda"chat:options:model: qwen-plus

3.项目测试

编写一个类,当spring boot项目启动时自动会执行一次run方法

package com.example.demo.demos;import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;/*** 使用springAi框架调用ai*//*** 实现 CommandLineRunner接口的话在,每次项目启动时就会执行一次他的run方法*/@Component
public class SpringAiInvoke implements CommandLineRunner {@Resourceprivate ChatModel dashscopeChatModel;@Overridepublic void run(String... args) throws Exception {// 调用模型 Prompt是模型输入AssistantMessage message = dashscopeChatModel.call(new Prompt("你是谁")).getResult().getOutput();System.out.println(message.getText()); // 输出结果 文本响应}
}

4.构建初始化大模型类

初始化大模型,主要是初始化ChatClient 接口的实现类,给ChatClient 配置一些默认的配置

例如提示词,对话记忆,及Advisor(顾问,类似于AOP)

为什么有了chatModel还需要chatClient?

CatModel 相较于 ChatClient 更为底层,Catmodel所使用的Api是直接对大模型进行调用,

例如:

  • 处理模型本身的参数(如温度值 temperature、最大 token 数 maxTokens)。

  • 返回原始响应数据(如 ChatResponse 包含消息、元数据)。

ChatClien主要是与业务交互提供了更高级的抽象方法

例如:

  • 提供更高层次的抽象,隐藏复杂性(如 Prompt 对象构建、响应解析)。

  • 集成 Spring 生态特性(如自动重试、监控)。

  • 标准化输入输出(如直接返回 String 而非 ChatResponse

但是本质上ChatClient也是在调用CatModel,只不过提供了更多便捷的方法

总结:

ChatClient 本质上是对 ChatModel 的封装,提供更高层次的便捷方法,而初始化 ChatClient 时通常需要传入 ChatModel。这种设计看似冗余,但背后有明确的架构意图和实际价值。

演示:

当前是初始化了大模型和配置

package com.example.demo.app;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.stereotype.Component;@Component
public class AiApp {ChatClient chatClient;// 构造函数 初始化大模型时会注入对象 (根据使用的名称注入,例如阿里的就注入dashscopeChatClient)public AiApp(ChatModel dashscopeChatModel) {//创建一个基于内存的会话历史记录ChatMemory memory = new InMemoryChatMemory();chatClient= ChatClient.builder(dashscopeChatModel) //传入大模型对象.defaultSystem("你当前的角色是i桂航小助手,解决学生在学校的各种疑问") //设置系统提示词 例如当前aiapp是一个学校客服系统,角色是i桂航小助手.defaultAdvisors(new MessageChatMemoryAdvisor(memory)//设置一个advisor (顾问) 当前设置的是处理对话上下文的advisor//也设置多个advsior 和自定义的advisor).build();}}

5.ChatClien实现对话

给AiApp类中添加新的对话方法

//Chatclien对话public String dochat(String message,String sessionId){ChatResponse chatResponse = chatClient.prompt().user(message)//传入用户输入信息.advisors(advisorSpec -> advisorSpec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId)//对话的会话id 用于查看是否是当前上下文.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 3) //检索上下文的长度 如果长度过长所消耗的Token数量会过大).call().chatResponse();log.info("chatResponse: {}", chatResponse.getResult().getOutput().getText());//输出模型返回的结果return chatResponse.getResult().getOutput().getText();}

测试调用对话


@SpringBootTest
class DemoApplicationTests {@AutowiredAiApp app;@Testvoid contextLoads() {app.dochat("你好,请记住我的朋友叫Java", "1");app.dochat("你是谁? 回复不超过10个字","1");app.dochat("我的朋友叫什么?还有帮忙回忆一下回复不超过几个字?","1");}}

输出的结果为

说明实现了对话,且具有了对话记忆功能

6.结构化输出(将大模型输出转为JAVA对象)

引入maven

<!--springAi结构化输出-->
<dependency><groupId>com.github.victools</groupId><artifactId>jsonschema-generator</artifactId><version>4.38.0</version>
</dependency>

在AiApp类中编写一个用于返回,一个Java对象的聊天 方法

其中创建了一个Tmplate类 与一个 聊天方法

 //JDK14提供的语法 用于创建一个对象public  record Template(String title, List<String> mesages){}public Template dochatTemplate(String message, String sessionId){Template template = chatClient.prompt("现在你需要根据用户的需求给出建议标题为: 给{xxx}的建议,内容列出列表").user(message).advisors(advisorSpec -> advisorSpec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 3)).call().entity(Template.class);//输出成为一个Java对象log.info("结果:{}", template);return template;}

测试 :

    @Testvoid dochatTemplate() {AiApp.Template template = app.dochatTemplate("你好,我叫小明,在学校我有些困惑,请给我3条建议", "1");}

输出结果

大模型给出的返回值变成了Taplate对象 ,建议也变成了List集合

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMake笔记:配置(Configure)、生成(Generate)和构建(Build)

以下为AI生成的内容&#xff1a; 一、配置阶段&#xff08;Configure&#xff09; 本质&#xff1a;解析项目逻辑&#xff0c;构建内存模型 触发命令&#xff1a;cmake -S <源码路径> -B <构建路径> 关键操作与输出&#xff1a;操作类型典型案例输出产物变量定义se…

直接编辑pdf文件教程

工具下载地址&#xff1a;https://pan.quark.cn/s/4befbe5f4a77 一、下载并安装软件二、打开软件&#xff0c;并打开一个pdf文件三、编辑PDF文件&#xff0c;并保存四、关闭软件&#xff0c;打开源文件查看效果。

javaswing json格式化工具

效果展示代码 package com.example.springbootdemo;import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import java.…

真实案例 | 如何用iFlyCode开发Webpack插件?

01案例背景在项目中&#xff0c;我们经常需要存档前端每次打包的版本&#xff0c;方便线上快速切换不同版本使用。经过思考&#xff0c;我们可以在打包时&#xff0c;将本次打包结果另存为zip压缩包&#xff0c;方便后续使用。于是我准备开发一个Webpack插件实现此功能&#xf…

19day-人工智能-机器学习-分类算法-决策树

1. 什么是决策树学过数据结构与算法的小伙伴应该对树不陌生吧&#xff0c;这里的决策树也是大同小异的&#xff0c;只是每次反之都有一个条件来决定流向的。1.1 决策节点通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较…

地球磁层全球MHD模型中模拟Dst指数的半经验方法

A semi-empirical approach to simulating the Dst index in global MHD models of Earth’s magnetosphere pdf 1 Introduction Dst指数 (Disturbance storm time index, 地磁暴时扰动指数) 是描述磁暴活动强度应用最广泛的指数&#xff0c;对于研究地磁扰动和磁暴具有重要意…

什么是脏读、幻读、不可重复读?

脏读、幻读和不可重复读是数据库事务隔离级别中常见的三种数据一致性问题。它们描述了在并发事务环境下可能出现的异常现象。下面通过对比表格和具体示例进行清晰解析&#xff1a;核心概念对比表问题类型触发场景本质原因示例脏读 (Dirty Read)事务A读取了事务B未提交的修改读取…

腾讯位置商业授权微信小程序关键词输入提示

微信小程序JavaScript SDK 开发指南 关键词输入提示 getSuggestion(options:Object) 用于获取输入关键字的补完与提示&#xff0c;帮助用户快速输入 注&#xff1a;坐标系采用gcj02坐标系 options属性说明 属性类型必填说明keywordString是用户输入的关键词&#xff08;希望…

LabVIEW菜单操控

该程序围绕运行时菜单栏操作&#xff0c;实现从初始化构建菜单结构&#xff08;含菜单项、快捷键 &#xff09;&#xff0c;到响应交互删除特定菜单项&#xff0c;再到监控界面事件驱动逻辑&#xff0c;完成自定义菜单交互全流程&#xff0c;适配需灵活菜单控制的程序开发场景。…

Web 服务详解:HTTP 与 HTTPS 配置

Web 服务详解&#xff1a;HTTP 与 HTTPS 配置 一、HTTP 服务概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是用于在网络上传输网页数据的基础协议&#xff0c;默认使用80 端口&#xff0c;以明文形式传输数据。常见的 HTTP 服务软…

YOLO-v2-tiny 20种物体检测模型

一、简介 YOLO-v2-tiny是基于YOLO(You Only Look Once)实时目标检测算法的轻量级版本&#xff0c;专门为嵌入式设备和资源受限环境优化。本模型能够检测20种常见物体类别&#xff0c;在保持较高检测精度的同时大幅减少了计算量和模型大小。 20种物体检测模型&#xff0c; 使用…

heterophilic graph和hetergeneous graph区别(附带homophilic graph 和homoegeneous graph)

Heterophilic Graph&#xff08;异配图&#xff09;连接的节点在属性上不相似,但是所有节点和边的类别都是同一种类型&#xff0c;数据集如squirrel / chameleon&#xff0c;它们是 heterogeneous graph&#xff08;异质图&#xff09;而不是Heterophilic Graph&#xff08;异配…

Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞检测,命令执行,Getshell

工具介绍 Thinkphp(GUI)漏洞利用工具&#xff0c;支持各版本TP漏洞检测&#xff0c;命令执行&#xff0c;Getshell。JAVAFX可视化编写&#xff0c;博主第一次用javafx来写界面&#xff0c;第一次学习尝试&#xff0c;仅仅只用于学习尝试如果缺少什么payload&#xff0c;欢迎提交…

GitHub分支保护介绍(Branch Protection)(git分支保护)(通过设置规则和权限来限制对特定分支的操作的功能)

文章目录**1. 核心功能****a. 防止误操作****b. 强制代码审查****c. 状态检查&#xff08;Status Checks&#xff09;****d. 权限控制****2. 如何设置分支保护&#xff1f;**1. **进入仓库设置**2. **添加分支保护规则**3. **配置保护规则**4. **保存设置****3. 常见应用场景**…

怎么理解On-Premises

On-Premises 指的是—— 软件、系统、数据中心等部署并运行在企业自己管理的本地硬件或机房里&#xff0c;而不是放在云端或第三方托管环境中。 你可以把它理解成&#xff1a;“服务器在你自己家里&#xff08;公司机房&#xff09;&#xff0c;而不是寄放在别人家&#xff08;…

UserController类讲解

用户管理控制器&#xff0c;实现了用户CRUD操作的RESTful API&#xff1a; 1. 类结构与核心注解 1.1 控制器声明 RestController RequestMapping("/api/users") public class UserControllerRestController 深度解析&#xff1a; 组合注解&#xff1a;Controller Re…

【剑指offer】搜索算法

目录 &#x1f4c1; JZ53 数字在升序数组中出现的次数​编辑 &#x1f4c1; JZ4 二维数组中的查找​编辑 &#x1f4c1; JZ11 旋转数组的最小数字 &#x1f4c1; JZ38 字符串的排列​编辑 &#x1f4c1; JZ53 数字在升序数组中出现的次数 这就是一道简单的模板题&#xff0…

ETLCloud批流一体化体现在哪

ETLCloud批流一体化体现在哪 企业对数据处理的实时性、高效性和准确性的要求越来越高。批流一体化作为一种先进的数据处理理念&#xff0c;逐渐被企业所采用。 目前许多国产化ETL工具也装配了十分强大的批流一体化能力&#xff0c;ETLCoud就是一个很好的代表&#xff0c;它能够…

Mybatis学习之缓存(九)

这里写目录标题一、MyBatis的一级缓存1.1、工作原理1.2、一级缓存失效的四种情况1.3、不同的SqlSession对应不同的一级缓存1.4、同一个SqlSession但是查询条件不同1.5、同一个SqlSession两次查询期间执行了任何一次增删改操作1.6、同一个SqlSession两次查询期间手动清空了&…

windows10装Ubuntu22.04系统(双系统)

参考链接&#xff1a;Windows和Linux双系统的保姆级安装教程&#xff0c;新手小白跟着也能装_windows安装linux双系统-CSDN博客 1 前期准备 1.下载Ubuntu22.04.5 的iso镜像文件&#xff1a;Download Ubuntu Desktop | Ubuntu 2.准备一个U盘&#xff08;空&#xff0c;已有文…