Spring AI学习笔记(三)RAG从文档入库到回答

发表于 2026-05-22 22:07 1545 字 8 min read

Spring AI学习笔记(四)工具调用和MCPSpring AI学习笔记(三)RAG从文档入库到回答Spring AI学习笔记(二)ChatClient从怎么调到怎么封装Spring AI学习笔记(一)它到底解决什么问题java新版本-java25学习笔记(四)用JFR和GC日志做一次体检java新版本-java25学习笔记(三)虚拟线程要和资源边界一起看java新版本-java25学习笔记(二)运行时基线先统一java新版本-java25学习笔记(一)LTS版本对比和学习路线主流AI Agent能力对比与工程选型我用Kiro做了个自己的工具站盘一盘虚拟线程我用Trae做了个AstrBot的AI角色扮演插件Python初学笔记(六)常用标准库先学这几个Python初学笔记(五)读写文件和处理异常Python初学笔记(四)函数让代码开始有结构Python初学笔记(三)条件、循环和推导式Python初学笔记(二)变量和基础类型比想象中重要Python初学笔记(一)先把环境和运行方式弄明白主流AI大模型能力对比Java 21和Spring Boot 3升级笔记(五)日志指标与可观测性Java 21和Spring Boot 3升级笔记(四)数据访问层适配Java 21和Spring Boot 3升级笔记(三)虚拟线程使用边界Java 21和Spring Boot 3升级笔记(二)Jakarta迁移要点Java 21和Spring Boot 3升级笔记(一)工程基线整理How Can We Tolerate Magic Values! Major Overhaul of JPA Specification!处理生僻字乱码:JPA框架对于Oracle的NVarchar2,NChar,NClob类型支持Redis Stream能不能当轻量消息队列用RocketMQ 5学习笔记:普通消息之外要看什么事件流不是换个消息队列这么简单Kubernetes学习笔记04:发布、排障和观测Kubernetes学习笔记03:配置、密钥和存储Kubernetes学习笔记02:Deployment、Service和IngressKubernetes学习笔记01:Pod和控制器mysql索引原理02--存储引擎索引的实现mysql索引原理01--索引的数据结构
This post is not yet available in English. Showing the original.
  RAG 是 Spring AI 里最容易被拿来做业务功能的方向。   它的思路并不复杂:先检索知识库,再把检索到的内容交给模型回答。这样模型不用凭空回答,可以结合企业自己的文档、接口说明、制度资料、产品手册。   但真正做起来,RAG 不是“接一个向量库”...

前言

  RAG 是 Spring AI 里最容易被拿来做业务功能的方向。

  它的思路并不复杂:先检索知识库,再把检索到的内容交给模型回答。这样模型不用凭空回答,可以结合企业自己的文档、接口说明、制度资料、产品手册。

  但真正做起来,RAG 不是“接一个向量库”这么简单。它至少包括文档读取、清洗、切分、Embedding、入库、检索、权限过滤、上下文组装、回答生成、来源引用和效果评估。

RAG 先解决什么问题

  RAG 最适合解决“答案在资料里,但用户不想自己找”的问题。

比如:

1.内部开发规范问答。 2.产品手册问答。 3.接口文档问答。 4.制度和流程问答。 5.知识库辅助客服。

如果资料里没有答案,RAG 不应该硬编。如果资料本身过期,RAG 也会跟着错。所以第一步不是写代码,而是确认知识源是否可靠。

很多 RAG 项目失败,不是模型差,而是知识库太乱。

文档入库流程

  一个比较完整的文档入库流程可以这样看:

1.读取文档。 2.清洗无用内容。 3.按结构切分。 4.生成 Embedding。 5.写入向量库。 6.保存元数据。

元数据很重要。至少要有文档 ID、标题、来源链接、更新时间、权限范围、段落位置。

没有元数据,后面就没法做权限过滤、来源引用和文档更新。

