07. RAG 生产化
1. 先定义数据边界
每个 chunk 都应带 tenant、文档 ID、版本、生效时间、过期时间、来源、ACL 标签和解析器版本。检索时先按用户权限过滤,再做相似度排序;事后过滤会把越权内容暴露给排序器或日志。
request → authenticate → authorize filters → retrieve → rerank → generate权限变化时,缓存、向量索引、引用链接和导出文件都要失效。不要把“提示词要求模型保密”当作访问控制。
2. 索引版本与增量更新
为每次构建生成 index_version,记录输入快照、embedding 模型、切分配置、解析器版本和构建时间。先构建新索引并抽样评估,再原子切换别名;失败时切回上一版本。删除文档必须按稳定 document_id 删除所有 chunk,不能只删除一个文件名。
增量流程:
- 读取变更事件并去重。
- 校验来源和权限。
- 解析、切分、向量化到临时批次。
- 对同一文档旧 chunk 做替换。
- 运行小型回归集。
- 提交版本并发布。
3. 可靠性
外部模型调用设置连接和总超时、有限重试、指数退避和熔断;重试只用于幂等请求。索引写入使用批次和校验,临时文件完成后再 rename。检索为空、模型超时和引用生成失败要有明确降级:返回可解释拒答或检索结果,不要编造。
4. 可观测性
每个请求关联 trace ID,记录阶段耗时、候选数量、过滤数量、top-k 分数、模型/索引版本、token、错误类型和引用 ID。敏感原文按权限脱敏。告警关注 p95 延迟、空结果率、引用覆盖率、越权拒绝、索引新鲜度和成本,而不是只看 HTTP 200。
5. 成本和容量
Embedding 离线批处理并缓存 hash;相同文档和模型不重复计算。限制问题长度、候选数量和上下文 token。先用便宜模型做召回,再把少量候选交给重排或生成。容量测试要覆盖文档增长、并发、重建索引和模型限流。
6. 安全清单
- 文档内容视为不可信输入,防止提示注入影响系统指令。
- 引用 URL 做允许列表,避免 SSRF 或把内部路径返回用户。
- 日志、评估集和缓存按敏感级别处理。
- 租户字段不能由用户查询参数直接决定。
- 工具调用设置最小权限、参数校验和审计。
- 依赖许可证、镜像和模型来源在发布前锁定并扫描。
7. 上线门槛
必须有:权限过滤测试、无答案拒答测试、索引回滚演练、20 条以上回归集、p95 和成本预算、数据删除流程、事故联系人。没有这些证据时只允许内部试用。
练习
模拟 embedding 模型升级:构建 v2,比较 Recall@k 和成本;故意让构建失败,证明线上仍使用 v1;删除一份制度,验证引用、缓存和搜索均不可见。
评论
正在加载评论…