SKILL 21 / RESEARCH · DEEP-DIVE

来源接地与引用可信度

模型最会编的三样东西是 URL、引文和日期 · 治它的不是「请认真点」,是让它指得回去

2026-09-22 · BigCat

上一期把引用核验钉进了研究清单。这期往下一层:为什么核验之前,先得让模型的每一句话都有个能指回去的位置——以及官方已经把这件事做进 API 的哪几个字段里。

前置 → Skill 20 把研究流程写成 Workflow Skill(引用核验那一步的出处)

// WHY THIS MATTERS

上期结尾留了一条死线:引用核验 ≠ 事实核验——链接返回 200,不代表那句话是那篇文章说的。本期就从这条线往下走。接地(grounding)要解决的不是「模型知不知道」,而是「它说的这句,在哪份材料的第几个字」。这件事有三档答案:写进 prompt(最便宜、最不可靠)、装一个 skill(可移植、仍靠模型自觉)、用官方 API 字段(模型根本没机会编)。本期把这三档各点名几个真东西,最后给一张在它们之间取舍的判据表。

// 01

它替你干掉什么:那三样它几乎必编的东西

论断:模型编造的分布极不均匀。URL、逐字引文、日期这三样,是它在没有工具时编得最理直气壮的三样——因为它们格式规整、长得像它见过的一万条。

官方文档已经点名了治法

Reduce hallucinations 这页给了三条基本策略,每条都配一段可以整段抄走的 prompt:① 允许它说「我不知道」(原话 This simple technique can drastically reduce false information);② 长文先逐字摘引再分析(超过 2 万 token 的文档尤其);③ 写完回头给每句话找一条支撑引文,找不到就删——官方那段示例狠在最后一句:remove that claim from the press release and mark where it was removed with empty [] brackets. 另有四条进阶:chain-of-thought verification、best-of-N verification、iterative refinement、external knowledge restriction。这页免费、零依赖,是本期最该先读的东西。

然后装这两个 skill

# 官方出品:答完之后逼你回头看
/plugin marketplace add anthropics/skills
# discernment-nudge 在 skills/ 目录下,19 个官方 skill 之一

# 第一条立刻能跑的用法:让它先把引文摘出来,再让你自己挑
# 「先从这份文档里逐字摘出与 X 相关的原文,摘不到就说『没有相关引文』;
#  然后只基于这些引文作答,逐条标编号。」

discernment-nudge(官方):它不核验,它让你去核验。答完之后在回复末尾追加 A few things worth a second look: 加 2–3 个短问题,每个都指向回复里某个具体元素,而且写成「你可以照着原样问我」的样子。设计上有两条硬约束值得抄:一次对话最多提一次;以及一串明确的不触发场景——创意写作、闲聊、简单查询、纯解释性问题,还有「用户已经要求你核验、标注来源或标出不确定」时不要再提。什么时候别装:你要的是答案而不是追问,或者你已经在流水线里接了自动核验——它只会多一段你不会读的文字。

truth-first(Agensi marketplace):解决的是另一半——不许在没跑过的情况下声称「已完成」,要求先真实读取文件内容、配置、系统状态,再下结论。诚实交代:agensi.io 本期从本机网络被出口策略挡住,打不开页面,所以本期不给它的装机量数字,也不照抄它的安装命令——只记下它的定位。想要同一件事但能读到源码的,看下一节点名的两个 GitHub 实现。

出处 · anthropics/skills · skills/(据仓库目录页,2026-09 共 19 个 skill 目录,discernment-nudge 在列)
// 02

机制:能不能指回去,是个工程问题不是态度问题

论断:prompt 里写「请标注来源」,得到的是模型「生成」的来源;官方 Citations 得到的是 API「解析」出来的位置。这两者的可靠性不在一个量级。
prompt 说「请标来源」 → 模型生成一串看起来像引用的字符 → 可能不存在 skill 说「先摘引文」 → 模型生成引文 + 自己检查 → 靠自觉,可跳过 citations:{enabled:true} → API 解析出 char/page/block 位置 → 指针必然有效

官方 Citations:把引用从「生成」改成「解析」

