SpringAI1.0
springAI1.0~
具备一定Java基础 掌握springBoot使用
希望了解springAI和大模型 以及使用它们进行大模型的开发应用
目录
一、SpringAI概述
1.0 认识AI
通过算法和数据,让机器具备类人的能力
人工智能偏硬件和实体,AI偏软件和程序
2.0 发展简史
萌芽期 黄金时代 复兴期 爆发期(2010s--至今)
3.0 SpringAI是什么
帮助Java或spring开发人员在我们的应用程序中更加方便地集成AI的能力
使用ai给我们提供了模型的统一接口
让我们非算法 非spring玩家也能快速的调用大语言模型提供了一个基础的方式
二、术语介绍
1.0 模型
模型是一个经过特殊训练的超级加工厂 输入-->模型-->输出
模型旨在处理和生成信息的算法,通常模仿人类的认知功能
springAI的作用是让我们在Java spring应用中,能非常方便的
选择不同的模型 构造和发送输入 接收并处理输出(AI的响应)
2.0 LLM
大语言模型 人工智能模型中专门创建文本的一种类型
常见的大语言模型
GPT-5(OpenAI)Deepseek R1(深度求索) Qwen2.5-72B-instruct(阿里巴巴)
Gemini 2.5Pro(Google).
多模态是什么意思?
单一模型 处理单独的内容 嘴巴可以说 但是不可以听 单维度的处理
多模态就像人类一样 可以视听说
支持混合的输入 图片 文字 代码 等等
3.0 提示词
用于引导模型生成特定输出 可以理解为模型的输入

4.0 词元
词元是大语言模型处理文本时最小的语义单位,用于将文本拆解为模型可理解的离散单元
问deepseek:中国有哪些节日
中国有哪些节日会被拆分成很多词元
模型的上下文窗口,实际是词元的数量限制,API收费通常按词元数计费
词元越多,计算耗时和内存占用越高,所以在使用时,尽量避免冗余词
三、SpringAI快速入门
1.0 环境要求

2.0 准备工作
(1) DeepSeek介绍
(2) 申请DeepSeek API Keys 充值1元


充值1块钱 花费根据词元来进行收费的

记得复制好apiKey 丢了就找不到了 只有第一次购买的时候能复制 如果你忘记了 就找不到了
点开接口文档能看内容

3.0 项目初始化
(1)创建父工程
父工程和子项目简单介绍:说白了就是相当于 父工程:妈 管钱管饭管规矩 子项目:你和你兄弟姐妹 各过各的,但都得听妈的
父工程里面写啥?例如公共配置啊 比如用啥Java版本 用啥依赖版本 子项目就是写自己的代码 但是不用重复声明版本号
创建一个空的项目 要注意的是maven 还有就是jdk在17以上这个版本

src删掉就可以了 只留下pom.xml就可以了
完善pom文件 添加依赖,声明父工程的打包方式为pom
下面是完善依赖的代码
还有加入代码<packaging>pom</packaging> 表明父工程代码的打包方式为pom
<!-- 打包方式为pom -->
<packaging>pom</packaging>
<!-- 完善依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
(2) 创建子项目
1创建一个模块 子项目是父工程的一个模块

2声明项目依赖和项目构建插件 下面是代码
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
添加完依赖之后 3添加启动类

包的名字为 com.bit.ai
ai里面写类 SpringAiApplication 然后写启动类的代码
(右上角 刷新一下maven )
加上注解 @spring
下面是启动类的代码
package com.bit.ai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringAiApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiApplication.class,args);
}
}
4写配置文件

名字为 application.yml 定义好项目文件的名称

这样子项目创建好了
创建项目 完善pom文件 启动类 配置文件 (学习springboot的时候 用插件就可以直接完善了)
下来就可以接入deepseek了
//如果使用spring插件 这些都是自动化的 我们这里只是体验一下手动创建
(3)添加Spring AI BOM
使用ai之前 先加入ai的依赖
Getting Started :: Spring AI Reference
引入依赖
想要使用deepseek的 需要接入调用对话的api
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
在哪找?
Getting Started :: Spring AI Reference springAI的官方文档