Spring AI 提供了 Document、EmbeddingModel、VectorStore 等抽象,可以把这些步骤串起来。具体用哪个向量库,反而不是第一天最重要的问题。

切分比想象中重要

  文档切分直接影响检索质量。

切太大,命中的片段包含很多无关内容,模型回答容易发散。切太小,语义断掉,模型拿不到完整上下文。

我更倾向于按文档结构切分:标题、段落、列表、表格、代码块尽量保持完整。

比如接口文档里,一个接口的路径、请求参数、响应字段、错误码最好不要被切得太碎。否则用户问接口怎么调用时,检索可能只拿到参数片段,拿不到完整说明。

切分策略需要反复调,不可能一次完美。

向量库只是存储层

  向量库很重要,但不要把 RAG 等同于向量库。

Spring AI 的 VectorStore 抽象能屏蔽一部分存储差异。项目可以根据规模和团队经验选择 pgvector、Redis、Milvus、Elasticsearch、OpenSearch 等。

小项目或内部工具,用 PostgreSQL + pgvector 很现实。已有搜索体系的团队,可以评估 Elasticsearch/OpenSearch 的向量能力。数据量大、检索要求高,再考虑专门向量数据库。

选型要看:

1.数据量。 2.更新频率。 3.检索延迟。 4.权限过滤。 5.运维能力。 6.已有基础设施。

不要为了“看起来专业”一开始就引入很重的平台。

检索不只靠向量

  企业知识问答里,混合检索很常见。

用户可能输入自然语言,也可能输入接口名、字段名、错误码、配置项。这些精确词用关键词检索更靠谱。

所以 RAG 可以把向量检索和关键词检索结合起来。先分别召回,再重排,最后取前几段进入模型上下文。

比如用户问E1024是什么意思,关键词检索通常比向量检索更直接。

不要迷信“全部语义化”。工程上能稳定命中答案的方法都值得用。

权限必须在检索阶段处理

  内部知识库一定会遇到权限问题。

某个用户能不能看到这份文档?某个部门资料能不能被其他部门问到?客户资料能不能进入通用问答?

权限过滤应该在检索阶段处理。用户没有权限的文档,不应该进入模型上下文。

入库时要保存权限元数据,查询时按当前用户过滤。不要等模型回答完再试图过滤,因为那时敏感内容可能已经被模型看到。

RAG 系统里,权限不是外层页面控制,而是检索链路的一部分。

回答要带来源

  RAG 的回答最好能展示来源。

用户看到答案时,可以知道它来自哪份文档、哪一段。这样答案不对时,也能回到原文检查。

来源不要让模型自己编。系统应该把检索命中的文档标题、链接、段落位置传给前端展示。

模型负责组织语言,系统负责提供真实来源。

这对企业应用很重要。很多内部问答不是要一个“像真的”答案,而是要能追溯依据。

评估集要早点建

  RAG 的效果不能只靠感觉。

我建议第一版就准备一组测试问题:

1.文档里明确有答案的问题。 2.需要多个片段组合的问题。 3.文档里没有答案的问题。 4.容易混淆的问题。 5.包含错误码或接口名的问题。

每次调整切分、Embedding、检索参数、模型和提示词,都跑一遍评估集。

特别要关注“没有答案”的问题。好的 RAG 应该敢说不知道,而不是编一个看起来合理的答案。

小结

  Spring AI 可以帮助 Java 项目把 RAG 的各个环节串起来,但 RAG 的难点不只在代码。

  文档质量、切分策略、Embedding、向量库、混合检索、权限过滤、来源引用和评估集,缺一块都会影响最终效果。

  我的建议是从小知识库开始,先把一条从文档入库到回答的链路做扎实。知识问答不是把资料塞进向量库就完成了,真正要用得住,还要能追溯、能评估、能更新。

If you enjoyed this, leave a comment~

© 2019 - 2026 VincentHo @VincentHo
Powered by theme astro-koharu · Inspired by Shoka