Q:为啥要做引用定位? A:因为没有出处的AI答案,业务方根本不敢信。

我们法务那边的合规问答智能体,最早就是吃了这亏——它答得头头是道,法务问一句"这条哪来的",答不上来,整个工具就被打入冷宫。后来我把"答案标注来源段落"做出来,标出每句结论出自知识库哪一段,法务才肯用。记一下怎么做的。

核心思路:切片的时候就给ID

引用定位能不能做,关键在前面——文档入库切片那一步,得给每个切片一个稳定的唯一ID,而且要能反查回原文位置(哪个文档、第几段、原文是啥)。

我入库时每个chunk存成这样:

{
  "chunk_id": "doc12#p7",
  "doc_name": "退货政策v3.pdf",
  "para_index": 7,
  "text": "无理由退货需在签收后7日内……"
}

chunk_id是命中、回引、定位的钥匙。只要切片阶段把这个埋好,后面就好办。

检索→生成→回引

检索阶段捞回来的不只是文本,连chunk_id一起带回,喂给模型的上下文里,每段前面挂个标记:

[来源 doc12#p7] 无理由退货需在签收后7日内……
[来源 doc12#p9] 定制类商品不支持无理由退货……

生成阶段在提示里要求模型:每给一条结论,末尾用方括号标出依据的来源标记。模型就会输出"定制商品不能无理由退货[doc12#p9]"这种。

回引阶段我在后处理里把答案中的[doc12#p9]正则抠出来,反查到原文段落,前端渲染成可点击的引用,点开就是知识库里那段原文。法务一点就能核对。

两个实打实的坑

模型会瞎标。 有时它给的结论根本不在上下文里(幻觉),却硬安一个来源标记。我加了道校验:答案里出现的每个chunk_id,必须真的在本轮检索结果里,对不上的标记直接抹掉,并且给那句结论降级处理。这道校验拦下来不少"看着有出处其实是编的"。

段落切太碎,引用就碎。 我一开始按句切,一条结论能引出五六个来源,密密麻麻没法看。后来切片粒度调粗(按自然段),引用清爽多了。但切太粗召回又会糊——这个粒度来回调了好几轮才平衡,没有标准答案,看文档结构。

工程落地

这套我没全手写。用的那种不用编程就能搭智能体的平台,知识库切片带元数据、检索回带chunk信息这些是支持的,我主要写了提示词里的引用规范、和后处理的校验+反查逻辑。省了搭检索管线的功夫。

模型层提一嘴:生成和校验都靠大模型,我接的讯飞MaaS(现成模型API,不自建算力),调用即用,省了模型运维。

你们做来源标注,是让模型自己标、还是检索后强行绑定最相关的那段?我这俩都试过,模型自标更灵活但容易乱标,评论区说说你们的权衡。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