返回文章目录

RAG 应用基础:从检索到生成的完整数据流

把 RAG 拆成文档切分、向量化、召回、重排、上下文组装、生成和评估,说明每一步的质量责任。

内容说明本文为个人学习与教学示例,不代表真实生产项目。涉及生产配置时请结合环境评估并完成审查。

大语言模型只基于训练和当前上下文生成内容。它不会自动知道团队文档,也不能保证记住最新事实。RAG(检索增强生成)在生成前从受控知识库检索相关材料,把证据放入上下文,让回答更可追溯、更容易更新。

问题背景:模型不知道你的私有知识

直接把问题交给模型,模型可能用通用知识补全缺失信息,产生听起来合理但没有依据的答案。微调可以改变行为或风格,却不适合频繁同步大量事实。RAG 把知识更新变成数据管线问题:文档变化后重新处理和索引,而不必训练整个模型。

RAG 也不是“连接向量数据库就准确”。切分丢失上下文、召回错误材料、权限过滤缺失或提示没有要求引用证据,都会让最终答案失败。

RAG 的完整数据流

离线链路负责文档解析、切分和索引;在线链路负责查询理解、召回、重排、上下文组装和生成。权限信息必须进入检索阶段,不能先检索全部内容再要求模型自行忽略。

切分、Embedding 与索引

固定字符切分简单,但可能把标题与正文、表格与解释拆开。更可靠的做法是尊重文档结构,保留标题层级、来源、更新时间和权限标签等元数据,并使用适度重叠维持跨边界语义。

Embedding 把文本映射到向量空间,语义相近的文本距离更近。模型、维度和距离度量必须匹配。更换 Embedding 模型通常意味着重建索引,不能把不同模型生成的向量直接混用。

索引记录至少包含稳定文档 ID、块 ID、正文、来源版本和权限元数据。删除或撤销权限时要能定位全部派生块,防止旧向量继续被召回。

召回、重排与上下文

纯向量检索擅长语义相似,但对精确编号、代码符号和专有名词不总是最好。混合检索将关键词与向量结果合并,常能提高覆盖率。第一阶段扩大候选集,第二阶段用重排模型或规则挑选最相关内容。

上下文不是越多越好。无关块会稀释证据并增加成本。组装时应去重、保持来源边界、控制总 Token,并明确告诉模型:只根据材料回答;证据不足时说明不知道;引用对应来源。

实践:最小检索管线

下面的 Python 示例只演示余弦相似度检索,使用本地构造向量以便独立运行。实际系统应调用经过评估的 Embedding 模型,并使用专门索引处理大规模数据。

python
01from dataclasses import dataclass
02from math import sqrt
03
04@dataclass
05class Chunk:
06 chunk_id: str
07 text: str
08 vector: list[float]
09 source: str
10
11def cosine(a: list[float], b: list[float]) -> float:
12 dot = sum(x * y for x, y in zip(a, b))
13 norm_a = sqrt(sum(x * x for x in a))
14 norm_b = sqrt(sum(y * y for y in b))
15 return dot / (norm_a * norm_b) if norm_a and norm_b else 0.0
16
17def retrieve(query_vector: list[float], chunks: list[Chunk], top_k: int = 3):
18 ranked = sorted(
19 chunks,
20 key=lambda chunk: cosine(query_vector, chunk.vector),
21 reverse=True,
22 )
23 return ranked[:top_k]
24
25chunks = [
26 Chunk("c1", "就绪探针决定实例是否接收流量", [0.9, 0.1], "k8s.md"),
27 Chunk("c2", "存活探针决定容器是否需要重启", [0.7, 0.3], "k8s.md"),
28]
29
30for item in retrieve([0.85, 0.15], chunks):
31 print(item.chunk_id, item.source, item.text)

生产实现需要校验向量长度、设置超时、限制 top_k,并在检索前做租户和权限过滤。用户上传的文档属于不可信输入,解析器要限制文件大小、类型、嵌套深度和外部链接。

生成提示可以采用清晰的证据边界:

text
01任务:根据“资料”回答问题。
02约束:
031. 不使用资料之外的事实补全答案。
042. 资料不足时明确说明缺少什么。
053. 每个关键结论标注来源编号。

评估、安全与成本

评估要把检索和生成分开。检索阶段观察目标证据是否进入前 K 个结果、排名是否合理;生成阶段观察答案是否正确、是否忠于证据、引用是否对应。建立一组来自真实问题类型但不包含敏感数据的固定测试集,才能比较切分、模型或提示变更。

RAG 面临提示注入:文档中可能包含“忽略系统要求”等恶意文本。系统必须把文档视为数据而非指令,工具调用仍需独立授权与参数校验。日志和评估样本要脱敏,并为敏感知识设置访问审计。

成本来自解析、Embedding、索引存储、在线检索、重排和生成。缓存稳定查询、减少重复块、按问题复杂度选择模型都能降低成本,但缓存键必须包含权限和知识版本。

常见误区与总结

只调大 top_k 会带来更多噪声;用单一固定长度切所有文档会破坏结构;没有删除链路会保留过期知识;只看答案流畅度会掩盖引用错误。

可靠 RAG 是一条可观测数据链路:结构化切分、受控索引、权限内召回、重排、有限上下文、证据约束生成和分层评估。延伸学习可以进入 Embedding 索引、Function Calling、Agent 权限和 AI 成本治理。

上一篇高可用系统设计:消除单点并控制故障半径