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

SpringBoot+Spring AI 构建企业知识库

前言

在之前的文章中我们使用 SpringBoot 配合 DeepSeek 构建了一个拥有聊天记忆的问答机器人,如果没有看过的可以翻下我之前的帖子。这次构建企业知识库将基于之前的内容来添砖加瓦。

构建知识库

在开始之前,我们需要了解 2 个概念:向量数据库检索增强生成(RAG)

  • **向量数据库:**顾名思义,存储向量的数据库。什么是向量?可以简单理解为,文本、图片、视频等数据在空间中的坐标,语义相似的词在向量空间中距离更近,AI 根据距离来判断相似度。
  • **检索增强生成(RAG):**当需要将用户查询发送到 AI 模型时,首先检索一组相似的文档。这些文档随后作为用户问题的上下文,与用户查询一起发送给 AI 模型。这种技术被称为检索增强生成(RAG)。

添加依赖

之前我们是直接使用的 DeepSeek 的依赖包,但是由于在硅基流动中没找到 DeepSeek 的嵌入模型,这里使用的千问的嵌入模型, Open AI 都能兼容。

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-advisors-vector-store</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-rag</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.1.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

配置嵌入模型

为什么要配置嵌入模型?

前面提到 AI 通过向量可以判断相似度,而嵌入模型就是用于生成向量。嵌入模型可以到硅基流动搜索 Embedding 关键字,这里就直接使用的千问模型。

spring: ai: openai: api-key: xxxx base-url: https://api.siliconflow.cn embedding: options: model: Qwen/Qwen3-Embedding-0.6B chat: options: model: deepseek-ai/DeepSeek-R1-0528-Qwen3-8B temperature: 0.7

聊天客户端配置

之前是直接在控制器中使用构造器的方式进行注入:

@RestController @RequestMapping("/chat") public class ChatBotController { private final ChatClient chatClient; public ChatBotController(ChatClient.Builder chatClientBuilder) { this.chatClient = chatClientBuilder.build(); } }

现在我们直接抽取成配置。

@Configuration public class ChatConfig { @Bean public ChatClient chatClient(ChatModel chatModel, EmbeddingModel embeddingModel, ChatMemory chatMemory) { return ChatClient.builder(chatModel) .defaultSystem("你是一个客服人员,针对用户的问题总是能以友好愉悦的方式去进行交流,希望带给客户很好的体验。") .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .defaultAdvisors(VectorStoreChatMemoryAdvisor.builder(SimpleVectorStore.builder(embeddingModel).build()).build()) .build(); } @Bean public VectorStore vectorStore(EmbeddingModel embeddingModel) { return SimpleVectorStore.builder(embeddingModel).build(); } }

我们可以看到ChatClient​ 的 bean 配置了defaultSystem​和defaultAdvisors​,defaultSystem​用来生成默认的提示词,这里我给了个提示让它作为一名客服人员去回答问题。defaultAdvisors​则是添加顾问,可以理解为一种拦截器,在请求 AI 前的一些操作,这里告诉 AI 使用内存作为记忆,并且使用内存作为向量数据库。

当然,实际企业不会直接使用内存作为记忆和向量数据库,我们可以直接基于自身的项目的架构选择合适的向量数据库和记忆会话历史。比如使用 mysql 存储会话历史,使用 redis-stack 做为向量数据库都是不错的选择。

到目前为止已经解决了之前思考问题:”我们怎么给 AI 预置一个角色?比如让它作为一个智能客服或者作为一个营养师。“

添加知识库

这里为了方便,直接使用了PostConstruct​模拟了知识库初始化,真实数据可以从数据库中获取,使用CommandLineRunner​接口加载数据。

@Autowired private VectorStore vectorStore; @PostConstruct public void loadStore() { List<Document> documents = List.of( new Document("lanjii是开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建, 集成了 JWT 认证、Spring Security 6、MyBatis-Plus\u200B 和 WebSocket\u200B 等核心技术。前端使用了 Vue3 +Vite + Element Plus + Pinia 构建。它是一个简洁、高效、无过多依赖的项目,支持按钮级别的权限控制,使用简单,开箱即用。") ); vectorStore.add(documents); }

挂载知识库

在聊天客户端中直接添加QuestionAnswerAdvisor​就可以让我们在问 AI 时先从知识库中获取数据,然后经过 AI 整合后回答我们。

