第 9 课:RAG 工程优化与生产化
RAG 课程 · 09 |目标:把实验链路变成可维护、可观测、可上线的服务|用时:30 分钟
RAG 项目从 demo 走向生产,难点通常不在“能不能搜到”,而在延迟、成本、数据更新、权限、故障恢复和可解释性。
先拆延迟预算
不要只记录整个请求耗时,要拆成阶段:
text
总延迟
= query 改写
+ query embedding
+ dense/BM25 召回
+ rerank
+ 上下文组装
+ LLM 生成记录 p50、p95 和错误率。平均值会隐藏尾部慢请求,用户通常感受到的是 p95 或更高分位。
常见优化顺序:
- 先确认慢在哪里。
- 降低不必要的候选数量和 token 数。
- 对可复用结果做缓存。
- 对 embedding、批量入库和检索做批处理。
- 最后再考虑更换硬件或索引参数。
成本和缓存
适合缓存的对象包括:
- 相同 query 的 query embedding。
- 文档解析和 chunking 结果。
- 文档 chunk 的 embedding。
- 稳定知识库上的召回候选。
- 最终答案,但必须绑定 query、权限、知识库版本和模型版本。
缓存 key 至少要考虑:
text
hash(query, tenant_id, filter, embedding_version, knowledge_base_version)不能把一个用户的召回结果直接复用给另一个权限范围不同的用户。
数据更新与索引版本
文档更新不是简单地“再插入一遍”:
- 计算文档内容 hash,判断是否真的变化。
- 删除或标记旧版本 chunk。
- 使用稳定的
document_id + chunk_id做幂等 upsert。 - 写入新的
version、updated_at和embedding_model。 - 确认索引可见后再切换 active version。
- 保留失败任务,支持重试和死信处理。
Embedding 模型更换时,旧向量和新向量通常不能直接混用。应建立新 collection 或新索引版本,完成离线评测后再切换流量。
权限是检索正确性的一部分
多租户或企业知识库至少要支持:
text
tenant_id
document_id
allowed_users / allowed_groups
document_status
version权限过滤必须在数据库查询或检索服务中执行。不能先召回所有内容,再在 prompt 中要求模型忽略无权数据;那既不安全,也不可证明。
可观测性
每次请求应能回答:
- 用户问了什么,系统是否改写了 query。
- 使用了哪个 embedding、索引和召回策略。
- 返回了哪些 chunk,分数是多少。
- 哪些 chunk 进入最终上下文。
- 生成模型和 prompt 版本是什么。
- 哪个阶段慢或报错。
- 答案是否有引用,是否触发拒答。
建议为一次请求生成 trace_id,将 query、检索、重排和生成日志串起来。日志中的原文应按敏感等级脱敏或只保存 hash、ID 和摘要。
可靠性与降级
需要为依赖失败准备降级路径:
| 故障 | 降级方案 |
|---|---|
| embedding 服务超时 | 使用 query 缓存、备用模型或返回明确错误 |
| 向量库不可用 | 使用 BM25 索引或只读快照 |
| reranker 超时 | 使用初始召回排序,但降低上下文数量 |
| LLM 不可用 | 返回检索证据和服务状态,不伪造答案 |
| 文档更新失败 | 保留旧版本,报警并重试 |
降级也要写入 trace,不能让用户误以为拿到的是完整能力下的答案。
生产检查清单
- [ ] 文档入库任务幂等,可重试,可追踪失败。
- [ ] embedding、chunk、索引和 prompt 都有版本。
- [ ] 权限过滤在检索层执行。
- [ ] 有离线 query 集和线上反馈闭环。
- [ ] 记录召回、重排、上下文和生成的阶段指标。
- [ ] 有 p95 延迟、token 成本和错误率告警。
- [ ] 有缓存失效和知识库版本切换策略。
- [ ] 外部模型或向量服务不可用时有降级方案。
- [ ] 日志和引用不会泄露不该暴露的原文。
本课练习
为一个企业请假知识库设计生产架构,写出:
- 文档更新到可检索的状态转换。
- embedding 模型升级时如何灰度和回滚。
- 一个请求的 trace 字段。
- 向量库、reranker 或 LLM 故障时的降级方案。
- 三个最重要的告警指标及阈值依据。
主读材料
Qdrant Concepts。重点阅读 payload、filter、collection 和索引相关概念,再结合你的部署规模做容量与权限设计。
下一步
有任何不清楚的地方,直接向老师提问。