Claude API 引用(citations)怎么用:citations.enabled、三种文档类型、引用位置字段和与结构化输出的冲突

想让 Claude 回答时标出依据来自文档哪一句?按官方《Citations》讲清 citations.enabled 写法、纯文本 / PDF / 自定义内容三种文档的区别、返回里的 char_location 等字段、缓存、流式,以及与结构化输出不兼容的 400 错误。

NNathaniel bigo··原创首发·AI 辅助撰写
9 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 其他 账号
本文根据 Claude 开发者平台官方文档《Citations》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。本站(bigolab.com)不是 Anthropic 官方网站。

适用于谁

  • 做文档问答、合同 / 报告核对、知识库问答,需要让用户看到「这句话出自哪里」的开发者;
  • 不想自己用字符串匹配去反查依据的人。

基础调用见 /guides/claude-api-python-quickstart。联网搜索自带的引用是另一套机制,见 /guides/claude-api-web-search-tool;本文讲的是基于你自己提供的文档的引用。

结论先说

  1. 官方定义: 引用让 Claude 在回答关于文档的问题时,给出支持每个论断的原文段落,方便核对来源。官方写明所有活跃模型都支持。
  2. 打开方式: 在每个 document 块里加 "citations": {"enabled": true}。官方限制:一次请求里要么所有文档都开,要么都不开。
  3. 三种文档: 纯文本(按句分块,引用是字符位置)、PDF(按句分块,引用是页码)、自定义内容(不再分块,引用是内容块编号)。
  4. 目前只支持文本引用,不支持图片引用。 所以扫描件 PDF(没有可提取文字)无法被引用。
  5. 与结构化输出冲突: 开了引用又带 output_config.format(或已弃用的 output_format),API 返回 400。

启用引用的步骤

图:本站根据 Claude 官方文档:Citations 整理的示意图

一、最小请求

官方示例是一个纯文本文档。下面是把它转写成 Python 的版本(模型 ID 沿用官方示例中的 claude-opus-5-5):

python
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "document",
                    "source": {
                        "type": "text",
                        "media_type": "text/plain",
                        "data": "The grass is green. The sky is blue.",
                    },
                    "title": "My Document",
                    "context": "This is a trustworthy document.",
                    "citations": {"enabled": True},
                },
                {"type": "text", "text": "What color is the grass and sky?"},
            ],
        }
    ],
)
print(response)

字段说明(官方):

  • source 里的文字是可以被引用的内容;
  • title 和 context 是可选字段,会传给模型,但不会被当作引用来源;title 长度有限制,要放文档元数据(比如编号、来源)可以用 context,写成文本或序列化后的 JSON。

二、官方说的处理过程

  1. 你提供文档并设置 citations.enabled;
  2. 文档内容被「分块」,分块决定了引用的最小粒度。比如按句分块,Claude 可以引用单句,也可以把连续几句串起来引用一整段;
  3. Claude 返回带引用的回答:回答可能由多个文本块组成,每个文本块可以带一个支持该论断的引用列表。

引用的位置格式取决于文档类型:

文档类型适合分块引用格式
纯文本普通文字、散文按句字符位置(从 0 开始,结束位置不含)
PDF带文字的 PDF按句页码(从 1 开始,结束页不含)
自定义内容列表、逐字稿、特殊格式、更细粒度不再分块内容块编号(从 0 开始,结束编号不含)

文档编号(document_index)从 0 开始,按整个请求中所有文档块的顺序算(跨所有消息)。

官方的建议:想让 Claude 引用 RAG 检索片段里的具体句子,就把每个片段放进一个纯文本文档;如果不想再被分块,或想自己定义粒度,就把片段放进自定义内容文档。

三、返回里的字段

启用后,响应的 content 是一串文本块,带引用的块长这样(官方示例,省略部分字段):

json
{
  "type": "text",
  "text": "the grass is green",
  "citations": [
    {
      "type": "char_location",
      "cited_text": "The grass is green. ",
      "document_index": 0,
      "document_title": "Example Document",
      "start_char_index": 0,
      "end_char_index": 20
    }
  ]
}

三种引用类型:

  • 纯文本:char_location,字段 start_char_index、end_char_index;
  • PDF:page_location,字段 start_page_number、end_page_number;
  • 自定义内容:content_block_location,字段 start_block_index、end_block_index。

它们都带 cited_text、document_index、document_title。

