上一期讲怎么挑现成的研究 skill。这期讲怎么把研究流程写成一个——主角是两个真能跑的校验脚本,以及官方 best-practices 里那段几乎没人注意的六行清单。
上一期的六条判据里有一条是「有没有机器能跑的校验」。这期沿着那条往下走。研究流程里唯一能自动判对错的环节是引用核验——链接打不打得开、DOI 存不存在、正文编号在不在参考文献表里,这三件事不用读内容就能判。把它钉在一份清单的末尾,再让它失败时回跳,你就有了一个 workflow skill。官方 best-practices 把这两件事分写在「Use workflows for complex tasks」和「Implement feedback loops」两节,199-biotechnologies/claude-deep-research-skill 则把它做成了两个真能跑的 Python 脚本。本期把这两样拼起来。
在 Skill authoring best-practices「Use workflows for complex tasks」节里,官方给的第一个例子恰好就是研究,而且是「不含代码的 skill」那一类:
# 官方原文示例:Research synthesis workflow
Research Progress:
- [ ] Step 1: Read all source documents
- [ ] Step 2: Identify key themes
- [ ] Step 3: Cross-reference claims
- [ ] Step 4: Create structured summary
- [ ] Step 5: Verify citations
关键不在这五行,在它后面那句:If citations are incomplete, return to Step 3. —— 末尾这步失败要回跳,清单才是闭环,否则只是排版。官方对这段的评语是 Clear steps prevent Claude from skipping critical validation.
# 主角:本期唯一把「校验→修→重跑」做成真脚本的实现
git clone https://github.com/199-biotechnologies/claude-deep-research-skill.git ~/.claude/skills/deep-research
pip install -r ~/.claude/skills/deep-research/requirements.txt
# 第一条立刻能跑的用法:不用等它写报告,先拿它验你手上任何一份 md
python ~/.claude/skills/deep-research/scripts/verify_citations.py --report report.md --strict
python ~/.claude/skills/deep-research/scripts/validate_report.py --report report.md
这是本期最该先跑的一条命令。verify_citations.py 不要任何 API key(走 doi.org 的免费解析),退出码 0 过 / 1 不过。拿你上周那份 AI 写的调研报告喂进去,多半当场就能看见几条打不开的链接。
它到底验什么(据仓库 main 分支 scripts/verify_citations.py,2026-09):DOI 能否在 doi.org 解析并取回元数据;报告里写的标题/年份与元数据相似度低于 50% 判 mismatch;URL 发 HEAD 看是否 200;外加一组幻觉启发式——「A Study of…」这类通用学术标题模板、tbd/todo 占位、2000 年前的论文却提到 AI/GPT、未来年份、近年文献却既无 DOI 也无 URL。--strict 下任何一条可疑或未验证都判失败。
另一半是结构:validate_report.py 跑 9 项检查——Executive Summary 在不在、字数是否落在 50–400、8 个必需章节齐不齐、正文引用编号有没有对应条目、编号连不连续、有没有 TBD/TODO、有没有生成被截断的痕迹、全文是否低于 500 词、去重来源是否少于 10 个、内部链接是否有效。
daymade/claude-code-skills 的 deep-research 把它放在 P3:按证据家族合并来源、按首次出现编 [n]、给每条打上类型(official / academic / secondary-industry / journalism / community)与可达性标签,并记下被丢弃的源和丢弃理由,且这些源在 P5 起草时不得再出现。同一份 SKILL.md 里另有两条值得单抄:P0 显式设 AS_OF 日期、所有时效性论断都挂来源日期并按新鲜度降置信;以及一句写死的禁令——Lead agent never invents URLs; every locator must come from an actual retrieval.
Anthropic 的 Research 系统在研究循环结束后,把全部资料连同报告交给一个独立的 CitationAgent,由它去定位每条引用该挂在哪(据 Anthropic 工程博客《How we built our multi-agent research system》,2025-06)。道理很朴素:同一个 agent 既写又验,验的是自己的记忆;换个角色,它手上就只剩原文和成稿两份东西。
.py 不依赖它的流程,对任何 markdown 报告都能跑,和谁写的无关。要流程还是只要脚本,可以分开决定。daymade/claude-code-skills(据 GitHub 仓库页,2026-09 为 1.4k 星、70+ 个 skill 目录,MIT)拿它的 P3 登记表——只拷 deep-research 一个目录,别整装;Weizhena/Deep-Research-skills(据 GitHub 仓库页,2026-09 为 2.2k 星,MIT)拿它的两阶段人工闸门——第一阶段只产出大纲、等你点头,第二阶段才逐条开搜。后者中英各一套,Codex 与 OpenCode 也能装;代价是手工 cp -r skills/research-en/* ~/.claude/skills/ 外加 pip install pyyaml。54yyyu/zotero-mcp(据 GitHub 仓库页,2026-09 为 5.1k 星,MIT):uv tool install zotero-mcp-server,再 zotero-mcp setup。它把核验从「链接能打开」升级到「这条在我库里、我读过」:按 DOI / URL / ISBN / BibTeX 加论文,读 PDF 全文与指定页范围,直接取 BibTeX,可选装 scite 扩展拿引用计数与撤稿提醒——撤稿是纯网页核验给不了的那一格。什么时候别装:你不用 Zotero,或你的来源本来就是网页而非文献,那它只是多占工具位。
原文从哪来:openags/paper-search-mcp(二十余个学术源,多数不要 key)与 blazickjp/arxiv-mcp-server(论文落盘、按节读原文、出 BibTeX)上期已拆过,这里只补一句——校验脚本只能告诉你这个 DOI 存在;要判断「这句话是不是那篇文章说的」,你得把原文真的取回来。
anthropics/skills 的 skill-creator(/plugin marketplace add anthropics/skills)给了现成的做法:测试用例存 evals/evals.json;每条用例同一轮里开两个 subagent——一个带 skill、一个不带作 baseline;跑完让 agents/grader.md 逐条判定,再 python -m scripts.aggregate_benchmark 聚合出 pass_rate、时间、token 的均值与标准差,最后 eval-viewer/generate_review.py 起个页面让你人工过一遍。它还有一句该贴墙上的话:主观产出别硬上断言。研究类正好一半一半——引用核验写成断言,结论质量留给人看。
verify_citations.py 能确认 DOI 存在、URL 返回 200,它不检查这句话是不是那篇文章说的。一条真实链接挂着一句它并不支撑的论断——这是研究类最高频的假阳性,而它能通过全部自动校验。所以清单里 Step 3(cross-reference claims)那一步既不能省,也没法自动化。幻觉检测是启发式的:它把「A Study of…」「Recent Advances in…」这类标题模板当可疑信号,可真有论文就叫这个名字。--strict 下这类直接判失败,于是你花时间去「修」一条本来没错的引用。建议先不带 --strict 跑一遍看清单,人判完再决定要不要把它接进流水线。
每条引用都要发网络请求:DOI 走 doi.org 内容协商,URL 发 HEAD,超时 10 秒,条目之间还有 0.5 秒限速。50 条引用就是分钟级。别把它放进每轮对话,放在交稿前跑一次。
流程层多半是 orchestrator + subagents 的结构。据 Anthropic 工程博客《How we built our multi-agent research system》,2025-06:Opus 4 主 agent 配 Sonnet 4 子 agent 的组合,在其内部研究评测上比单个 Opus 4 高 90.2%,代价是约 15 倍于一次普通对话的 token,且该文明说这种结构不适合紧耦合任务。一份深研报告的成本按一次编译预期,不是按一次提问。
先做这三件:① 抄官方 best-practices「Use workflows for complex tasks」那五行 Research synthesis workflow 清单,连同末尾 return to Step 3 的回跳。② git clone https://github.com/199-biotechnologies/claude-deep-research-skill.git ~/.claude/skills/deep-research,先只用 scripts/verify_citations.py,拿它验一份你已经写完的报告。③ 从 daymade/claude-code-skills 的 deep-research 抄走 P3 引用登记表那一段(含「记录被丢弃的源与理由」和 AS_OF 日期规则)。
按需再加:Weizhena/Deep-Research-skills(要在大纲处卡一道人工闸门)· 54yyyu/zotero-mcp(核验要接自己的文献库、要撤稿提醒)· openags/paper-search-mcp 与 blazickjp/arxiv-mcp-server(要把原文真的取回来核)· anthropics/skills 的 skill-creator(要给这套流程做 baseline 对比验收)。
明确别做:把 --strict 直接接进流水线而没人工过一遍 · 把 verify_citations.py 放进每轮对话 · 为一次性调研新建一个 skill 目录 · 以为过了引用核验就等于事实核对过了。
[Unverified](据仓库页,2026-09 为 1.1k 星,MIT,v2.3.1)--strict 与退出码 0/1;README 原话 No API keys — uses free DOI resolver and heuristicsAS_OF 规则;Lead agent never invents URLs(据仓库页,2026-09 为 1.4k 星、70+ 目录,MIT)uv tool install zotero-mcp-server;读 BibTeX 与 PDF 页范围、按 DOI/ISBN 入库、可选 scite 引用计数与撤稿提醒(据仓库页,2026-09 为 5.1k 星,MIT)evals/evals.json、同轮双跑 baseline、agents/grader.md、scripts.aggregate_benchmark、eval-viewer/generate_review.py