Bom包含了springAI所需要的一些东西 BOM (bill of materials)物料清单
当你把BOM加入到项目的dependencyManagement部分后,Maven就会知道:所有SpringAI的依赖,如果没有写版本号,就默认使用BOM里指定的版本 简化了 不用写版本号了
4.0 接入deepseek
(1)配置
springAI生态专门为OpenAI及兼容API服务设计了Starter,用于快速集成大语言模型能力到springBoot应用中
springAI生态:Spring官方搞的一套专门用来做AI开发的东西
Starter:SpringBoot里的”一键启动器“ 你在项目里面引入了它,它就会自动帮你配好所有的东西(如依赖 配置 客户端) 不用自己手写一堆配置代码
快速集成大语言模型能力:让你能在SpringBoot应用里,用很简单的代码就能调用大模型 比如让AI回答问题,生成内容等等
这里的Starter就相当于AI插头,插上就能用

添加好依赖 Spring AI with NVIDIA LLM API 在子项目的pom文件中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
配置API密钥:访问Spring官方文档网站 在文档的”SpringAI“部分,找到”APIReference“或”Configuration Properties“相关页面 找到配置项 赋值代码
api-key:就像是一张“门禁卡”
你想要用deepseek等AI服务,得证明你是有权限的人,服务商给你一个唯一字符串,这个就是门禁卡 再springAI里写上api-key:xxxxx 相当于告诉程序 调用AI时,把这张卡亮给服务商看 如果没有这张卡,会返回401错误
spring:
ai:
openai:
api-key: sk-your-key
base-url: https://api.deepseek.com
chat:
options:
model: deepseek-chat
temperature: 0.7
这种代码 可以在spring官方文档里面找 在左侧栏搜索 可以在DeepSeek官方API文档里面看
base-url:指定AI服务的“服务器地址” 也就是告诉程序“该去哪个网站找AI”
chat:表示你要配置的是“对话类”的功能 (聊天 问答等)
options:放的是调用AI时的具体参数,可以理解为“你希望AI怎么回答”的指令
model:deepseek-chat :指定要使用deepseek的哪个具体模型
temperature:控制AI回答的随机性 或 创造性 接近0:回答很保守、稳定、每次问同样的问题
答案几乎一样 接近1或者更高:回答更有创意,更多变 但是偶尔出现一些不稳定的内容
0.7 是一个比较平衡的值,既保持一定的准确性,又有一些灵活性
(3)编写接口
用户的提示词可以作为参数
写一个接口开始调用deepseek
package com.bit.ai.controller;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/ds")
@RestController
public class DeepSeekController {
@Autowired
private OpenAiChatModel openAiChatModel;
@RequestMapping("/chat")
public String chat(String message){//把用户的提示词发送给AI
return openAiChatModel.call(message);
}
}
运行启动类 进行接口的访问:http://127.0.0.1:8080/ds/chat?message=你是谁
或者纹问一些其他的问题
(3)练习:接入ChatGpt
首选创建APIkeys,复制生成的API Key并保存
添加依赖
配置API密钥
编写接口 测试
//可能出现一下的问题 有关代理服务器的问题

配置一下代码进行解决
public static void main(String[] args) {
SpringApplication.run(SpringAiApplication.class, args);
System.setProperty("http.proxyHost", "127.0.0.1"); //修改为你代理服务器的IP
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "7897"); // 修改为你代理软件的端口
System.setProperty("https.proxyPort", "7897"); // 同理
}
接入chatgpt这里还是有点麻烦
openai的apikey国内没办法直接充,只能找代充,不过代充有风险
5.0 springAI聊天模型
介绍 :: 春季AI参考 官方文档
通过标准化的接口设计,使开发人员能够将AI模型的聊天功能集成到应用程序中
springAI聊天模型 = 帮你把话传给AI 再把AI的话带回来的”跑腿小弟“
在Spring AI框架中, ChatModel和ChatClient是构建对话式AI应⽤的两⼤核⼼接⼝.
(1)ChatClient
ChatClient是SpringAI框架中封装复杂交互流程的高阶API接口
旨在简化开发者与大语言模型的集成过程
//简化我们的配置 将与LLM及其其他组件交互的复杂性进行封装 给用户提供开箱即用的服务。提供了与AI模型通信的FluentAPI 它支持同步和反应式编程模型 //fluent api表示流畅接口 可读性强大
---------------------------------- 下面是通俗的解释
本来你自己要写很多代码,但ChatClient把这些脏活累活都包了
你只要加个依赖,写几行配置,就能直接调用chatClient.call("你好"),不用自己搭连接池、不用管 API 密钥怎么传。
流畅接口,代码写起来像连读句子,点一个方法,再点一个方法,读起来很自然

