实现从问题到证据的最小链路:关键词检索、确定性排序、原文引用与无证据拒答。这里使用抽取式回答,后续可接入模型。
目标与约定
实现 solve(payload):payload 含 query 字符串和 documents 列表(每项唯一非空 id 和 text 字符串)。按空白拆分 query,casefold 后去重;每个词在 text 中出现记 1 分。取分数最高的文档,同分按 id 升序。返回 {answer: 完整原文, citations: [id]};空问题或无命中返回 {answer: '资料不足,无法回答', citations: []}。非法结构及重复 id 抛 ValueError,不修改输入。此基线不做语义理解或中文分词。
第一步:运行起始项目
需要 Python 3.12 或更高版本,仅使用标准库。解压后在此目录运行:
python verify.py
起始代码会报 NotImplementedError,这是待完成的任务。编辑 solution.py 的 solve 函数;sample.json 包含输入与预期输出。
第二步:逐步实现
- 用自己的话列出输入、输出和错误条件。
- 先通过样例,再处理空值、重复、顺序和非法类型。
- 每次小改动后重新运行 python verify.py。
第三步:遇到问题再看提示
先把输入校验与评分拆开。使用 (-score, id) 排序;只引用真正命中的文档。试试 '退款' 与 '退货',记录词面匹配的局限。
常见问题:当前目录错误会找不到 sample.json;默认不运行 reference.py。先看失败用例的输入和断言,不要只为了绿色结果删掉测试。
第四步:验收与复盘
python verify.py
python verify.py --reference
第一个命令检查你的实现,退出码 0 表示此套本地用例通过;第二个检查参考实现。参考实现放在 reference.py,建议先独立尝试。
新增至少两个测试,分别覆盖你遇到的边界和一次真实使用场景。记录命令输出、修改过程与实现局限,在本站项目页保存链接和复盘。本地通过结果由你自行记录,本站不接收或执行用户代码,也不会据此自动标记课程掌握。
延伸练习
将函数接入命令行或网页;为输入增加大小限制;尝试接入真实模型并比较确定性测试与生成效果评估的差别。本项目完成不依赖模型或第三方服务。