本文详细介绍了使用Spring AI实现RAG检索增强生成技术,通过Redis Stack构建向量数据库,将文档向量化存储并实现基于知识库的问答系统。通过相似度检索和AI生成的结合,解决大模型幻觉问题,提高专业领域问答准确性。包含完整代码实现、测试对比和最佳实践,适合构建企业知识库、技术支持等应用场景。
一、什么是 RAG?为什么需要它?
RAG(Retrieval-Augmented Generation) 是一种将信息检索与文本生成相结合的技术。它的核心思想是:
- 检索:从知识库中查找与问题相关的文档片段
- 增强:将这些片段作为上下文提供给大模型
- 生成:模型基于上下文生成更准确、更可靠的答案
为什么需要 RAG?
- 解决幻觉问题:大模型不再"凭空想象",而是基于实际文档回答
- 知识更新便捷:只需更新向量数据库,无需重新训练模型
- 专业领域适配:可快速为特定领域(如法律、医疗)构建专业问答系统
二、环境准备:Redis Stack
我们将使用 Redis Stack 作为向量数据库存储文档嵌入。
三、项目配置与依赖
1. 添加必要的依赖
<!-- Redis 向量存储 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
<!-- PDF 文档读取 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-pdf-document-reader</artifactId>
</dependency>
<!-- 文档解析(支持 Word、Excel 等) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
2. 配置应用参数
spring:
ai:
openai:
embedding:
options:
model: text-embedding-v4 # 使用百炼平台的嵌入模型
vectorstore:
redis:
initialize-schema: true # 自动初始化向量索引
index-name: custom_index # 索引名称
prefix: "ai:" # Redis 键前缀
data:
redis:
url: redis://:mypassword@192.168.10.15:6379 # Redis 连接地址
四、实现文档向量化存储
创建 VectorStoreController 处理文档上传和向量化:
@RestController
@RequiredArgsConstructor
@RequestMapping("/vectorStore")
public class VectorStoreController {
private final VectorStore vectorStore;
/**
* 上传并向量化 PDF 文档
*/
@RequestMapping(value = "/savePdf")
public String savePdf(@RequestParam("filePath") String filePath) {
Resource resource = new FileSystemResource(filePath);
// 配置 PDF 阅读器(每页作为一个文档)
PagePdfDocumentReader reader = new PagePdfDocumentReader(
resource,
PdfDocumentReaderConfig.builder()
.withPageExtractedTextFormatter(ExtractedTextFormatter.defaults())
.withPagesPerDocument(1) // 每页作为独立文档
.build()
);
// 读取并向量化文档
List<Document> documents = reader.read();
vectorStore.add(documents);
return "success";
}
/**
* 上传并向量化 Word 文档
*/
@RequestMapping(value = "/saveDoc")
public String saveDoc(@RequestParam("filePath") String filePath) {
Resource resource = new FileSystemResource(filePath);
TikaDocumentReader reader = new TikaDocumentReader(resource);
List<Document> documents = reader.read();
vectorStore.add(documents);
return "success";
}
/**
* 向量相似度查询
*/
@RequestMapping(value = "/query")
public String query(@RequestParam String prompt) {
SearchRequest request = SearchRequest.builder()
.query(prompt)
.topK(2) // 返回最相似的2个文档
.similarityThreshold(0.6) // 相似度阈值
.build();
List<Document> docs = vectorStore.similaritySearch(request);
if (CollectionUtils.isEmpty(docs)) {
return "没有搜索到相关文档";
}
// 拼接检索到的文档内容
return docs.stream()
.map(Document::getText)
.collect(Collectors.joining("\n\n"));
}
}
在网上找了一个美国签证申请的文档,大概内容如下:

在 Redis Stack 中长这样

五、构建 RAG 问答接口
创建结合向量检索与 AI 生成的智能问答接口:
@RestController
@RequiredArgsConstructor
public class AgentVectorController {
private final ChatClient chatClient;
private final VectorStore vectorStore;
@RequestMapping(value = "/ai/chat/vector")
public String chat(@RequestParam String prompt) {
// 1. 向量检索:查找相关文档
SearchRequest request = SearchRequest.builder()
.query(prompt) // 查询
.topK(2) // 返回的相似文档数量
.similarityThreshold(0.6) // 相似度阈值
.build();
List<Document> listOfSimilarDocuments = vectorStore.similaritySearch(request);
// 2. 拼接文档内容作为上下文
String documents = listOfSimilarDocuments.stream().map(Document::getText).collect(Collectors.joining("\n\n"));
// 3. 构建系统提示(包含检索到的上下文)
Message systemMessage = new SystemPromptTemplate(
"你是一个专业的客服助手,请严格根据提供的参考文档回答问题。" +
"回答要简洁准确,尽量使用文档中的原话。" +
"如果文档中没有相关信息,请告知用户: 我不明白你的问题。" +
"\n\n参考文档:\n{documents}")
.createMessage(Map.of("documents", documents));
return chatClient.prompt().system(systemMessage.getText()).user(prompt).call().content();
}
}
六、效果测试对比
我们使用一份"美国签证办理指南"文档进行测试:
测试 1:RAG 问答(基于文档)
请求:
GET http://localhost:8080/ai/chat/vector?prompt=在职证明包含哪些内容
响应(准确基于文档内容):
在职证明应包含以下内容:
公司抬头信纸
公司地址和联系电话
申请人姓名、职位
入职时间
单位准假证明
单位负责人签字
这些内容有助于证明你在本国的稳定工作,会按时回国。
测试 2:普通对话(无文档参考)
请求:
GET http://localhost:8080/ai/chat?prompt=在职证明包含哪些内容
响应(模型通用知识):
在职证明一般由公司出具,用于证明员工目前在该公司工作的正式文件。常见的内容包括以下几个方面:
1. **公司基本信息**
- 公司名称、地址、联系电话、统一社会信用代码等。
2. **员工基本信息**
- 员工姓名、身份证号码、入职时间。
3. **职位与部门**
- 员工所在的部门、担任的职位或职务。
....
(基于模型训练数据,可能不准确或不完整)
效果对比:
| 方面 | 普通对话 | RAG 增强 |
| 准确性 | 依赖模型记忆,可能过时或不准确 | 基于最新文档,准确可靠 |
| 专业性 | 通用回答,缺乏细节 | 专业领域术语,完整格式 |
| 可追溯 | 无法提供来源 | 基于具体文档内容 |
| 更新成本 | 需重新训练模型 | 只需更新文档 |
七、扩展应用场景
这种 RAG 架构可应用于多种场景:
- 企业知识库:内部文档问答系统
- 技术支持:产品手册智能查询
- 教育培训:教材内容精准检索
- 法律咨询:法规条文准确引用
八、总结与最佳实践
本文我们实现了:
- 文档向量化:将 PDF/Word 文档转换为向量存储
- 相似度检索:根据问题查找相关文档片段
- 增强生成:将检索结果作为上下文生成准确答案
最佳实践建议:
- 文档预处理:清理格式、分段优化提升检索效果
- 阈值调优:根据场景调整相似度阈值(0.6-0.8)
- 多文档支持:支持多种格式文档上传
- 版本管理:实现文档版本更新和回滚
如何系统学习掌握AI大模型?
AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份
全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

4. 大模型行业报告
行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

6. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以
微信扫描下方优快云官方认证二维码,免费领取【保证100%免费】


被折叠的 条评论
为什么被折叠?



