自拟练习 · 不使用任何公司内部文档。
先把题目说清楚
给一个课程资料库做基于检索(retrieval)的问答(RAG)。资料会更新,不同用户能看见的文档不同。回答要带可打开的引用,找不到依据时允许说不知道。第一版不做自动执行操作。
不要把目标写成“接一个向量库”。真正要保证的是:回答用到的是当前用户有权访问、版本正确、能支撑结论的证据。
两条路径分开画
flowchart LR A["文档与权限、版本"] --> B["切分与索引"] Q["问题与身份"] --> C["有权限的检索"] B --> C C --> D["重排与证据选择"] D --> E["回答与引用"] E --> F["支持性检查 / 不回答"]
权限条件应尽可能参与检索,并在选证据时再次检查;不能先把无权看的文本发给模型,再在最终回答里过滤。
三个选择
| 选择 | 好处 | 代价与检查 |
|---|---|---|
| 关键词与向量混合 | 编号、专有名词和语义表达各有入口 | 融合规则、重复结果和候选(candidate)预算 |
| 小块检索,再取相邻上下文 | 找得准,也保留段落关系 | 容易拿到过期版本;扩展后仍要检查权限 |
| 引用到具体版本与片段 | 用户可以复核 | 文档更新后需要保留版本或明确失效 |
证据越多不一定越好。先定义 context budget,再看是否覆盖回答需要的关键事实;不要用更多无关文字掩盖检索缺口。
怎么测
自己写一小组问题,标明所需文档和关键事实,包含跨段落、过期答案、没有答案、无权限四类。分别量检索是否找到证据、回答是否被证据支持、引用是否准确、该拒绝时是否拒绝,再看延迟。
不要只让同一个模型生成问题、回答和评分,然后把分数当成独立验证。保留人工检查的小切片(slice),记录失败属于检索、证据选择还是生成。
追问自己
召回到了正确文档,为什么仍然答错?
可能切片没覆盖所需段落,版本不对,重排丢了关键证据,或者生成加入了证据没有支持的结论。按阶段查,不直接归因于模型太小。
缓存答案怎样处理权限撤回?
缓存键和读取检查必须考虑身份或权限范围、文档版本与失效机制。缓存命中不能跳过授权检查。
补原理:检索 · 评估。这里给的是可讨论的设计,不是唯一实现。
本页术语 3
- 检索 retrieval
- 从外部语料里找出相关内容
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容
- 切片 slice
- 按内容或用户属性划分的子群体,用来检查平均值掩盖了什么