前言
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、向量库、混合检索、权限过滤、来源引用和评估集,缺一块都会影响最终效果。
我的建议是从小知识库开始,先把一条从文档入库到回答的链路做扎实。知识问答不是把资料塞进向量库就完成了,真正要用得住,还要能追溯、能评估、能更新。
喜欢的话,留下你的评论吧~