具备一定Java基础    掌握springBoot使用   

希望了解springAI和大模型 以及使用它们进行大模型的开发应用

目录

一、SpringAI概述

1.0 认识AI

2.0 发展简史

3.0 SpringAI是什么

二、术语介绍

1.0 模型

2.0 LLM

3.0 提示词

4.0 词元

三、SpringAI快速入门

1.0 环境要求

2.0 准备工作

(1) DeepSeek介绍  

(2) 申请DeepSeek API Keys   充值1元

3.0 项目初始化

(1)创建父工程

(2) 创建子项目

(3)添加Spring AI BOM

4.0 接入deepseek

(1)配置

(3)编写接口

5.0  springAI聊天模型

(1)ChatClient

(2)角色预设

(3)结构化输出

(4)打印日志

(5)流式编程 

(6)ChatModel

6.0 本地部署

(1)简介

(2)下载安装Ollama   

(2)Spring AI接入服务

7.0 SpringAI Alibaba

(1)简介

(2)如何使用

(3)ChatClient

(4)多模态

四、项目

1.0 内容

(1)搭建环境

(2)简单对话功能

(3)对话记忆

(4)对话历史

(5)切换DeepSeek开放API

(6)成果展示


一、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.配置日志级别

logging:
level:
org.springframework.ai.chat.client.advisor: debug

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大多也具备 比如流式响应 返回实体类等

具体参考:概览 | Spring AI Alibaba

流式响应  实体类 //这些文档里面都有相应的代码  复制贴贴使用就好了

(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------>.....

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