同步:你问一句,坐在那里等待AI回答,回答完才继续干别的事
反应式:你问一句 然后该干嘛嘎嘛 AI回答完了会自动通知你
基于ChatModel封装:ChatModel 是“基础工具”,帮你发消息收消息;ChatClient 是“加强版工具”,里面用了 ChatModel,但给你提供了更舒服的用法 例子:ChatModel 像手动挡汽车,你要自己踩离合、换挡;ChatClient 像自动挡,你只管踩油门和刹车,换挡它自动做。
(2)角色预设
我们同样可以访问deepseek 但是我们可以给它设置不同的角色
百度接入deepseek 问小白接入deepseek 你发送你是谁 它们的回复是不一样的
.defaultSystem( ) 通过这个方法可以设置系统提示词 每次请求都会生效

现在这个设置只针对chatclient生效 我们并不对之前的接口生效
如果我们希望对于所有的接口生效
可以提出来 new一个configuration包 写代码交给spring管理 其他接口用的时候注入就行了
@Autowired private ChatClient chatClient;
(3)结构化输出
如果想要从LLM接收结构化输出,SpringAI支持将ChatModel/ChatClient方法的返回类型从Stirng更改为其他类型
通过entity( ) 方法将模型输出转换为自定义实体类,需确保输出格式符合JSON规范
需求: 我给ai一些菜名 ai给我生成一个菜单(所需材料)
//为什么要返回实体类?
返回的纯文本需要自己手动加工处理 返回实体类,像是你提前定义一个菜单的模子
class类 name属性 price属性
AI就老老实实给你JSON格式的数据 然后SpringAI自动把这坨JSON变成Java对象
你直接调用menuItem.getName( )就能拿到菜名
@RequestMapping("/entity")
public String entity(String userInput){
//还是用chatCLient 接口来调用
Recipe recipe = chatClient.prompt()
.user(String.format("请帮我生成%s的食谱", userInput))
.call()
.entity(Recipe.class);
return recipe.toString();
}


问题:响应时间太长 需要好几秒 用户的体验感会降低
流式输出:
介绍:大模型流式输出(Streaming Output) 是通过逐步生成内容而非一次性返回完整结果的技术
SpringAI使用CHatClient的stream( )方法生成Flux<String>流,适用于需要更轻量级客户端控
简单来说就是一个字一个字往外面崩哈哈哈 ,也得等 但是好看 之前是整篇文章返回给你 也是你得等
如何实现流式输出?

@RequestMapping(Vaule = "/stream" ,produces = "text/html ; charset = utf-8")
这样解决了乱码的问题

(4)打印日志
SpringAI借助Advisors来实现日志打印的功能

请求需要经过一系列流程哈哈
应用场景:敏感词过滤 建立聊天历史 对话上下文管理

可以用.defaultAdvisor( ) 添加这个功能
1.添加Advisior到Advisor链中
.defaultAdvisors(new SimpleLoggerAdvisor())
2.配置日志级别
3测试

(5)流式编程
SSE协议介绍: server sent events (服务器发送事件)
SSE技术可以实现流式传输,允许服务器主动向客户端推送数据流 //实时天气预报
HTTP协议本身设计为无状态的请求-响应模式
SSE是一种基于HTTP的轻量级实时通信协议,浏览器通过内置的eventSourceAPI接收并处理这些实时事件
特点:
单向推送 :仅支持服务器向客户端单向数据推送 客户端通过普通HTTP请求建立连接后,服务器可持续发送数据流,但客户端无法通过同一连接向服务器发送数据
websocke是双向的
自动重连:支持断线重连,连接中断事,浏览器会自动尝试重新连接
自定义消息类型:客户端发起请求后 服务器保持连接开放
数据格式:
客户端向浏览器发送SSE数据 需要设置必要的HTTP头信息
Content-Type: text/event-stream;charset=utf-8
Connection: keep-alive
每一次发送的信息,由若干个message组成,每个message之间由\n\n分隔,每个message内部由若干行组成 每一行都是这个的格式 [field]: value\n

