阅读清单跑通了,不必立刻升级成“大而全的 AI 平台”。选一个自己会用的小功能,写下怎样才算做好,再动手。评估报告已有可运行版本;下面的分页、搜索和后台任务仍是扩展练习,并没有实现或部署。
想补哪一段,就挑哪一项
| 想理解什么 | 小项目 | 第一版边界 | 怎么检查 |
|---|---|---|---|
| 请求与数据库 | 给阅读清单加分页 | 按 ID 取下一页,不加账户 | 中间插入新记录,翻页不重复、不漏掉原有记录 |
| 搜索为什么找错 | 为自己选的 10 篇笔记做搜索 | 标题与摘要关键词搜索,不接 LLM | 手写 5 个查询和期望结果,观察同义词漏召回 |
| 评估怎样进入工程 | 运行评估报告后,再补分组门槛 | 固定样本,逐题比较新旧输出 | 总分上涨但某类退步,仍能按事先约定的规则拦下 |
| 为什么需要后台任务 | 批量导入一份文档清单 | 先本地队列和单 worker,不接付费 API | 中途退出后重启,重复任务不重复入库 |
这些不是难度排名。只想知道网站怎么上线,看前面的 CI/CD 一章就够;对 ML 更感兴趣,可以直接做评估报告。
搜索:先让错误看得见
挑 10 篇公开笔记,保存 id、title、summary、url,先用小 JSON 文件,不上向量数据库。给定“token 怎么切”,标题里只有 Tokenization,简单字面匹配可能找不到。这时补一个同义词映射就能看到变化,不必一开始就买 embedding API。
记录每个查询的前几个结果,不只测“接口返回了 200”。后面加 BM25 或 embedding 时,固定文档快照、查询和候选(candidate)数量,看看具体哪个查询改善、哪个变差。
如果要抓外站,还要处理许可、访问限制、文档版本和不可信内容。第一版直接用自己有权使用的文本,别让爬虫成为项目的全部。接着读 TF-IDF / BM25 或现有 RAG 小例子。
评估报告:把“涨了一分”拆开看
评估报告这一章已经把“改善两题、退步一题”做成了能运行的 CLI 和网页,缺题、重复 ID、错误标签类型都会报错。先跑通它,不用再从空文件起步。
下一步可以补一个分组门槛:整体分数不下降,但非关键的 evidence 组退步时,也要拦下(no-evidence 两题都是关键题,一退步现有规则就会拦下)。先写出会失败的样例,再改判断逻辑,最后把报告里的规则说明一起改掉。不要只改返回码,页面却仍说旧规则。
也可以增加运行时间和 token 用量,但别把不同单位直接相加变成一个“综合分”。想进一步估计可靠性,再读评估协议;小样本里的一次上涨,不是模型质量已被证明。
后台任务:接收成功,不等于已经做完
假设一次导入要处理 100 个文件。如果让浏览器一直等,关掉页面就不知道进度。可以先返回任务 ID 和 queued,由 worker 去做;页面再查询 running / succeeded / failed。
| 变化 | 需要补的规则 |
|---|---|
请求返回 202 |
只说明任务已接收,不显示“导入完成” |
| worker 中途退出 | 任务状态(task state)要能恢复,不能只在内存里 |
| 同一个任务重试 | 用稳定的文件 / 版本标识避免重复写入 |
| 某个文件失败 | 记录失败项和原因,不用整批“成功”掩盖 |
先用本地文件或 SQLite 存任务状态,把重启实验做通,再考虑专门的队列系统。锁、租约、重试间隔和任务幂等都有用,但不用在第一版同时解决所有分布式问题。后训练的中断恢复是另一种场景,可以对照哪些状态不能丢。
做完一个,比开十个坑更有用
给自己的 README 留四样东西:运行命令、一次正常结果、一个失败例子、还没解决什么。再请朋友只按说明跑一遍,看看他卡在哪儿。这个反馈通常比再加一个首页动效更能说明项目哪里还没讲清。
本页术语 2
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容
- 任务状态 task state
- 执行任务时保存的目标、已知信息、进度和待确认事项