L03 有版本、有权限、有证据的检索与上下文
适用章节:M03。本实验允许多种正确实现;验收不变量固定,不强制特定框架。
工程事故
Agent检索到旧版政策P05,认为无需审批就能退款。另一个查询把shop-b内部政策P06排到第一名。问题不是“向量库不够先进”,而是检索条件和证据生命周期没有进入设计。
最终交付
BM25基线、RRF融合函数、过滤与引用测试、两种上下文截取策略、一份失败分析表。真实embedding与reranker为选修。
已提供材料
data/retail/policies.json、data/retail/tasks.jsonl、reference/agentlab/retrieval.py
先独立写出预期行为再看参考解。所有商店、订单、试次与价格单位都是教学构造;不连接真实资金系统。
接口与不可破坏的约束
数据中的active与tenant_id为硬过滤条件,不应由模型自由放宽。每条证据保留doc_id/version/source,答案引用不能只保留文本。检索结果只是证据,最终退款资格仍由业务政策执行器判断。
本实验中文基线用连续汉字二元组加ASCII词分词,易读但不宣称是最佳中文检索方案。RRF使用rank从1开始,默认k=60;每份排名列表同一文档最多贡献一次。
实施步骤
- 先手工标注5条查询的相关文档ID,冻结这些标签,避免边看结果边改答案。
- 在过滤后的语料上建立BM25,固定k1=1.2、b=0.75,记录分词策略和平均长度。
- 手算两份排名[A,B]与[B,C]的RRF,再实现函数。
- 设计context builder,必须保留当前任务、权限与审批约束、未确认操作ID。大工具输出保留摘要与可取回引用。
- 构造旧政策排名高于新政策、恶意备注、上下文太长三个反例。
- 用相同查询比较仅关键词、融合检索与压缩;真实模型试验单独计费,不把离线通过当作回答质量已验证。
验收矩阵
| 输入 | 验收 |
|---|---|
| shop-a任意查询 | 不返回P06 |
| 查询含“旧版退款” | 不返回inactive的P05 |
| 空查询/limit=0 | 空列表,不报成功证据 |
| RRF [A,B]+[B,C] | B第一,分数1/62+1/61 |
| 排名[A,A] | A只获得一次贡献 |
| 压缩后继续待确认退款 | operation_id与unknown状态仍可恢复 |
如何运行已有参考测试
在包根目录运行:
python -m unittest discover -s reference/tests -v
本实验主要参考测试类为RetrievalTests。已有测试默认验证reference/;测试通过不代表你的starter/实现通过。接入自己的实现时,将被测模块显式替换/注入,保持测试和领域契约不变,不要修改断言来迁就实现。
评分
权限与版本30;基线正确性25;引用与状态保留20;实验15;局限解释10。
出现跨租户泄露、未经批准的退款或伪造结果时,不以其他分数抵消。允许记录未完成的选修功能,但必须说明范围。
进阶挑战
用自建中文同义词改写集评估keyword召回。把“检索命中证据”和“答案正确”分别统计,查看改善前者是否真的改善后者。
提交前自查
保存代码版本、运行命令、输入数据版本、输出日志、失败案例与设计决策。解释至少一个被你否决的方案。没有运行的测试标记“未运行”,不写“预计通过”。参考解见对应答案。