大语言模型只基于训练和当前上下文生成内容。它不会自动知道团队文档,也不能保证记住最新事实。RAG(检索增强生成)在生成前从受控知识库检索相关材料,把证据放入上下文,让回答更可追溯、更容易更新。
问题背景:模型不知道你的私有知识
直接把问题交给模型,模型可能用通用知识补全缺失信息,产生听起来合理但没有依据的答案。微调可以改变行为或风格,却不适合频繁同步大量事实。RAG 把知识更新变成数据管线问题:文档变化后重新处理和索引,而不必训练整个模型。
RAG 也不是“连接向量数据库就准确”。切分丢失上下文、召回错误材料、权限过滤缺失或提示没有要求引用证据,都会让最终答案失败。
RAG 的完整数据流
离线链路负责文档解析、切分和索引;在线链路负责查询理解、召回、重排、上下文组装和生成。权限信息必须进入检索阶段,不能先检索全部内容再要求模型自行忽略。
切分、Embedding 与索引
固定字符切分简单,但可能把标题与正文、表格与解释拆开。更可靠的做法是尊重文档结构,保留标题层级、来源、更新时间和权限标签等元数据,并使用适度重叠维持跨边界语义。
Embedding 把文本映射到向量空间,语义相近的文本距离更近。模型、维度和距离度量必须匹配。更换 Embedding 模型通常意味着重建索引,不能把不同模型生成的向量直接混用。
索引记录至少包含稳定文档 ID、块 ID、正文、来源版本和权限元数据。删除或撤销权限时要能定位全部派生块,防止旧向量继续被召回。
召回、重排与上下文
纯向量检索擅长语义相似,但对精确编号、代码符号和专有名词不总是最好。混合检索将关键词与向量结果合并,常能提高覆盖率。第一阶段扩大候选集,第二阶段用重排模型或规则挑选最相关内容。
上下文不是越多越好。无关块会稀释证据并增加成本。组装时应去重、保持来源边界、控制总 Token,并明确告诉模型:只根据材料回答;证据不足时说明不知道;引用对应来源。
实践:最小检索管线
下面的 Python 示例只演示余弦相似度检索,使用本地构造向量以便独立运行。实际系统应调用经过评估的 Embedding 模型,并使用专门索引处理大规模数据。
01from dataclasses import dataclass02from math import sqrt0304@dataclass05class Chunk:06 chunk_id: str07 text: str08 vector: list[float]09 source: str1011def 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.01617def 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]2425chunks = [26 Chunk("c1", "就绪探针决定实例是否接收流量", [0.9, 0.1], "k8s.md"),27 Chunk("c2", "存活探针决定容器是否需要重启", [0.7, 0.3], "k8s.md"),28]2930for item in retrieve([0.85, 0.15], chunks):31 print(item.chunk_id, item.source, item.text)
生产实现需要校验向量长度、设置超时、限制 top_k,并在检索前做租户和权限过滤。用户上传的文档属于不可信输入,解析器要限制文件大小、类型、嵌套深度和外部链接。
生成提示可以采用清晰的证据边界:
01任务:根据“资料”回答问题。02约束:031. 不使用资料之外的事实补全答案。042. 资料不足时明确说明缺少什么。053. 每个关键结论标注来源编号。
评估、安全与成本
评估要把检索和生成分开。检索阶段观察目标证据是否进入前 K 个结果、排名是否合理;生成阶段观察答案是否正确、是否忠于证据、引用是否对应。建立一组来自真实问题类型但不包含敏感数据的固定测试集,才能比较切分、模型或提示变更。
RAG 面临提示注入:文档中可能包含“忽略系统要求”等恶意文本。系统必须把文档视为数据而非指令,工具调用仍需独立授权与参数校验。日志和评估样本要脱敏,并为敏感知识设置访问审计。
成本来自解析、Embedding、索引存储、在线检索、重排和生成。缓存稳定查询、减少重复块、按问题复杂度选择模型都能降低成本,但缓存键必须包含权限和知识版本。
常见误区与总结
只调大 top_k 会带来更多噪声;用单一固定长度切所有文档会破坏结构;没有删除链路会保留过期知识;只看答案流畅度会掩盖引用错误。
可靠 RAG 是一条可观测数据链路:结构化切分、受控索引、权限内召回、重排、有限上下文、证据约束生成和分层评估。延伸学习可以进入 Embedding 索引、Function Calling、Agent 权限和 AI 成本治理。