当前位置: 首页 > article >正文

SpringAI的使用

1. 项目依赖配置

首先需要在 pom.xml 中添加 SpringAI 相关依赖。以下是关键依赖项:

xml

<!-- SpringAI 核心依赖 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><version>0.8.0</version>
</dependency><!-- SpringAI 智谱 AI 支持 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-zhipuai</artifactId><version>0.8.0</version>
</dependency><!-- SpringAI Redis 向量存储支持 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-vectorstore-redis</artifactId><version>0.8.0</version>
</dependency><!-- 其他必要依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

知识总结:这些依赖提供了 SpringAI 的核心功能、智谱 AI 模型支持、Redis 向量存储以及项目所需的基础组件(如 Web 服务和服务发现)。

2. 应用配置

在 application.yml 中配置 SpringAI 和相关服务:

yaml

server:port: 8081spring:application:name: railway-Ai# SpringAI 配置ai:zhipuai:chat:enabled: trueoptions:model: GLM-4-Air  # 使用的智谱 AI 模型base-url: http://open.bigmodel.cn/api/paasapi-key:   # 智谱 AI API 密钥embedding:enabled: truebase-url: http://open.bigmodel.cn/api/paasapi-key:   # 智谱 AI API 密钥options:model: embedding-2  # 使用的智谱 AI 嵌入模型# Redis 向量存储配置vectorstore:redis:index: my_vector_index  # 向量索引名称prefix: chatbot  # 键前缀initialize-schema: true  # 自动初始化模式# Redis 配置data:redis:host: 121.43.138.23database: 0port: 6379# Nacos 服务发现配置cloud:nacos:discovery:server-addr: 121.43.138.23:8848namespace: publicgroup: DEFAULT_GROUP

知识总结

  • spring.ai.zhipuai 部分配置了智谱 AI 的连接信息和使用的模型
  • spring.ai.vectorstore.redis 配置了 Redis 向量存储的参数
  • Redis 和 Nacos 是项目运行的基础设施,分别用于向量存储和服务注册发现
3. 核心组件配置

配置聊天内存和文本分割器:

java

// ChatClientConfig.java
import org.springframework.ai.chat.ChatMemory;
import org.springframework.ai.chat.inmemory.InMemoryChatMemory;
import org.springframework.ai.text.splitter.TokenTextSplitter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ChatClientConfig {@BeanChatMemory chatMemory() {return new InMemoryChatMemory();}@Beanpublic TokenTextSplitter tokenTextSplitter() {return new TokenTextSplitter();}
}

知识总结

  • ChatMemory 用于存储对话历史,支持对话上下文感知
  • TokenTextSplitter 将文本分割为合适的 token 块,便于向量嵌入处理
4. 数据处理与向量存储

实现 PDF 文件内容提取并存储到向量数据库:

java

// PdfStoreServiceImpl.java
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
import org.springframework.ai.document.PagePdfDocumentReader;
import org.springframework.ai.document.TextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.function.Function;@Service
public class PdfStoreServiceImpl {private final ResourceLoader resourceLoader;private final VectorStore vectorStore;private final Function<List<Document>, List<Document>> tokenTextSplitter;public PdfStoreServiceImpl(ResourceLoader resourceLoader, VectorStore vectorStore,Function<List<Document>, List<Document>> tokenTextSplitter) {this.resourceLoader = resourceLoader;this.vectorStore = vectorStore;this.tokenTextSplitter = tokenTextSplitter;}// 按页分割并存储 PDF 内容public void saveSourceByPage(String url) {Resource resource = resourceLoader.getResource(url);// 配置 PDF 读取器PdfDocumentReaderConfig loadConfig = PdfDocumentReaderConfig.builder().build();PagePdfDocumentReader pagePdfDocumentReader = new PagePdfDocumentReader(resource, loadConfig);// 分割文档并存储到向量库vectorStore.accept(tokenTextSplitter.apply(pagePdfDocumentReader.get()));}// 其他存储方法...
}

知识总结

  • DocumentReader 负责从不同来源读取内容
  • TextSplitter 将文档分割为可管理的块
  • VectorStore 将文本转换为向量并存储,支持相似性检索
5. 聊天服务实现

实现基于向量检索和通用聊天的服务:

java