在每个 document 上加 "citations": {"enabled": true},回复里的文本块就会带上 citation 对象。官方文档对比 prompt 方案时那句话是本期的核心:citations are guaranteed to contain valid pointers to the provided documents. 三件工程细节:

两个 server tool 各自的接地方式

web_search:{"type":"web_search_20250305","name":"web_search","max_uses":5}。引用是强制开的——官方原话 Citations are always enabled for web search,每条 web_search_result_location 带 url / title / cited_text(至多 150 字符),这三个字段同样不计 token。可用 allowed_domains 白名单把搜索钉在官方域上。什么时候别装:稳定知识别开——它按 $10 / 1000 次搜索计费,外加搜回来的内容全算输入 token。

web_fetch:本身不额外收费,但引用默认关,要自己写 "citations": {"enabled": true}。它有一条机制堪称本期最漂亮的设计:模型只能取回「此前在对话里出现过」的 URL——用户消息里的、客户端工具结果里的、前一次搜索或抓取结果里的。只出现在模型自己输出里的 URL 取不到,报 url_not_in_prior_context。它编的链接,物理上访问不了。(这条设计的本意是防数据外泄,官方对此有一段 Warning:在模型会处理不可信输入又同时接触敏感数据的环境里别开——参见本站 Skill 12。)用 max_content_tokens 卡住长文;一篇 100 kB 文档约 25000 token,一份 500 kB PDF 约 125000 token。

最常见的错觉:以为「我在 prompt 里要求它标来源了」就等于接地了。没有接地的引用,只是一串格式正确的字符。官方之所以要把 cited_text 做成由 API 抽取而不是由模型输出,正是因为模型输出的那一份本质上仍然是生成的。
// 03

真实用法与边界:四个候选,四条判据

论断:上面点名的东西解决的不是同一件事。先看你要挡住哪一类编造,再决定装哪个——装错类别,成本全付了、事故照发。

另外两个可以读源码的实现

daymade/claude-code-skills · fact-checker(MIT):拿一份已经写完的文档,逐条挑出事实性论断去核——上下文窗口大小、定价、版本号、发布日期、benchmark 分数这一类。它写死了一个来源优先级:产品官方页 > API 文档 > 官方博客公告 > GitHub releases,明说对第三方聚合站要留神。核不了的标 ❓ Unverifiable 并建议改成限定语气,而且改动必须经你点头才落盘。什么时候别装:主观判断、付费墙后的来源、有争议的事实——它自己声明这三类它做不了。

geigermatic/claude-craft · verify-claim(MIT,6 个 skill 之一):治的是它所谓 the single most expensive failure mode of AI-assisted coding: confident wrongness。做法是把断言变成可跑的证据:先把论断写成单一、可证伪的一句,再配一个核验手段(读文件 / grep / curl),跑完只报三种结论——Verified / Refuted / Inconclusive,带 file:line,而且不许提前概括(grep 出 3 条就报 3 条)。什么时候别装:它自己划了线——刚读过的文件里显而易见的事、错了也不疼的小事,别走这套流程。

michaelwjohnson/claude-skills · check-claims:三件套 occams-razor / check-claims / writing-review,claude plugin marketplace add michaelwjohnson/claude-skills 后逐个装。它的顺序论有意思——先跑剃刀再查事实,理由是「删改会改变哪些论断还承重,而且删完会留下本身往往就是错的孤儿句」。诚实的代价:据 GitHub 仓库页,2026-09 该仓 0 星、0 fork、main 上 11 次提交——它的价值在于那条顺序论可以直接抄进你自己的流程,不在于它被验证过。同理,frmoretto/source-of-truth-creator(CC BY 4.0)那张「过度自信陷阱」清单(未标注的估算、自评偏差、以缺席为证、示意数据当实测、过期未标)值得当检查表读,但据其仓库页 2026-09 仅 3 星、2 次提交——当读物,不当依赖。

