2026/3/4 16:19:31
网站建设
项目流程
邯郸网站设计培训机构,化妆品公司网站建设方案,电脑做网站,杭州制作网站公司前言
在之前的文章中我们使用 SpringBoot 配合 DeepSeek 构建了一个拥有聊天记忆的问答机器人#xff0c;如果没有看过的可以翻下我之前的帖子。这次构建企业知识库将基于之前的内容来添砖加瓦。
构建知识库
在开始之前#xff0c;我们需要了解 2 个概念#xff1a;向量数…前言在之前的文章中我们使用 SpringBoot 配合 DeepSeek 构建了一个拥有聊天记忆的问答机器人如果没有看过的可以翻下我之前的帖子。这次构建企业知识库将基于之前的内容来添砖加瓦。构建知识库在开始之前我们需要了解 2 个概念向量数据库和检索增强生成RAG**向量数据库**顾名思义存储向量的数据库。什么是向量可以简单理解为文本、图片、视频等数据在空间中的坐标语义相似的词在向量空间中距离更近AI 根据距离来判断相似度。**检索增强生成RAG**当需要将用户查询发送到 AI 模型时首先检索一组相似的文档。这些文档随后作为用户问题的上下文与用户查询一起发送给 AI 模型。这种技术被称为检索增强生成RAG。添加依赖之前我们是直接使用的 DeepSeek 的依赖包但是由于在硅基流动中没找到 DeepSeek 的嵌入模型这里使用的千问的嵌入模型 Open AI 都能兼容。dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-advisors-vector-store/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-openai/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-rag/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.1.2/version typepom/type scopeimport/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和defaultAdvisorsdefaultSystem用来生成默认的提示词这里我给了个提示让它作为一名客服人员去回答问题。defaultAdvisors则是添加顾问可以理解为一种拦截器在请求 AI 前的一些操作这里告诉 AI 使用内存作为记忆并且使用内存作为向量数据库。当然实际企业不会直接使用内存作为记忆和向量数据库我们可以直接基于自身的项目的架构选择合适的向量数据库和记忆会话历史。比如使用 mysql 存储会话历史使用 redis-stack 做为向量数据库都是不错的选择。到目前为止已经解决了之前思考问题”我们怎么给 AI 预置一个角色比如让它作为一个智能客服或者作为一个营养师。“添加知识库这里为了方便直接使用了PostConstruct模拟了知识库初始化真实数据可以从数据库中获取使用CommandLineRunner接口加载数据。Autowired private VectorStore vectorStore; PostConstruct public void loadStore() { ListDocument 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() { ListDocument 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 FluxString 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 跟我们完成业务操作比如跟我下单或者说取消机票完整代码后续我会整理后将代码放在 Giteelanjii: 开箱即用的 RBAC 权限管理系统。后端基于 Spring Boot3 构建 集成了 JWT 认证、Spring Security 6、MyBatis-Plus这是一款 MIT 协议可商用的 SpringBoot 脚手架拥有完整的权限控制和常用的基础功能。希望大家给个 Star后面有新的功能和一些 BUG 的修复也会提交到 Gitee。