客户端实现:
@RestController
@RequestMapping("/sse")
public class SseController {
@RequestMapping("/data")
public void data(HttpServletResponse response) throws IOException, InterruptedException {
response.setContentType("text/event-stream;charset=utf-8");
PrintWriter writer = response.getWriter();
for (int i = 0; i < 20 ; i++) {
String s = "data:"+new Date() + "\n\n";
writer.write(s);
writer.flush();
Thread.sleep(1000L);
}
}
}
服务端实现:
resources包里面创建一个static包 写一个index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SSE</title>
</head>
<body>
<div id = "sse"></div>
<script>
let eventSource = new EventSource("/sse/data")
eventSource.onmessage = function(event){
document.getElementById("sse").innerHTML=event.data;
}
</script>
</body>
</html>
这个时间会自动走 就像是电子表一样
如何自定义事件呢
如何结束呢
Spring中关于SSE协议的实现
Flux是WebFlux的核心API

快速使用: Flux的流程分为三个步骤
1创建Flux 创建一个Flux数据流,并有数据源
方式1 Flux<String> fruitFlux = Flux.just("Apple"',"Banana"';"CHerry")
方式2 方式3略
2处理数据 使用操作符队数据进行处理
常见的操作符:
3订阅数据 订阅Flux来消费数据 触发数据的流动
当我们进行订阅时 flux数据才会流动
Flux<String>newFlux=fruitFlux.map(String::toUpperCase)//将每个字符串转为大写
.filter(s->s.startsWith("A"));//筛选出以A开头的元素
newFlux.subscribe(System.out::println);
(6)ChatModel
上⾯介绍了ChatClient接⼝的使⽤, 接下来看下ChatModel
ChatClient是基于ChatModel使用的 所以ChatModel 更加的底层
ChatModel 是Spring AI 构建对话应⽤的核⼼接⼝, 它抽象了应⽤与模型交互的过程, 包括使⽤ Prompt 作为输⼊, 使⽤ ChatResponse 作为输出等. ChatModel 的⼯作原理是接收 Prompt 或部 分对话作为输⼊, 将输⼊发送给后端⼤模型, 模型根据其训练数据和对⾃然语⾔的理解⽣成对话响应应 ⽤程序可以将响应呈现给⽤⼾或⽤于进⼀步处理
@RequestMapping("/chatByPrompt")
public String chatByPrompt(String message){
Prompt prompt = new Prompt(message);
ChatResponse response = chatModel.call(prompt);
return response.getResult().getOutput().getText();
}
角色预设:
在 Spring AI 中, ChatModel ⽀持通过 Prompt 预设⻆⾊, 这是引导模型输出特定⻛格或专业内容的 核⼼技术⼿段.
@GetMapping(value = "/role")
public String role(String message) {
SystemMessage systemMsg = new SystemMessage("你是xxx");
UserMessage userMsg = new UserMessage(message);
Prompt prompt = new Prompt(List.of(systemMsg, userMsg));
ChatResponse response = openAiChatModel.call(prompt);
return response.getResult().getOutput().getText();
}
实现流式输出
@GetMapping(value = "/callByStream", produces = "text/html;charset=utf-8")
public Flux<String> callByStream(String message) {
KeyValues openAiChatModel;
Flux<ChatResponse> response = chatModel.stream(new Prompt(message));
return response.map(x -> x.getResult().getOutput().getText());
}
ChatClient 和 ChatModel的区别:


6.0 本地部署
(1)简介
常见的部署方案有云服务部署和本地部署 下面是对比:

常见的云服务平台介绍: //很多的知名云服务平台提供了大模型的私有部署功能
| 云平台 | 公司 | 地址 |
|---|---|---|
| 阿里百炼 | 阿里巴巴 | https://bailian.console.aliyun.com/ |
| 千帆平台 | 百度 | https://cloud.baidu.com/product-s/qianfan_home |
| 腾讯 TI 平台 | 腾讯 | https://cloud.tencent.com/product/ti |
| 华为昇腾云 | 华为 | https://www.huaweicloud.com/product/ecs/ascend.html |
(2)下载安装Ollama
由于大模型的参数很多,使用普通方法部署大模型很不友好,所以诞生了一些本地部署的框架。工具来帮助我们部署大模型。
Ollama就是一个能让你自己再电脑上“养”一个AI工具,不用联网,不用写代码,打几个字就能跟它聊天。 就是相当于手机里面的应用商店 Ollama
下载安装 Ollama
验证:默认端口是 http://127.0.0.1:11434 或者用cmd访问 ollama --version
拉取模型 Ollama可以管理和部署模型
修改模型存储路径 :使得每次下载的模型都在指定的目录下
配置系统环境变量:变量名OLLAMA_MODELS 变量值路径 在D盘创建一个model文件夹放各种模型 
或者通过Ollama界面来设置
拉取模型:Ollama 这个里面是各种模型