判据:按「你要挡住哪一类编造」选

  1. 编的是链接/引文位置 → 只有 API 字段挡得住。文档在你手上用 Citations,网页用 web_search(强制引用)或 web_fetch(自己开)。skill 在这一格无能为力。
  2. 编的是数字与版本 → fact-checker,它的来源优先级就是为这格写的;再叠上期的 verify_citations.py 把链接层扫一遍。
  3. 编的是「我跑过了 / 我确认了」 → verify-claim 或 truth-first,它们要的是工具输出作证据,不是措辞。
  4. 你自己不会去复核 → discernment-nudge。它唯一的产出就是三个该复核的点,治的是人不是模型。
这一节的死线:二手聚合站不能当来源。本期核名时就撞上两次——SEO 站把 source-of-truth-creator 的失效模式数写成 6 个,仓库自己列的是 8 个;另一处把官方 web-artifacts-builder 写成 artifacts-builder。聚合站用来发现候选,名字、数字、条目数一律回 GitHub 目录或官方页核。
// 04

代价与替代品:接地不免费,而且有一格永远空着

论断:接地能证明「这句话出自这里」,永远证不了「这里说得对」。把这格当成已解决,才是真正的事故来源。

三笔账

不装任何东西,你还能怎么办

  1. 抄那三段官方 prompt。「允许说不知道」「先摘引文再分析」「找不到支撑引文就删掉并留空 []」——零成本,覆盖掉大半。
  2. 给 CLAUDE.md 加一条硬规矩:凡是要拿去做决定的数字,必须挂来源与来源页自己的日期;名字一律以 GitHub 目录或官方页为准。(本仓这条规矩就是这么写的,本期正是靠它拦下了上一节那两处错名。)
  3. 把「取回来」当成硬前提:没真的 fetch 过的 URL 不许出现在成稿里。web_fetch 的 url_not_in_prior_context 是把这条做成了错误码——你也可以只把它做成自己的一条规矩。
那一格永远空着:Citations 保证指针指得回去,verify_citations.py 保证 DOI 能解析,web_fetch 保证链接真取过——没有一样能判断那段被正确引用的原文,是否支撑你写下的那句结论。这一步至今只能人做。

// 一页选购卡

先做这三件:① 读 Reduce hallucinations,把「允许说不知道」和「找不到支撑引文就删并留空 []」两段 prompt 抄进你的模板。② /plugin marketplace add anthropics/skills,先只开 discernment-nudge,让它每次对话提醒你一次该复核什么。③ 你手上有文档要问的话,在 API 调用里给每个 document 加 "citations": {"enabled": true}——这是全场唯一能给出「必然有效的指针」的一档。

按需再加:web_search(要时效信息,且接受 $10/1000 次)· web_fetch + citations.enabled(已有 URL 要逐段引,且环境可信)· daymade/claude-code-skills 的 fact-checker(稿子里数字版本多)· geigermatic/claude-craft 的 verify-claim(挡「我跑过了」)· truth-first(同上,Agensi marketplace,装前自己打开 SKILL.md 读一遍)· 199-biotechnologies/claude-deep-research-skill 的 verify_citations.py(交稿前扫链接层)。

明确别做:在 prompt 里写「请标注来源」就当接地了 · 把 michaelwjohnson/claude-skills(0 星)或 source-of-truth-creator(3 星)当成验证过的依赖而不是读物 · 照抄二手聚合站给的名字与数字 · 以为过了接地与引用核验,结论就核对过了。

// 术语表

grounding(接地)
让输出的每句话都能指回某份具体材料的某个具体位置。它管的是「可定位」,不管「对不对」。
Citations(官方引用功能)
在 document 上设 citations.enabled 后,API 把引用解析成带位置的结构化对象。官方原话:指针必然有效。
char_location / page_location / content_block_location
三种引用位置类型,分别对应纯文本(字符下标)、PDF(页码)、custom content(内容块下标)。
cited_text
被引原文,由 API 抽取而非模型生成,不计入输入或输出 token。
url_not_in_prior_context
web_fetch 的错误码:该 URL 此前没在对话里出现过。模型自己编的链接因此取不回来。
load-bearing claim(承重论断)
verify-claim 的说法:你打算照着行动、错了要付真实代价的那种论断。只有这类值得走完整核验流程。
Verified / Refuted / Inconclusive
核验的三种结论。第三种最重要——它是「没查到」而不是「不成立」,混为一谈就会把缺证据当成反证。

// 延伸阅读