上一期把引用核验钉进了研究清单。这期往下一层:为什么核验之前,先得让模型的每一句话都有个能指回去的位置——以及官方已经把这件事做进 API 的哪几个字段里。
上期结尾留了一条死线:引用核验 ≠ 事实核验——链接返回 200,不代表那句话是那篇文章说的。本期就从这条线往下走。接地(grounding)要解决的不是「模型知不知道」,而是「它说的这句,在哪份材料的第几个字」。这件事有三档答案:写进 prompt(最便宜、最不可靠)、装一个 skill(可移植、仍靠模型自觉)、用官方 API 字段(模型根本没机会编)。本期把这三档各点名几个真东西,最后给一张在它们之间取舍的判据表。
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。这页免费、零依赖,是本期最该先读的东西。
# 官方出品:答完之后逼你回头看
/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 实现。
discernment-nudge 在列)在每个 document 上加 "citations": {"enabled": true},回复里的文本块就会带上 citation 对象。官方文档对比 prompt 方案时那句话是本期的核心:citations are guaranteed to contain valid pointers to the provided documents. 三件工程细节:
char_location(字符下标,0 起);PDF 抽文本后切句,给 page_location(页码,1 起);custom content 不再切分,给 content_block_location(块下标)。cited_text 不计入输出 token,回传时也不计入输入 token。所以「让它输出逐字引文」这件事,用 API 字段反而比用 prompt 便宜。title 与 context 会喂给模型但不算可引内容;citations 必须在一次请求里的全部 document 上要么都开要么都不开。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。
cited_text 做成由 API 抽取而不是由模型输出,正是因为模型输出的那一份本质上仍然是生成的。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 次提交——当读物,不当依赖。
web_search(强制引用)或 web_fetch(自己开)。skill 在这一格无能为力。fact-checker,它的来源优先级就是为这格写的;再叠上期的 verify_citations.py 把链接层扫一遍。verify-claim 或 truth-first,它们要的是工具输出作证据,不是措辞。discernment-nudge。它唯一的产出就是三个该复核的点,治的是人不是模型。source-of-truth-creator 的失效模式数写成 6 个,仓库自己列的是 8 个;另一处把官方 web-artifacts-builder 写成 artifacts-builder。聚合站用来发现候选,名字、数字、条目数一律回 GitHub 目录或官方页核。web_search $10 / 1000 次搜索,外加内容进 context 的输入 token;web_fetch 不收工具费,但一份 500 kB 的 PDF 就是约 125000 输入 token。Citations 本身只让输入 token 略增(系统提示与切分),输出侧反而省。fact-checker 的 ❓ 与 verify-claim 的 Inconclusive 都是诚实的,但一篇满是限定语的稿子也是没法用的稿子。只对要拿去做决定的论断开这套。web_fetch 的 url_not_in_prior_context 是把这条做成了错误码——你也可以只把它做成自己的一条规矩。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 星)当成验证过的依赖而不是读物 · 照抄二手聚合站给的名字与数字 · 以为过了接地与引用核验,结论就核对过了。
citations.enabled 后,API 把引用解析成带位置的结构化对象。官方原话:指针必然有效。web_fetch 的错误码:该 URL 此前没在对话里出现过。模型自己编的链接因此取不回来。verify-claim 的说法:你打算照着行动、错了要付真实代价的那种论断。只有这类值得走完整核验流程。citations.enabled;三种位置类型与索引起点;cited_text 不计 token;图片与扫描件 PDF 不可引;同一请求内必须全开或全关(2026-09)web_search_result_location 四字段;allowed_domains / blocked_domains;$10 / 1000 次搜索(2026-09)url_not_in_prior_context;citations 默认关;max_content_tokens;数据外泄 Warning;无额外工具费(2026-09)file:line 与「不许提前概括」;低风险场景明确不用(MIT,仓库共 6 个 skill)occams-razor / check-claims / writing-review 与「剃刀先于查证」的顺序论(据仓库页,2026-09 为 0 星、11 次提交,MIT)verify_citations.py 与引用登记表的完整拆解web_fetch 的那段 Warning