参数越大 能力越大 后面的都400多GB哇咔咔
复制一下 打开命令行 就可以对话了

如果有硬件基础的同学可以尝试一下70GB的 或者更大的
成果是这个样子的:

(2)Spring AI接入服务
首先需要确保ollama是运行的 并且模型已经部署了
先创建一个项目
pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build
启动类和controller:
package com.bit.ollama;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringOllamaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringOllamaApplication.class, args);
}
}
--------------------------------------------------------------------
package com.bit.ollama;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ollama")
public class OllamaController {
@Autowired
private OllamaChatModel chatModel;
@RequestMapping("/chat")
public String chat(String message){
return chatModel.call(message);
}
//后续也可以加更多好玩的功能
}
添加依赖:
springAI和Ollama
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
配置文件application.yml 和 日志级别
server:
port: 8081
spring:
application:
name: spring-ollama-demo
ai:
ollama:
base-url: http://localhost:11434
chat:
model: deepseek-r1:1.5b
logging:
pattern:
console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
logging:
level:
org.springframework.chat.client.advisor:debug

7.0 SpringAI Alibaba
(1)简介
随着⽣成式 AI 的快速发展, 基于 AI 开发框架构建 AI 应⽤的诉求迅速增⻓,涌现出了包括LangChain、LlamaIndex 等开发框架, 它们为 Python 开发者提供了⽅便的 API 抽象. 但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者⽽⾔, 并⾮⼗分友好和丝滑. 因此, 我们基于Spring AI 发布并快速演进 Spring AI Alibaba, 通过提供⼀种⽅便的 API 抽象, 帮助 Java 开发者简化AI 应⽤的开发, ⼀步迈⼊ AI 原⽣时代.
概览 | Spring AI Alibaba //SpringAI Alibaba技术文档 里面有教程
阿里巴巴还开源了很多中间件 都是一个系统

(2)如何使用
云平台上面部署了很多模型 直接用就可以了 //上面的笔记里面有各种云平台 有的会收费
例:阿里云百炼平台

注册
申请阿里云百炼平台API-KEY:如何获取API Key-大模型服务平台百炼(Model Studio)-阿里云帮助中心
创建项目:
就放到spring-ai-project模块里了 创建项目参考:快速开始-阿里云Spring AI Alibaba官网官网
添加依赖:
配置简单的依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置spring-ai-alibaba依赖
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M6.1</version>
</dependency
这个时候这个依赖会报错 不用管 直接刷新maven就完事
配置文件:
server:
port: 8082
spring:
application:
name: spring-alibaba-demo
ai:
dashscope:
api-key: sk-XXXXXX
logging:
pattern:
console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
写启动类:
package com.bit.alibaba.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AlibabaApplicationDemo {
public static void main(String[] args) {
SpringApplication.run(AlibabaApplicationDemo.class, args);
}
}
使用chatModel完成一个简单的对话:
package com.bit.alibaba.demo.controller;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ali")
public class AliController {
private final ChatModel chatModel;
public AliController(@Qualifier("dashscopeChatModel") ChatModel chatModel) {
this.chatModel = chatModel;
}
@RequestMapping("/chat")
public String chat(String message){
return chatModel.call(message);
}
}

(3)ChatClient
SpringAIAlibaba 是基于SpringAI进行构建的 所以SpringAIChatClient具备的功能,SpringAIAlibaba大多也具备 比如流式响应 返回实体类等
流式响应 实体类 //这些文档里面都有相应的代码 复制贴贴使用就好了
(4)多模态
多模态指的是 模型同时理解和处理文本,图像,音频及其他数据格式等多源信息的能力
我们的学习方式和体验都是多模态的,不只有视觉,听觉或文本的单一感知。