@RestController @RequestMapping("/chat") public class ChatBotController_demo { @Autowired private ChatClient chatClient; @Autowired private VectorStore vectorStore; @PostConstruct public void loadStore() { List<Document> documents = List.of( new Document("lanjii是开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建, 集成了 JWT 认证、Spring Security 6、MyBatis-Plus\u200B 和 WebSocket\u200B 等核心技术。前端使用了 Vue3 +Vite + Element Plus + Pinia 构建。它是一个简洁、高效、无过多依赖的项目,支持按钮级别的权限控制,使用简单,开箱即用。") ); vectorStore.add(documents); } @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> chatStream(String message, String conversationId) { return chatClient.prompt() .advisors( a -> a.param(ChatMemory.CONVERSATION_ID, conversationId) ) .advisors(QuestionAnswerAdvisor.builder(vectorStore).build()) .user(message) .stream() .content(); } }

不知大家有没有注意到这里使用到了ChatMemory.CONVERSATION_ID​,这是将聊天数据的上下文进行关联。上篇文章留下的思考中:如果用户 A 和用户 B 同时对 AI 进行对话,怎么让对话进行隔离?这里直接让不同的会话使用不同的 conversationId 即可。

至此,一个简单的知识库就构建好了,看下效果吧:​

更可以达到这样的效果:​

这样一个即有记忆功能,又能对话隔离,并且能直接关联知识库的问答系统就构建好了。

思考

又到了思考环节,按理说 AI 的场景运用到这里已经结束了,但是!!!

  • 如果通过对话直接让 AI 跟我们完成业务操作,比如跟我下单,或者说取消机票?

完整代码

后续我会整理后将代码放在 Gitee:lanjii: 开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建, 集成了 JWT 认证、Spring Security 6、MyBatis-Plus

这是一款 MIT 协议可商用的 SpringBoot 脚手架,拥有完整的权限控制和常用的基础功能。希望大家给个 Star,后面有新的功能和一些 BUG 的修复也会提交到 Gitee。

http://www.jsqmd.com/news/123605/

相关文章:

  • JetBrains2023系列软件安装激活通用教程
  • 006_prompt
  • 实用指南:Java集合大调研
  • 【独家深度】解密Open-AutoGLM在国家级碳交易平台中的监控应用
  • 2025年豆包优化排名优质公司推荐:聚焦Geo与AI SEO核心能力 - 品牌推荐排行榜
  • 别再手动清洗星载数据了!Open-AutoGLM一键自动化方案已上线
  • Open-AutoGLM模型调优技巧(性能提升80%的3个关键步骤)
  • 2025年靠谱PP药品柜品牌排行榜,新测评精选实验室存储设备公司推荐 - myqiye
  • 2025年年终国内抛丸机厂家推荐排行榜:五家优质企业综合对比分析 - 十大品牌推荐
  • 【AI】RAG智能问答的三层优化策略
  • Exendin-4;HGEGTFTSDLSKQMEEEAVRLFIEWLKNGGPSSGAPPPS-NH2
  • 2025年齿轮类铸件工厂权威推荐榜单:林业机械类铸件/低合金钢铸件/水泵类铸件源头厂家精选 - 品牌推荐官
  • 收藏!2025年AI行业风口:应用层人才成企业争抢核心,程序员/小白入门指南
  • [故障排查] 应用程序无法正常启动0xc000007b 的技术原理与终极解决方案 - PC修复电脑医生
  • 2025年小泡气泡膜批发厂家权威推荐榜单:气泡膜切片/白色气泡膜/红色气泡膜源头厂家精选 - 品牌推荐官
  • 2025年CIP清洗系统生产商权威推荐榜单:灭活罐/种子罐/配液系统源头厂家精选 - 品牌推荐官
  • 2025年知名的西点培训中心推荐,专业西点培训机构哪家好全解析 - 工业推荐榜
  • 查看npm包的下载量对比
  • 云手机的兼容性如何
  • 2025昆明婚纱摄影口碑TOP10推荐出炉:综合实力王者领衔,备婚新人必看 - 提酒换清欢
  • 网络安全终极指南:一份从零到精通的全面实战手册,知识点一网打尽
  • JMeter实战:单个线程提交任务的深度解析与实操指南
  • 海口GEO优化公司怎么选?把“海口AI搜索推广”做成长期获客利器 - 优质品牌推荐TOP榜
  • 2025 火锅底料厂家 TOP5 成都周边底料厂攻略 蓉城老妈就近赋能 - 品牌智鉴榜
  • 【Open-AutoGLM脑机接口交互革命】:揭秘下一代人机协同核心技术
  • Web层接口通用鉴权注解实践(基于JDK8)
  • 云手机的适配性怎么样?
  • 贵阳GEO优化公司怎么选?AI搜索时代,本地企业正在被重新“筛选” - 优质品牌推荐TOP榜
  • 构筑通信防线:针对失效、丢失、残缺、乱序、伪造五大威胁的防护要点
  • 2025四川最新砂轮片厂家TOP5 评测!成都等地区优质品牌方案权威榜单发布,品质铸就工业研磨新标杆 - 全局中转站