当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > AI 生成内容怎样保留来源和引用链

AI 生成内容怎样保留来源和引用链

来源:17golang原创 2026-10-14 11:38:58 0浏览 收藏

AI 回答上线后,最容易丢掉的不是正文,而是“这句话从哪里来”。如果只保存最终文本,后续很难回答它引用了哪份资料、经过哪次检索、由哪个模型生成,以及人工改过哪些地方。实用做法是把内容生产拆成来源实体、处理活动和责任主体,再用稳定 ID 把它们连起来。

官方资料:https://www.w3.org/TR/prov-o/

W3C PROV 的核心正好适合这个问题:Entity 表示资料或生成物,Activity 表示检索、切片、生成、审核等活动,Agent 表示模型、服务或人工角色。本文不要求把业务系统改造成完整 RDF,而是先用一份可落地的 JSON 保留同样的关系。

一、先把来源、动作和责任主体拆开

先看一条最小链路:网页资料是来源实体,检索是活动,模型是代理,生成的草稿是新实体,人工编辑又是另一个活动。这样“草稿引用了来源”和“模型参与生成草稿”是两条不同关系,不能把所有信息塞进一个 source_url 字段。

在 PROV 语义里,wasDerivedFrom 表示一个实体由另一个实体派生,used 表示活动使用了某个实体,wasGeneratedBy 表示实体由某个活动产生,wasAttributedTo 则用于标记责任主体。它们组合起来,才能形成从原文到最终文章的引用链。

AI 内容溯源中来源实体、检索生成活动和责任主体的静态关系说明图
图1:AI 内容溯源的实体与活动关系说明图,展示来源、检索、生成物和责任主体之间的静态边界,不是运行截图。

二、给每个节点稳定 ID,再保存派生关系

稳定 ID 不等于标题,也不等于数据库自增数字。来源可以用规范化 URL 加内容摘要生成,活动用一次任务的 request_id,生成物用版本号加内容哈希。这样同一来源被多次检索时可以复用实体,而同一篇文章重新生成时会产生新的生成物。

下面这份 JSON 是应用层记录,不是严格的 PROV-N 或 RDF 文档。字段名采用容易查询的写法,但关系含义与 PROV 的派生、使用、生成和归属关系对应。

{
  "entities": [
    {
      "id": "source:w3c-prov-o:sha256:ab12",
      "kind": "source",
      "url": "https://www.w3.org/TR/prov-o/",
      "captured_at": "2026-10-14T01:40:00+08:00",
      "content_sha256": "ab12..."
    },
    {
      "id": "draft:answer-001:v3",
      "kind": "generated_text",
      "content_sha256": "91ef...",
      "derived_from": ["source:w3c-prov-o:sha256:ab12"]
    }
  ],
  "activities": [
    {
      "id": "activity:retrieve-and-draft:8f31",
      "kind": "retrieval_generation",
      "used": ["source:w3c-prov-o:sha256:ab12"],
      "generated": ["draft:answer-001:v3"],
      "agent": "agent:model-service:answer-v2"
    }
  ]
}

注意两点:第一,captured_at 是系统保存来源的时间,不代表网页内容永远不变;第二,content_sha256 只用于识别版本,不能替代人工判断,也不能证明生成内容本身正确。

三、把检索和生成记录成一次可追踪活动

实际接入时,最容易漏掉的是“中间动作”。只保存最终 prompt 和答案,无法说明模型实际使用了哪些检索片段。建议每次生成都落一条 activity,至少包括输入实体 ID、输出实体 ID、模型标识、提示词模板版本、时间、操作者和错误状态。

package provenance

import (
    "crypto/sha256"
    "encoding/hex"
    "time"
)

type Activity struct {
    ID             string    `json:"id"`
    Kind           string    `json:"kind"`
    Used           []string  `json:"used"`
    Generated      []string  `json:"generated"`
    Agent          string    `json:"agent"`
    PromptVersion  string    `json:"prompt_version"`
    StartedAt      time.Time `json:"started_at"`
    FinishedAt     time.Time `json:"finished_at"`
    Status         string    `json:"status"`
}

func EntityID(prefix string, content []byte) string {
    // 用内容摘要区分同一来源的不同版本,避免把标题当成唯一键。
    sum := sha256.Sum256(content)
    return prefix + ":sha256:" + hex.EncodeToString(sum[:])
}

func NewActivity(id, agent, promptVersion string, used []string) Activity {
    // 创建活动时记录输入实体和代理;生成物在模型返回后再补入。
    return Activity{
        ID:            id,
        Kind:          "retrieval_generation",
        Used:          append([]string(nil), used...),
        Agent:         agent,
        PromptVersion: promptVersion,
        StartedAt:     time.Now().UTC(),
        Status:        "running",
    }
}

生产环境里不要把完整 prompt、用户原文或访问令牌无条件写进公共溯源表。可以保存模板版本、参数摘要和脱敏后的输入实体 ID;敏感原文放在受控存储中,通过权限和保留期限管理。

AI 生成内容引用链从检索片段到草稿版本再到人工修订的静态关系说明图
图2:从检索片段到生成草稿再到人工修订的引用链结构图,重点看版本、活动和责任主体的连接。

四、修订和断链状态要显式保存

人工修改后不要覆盖旧的生成物。新增一个 revision 实体,用 wasRevisionOf 或业务字段记录它与上一版本的关系;如果来源无法再次访问,也不要删除整条链,可以把实体状态标成 unavailable,保留 URL、抓取时间和摘要。

还要把“有引用链”和“内容正确”分开。溯源记录只能说明某段文字使用过哪些材料、经过哪些动作,不能自动证明引用没有断章取义。审核系统仍应单独保存事实核对结果、人工结论和拒绝原因。

可以用下面的最小清单做落地检查:

  • 来源实体是否有稳定 ID、规范化地址、保存时间和内容摘要?
  • 每次检索、生成、编辑是否都有独立 activity 和状态?
  • 输出版本能否回指输入实体、模型代理和提示词版本?
  • 失效来源、删除请求和脱敏动作是否有可查询记录?

常见问题

只保存引用 URL 够不够?

通常不够。URL 只能说明可能访问过哪个入口,还需要保存抓取时间、内容摘要、被使用的片段标识和生成活动 ID,才能定位“哪一版资料影响了哪一版输出”。

一定要引入 RDF 或图数据库吗?

不一定。先把 Entity、Activity、Agent 和关系落在 JSON 或关系表里,等到需要跨系统交换、复杂查询或与外部 PROV 数据互操作时,再映射到 PROV-O。

总结

AI 生成内容的来源和引用链,核心是把最终文本拆回“来源实体—检索/生成活动—模型或人工代理—新版本实体”。稳定 ID 负责连接,哈希负责识别版本,状态和修订记录负责面对现实中的失效来源与人工改写。先把这条链保存下来,后续再扩展到 RDF、图查询或审计系统,成本会小得多。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
AI 工具调用失败怎样设计可重试错误AI 工具调用失败怎样设计可重试错误
上一篇
AI 工具调用失败怎样设计可重试错误
Embedding 模型更换后怎样处理向量空间不兼容
下一篇
Embedding 模型更换后怎样处理向量空间不兼容
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    467次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    530次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    549次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    498次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    317次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码