怎么用在页面上: 按顺序遍历文本块,把有 citations 的块渲染成可点击的角标,点击时用 document_index 找到文档、用位置字段高亮原文。官方示例里的 cited_text 是为方便而提供的。

四、自定义内容文档

想控制引用粒度,用 source.type: "content",把每一块自己切好放进去(官方示例的结构):

json
{
  "type": "document",
  "source": {
    "type": "content",
    "content": [
      {"type": "text", "text": "First chunk"},
      {"type": "text", "text": "Second chunk"}
    ]
  },
  "title": "Document Title",
  "citations": {"enabled": true}
}

官方说明:不做额外分块,提供的块原样交给模型;引用的是块编号范围。

PDF 可以用 base64、URL 或 file_id 提供;官方说明扫描件没有可提取文本时不可引用。官方还指出 .docx、.xlsx 等 document 块不支持的格式,要先转成纯文本再放进消息;.csv、.md 这类纯文本文件可以用明确的 text/plain 类型上传。文件上传见官方 Files API 页面。

五、费用、缓存、流式

  • Token: 官方说启用引用会让输入 token 略有增加(系统提示词增加和文档分块导致),但对输出 token 很高效;cited_text 不计入输出 token,在后续对话轮中回传时也不计入输入 token。
  • 提示词缓存: 可以配合使用。官方说回复里生成的引用块不能直接被缓存,但它们引用的源文档可以;做法是在顶层的文档内容块上加 cache_control。缓存基础见 /guides/claude-prompt-caching。
  • 其他兼容: 官方说引用可以与提示词缓存、token 计数、批量处理配合。
  • 流式: 引用以 content_block_delta 事件里的 citations_delta 类型到达,每个增量带一条引用,要追加到当前文本块的 citations 列表里。

六、想要结构化数据又要引用怎么办

启用引用后的常见问题

图:本站根据官方文档整理的示意图

官方明确:引用和结构化输出不兼容,因为引用需要在文本输出里穿插引用块,而结构化输出要求严格的 JSON 模式。同时用会返回 400。

官方给的替代办法:让 Claude 每个字段一行回答,例如 field: value,并要求每行都引用文档;然后在你的代码里把行解析成结构化数据。官方提示词示例:

text
Extract these fields from the document: grass_color, sky_color.
Answer with one line per field in the form "field: value", and cite the document for each line. After the colon, write only the value, with no explanation or quotation.

官方还提醒两点:

  • 避免只要 JSON 的提示词,例如「只返回一个 JSON 对象,不要其他文字」。这样的请求能成功,但回答里可能很少甚至没有引用;
  • 解析后要检查:每个字段要有值且至少有一条引用,API 不保证这两点。

常见问题

Q:有些文档开了引用、有些没开可以吗?

不可以。官方写的是「目前引用必须在一次请求的所有文档上都启用或都不启用」。

Q:图片能引用吗?

不能,官方说目前不支持图片引用,PDF 里的图片同理。

Q:和联网搜索的引用有什么区别?

联网搜索的引用总是开启,字段是 web_search_result_location;文档引用需要你在每个文档块里显式打开。

Q:我碰到 429 或 400 怎么处理?

429 见 /guides/claude-api-error-429-rate-limit;400 先对照本文第六节检查是不是引用和结构化输出同时开了。

相关教程

参考资料

  • Claude 开发者平台文档:Citations — https://platform.claude.com/docs/en/build-with-claude/citations