// ChatServiceImpl.java
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.adapter.zhipuai.ZhiPuAiChatModel;
import org.springframework.ai.chat.memory.MessageChatMemoryAdvisor;
import org.springframework.ai.prompt.Prompt;
import org.springframework.ai.prompt.messages.UserMessage;
import org.springframework.ai.retriever.QuestionAnswerAdvisor;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Service;@Service
public class ChatServiceImpl implements ChatService {private static final String PROFESSIONAL_SYSTEM_PROMPT = "You are a professional railway maintenance advisor. " +"Provide accurate, concise, and actionable advice based on the context.";private final ZhiPuAiChatModel chatModel;private final VectorStore vectorStore;private final ToolConfig toolConfig;private final ChatMemory chatMemory;public ChatServiceImpl(ZhiPuAiChatModel chatModel, VectorStore vectorStore,ToolConfig toolConfig,ChatMemory chatMemory) {this.chatModel = chatModel;this.vectorStore = vectorStore;this.toolConfig = toolConfig;this.chatMemory = chatMemory;}@Overridepublic String chatByVectorStore(String message) {// 创建聊天客户端并设置系统提示ChatResponse response = ChatClient.builder(chatModel).defaultSystem(PROFESSIONAL_SYSTEM_PROMPT).build().prompt().tools(toolConfig)  // 注册工具.advisors(new MessageChatMemoryAdvisor(chatMemory),  // 聊天历史顾问new QuestionAnswerAdvisor(vectorStore)  // 向量检索顾问).user(message)  // 用户消息.call();  // 调用模型生成回复return response.getContent();}@Overridepublic String chatByGeneral(String message) {// 通用聊天,不使用向量检索return ChatClient.create(chatModel).prompt().advisors(new MessageChatMemoryAdvisor(chatMemory)).user(message).tools(toolConfig).call().content();}
}

知识总结

  • ChatClient 是与 AI 模型交互的核心接口
  • MessageChatMemoryAdvisor 提供对话历史功能
  • QuestionAnswerAdvisor 利用向量存储进行相似内容检索
  • ToolConfig 注册可在对话中调用的工具
6. 控制器实现

提供 REST API 接口:

java

// ChatController.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/chat/")
public class ChatController {private final ChatService chatService;public ChatController(ChatService chatService) {this.chatService = chatService;}@GetMapping("think")public String think(@RequestParam("msg") String msg) {return chatService.chatByGeneral(msg);}@GetMapping("advisorThink")public String advisorThink(@RequestParam("msg") String msg) {return chatService.chatByVectorStore(msg);}
}

知识总结

  • /chat/think 提供通用聊天功能
  • /chat/advisorThink 提供基于向量检索的专业问答功能
7. 工具配置

配置可在对话中调用的工具:

java

// ToolConfig.java
import org.springframework.ai.tool.Tool;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;@Service
public class ToolConfig {@Autowiredprivate RailwayFeignClient railwayFeignClient;@Tool(name = "拿到当前时间", description = "拿到用户当前的日期时间")public String getCurrentDateTime() {LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;return now.format(formatter);}@Tool(name = "发送邮件", description = "帮助用户发送邮件")public void sendMail(@ToolParam(description = "需要维修的设备的相关信息name、model、station") List<Map<String, String>> maintInfoList,@ToolParam(description = "距离维修日期的天数") Integer day,@ToolParam(description = "要发送的对象的工号") List<String> emailList) {// 实现邮件发送逻辑}@Tool(name = "获取维修信息", description = "拿到需要维修的设备")public String getExpire() {return railwayFeignClient.expire(TokenConstant.getToken()).toString();}
}

知识总结

  • @Tool 注解将方法标记为可被 AI 模型调用的工具
  • 工具方法可以扩展 AI 系统的功能,如获取实时数据、执行操作等
  • 参数注解 @ToolParam 提供参数描述,帮助模型理解工具使用方式

使用流程总结

