主题
ADR-0002: Citation 协议设计
- 状态:Accepted
- 日期:2026-04-28
背景
投研输出必须可溯源。LLM 容易编造数字,必须有强制约束。候选方案:
- Inline source IDs —
[src:tushare:daily:2024-Q3]自由 prose 中带 tag - Structured output with mandatory
citefield — JSON schema 强制 cite - Two-pass: Agent writes, Verifier checks — 自由生成 + 第二轮 LLM 审核
- Competence-anchored — 每个声明锚到 Competence ID
决策
采用 2 + 4 的组合:tagged union cite 字段同时支持 kind: "tool" 和 kind: "competence"。
详见 Citation 协议。
理由
- 强 schema 约束 > 弱 inline tag — JSON schema 容易被代码校验,inline tag LLM 容易丢
- Competence-anchored 让知识可溯 — 不只是数字,定性判断也带来源
- 不需要第二个 LLM — 大部分编造(90%+)能被确定性代码抓到
取舍
❌ 输出冗余度高 — 每个数字都包一层 {value, cite} JSON,不能直接当 prose 输出
- 缓解:渲染层把结构化数据转成人类可读的报告(保留可点击的 cite link)
❌ 要求 LLM 输出严格 JSON — 模型的 instruction-following 要够强
- 缓解:Model Router 把综合写作路由到强模型 (Claude Opus / GPT-4)
❌ Competence 注册需要前置工作 — 得先把领域知识列出来
- 缓解:MVP 不要求覆盖完整域;从最常用的 10-20 条开始,按需扩展
为什么不用 LLM Critic
投研里最高频失败是编造数字,不是推理错。编造数字 90% 能被确定性代码抓到:
- Schema check
tool_call_id解析- 值匹配(cite 的值 = tool 返回值)
competence_id解析
LLM Critic 多消耗 3-5x token、引入 judge bias、自己也会 hallucination。先用代码兜底,eval 数据证明不够时再加 LLM 层。
影响
- 所有 Skill 输出必须符合
citeschema - Verifier 是 MVP 的核心组件,不是 nice-to-have
- 数据层 (01) 必须暴露
tool_call_id与 fetch 元数据 - Competence 注册机制是 Hermes 接入工作的关键依赖