{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}

Grounded Citations

让回答和文档锚定在带引用、可验证的来源上。

Skill 元数据

来源内置(默认安装)
路径skills/research/grounded-citations
版本1.2.0
作者Hermes Agent + Teknium
许可证MIT
平台linux, macos, windows
标签Research, Citations, Grounding, Sources, Web, Reports
相关 skillarxiv、pdf、reddit-reading、rss-feeds、youtube-content

参考:完整 SKILL.md

INFO

以下是 Hermes 在触发该 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。

Grounded Citations

每条取自外部来源的论断都得到行内编号引用和一个 Sources: 列表,Perplexity 风格。一个账本脚本掌管 url → [n] 映射,因此编号和 URL 来自检索,绝不靠记忆——模型只输出交到它手上的小整数。

对高风险工作,同一账本兼作事实核查链:逐字引文附到每个来源(除非逐字出现在取回的页面文本中否则拒绝),来自模型知识的论断标记 [unverified],verify --evidence 让任何引用来源不带证据的草稿失败。

本 skill 覆盖聊天中的回答、书面文档(markdown、PDF、docx、幻灯片)和研究报告。它不覆盖学术 BibTeX 流程——会议论文用 arxiv skill,本 skill 为其供料(见 references/citation-formats.md)。

何时使用

当回答或工件依赖你取回而非已知的信息时使用:

  • 研究、比较、新闻摘要、"X 的现状如何"
  • 你写到磁盘的任何引用、转述或报告外部事实的交付物——报告、简报、文档、deck、wiki 页
  • 用户会想核对你工作的事实调查
  • 必须归因冲突来源的多源综合

当检索只是另一任务的附带时跳过行内引用——编码中途快速查语法/版本、闲聊、创意写作。仅在用户合理会想要链接时提及 URL。

前置条件

标准工具集之外无。scripts/sources.py 是纯标准库 Python 3。检索来自任何已配置项:web_search、web_extract、browser_navigate 或 terminal(curl、CLI)。

账本位置:$HERMES_HOME/cache/citations/ledger.json(profile 感知)。按任务用 --ledger <path> 或 HERMES_CITATION_LEDGER 覆盖。

运行方式

S=~/.hermes/skills/research/grounded-citations/scripts/sources.py

python "$S" reset                                  # 起一个干净账本
python "$S" add https://example.com/a --title "A"  # 打印:[1]
python "$S" add https://example.com/b --title "B"  # 打印:[2]
python "$S" list                                   # 账本表
python "$S" render                                 # Sources: 块
python "$S" verify draft.md                        # 抓坏引用

add 幂等且 URL 归一化:同一页面在一个账本内总返回同一 id,因此跨多轮搜索/提取 id 保持稳定。

快速参考

动作命令
新任务用新账本sources.py reset
注册来源,拿其 idsources.py add <url> [--title T]
一次注册多个sources.py add <url1> <url2> ...
从 JSON 工具输出注册sources.py ingest results.json
给来源附逐字证据sources.py quote <id> --text "exact wording" --from page.txt
显示账本sources.py list [--json]
渲染 Sources 块sources.py render [--style markdown\|plain\|footnotes\|bibtex\|evidence] [--only 1,3]
只渲染草稿引用的sources.py render --cited-in draft.md
原地改写草稿的 Sources 块sources.py render --replace-in draft.md
检查草稿引用sources.py verify draft.md [--strict] [--min-coverage 0.6] [--evidence]

流程

① 在将产出锚定回答或文档的任务开始时重置账本。继续已有 id 在草稿中的工作时跳过重置——复用账本保持编号稳定。

② 检索时注册每个来源。 每次 web_search / web_extract / browser_navigate / fetch 后,把 URL 传给 sources.py add(或把裸 JSON 经 sources.py ingest 管道)。在写散文之前做。事后凭记忆注册,正是本 skill 要防止的失败模式。

③ 边写边引。 把括号 id(s) 紧放在来源支撑的每句之后:

Ice floats because it is less dense than liquid water.[1][2]
  • 括号前无空格;每个 id 单独括号。
  • 每句最多 3 个 id。按句引用,而非结尾一次性倾倒。
  • 只用账本返回的 id。绝不自造 id 或 URL。
  • 来自你自己知识的论断不引用。
  • 冲突来源:呈现两种读法,各带自己的 id。
  • 按来源所述引用确切数字、日期和名字;显式标记缺口("X 未找到来源"),而非抹平。

④ 用 sources.py render --cited-in <draft> 追加 Sources 块,使 id → URL 映射从账本机械生成,而非重打。对非 markdown 目标选匹配 --style,按 references/citation-formats.md 放置(docx 用脚注、PDF/LaTeX 用尾注、deck 用 Sources 幻灯片、wiki 输出用每页来源列表)。

⑤ 交付前验证——sources.py verify <draft> 在未知 id、与账本不符的 Sources 块、或(带 --min-coverage)引用过稀的散文上退出非零。修复并重跑。

⑥ 聊天回答 把草稿放在回复里走同样步骤:注册来源、行内引用、以渲染的 Sources: 列表结尾。短回答可用 sources.py render --only <ids> 渲染块,而非写文件。

多平台扫荡

