Skip to main content

引文

引文将助理响应的跨度链接到支持它们的源。 创建或恢复会话时打开 enableCitations ,然后读取 citations 事件上的 assistant.message 有效负载,以呈现脚注、源列表或内联链接。

警告

引文是实验性的。 在将来的版本中,选项名称、事件有效负载和提供程序覆盖范围可能会更改。

引文的工作原理

引文由模型提供程序而不是 SDK 生成。 流有三个部分:

  1. 您的应用程序提供可引用材料,例如文档附件或包含源内容的工具结果。
  2. enableCitations 启用时,运行时会将该内容标记为可在线上传输时引用。 对于 Anthropic 模型,文件附件会以启用引用的 document 块形式发送。
  3. 模型返回引用元数据,运行时会在最终的 citations 事件中将其规范化为与提供程序无关的 assistant.message 对象。

提供程序支持有限。 每个来源记录上的 provider 字段会记录引文来自何处:

提供者值Meaning
anthropic由Anthropic(Claude)模型响应生成的引文
openaiOpenAI 模型响应生成的引文
client运行时从工具输出合成的引文

注意

enableCitations启用不保证响应包含引文。 只有当响应基于可引用的源材料时,模型才会输出这些内容。 始终将 citations 字段视为可选字段。

在会话上启用引文

在会话创建时设置选项,如果想要重启后引文,请在恢复时再次设置该选项。

代码语言 navigation

TypeScript
const session = await client.createSession({
    onPermissionRequest: approveAll,
    enableCitations: true,
});

const resumed = await client.resumeSession(session.sessionId, {
    onPermissionRequest: approveAll,
    enableCitations: true,
});

从助理消息中读取引文

引用出现在最终的 assistant.message 事件中,而不是在 assistant.message_delta 事件中。 在渲染源标记之前,先等待最终消息。

代码语言 navigation

TypeScript
session.on((event) => {
    if (event.type !== "assistant.message" || !event.data.citations) {
        return;
    }

    const { sources, spans } = event.data.citations;
    const sourceById = new Map(sources.map((source) => [source.id, source]));

    for (const span of spans) {
        const quoted = event.data.content.slice(span.startIndex, span.endIndex);
        for (const reference of span.references) {
            const source = sourceById.get(reference.sourceId);
            const label = source?.title ?? source?.url ?? source?.path ?? source?.id;
            console.log(`"${quoted}" — ${label}`);
        }
    }
});

引用负载参考

citations 对象将去重后的来源与引用这些来源的跨度分开,因此,被引用五次的某个来源在 sources 中只会出现一次。

类型领域Description
Citationssources引文片段引用的去重后来源集合
Citationsspans标注了其支持来源的生成文本片段
CitationSourceidCitationReference.sourceId 引用的稳定的、限于当前轮次的标识符
CitationSourceprovider生成引用的系统:anthropicopenaiclient
CitationSourcetitle?源的易读标题
CitationSourceurl?源的 URL,当它是 Web 资源时
CitationSourcepath?源为文件时,相对于代理工作区根目录的文件路径
CitationSpanstartIndex最终消息内容中的开始偏移量(UTF-16 代码单元,从零开始,含)
CitationSpanendIndex最终消息内容中的结束偏移量(UTF-16 代码单元、从零开始、独占)
CitationSpanreferences支持此跨度的来源
CitationReferencesourceId此引用所指向的 CitationSource 的标识符
CitationReferencecitedText?如果模型提供了该内容,则给出源文本中支持该片段的精确原文
CitationReferencelocation?支持跨度的源中的位置
CitationReferenceproviderMetadata?提供方原生关联数据,以不透明方式传递

提示

跨度偏移量以 UTF-16 代码单位度量,相对于最终 content 字符串。 TypeScript、Java 和.NET字符串已是 UTF-16,因此可以直接对其进行切片。 Python字符串由 Unicode 代码点编制索引,Go 和 Rust 字符串为 UTF-8,因此在切片之前将内容转换为 UTF-16 代码单元,如上面的示例所示。

引文位置

CitationReference.location 是一个以 type 为判别键的可区分联合:

位置类型FieldsUse
char
startIndexendIndex源文本中的字符范围
page
startPageendPage分页文档内的页面范围
block
startBlockendBlock结构化文档中的内容块范围

提供可引用的来源

引文需要模型可以属性的源材料。 有两种方法来提供它。

将文档附加到邮件

启用引用功能且会话使用 Anthropic 提供程序时,文件附件会以启用引用的 document 块形式发送,以便模型可以从中引用段落。

await session.sendAndWait({
    prompt: "Summarize the attached PDF and cite the passages you used.",
    attachments: [
        {
            type: "blob",
            data: pdfBase64,
            displayName: "quarterly-report.pdf",
            mimeType: "application/pdf",
        },
    ],
});

有关附件 API 以及 blob 附件形状,请参阅 file

从工具返回可引用的来源

工具结果包含一个实验性的 citableSources 数组。 每个条目都提供模型可引用的content,以及id和可选的titleurlpath。 这些来源会与工具结果一同保存,因此在恢复会话后仍然可用,并且基于这些来源生成的引用会被标记为来自 client 提供程序。

局限性

  • 引文在每个 SDK 中都是实验性的,不由兼容性保证涵盖。
  • 覆盖范围取决于模型提供方。 为没有引文支持的提供程序配置的会话不会发出任何 citations 有效负载。
  • 引文仅存在于最终 assistant.message 事件中,因此流式处理使用者不能在响应中呈现它们。
  • 公开代码和 IP 重复引用不属于此界面。

延伸阅读