切换深色模式
10 · 交付参考项目:让别人能运行,也能看懂失败
前置:08、09。本课预计 3–4 小时。交付:可独立解压运行的项目包、真实文章回放、检索报告和结课覆盖表。
这份参考项目演示了从真实文件到候选回答的闭环。它不是上线服务:没有真实认证、写操作、持久化任务或自动语义评分。cli.mjs 默认回放读取第一个结果;新增的 结课参考解答提供三来源比较、冲突与缺证的完整预编排案例。独立毕业作品还要实现自己的策略与评估。
1. 项目结构与阅读顺序
下载 完整项目包,解压后会看到 START-HERE.txt 与 docs。只需 Node.js,无需安装 npm 包;所有文件保留与课程仓库一致的相对路径。
text
docs/
notes/delayed-tasks.md 真实课程笔记
java/jvm/heap.md 第二个检索主题
public/examples/research-project/
cli.mjs 配置、回放与可选在线入口
knowledge.mjs 解析、检索、授权与版本
runtime.mjs 异步控制循环
claude.mjs Messages API 适配器
retrieval-eval.mjs 真实文章召回评测
project.test.mjs 隔离临时数据的测试
capstone-eval.mjs 十二类完整参考案例回放
capstone-reviews.json 与输出摘要绑定的参考判定
capstone.test.mjs 案例与评审版本测试
fixtures/ 七份原创合成资料先看 cli.mjs 中的回放器,再看 runtime 的单轮分支,然后看 knowledge 的读取;最后读适配器。这样能先理解“期待返回什么”,再核对“如何限制它”。
2. 三个命令形成最小交付证据
在解压后的根目录运行:
powershell
node docs/public/examples/research-project/cli.mjs "延时任务 故障 恢复"
node docs/public/examples/research-project/retrieval-eval.mjs
node --test docs/public/examples/research-project/project.test.mjs第一次输出实际片段、版本和轨迹;第二次输出开发查询集指标;第三次验证执行与适配契约。它们回答不同问题,不合并成一个“准确率”。
额外运行 node docs/public/examples/research-project/cli.mjs "JVM 回收",检查来源属于 JVM 笔记。再换成一个不存在的英文词,观察资料不足路径。若查询含“任务”等常见词而仍有结果,这可能是词项基线过宽,不是工具报错。
3. 正常轨迹应怎样讲解
| 阶段 | 本项目保存的证据 | 可以说明的事实 |
|---|---|---|
| 启动 | snapshot、promptVersion、question | 这次任务所用数据与提示词标识 |
| 模型或回放请求 | modelCalls、durationMs、usage | 做过几次决策,请求是否得到结果 |
| 搜索 | 查询参数、候选、截断标记 | 返回哪些候选,不代表已读正文 |
| 读取 | ID、revision、原文和行号 | 读取过该快照的资料 |
| 提交 | claims 与 citations | 引用形状有效,待语义复核 |
| 停止 | status、reason、总时长 | 为什么没有继续调度 |
默认回放有三条动作记录,第三条是 submit_answer。旧基础示例把 final 放在工具之外,所以只有两条工具记录。指标比较前先统一口径,不能说“新系统多调用一次检索”。
4. 与结课任务逐项对照
| 任务 | 参考项目提供的证据 | 学员还要补什么 |
|---|---|---|
| C01 正常问题 | 真实文件搜索读取,引用结构测试 | 对综合回答作语义与任务满足检查 |
| C02 第二主题 | JVM 回放与测试 | 自己加入的新主题及问法 |
| C03 无资料 | 空查询结果结束测试 | 检查合理同义表达是否被误拒绝 |
| C04 缺容量 | 原文章缺容量数据 | 在线模型或自实现策略的真实输出与人工判定 |
| C05 私有资源 | 猜 ID 拒绝,私有正文不外泄测试 | 真实登录集成若作为作品承诺 |
| C06 版本改变 | 文件修改后旧引用拒绝测试 | 刷新索引的产品策略 |
| C07 文档注入 | 未允许的工具拒绝 | 将注入放进文档后的模型路径评测 |
| C08 循环预算 | 轮数、重复 ID、期限和取消测试 | 更丰富的无信息增量检测 |
| C09 无关结论 | 未读引用拒绝,候选答案待复核 | 合法引用但无关内容的人工拒绝记录 |
| C10 新问法 | 不预填保留题结果 | 由验收人出题、实跑并保留轨迹 |
| C11 条件冲突 | 引用可以映射多个已读片段 | 冲突资料、比较策略与语义标签 |
| C12 缺用户条件 | request_input 的结构与暂停测试 | 模型是否在恰当时机澄清 |
表中的“还要补”是结课作品的工作量,不是自动化测试已经替你完成的部分。基础参考项目与完整业务研究能力的差异应在演示开头说明。
需要参考写法时,运行 node docs/public/examples/research-project/capstone-eval.mjs,阅读 完整解答。其中 C04、C09、C11、C12 提供具体的缺证、错误、条件冲突和澄清文本;这些公开题不能再充当自己的保留集。
5. 运行故障复盘:一次超时的责任归属
假设工具迟迟不返回。先看 modelCalls 是否已收到模型结果,再查 trace:若读操作因 deadline 停止,说明候选动作已产生,但正文没有及时成为证据。不能给答案补上一个“应该读到”的片段。
复盘至少写明:起始预算、故障位置、已执行动作、未确认结果、终态、是否允许重试。对本课只读文件,重跑可能看到新版本;新运行应记录新快照。若未来改为外部发布,必须先查询外部操作状态,不能照搬读取重跑策略。
6. 为什么当前不提供崩溃恢复按钮
任务状态只在内存,进程退出就丢失。本项目保存的终态 JSON 是交付报告,不是可直接恢复的检查点。没有完整消息、调用意图、审批版本和去重规则时,给它加一个 resume 参数会造成错误安全感。
扩展恢复时先定义以下故障点,再实现存储:模型已返回但工具未开始;工具已开始但结果未记录;结果已记录但下一轮未开始;最终产物已保存但终态未保存。每个故障点都需要不同的恢复依据。
在只读版本中可先保存“已读来源版本 + 未完成目标”,恢复时重新校验来源后从新的决策轮继续。未来写操作需要独立业务幂等与结果查询。该扩展在课程中作为设计任务,当前源码不声称具备恢复能力。
7. 对照实验报告应该包含什么
用实验模板记录两个版本的唯一变化。至少报告各任务修复与回归、所有尝试的总消耗、未知 usage 数量、人工复核分歧,以及资料快照是否相同。
如果只把 deadline 从 60 秒改为 120 秒后成功次数增加,不能直接说“推理能力增强”。可能只是允许了更长执行和更多成本;需要结合任务价值判断。若某题因资料不存在而失败,增加时间通常不能补出证据。
8. 最后一次交付自检
把完整包解压到一个新目录,不共享旧输出,重新运行三条命令。检查源码下载、资料路径、环境说明和错误提示。让同伴用新问题测试,并在第一次失败时解释数据、策略还是执行边界出了问题。
合格交付应让读者知道:哪些命令确实执行过,哪些是模拟,哪些需要自己的模型账户,哪些能力尚未实现。下一步回到结课评分,用自己的作品补齐覆盖表中的剩余证据。