Nathaniel 的更多内容

  1. 01

    Claude Personal Finance 是什么:连银行账户问花销、怎么开、只读权限、谁能用、怎么解除

    Claude 的 Personal Finance(beta)通过 Plaid 只读连接你的银行、信用卡、贷款和投资账户,在一页里看余额和花销并用自然语言提问。本文按官方帮助页讲谁能用(仅美国、Pro/Max/Ultra)、连接与解除步骤、Claude 能看什么,以及它做不到的事。

    Claude0
  2. 02

    Claude Code 离开一小时回来对话被「压缩」了:Idle compaction 是什么、条件、怎么关

    Claude Code 的 idle compaction 会在你离开约一小时后,把 200K token 以上的长对话先压缩成摘要,下一条消息就不用重新处理整段历史。本文按官方文档讲触发条件、看到什么提示、用 /config 或 idleCompaction 关闭、调阈值,以及恢复旧对话的用量警告。

    Claude0
  3. 03

    ChatGPT Computer History 是什么:Mac 桌面端的活动记忆怎么开、怎么暂停和清除、谁能用

    Computer History 是 ChatGPT macOS 桌面应用里默认关闭的可选功能,把你在应用和网站里的活动整理成记忆和时间线,供 ChatGPT 与 Codex 引用。本文按官方文档讲怎么开、记录什么不记录什么、怎么暂停与清除、数据存哪、谁能用,以及提示注入风险。

    ChatGPTCodex0
  4. 04

    Codex 输入框出现灰色建议:Composer predictions 是什么、Tab 接受、怎么关、谁能用

    Codex 桌面 App 的 Composer predictions(beta)会在 Codex 回完后,根据当前对话在输入框里给出下一条消息的建议,按 Tab 接受、不会自动发送。本文按官方帮助页讲谁能用、哪些线程支持、怎么关、算不算额度,以及没出现时怎么查。

    ChatGPTCodex0
  5. 05

    ChatGPT 隐私中心(Privacy Center)在哪里:隐私设置入口、三大分类和哪些套餐有

    ChatGPT 的 Privacy Center 把记忆、广告、位置、临时对话、锁定对话、两步验证、模型改进、数据导出和删号等入口集中到一页。本文按官方帮助页讲怎么打开、三大分类各有什么、哪些套餐有,以及它不会替你改任何设置。

    ChatGPT0
  6. 06

    Claude Code 处理大仓库:怎么让它只看需要的目录(子目录 CLAUDE.md、claudeMdExcludes、deny 规则)

    仓库太大,Claude Code 总在读无关文件、读进别的包的规则?本文按官方大仓库指南讲:从哪个目录启动、子目录 CLAUDE.md、claudeMdExcludes、Read 的 deny 规则、worktree.sparsePaths、additionalDirectories,以及一份合并后的配置示例。

    Claude0

同产品的其他教程

  1. 01

    Claude Code 在 CI 里跑:从本机 claude -p 到 GitHub Actions 的完整例子(自动审 PR、控成本)

    一条线走完 Claude Code 的 CI 用法:先在本机用 claude --bare -p 配 --json-schema 跑通,再写进 GitHub Actions 用 claude-code-action@v1 自动审 PR,最后加上 --max-turns、超时、并发限制来控成本,并附上常见故障的排查顺序。

    Claude0
  2. 02

    Claude Code 自定义 subagent 实例:测试员、调试员、只读调研员、只读数据库员怎么写

    四个可直接改的 subagent 实例:跑测试的 test-runner、找根因的 debugger、只读调研员、用 PreToolUse hook 限成只读 SQL 的 db-reader;讲 tools、disallowedTools、model、maxTurns 怎么配,怎么点名调用。

    Claude0
  3. 03

    Claude Code 的 CLAUDE.md 模板:前端、后端、数据分析各一份,附拆分与自检方法

    直接拿去改的三份 CLAUDE.md 模板(前端、后端、数据分析),每份都控制在官方建议的 200 行以内;再讲怎么用 .claude/rules 的 paths 拆出专属规则、用 @ 导入长文档,以及用 /context all 和 /doctor prompt-audit 检查是否生效。

    Claude0
  4. 04

    Claude Code 自己写一个插件并发布到 marketplace:plugin.json、marketplace.json、validate 到团队安装的完整流程

    想把自己写的 Skill、Hook 打包给团队用?按 Claude Code 官方 Plugins 文档,从目录结构、plugin.json、claude plugin validate,到写 marketplace.json、推到 Git、让同事一条命令安装,再到版本更新,走完一遍完整流程。

    Claude0
  5. 05

    Claude Code 写一个会自动触发的 Skill:从需求到触发,用 description、when_to_use 和 paths 控制它什么时候出场

    写好的 Skill 总是不触发,或者什么都触发?本文按 Claude Code 官方「Extend Claude with skills」走一遍完整实例:把「改数据库迁移前先检查」写成一个会自动出场的 Skill,包含 description、when_to_use、paths、附带脚本、触发测试和评估。

    Claude0
  6. 06

    Claude Code 配 Sentry MCP 排查线上报错:添加命令、浏览器授权、贴 issue 链接修 bug 和插件子智能体

    线上报错只能手动复制堆栈给 Claude Code?Sentry 官方提供 MCP 服务,可以让它直接读 issue、堆栈和 trace。本文按 Claude Code 官方 MCP 文档和 Sentry MCP 官方说明,讲添加命令、/mcp 授权、典型排查流程、插件方式和自托管注意事项。

    Claude0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~