"大家对 X 怎么看"/"在全网研究 X"不是一次 web_search。跨来源类型扇出,并行收集,然后综合,每条论断归因到它来自的平台:

来源类型路线增添什么
开放 webweb_search → web_extract官方文档、文章、公告
社区讨论reddit-reading(search、thread)真实用户体验、抱怨、绕行方案
博客/release/changelogrss-feeds(read、discover)带日期的一手帖子、版本历史
视频youtube-content教程、demo、演讲
代码terminal 配 gh search repos / gh search issues实现、未决 bug
X/Twitterxurl(需 API 访问)公告、开发者闲谈

reddit-reading 和 rss-feeds skill 可选。缺失时,用 hermes skills install official/social-media/reddit-reading 或 hermes skills install official/research/rss-feeds 安装后再用。

路由到达时把每个 URL 注册进账本(步骤②)。把观点和测量分开:Reddit 帖是用户报告某事物的证据,而非它为真;配一手来源或标为情绪。按平台报告覆盖缺口("Reddit 搜索未返回 3 月以后的新内容"),而非静默收窄到能用的。

事实核查模式

对读者必须能核对链条的工作——医疗、法律、金融、安全、争议论断,或用户要求事实核查时——从引用升级到证据:

① 每来源附逐字引文。 提取页面后,把其文本存文件,附承载每条论断的句子:

python "$S" quote 1 --text "Ice is about 9% less dense than liquid water." --from page1.txt

除非引文逐字出现在证据文本中(对空白、大小写和 markdown 标记不敏感——提取文本中如 _[ERAP1](https://…)_ 的行内链接匹配读者看到的纯散文),否则被拒绝,因此转述或记错的数字不能冒充证据。从取回文本复制粘贴;绝不重打。按读者看到的样子引用句子——匹配器替你看穿提取器标记,因此你不必在引文中复现链接语法或转义星号。

② 用 [unverified] 标记模型知识论断。 你无法找到来源的承重论断得到显式标记而非引用:

The refactor likely predates the 2.0 release.[unverified]

verify --min-coverage 把 [unverified] 句子计为已覆盖——目标是每条论断有声明出处,而非每句一个引用。关键论断能查就查;[unverified] 留给真正查不了的,且以 [unverified] 标记为主的事实核查交付物应在摘要里说明。

③ 对照第二个独立来源交叉核对争议事实。 两来源不一致时,用各自 id 和引文引用两种读法,说明你权重哪个及为何。一个来源是报道;两个独立来源是佐证。

④ 用证据门验证并渲染证据块:

python "$S" verify report.md --evidence --min-coverage 0.5
python "$S" render --style evidence --replace-in report.md

若任何引用来源无附引文,--evidence 让草稿失败。evidence 渲染样式在每个来源 URL 下打印其引文,因此交付物呈现 论断 → 来源 → 确切支撑文本,不凭信任。用 --replace-in <draft> 原地改写既有 Sources 块(幂等——多附引文后安全重跑);--cited-in 改为打到 stdout。两者都发标题 ## Sources(--style plain 发 Sources:)。

--min-coverage 计什么。 覆盖率为 带声明出处的句子 / 散文句子。散文句子是 Sources 块之后 4 词以上的非空行片段;标题(#)、表行(|)和围栏代码被丢弃;块引用标记被剥离。出处由 [n] 引用或 [unverified] 标记声明,因此同时带两者的句子计一次。先不带阈值跑 verify,读 info: stats: 行看计数再选数字。

常见陷阱

  • 写完才注册。 账本必须从工具输出填充,而非从草稿重建——那会重新引入编号本已消除的幻觉 URL 风险。
  • 任务中途重编号。 绝不手编草稿中 id。id 是账本身份;草稿引用 [4],[4] 就必须保持那个来源。只在任务之间跑 reset。
  • 把 URL 重打进 Sources 块。 总是 render。手打 URL 是未验证论断。
  • 把搜索片段当读过页面引用。 web_search 描述只支撑它字面所说的。论断需要正文时引用提取的页面——先 web_extract。
  • 过度引用。 一句三个 id 是上限;每个从句都引用让文本不可读,并掩盖哪个来源承重。
  • 在代码/配置工件中引用账本。 来源注释属于散文交付物和文档头,不在生成代码内。
  • 并行子代理。 每个子代理有自己工作目录;若输出要合并,用 --ledger(或 HERMES_CITATION_LEDGER)把它们全指向一个账本,否则 id 冲突。
  • 从片段而非页面引用。 证据引文必须来自提取的页面文本,而非搜索结果描述——先 web_extract,存文本,再 quote --from 该文件。
  • 把转述塞进 quote --text。 逐字检查会拒绝;修法是找真句子,而非改写到匹配。
  • 把 [unverified] 当逃生舱。 它标记真正无法找源的罕见论断;若大多数句子都带它,任务需要更多检索,而非更多标记。
  • 手编 Sources 块。 用 render --replace-in <draft>;自己切片文件会有过期或重复块的风险,verify 随后标记。

验证

python "$S" verify report.md --strict --min-coverage 0.5

绿意味着:草稿中每个 [n] 在账本存在,Sources 块恰好列出引用 id 及其账本 URL,且带来源句子的引用比例达阈值。即使退出码 0 也读警告——未引用的已注册来源通常意味着某论断在编辑中丢了归因。