  1. 初始化项目:添加必要依赖,配置 SpringAI 和基础设施
  2. 准备数据:将领域知识(如 PDF 文档)处理并存储到向量数据库
  3. 配置聊天服务:设置聊天客户端、历史记忆和检索功能
  4. 注册工具:根据业务需求配置可调用的工具
  5. 提供接口:通过控制器暴露聊天功能
  6. 前端集成:开发前端界面与后端 API 交互(您的项目中未包含,需补充)

相关文章:

SpringAI的使用

1. 项目依赖配置 首先需要在 pom.xml 中添加 SpringAI 相关依赖。以下是关键依赖项&#xff1a; xml <!-- SpringAI 核心依赖 --> <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId><…...

Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优

Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优 一、浏览器渲染引擎级优化 1.1 合成器线程优化策略 • 分层加速:通过will-change属性创建独立的合成层 .accelerated {will-change: transform;backface-visibility: hidden; }• 光栅化策略调整:使用image-r…...

SuperVINS:应对挑战性成像条件的实时视觉-惯性SLAM框架【全流程配置与测试!!!】【2025最新版!!!!】

一、项目背景及意义 SuperVINS是一个改进的视觉-惯性SLAM&#xff08;同时定位与地图构建&#xff09;框架&#xff0c;旨在解决在挑战性成像条件下的定位和地图构建问题。该项目基于经典的VINS-Fusion框架&#xff0c;但通过引入深度学习方法进行了显著改进。 视觉-惯性导航系…...

Node-Red通过开疆智能Profinet转ModbusTCP采集西门子PLC数据配置案例

一、内容简介 本篇内容主要介绍Node-Red通过node-red-contrib-modbus插件与开疆智能ModbusTCP转Profinet设备进行通讯&#xff0c;这里Profinet转ModbusTCP网关作为从站设备&#xff0c;Node-Red作为主站分别从0地址开始读取10个线圈状态和10个保持寄存器&#xff0c;分别用Mo…...

vscode连接WSL卡住

原因&#xff1a;打开防火墙 解决&#xff1a; 使用sudo ufw disable关闭防火墙...

Redis面试题全面解析:从基础到底层实现

Redis作为当今最流行的内存数据库之一&#xff0c;是后端开发岗位面试中的高频考点。本文将系统整理Redis面试中常见的基础、中级和底层实现问题&#xff0c;帮助开发者全面准备Redis相关面试。 一、Redis基础问题 1. Redis是什么&#xff1f;主要特点是什么&#xff1f; Re…...

【性能测试】jvm监控

使用本地jvisualvm远程监控服务器 参考文章&#xff1a;https://blog.csdn.net/yeyuningzi/article/details/140261411 jvisualvm工具默认是监控本地jvm&#xff0c;如果需要监控远程就要修改配置参数 1、先查看是否打开 ps -ef|java 如果打开杀掉进程 2、进入项目服务路径下…...

Uniapp开发鸿蒙应用时如何运行和调试项目

经过前几天的分享&#xff0c;大家应该应该对uniapp开发鸿蒙应用的开发语法有了一定的了解&#xff0c;可以进行一些简单的应用开发&#xff0c;今天分享一下在使用uniapp开发鸿蒙应用时怎么运行到鸿蒙设备&#xff0c;并且在开发中怎么调试程序。 运行 Uniapp项目支持运行到…...

QT+RSVisa控制LXI仪器

1.下载并安装visa R&SVISA - Rohde & Schwarz China 2.安装后的目录说明 安装了64位visa会默认把32位的安装上&#xff1b; 64位库和头文件目录为&#xff1a;C:\Program Files\IVI Foundation 32位库和头文件目录为&#xff1a;C:\Program Files (x86)\IVI Foundation…...

PHP8.0版本导出excel失败

环境&#xff1a;fastadmin框架&#xff0c;不是原版接手的项目。PHP8.0,mysql5.7. code // 创建一个新的 Spreadsheet 对象 $spreadsheet new Spreadsheet(); $worksheet $spreadsheet->getActiveSheet();// 设置表头 $worksheet->setCellValue(A1, ID); $worksheet…...

GO语言学习(五)

GO语言学习&#xff08;五&#xff09; 前面我们已经学了一些关于golang的基础知识&#xff0c;从这一期开始&#xff0c;我们就来讲解一下基于golang为后端的web开发&#xff0c;首先这一期为一些golang为后端的web开发基础讲解&#xff0c;我们将会从web的工作方式、golang如…...

js不同浏览器标签页、窗口或 iframe 之间可以相互通信

一、创建一个广播通道 // 创建一个名为 vue-apps-channel 的广播通道 const channel new BroadcastChannel(vue-apps-channel);二、发送消息 channel.postMessage({type: popup, message: false}); 三、接收消息&#xff08;也需要创建广播通道&#xff09; // 也创建一个…...

springboot3+vue3融合项目实战-大事件文章管理系统-文章分类也表查询(条件分页)

在pojo实体类中增加pagebean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean <T>{private Long total;//总条数private List<T> items;//当前页数据集合 }articlecontroller增加代码 GetMappingpublic Result<PageBean<Article&g…...

Canvas进阶篇:鼠标交互动画

Canvas进阶篇&#xff1a;鼠标交互动画 前言获取鼠标坐标鼠标事件点击事件监听代码示例效果预览 拖动事件监听代码示例效果预览 结语 前言 在上一篇文章Canvas进阶篇&#xff1a;基本动画详解 中&#xff0c;我们讲述了在Canvas中实现动画的基本步骤和动画的绘制方法。本文将进…...

Mac下载bilibili视频

安装 安装 yt-dlp brew install yt-dlp安装FFmpeg 用于合并音视频流、转码等操作 brew install ffmpeg使用 下载单个视频 查看可用格式 yt-dlp -F --cookies-from-browser chrome "https://www.bilibili.com/video/BV15B4y1G7F3?spm_id_from333.788.recommend_more_vid…...

Unity editor文件数UI(支持勾选框)

unity editor文件数&#xff08;支持勾选框&#xff09; 使用的时候new一个box即可 using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;[Serializable] publ…...

【Node.js】Web开发框架

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js Web框架概述1.1 Web框架的作用1.2 Node.js主要Web框架生态1.3 框架选择考虑因素 2. Express.js2.1 Express.js概述2.2 基本用法2.2.1 安装Express2.2.2 创建基本服务器 2.3 路由2.4 中间件2.5 请求…...

使用Vite创建一个动态网页的前端项目

1. 引言 虽然现在的前端更新换代的速度很快&#xff0c;IDE和工具一批批的换&#xff0c;但是我们始终要理解一点基本的程序构建的思维&#xff0c;这些环境和工具都是为了帮助我们更快的发布程序。笔者还记得以前写前端代码的时候&#xff0c;只使用文本编辑器&#xff0c;然…...

系统架构设计师案例分析题——web篇

软考高项系统架构设计师&#xff0c;其中的科二案例分析题为5选3&#xff0c;总分75达到45分即合格。本贴来归纳web设计题目中常见的知识点即细节&#xff1a; 目录 一.核心知识 1.常见英文名词 2.私有云 3.面向对象三模型 4.计网相关——TCP和UDP的差异 5.MQTT和AMQP协…...

MySQL--day5--多表查询

&#xff08;以下内容全部来自上述课程&#xff09; 多表查询 1. 为什么要用多表查询 # 如果不用多表查询 #查询员工名为Abel的人在哪个城市工作? SELECT* FROM employees WHERE last_name Abel;SELECT * FROM departments WHERE department_id 80;SELECT * FROM locati…...

【Redis】AOF日志的三种写回机制

目录 1、背景2、appendfsync always&#xff08;同步写回&#xff09;【1】工作机制【2】特点【3】实现原理 3、appendfsync everysec&#xff08;每秒写回&#xff0c;默认配置&#xff09;【1】工作机制【2】特点【3】实现原理 4、appendfsync no&#xff08;操作系统控制&am…...

leetcode hot100刷题日记——7.最大子数组和

class Solution { public:int maxSubArray(vector<int>& nums) {//方法一&#xff1a;动态规划//dp[i]表示以i下标结尾的数组的最大子数组和//那么在i0时&#xff0c;dp[0]nums[0]//之后要考虑的就是我们要不要把下一个数加进来&#xff0c;如果下一个数加进来会使结…...

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…...

MySQL Workbench 工具导出与导入数据库:实用指南

目录 一、MySQL Workbench 简介二、导出数据库2.1 打开 MySQL Workbench2.2 数据库导出步骤三、导入数据库3.1 打开 MySQL Workbench3.2 数据库导入步骤四、注意事项五、总结MySQL Workbench 是一款强大的数据库管理和开发工具,它提供了直观的图形界面,方便用户进行数据库的设…...

Android 绘制折线图

用了一段时间的 Jetpack Compose ,感觉写 UI 的效率确实会提升不少 。 配合 AI 编程绘制了一个折线图。供大家学习参考! @Composable fun TemperatureChart() {val timeLabels = listOf("7:00", "8:00", "9:00", "10:00", "11:…...

自建srs实时视频服务器支持RTMP推流和拉流

文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列&#xff1a;https://github.com/juancarlospaco/aw…...

ubuntu22.04 卸载ESP-IDF

要在Ubuntu 22.04上完全卸载ESP-IDF&#xff0c;请按照以下步骤操作&#xff1a; 卸载ESP-IDF的步骤 删除ESP-IDF目录&#xff1a; # 假设ESP-IDF安装在~/esp/esp-idf目录 rm -rf ~/esp/esp-idf删除ESP-IDF工具链和下载的工具&#xff1a; rm -rf ~/.espressif从PATH中移除ESP…...

Spring IOCDI————(2)

DI详解 我们之前讲了控制反转IOC&#xff0c;也就是bean的存&#xff0c;那么我们还需要Bean的取&#xff0c;就是DI了&#xff0c;DI翻译过来就是依赖注入&#xff0c;啥意思呢&#xff0c;就是我们通过IOC容器&#xff0c;把所有的对象交给Spring管理&#xff0c;我们指定哪…...

80. Java 枚举类 - 使用枚举实现单例模式

文章目录 80. Java 枚举类 - 使用枚举实现单例模式**1️⃣ 为什么用枚举实现单例&#xff1f;****2️⃣ 枚举实现单例模式****3️⃣ 枚举单例如何防止反射攻击&#xff1f;****4️⃣ 枚举单例如何防止反序列化破坏&#xff1f;****5️⃣ 枚举单例 vs 传统单例****6️⃣ 枚举单例…...

融云 uni-app IMKit 上线,1 天集成,多端畅行

融云 uni-app IMKit 正式上线&#xff0c;支持一套代码同时运行在 iOS、Android、H5、小程序主流四端&#xff0c;集成仅需 1 天&#xff0c;并可确保多平台的一致性体验。 融云 uni-app IMKit 在 Vue 3 的高性能加持下开发实现&#xff0c;使用 Vue 3 Composition API&#x…...