SKILL 20 / RESEARCH · DEEP-DIVE

把研究流程写成 Workflow Skill

六步清单谁都能抄 · 但只有「引用核验」这一步机器能替你跑

2026-09-21 · BigCat

上一期讲怎么挑现成的研究 skill。这期讲怎么把研究流程写成一个——主角是两个真能跑的校验脚本,以及官方 best-practices 里那段几乎没人注意的六行清单。

前置 → Skill 19 研究类 Skills 榜单(本期三份实现的来路)

// WHY THIS MATTERS

上一期的六条判据里有一条是「有没有机器能跑的校验」。这期沿着那条往下走。研究流程里唯一能自动判对错的环节是引用核验——链接打不打得开、DOI 存不存在、正文编号在不在参考文献表里,这三件事不用读内容就能判。把它钉在一份清单的末尾,再让它失败时回跳,你就有了一个 workflow skill。官方 best-practices 把这两件事分写在「Use workflows for complex tasks」和「Implement feedback loops」两节,199-biotechnologies/claude-deep-research-skill 则把它做成了两个真能跑的 Python 脚本。本期把这两样拼起来。

// 01

它替你干掉什么:模型跳步,而你事后看不出来

论断:一份研究报告最贵的错不是写错,是「它跳过了核对那一步,而你看不出来」。清单让跳步变得可见,校验脚本让跳步变得会报错。

官方那六行可以整段抄走

在 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 个、内部链接是否有效。

出处 · 199-biotechnologies/claude-deep-research-skill(据 GitHub 仓库页,2026-09 为 1.1k 星,MIT,版本 2.3.1)
// 02

机制:清单负责不跳步,脚本负责会报错

论断:这套东西之所以有效,是因为它把研究里最含糊的一句话——「我核过了」——换成了一个有退出码的事实。
问题 → 方法 → 来源 → 证据 → 综合 → 存疑 │ ↑ └── 引用登记表 ────┘ ← 可机器校验的中间产物 │ verify_citations.py → 退出码 1 就回跳,不许往下走

三个零件,官方各给了名字

  1. workflow / checklist:把复杂任务拆成有序步骤,并让模型把清单抄进回复里逐条勾。治的是跳步。
  2. feedback loop:官方写成 Run validator → fix errors → repeat,并强调 Only proceed when validation passes。治的是「跑了校验但不理会结果」。
  3. plan-validate-execute:先产出一份可机器校验的中间产物,验过了再执行。官方给的场景是批量与破坏性操作——研究其实是同一类:一旦成稿,错误就被抄了几十遍。

研究流程里那份中间产物是引用登记表

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 既写又验,验的是自己的记忆;换个角色,它手上就只剩原文和成稿两份东西。

最常见的半成品:清单写了,末尾没有回跳。模型会老老实实把五个框都勾上,包括「Step 5: Verify citations」那个——勾框不等于核过。没有退出码的校验步,和没写是一样的。
// 03

真实用法与边界:三条落法,一条死线

论断:你不必从零写。三份现成实现各解决一段,挑着拼比自己造快得多——但没有一份能替你判「这句话是不是那篇文章说的」。

按投入从小到大

把核验接到真东西上

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)那一步既不能省,也没法自动化。
// 04

代价与替代品:三笔账,和三条更便宜的路

论断:这套东西的代价是误杀、很慢、很贵。前两笔有解,第三笔只能选择不付。

一、误杀

幻觉检测是启发式的:它把「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,且该文明说这种结构不适合紧耦合任务。一份深研报告的成本按一次编译预期,不是按一次提问。

不写这个 skill,你还能怎么办

  1. 六行清单贴进 prompt。一次性调研这就够了,别为一次任务建目录。
  2. 把校验脚本单独留着当命令行工具。它不依赖任何 skill,交稿前手动跑一次,收益的八成就到手了。
  3. 只写一条最小约束进 CLAUDE.md:凡是要拿去做决定的数字,必须挂来源与来源页自己的日期。这条不用任何工具,也拦得住大多数事故。

// 一页选购卡

先做这三件:① 抄官方 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 目录 · 以为过了引用核验就等于事实核对过了。

// 术语表

workflow / checklist pattern(清单模式)
官方 best-practices 的写法:把多步任务写成一份可勾选清单,让模型抄进回复里逐条推进。原话是它能防止模型跳过关键校验。
feedback loop(反馈闭环)
跑校验 → 改 → 再跑,直到通过才往下走。研究流程里那个校验就是引用核验。
plan-validate-execute
先产出可机器校验的中间计划,验过再执行。本期对应的中间产物是引用登记表。
citation registry(引用登记表)
独立于正文的一份来源账:去重编号、打类型标签、记下被丢弃的源与理由,定稿后正文只许从表里引。
AS_OF
在流程开头显式定下的「截至日期」。所有时效性论断都要挂来源日期,超出新鲜度窗口的要降置信。
CitationAgent
Anthropic Research 系统里负责引用归位的独立 agent:研究循环结束后读原始资料与成稿,定位每条引用该挂哪儿。
baseline eval(基线对比)
同一个提示分别在「带 skill」和「不带 skill」下各跑一次再比。不做这一步,你无法区分是 skill 有用还是模型本来就会。

// 延伸阅读