spring官网对于多模态API的介绍:多模态 API :: Spring AI 中文文档
阿里巴巴平台对于多模态的介绍文档:向量化-大模型服务平台百炼(Model Studio)-阿里云帮助中心
多模态的实现:
我们借助阿里云来完成多模态的案例
引入依赖 、 配置文件
<!-- <dependency>-->
<!-- <groupId>org.springframework.ai</groupId>-->
<!-- <artifactId>spring-ai-core</artifactId>-->
<!-- <version>1.0.0-M6</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.0.0.2</version>
</dependency>
spring:
ai:
dashscope:
api-key: sk-XXX
chat:
options:
model: qwen-vl-max-latest # 模型名称
multi-model: true # 是否启用多模态
因为使用的依赖有冲突 把上面的依赖内容注解掉
接下来就可以利用dashscope来完成多模态的代码演示
我给你发送一张图片 你告诉我图片内容是什么? //仿照springAI文档里面的那个例 子
四、项目
1.0 内容
(1)简介
项目介绍:基于deepseek搭建的智能聊天机器人
核心功能:对话 历史记录 支持用户查看历史对话内容 上下文的连续性
界面设计:模仿kimi的样子
(1)搭建环境
创建项目: //还是放到spring - ai - project这个里面 算它的一个模块

pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件:
spring:
application:
name: spring-chat-bot
ai:
ollama:
base-url: http://127.0.0.1:11434 # 本地Ollama地址
chat:
model: deepseek-r1:1.5b
logging:
level:
org.springframework.ai.chat.client.advisor: debug
pattern:
console: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
前端页面:
这部分代码 我会打包到我的项目里面 应该会放在文章末尾
(2)简单对话功能
定义接口:

代码实现:配置Client
和前面那个例子的代码几乎差不多 就是简单的用前端包裹一下
(3)对话记忆
每次都重新调用请求 它不知道两次调用之间是有关系的
大模型本身是不具备记忆能力的,要想让大模型记住之前的聊天内容,需要把之前的聊天内容与新的提示词一起发送给大模型
以大模型服务平台百炼控制台 阿里百炼平台-通义千问plus进行演示
springAI角色消息类型:在对话系统中,SystemMessage UserMessage AssistantMessage是三种核心角色消息类型 用于构建上下文感知的对话框架
系统消息和用户消息我们都比较了解 系统消息是系统初始化的时候提供的 用户消息是输入的
assistantmessage是助手消息,是由助手(通常是AI模型)生成并返回给用户的响应
你需要把以往的用户消息和助手消息都发送给大模型 大模型才有记忆能力
ChatMemory:大语言模型是无状态的 它们不会保留有关以前交互的信息 springAI提供了对话内存功能,定义了ChatMemory接口 允许开发人员在与LLM的多次交互中存储和检索信息

分别对应: add将单条或者多条对话消息添加到指定会话的记忆库中 list那行:根据会话标识
获取历史信息 clear:清空指定会话的记忆存储
springAI会自动地配置chatmemory 开发人员直接用Autowired注入进来就行
springAI官方网站里面也有文档介绍这部分内容:聊天记忆 (Chat Memory) | Spring AI1.0.0中文文档|Spring官方文档|SpringBoot 教程|Spring中文网
springAiAlibaba里面也有文档介绍这部分的内容:
对话记忆-Alibaba CloudSpring Cloud AlibabaOfficial Website
(4)对话历史
功能列表:历史会话列表 根据会话ID,会话标题,返回历史消息 删除历史会话
定义会话存储记录接口:
1.存储会话记录 2.删除会话记录 3.查询会话列表
获取会话列表:
定义接口

代码实现
(5)切换DeepSeek开放API
添加依赖和配置 配置APIkey
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
-------------------------------------------------------------------
spring:
ai:
openai:
api-key: sk-XXXX # deepseek
base-url: https://api.deepseek.com
chat:
options:
model: deepseek-chat
temperature: 0.7
注意和ollama的区分
@Bean
public ChatClient ollamaChatClient(OllamaChatModel chatModel,ChatMemory chatMemory) {
return ChatClient.builder(chatModel)
.defaultSystem("你叫小特,是比特教育研发的一款智能AI助手,擅长Java和C++,主要工作是解决学生在学习过程中遇到的一些问题")
.defaultAdvisors(new SimpleLoggerAdvisor(),new MessageChatMemoryAdvisor(chatMemory))
.build();
}
@Bean
@Primary //加上这个注解表示默认首选
public ChatClient deepseekChatClient(OpenAiChatModel chatModel, ChatMemory chatMemory){
return ChatClient.builder(chatModel)
.defaultSystem("你叫AIAI, 是比特教育研发的一款智能AI助手, 擅长Java 和C++, 主要工作是解决学生在学习过程中遇到的一些问题")
.defaultAdvisors(new SimpleLoggerAdvisor(), new MessageChatMemoryAdvisor(chatMemory))
.build();
(6)成果展示

springAI1.0------>.....
更多推荐

所有评论(0)