Spring AI与DeepSeek实战三:打造企业知识库
一、概述
企业应用集成大语言模型(LLM)落地的两大痛点:
- 知识局限性:LLM依赖静态训练数据,无法覆盖实时更新或垂直领域的知识;
- 幻觉:当LLM遇到训练数据外的提问时,可能生成看似合理但错误的内容。
用最低的成本解决以上问题,需要使用 RAG
技术,它是一种结合信息检索技术与 LLM 的框架,通过从外部 知识库
动态检索相关上下文信息,并将其作为 Prompt
融入生成过程,从而提升模型回答的准确性;
本文将以AI智能搜索为场景,基于 Spring AI 与 RAG 技术结合,通过构建实时知识库增强大语言模型能力,实现企业级智能搜索场景与个性化推荐,攻克 LLM 知识滞后与生成幻觉两大核心痛点。
关于 Spring AI 与 DeepSeek 的集成,以及 API-KEY 的申请等内容,可参考文章《Spring AI与DeepSeek实战一:快速打造智能对话应用》
二、RAG数据库选择
构建知识库的数据库一般有以下有两种选择:
维度 | 向量数据库 | 知识图谱 |
---|---|---|
数据结构 | 非结构化数据(文本/图像向量) | 结构化关系网络(实体-关系-实体) |
查询类型 | 语义相似度检索 | 多跳关系推理 |
典型场景 | 文档模糊匹配、图像检索 | 供应链追溯、金融风控 |
性能指标 | QPS>5000 | 复杂查询响应时间>2s |
开发成本 | 低(API即用) | 高(需构建本体模型) |
搜索推荐场景更适合选择 向量数据库
三、向量模型
向量模型是实现 RAG 的核心组件之一,用于将非结构化数据(如文本、图像、音频)转换为 高维向量
(Embedding)的机器学习模型。这些向量能够捕捉数据的语义或结构信息,使计算机能通过数学运算处理复杂关系。
向量数据库是专门存储、索引和检索高维向量的数据库系统
spring-ai-alibaba-starter
默认的向量模型为 text-embedding-v1
可以通过 spring.ai.dashscope.embedding.options.model
进行修改。
四、核心代码
4.1. 构建向量数据
创建 resources/rag/data-resources.txt
文件,内容如下:
1. {"type":"api","name":"测试api服务01","topic":"综合政务","industry":"采矿业","remark":"获取采矿明细的API服务"}
2. {"type":"api","name":"新能源车类型","topic":"能源","industry":"制造业","remark":"获取新能源车类型的服务"}
3. {"type":"api","name":"罚款报告","topic":"交通","industry":"制造业","remark":"获取罚款报告的接口"}
4. {"type":"api","name":"光伏发电","topic":"能源","industry":"电力、热力、燃气及水生产和供应业","remark":"获取光伏发电的年度报告"}
5. {"type":"api","name":"收益明细2025","topic":"综合政务","industry":"信息传输、软件和信息技术服务业","remark":"2025年的收益明细信息表"}
创建向量数据库的 Bean
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel
, @Value("classpath:rag/data-resources.txt") Resource docs) {
VectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build();
vectorStore.write(new TokenTextSplitter().transform(new TextReader(docs).read()));
return vectorStore;
}
SimpleVectorStore
是Spring AI
提供的一个基于内存的向量数据库;- 使用
TokenTextSplitter
来切分文档。
4.2. 创建ChatClient
private final ChatClient chatClient;
public RagController(ChatClient.Builder builder, VectorStore vectorStore) {
String sysPrompt = """
您是一个数据产品的智能搜索引擎,负责根据用户输入的内容进行精准匹配、模糊匹配和近义词匹配,以搜索相关的数据记录。
您只能搜索指定的内容,不能回复其他内容或添加解释。
您可以通过[search_content]标识符来表示需要搜索的具体内容。要求您返回匹配内容的完整记录,以JSON数组格式呈现。
如果搜索不到内容,请返回[no_data]。
""";
this.chatClient = builder
.defaultSystem(sysPrompt)
.defaultAdvisors(
new QuestionAnswerAdvisor(vectorStore, new SearchRequest())
)
.defaultOptions(
DashScopeChatOptions.builder()
.withModel("deepseek-r1")
.build()
)
.build();
}
- 通过系统
Prompt
来指定智能体的能力; - 通过
QuestionAnswerAdvisor
绑定向量数据库。
4.3. 搜索接口
@GetMapping(value = "/search")
public List<SearchVo> search(@RequestParam String search, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
PromptTemplate promptTemplate = new PromptTemplate("[search_content]: {search}");
Prompt prompt = promptTemplate.create(Map.of("search", search));
return chatClient.prompt(prompt)
.call()
.entity(new ParameterizedTypeReference<List<SearchVo>>() {});
}
这里通过 entity
方法来实现搜索结果以结构化的方式返回。
4.4. 测试接口
4.4.1. 搜索新能源
除了模糊匹配了新能源车之外,还匹配了和新能源相关的光伏数据。
4.4.21. 搜索收入
匹配同义词的收益数据。
五、总结
本文以智能搜索引擎场景,通过 RAG
技术,实现了全文搜索、模糊搜索、同义词推荐等功能,并以结构化的方式返回搜索结果。需要注意的是,在企业应用中,要把 SimpleVectorStore
改为成熟的第三方向量数据库,例如 milvus
、elasticsearch
、redis
等。
六、完整代码
- Gitee地址:
https://gitee.com/zlt2000/zlt-spring-ai-app
- Github地址:
https://github.com/zlt2000/zlt-spring-ai-app
Spring AI与DeepSeek实战三:打造企业知识库的更多相关文章
- Spring Boot 揭秘与实战(三) 日志框架篇 - 如何快速集成日志系统
文章目录 1. 默认的日志框架 logback2. 常用的日志框架 log4j 1.1. 日志级别 1.2. 日志文件 3. 源代码 Java 有很多日志系统,例如,Java Util Logging ...
- Spring Boot 揭秘与实战(六) 消息队列篇 - RabbitMQ
文章目录 1. 什么是 RabitMQ 2. Spring Boot 整合 RabbitMQ 3. 实战演练4. 源代码 3.1. 一个简单的实战开始 3.1.1. Configuration 3.1 ...
- 生成式AI对业务流程有哪些影响?企业如何应用生成式AI?一文看懂
集成与融合类ChatGPT工具与技术,以生成式AI变革业务流程 ChatGPT背后的生成式AI,聊聊生成式AI如何改变业务流程 ChatGPT月活用户过亿,生成式AI对组织的业务流程有哪些影响? 生成 ...
- Spring线程池开发实战
Spring线程池开发实战 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs 本文提供了三个Spring多线程开发的例子,由浅入深,由于例子一目了然, ...
- 【SSH项目实战三】脚本密钥的批量分发与执行
[SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...
- AI应用开发实战 - 定制化视觉服务的使用
AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...
- AI应用开发实战 - 手写识别应用入门
AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...
- AI应用开发实战 - 从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
随机推荐
- IDEA神器插件-40款
IDEA 插件安装 步骤 IDEA里面,选择打开 File --> Settings --> Plugins 在Plugins里面, 可以搜索需要的插件 (下面的标题),然后安装 如下图: ...
- 如何快速的开发一个完整的iOS直播app(编解码原理)
为什么要编码 编码就是压缩图像 手机摄像头采集的都是一帧一帧的图片,只要每秒采集了24帧,看起来就比较流畅,视频就是由一帧一帧的图片构成的,常见图片格式png,jpg,一张图片2M,一秒钟30帧,那么 ...
- 使用Ollama
推荐 Ollama 本地运行大模型(LLM)完全指南 Ollama中文学习 应用 查看可支持的模型:https://ollama.com/library 查看运行中的模型 ollama ps 停止模型 ...
- C# as 和 is 运算符区别和用法
前言 在C#中,as 和 is 关键字都用于处理类型转换的运算符,但它们有不同的用途和行为.本文我们将详细解释这两个运算符的区别和用法. is 运算符 is 运算符用于检查对象是否是某个特定类型,或者 ...
- 聊聊GRPO算法——从Open R1来看如何训练DeepSeek R1模型
概述 首发自个人公众号:阿郎小哥的随笔驿站 DeepSeek R1系列建议阅读之前的系列文章: 聊聊DeepSeek R1的一些总结 聊聊DeepSeek R1的开源复现库--Open R1之合成数据 ...
- 『Python底层原理』--CPython的变量实现机制
在Python中,变量的使用看起来非常简单,例如 a = 10,s = "hello"等等. 然而,这种简单的赋值操作背后,CPython其实做了很多复杂的工作. 本文将通过一些简 ...
- mybatis mysql count(*) 返回结果为null的解决
具体错误信息: org.apache.ibatis.binding.BindingException: Mapper method 'com.xx.xx.xx.xx.xx.getCount attem ...
- DOS使用技巧整理 [典型案例分享]
最早于2008年系统地学习MS-Dos,当时刚初中毕业.从小深受父亲影响,对电脑的技术比较感兴趣,特别是对DOS.随着学习得不断深入,接触了大量数字媒体软件.框架还有编程界的知识,发现DOS有不可磨灭 ...
- Docker 容器的数据卷 以及 数据卷容器
Docker 容器删除后,在容器中产生的数据还在吗? 答案是 不在 Docker 容器和外部机器可以直接交换文件吗? 在没有数据卷的情况下,答案是 不可以 如下图:外部机器:Windows系统(自己的 ...
- Flink学习(十二) Sink到JDBC(可扩展到任何关系型数据库)
导入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java& ...