结论:RAG 的答案,光给结论不给出处,等于让用户盲信模型。把每句话引用了哪份文档、哪一段标出来,可溯源,用户才敢用。 这篇讲我怎么给一个知识库问答 Agent 加上引用标注,实操向。

为什么必须做溯源

我做的是公司内部的制度问答 Agent。早期它答得头头是道,但有同事拿它的答案去跟客户沟通,事后发现那条"制度"是模型糊弄出来的,根本没这条规定,差点出岔子。

从那以后我定了死规矩:答案里的每个关键事实,必须能点回到知识库里的原文。 答不出来源的,宁可说"没查到"。

实现的核心:让来源信息全程跟着切片走

溯源做不好,通常是因为检索那一步把原文信息丢了。我的做法是从切片入库就埋好元数据:

每个切片入库时带上:

  • doc_name:来自哪份文档

  • chunk_id:文档里第几段

  • text:切片原文

检索回来的不只是文本,而是连同这些元数据一起。然后喂给模型时,我把来源编号一起喂进去:

请基于以下资料回答,并在每句话末尾用 [编号] 标注依据来源。
若资料里没有依据,不要编造,回答"未在制度中找到相关规定"。

[1] (员工手册-第3章) 年假满一年享5天,满十年享10天...
[2] (考勤制度-第2节) 请年假需提前3个工作日提交...

用户问题: 工作三年有几天年假?

模型会回:工作满一年不满十年的,享5天年假[1]。申请需提前3个工作日[2]。 末尾的 [1][2] 就是出处。前端再把 [1] 渲染成可点击的链接,点开跳到对应文档段落。

落地位置

我是在一个带场景化 RAG 的搭智能体平台上做的,知识库切片时它能保留文档名和段落位置这些元数据,检索节点把这些信息一并带出来,我在生成节点的 prompt 里要求模型按 [编号] 标注,出口再把编号映射回真实文档链接。整条链路下来,用户看到的每条结论后面都挂着可点的出处。

三个踩过的坑

坑一:模型乱标编号。 它有时把 [1] 标到其实来自 [2] 的内容上。我让它先复述"我引用了哪几条",再生成答案,错标明显减少。

坑二:无依据时硬编。 不强调的话,资料里没有的内容它也敢答还给你标个来源。prompt 里那句"未找到就明说,不要编造"是底线,必须写死。

坑三:编号对不上原文。 喂给模型的编号和最终映射回的链接,顺序一定要严格对齐。我有次检索结果重排了序,编号却没跟着重排,点 [1] 跳到了不相干的文档。后来把"重排"和"编号"绑死在一步里才不出错。

收尾

加了溯源之后,同事对答案的信任度肉眼可见地上来了——能点开看原文,心里有底。代价是答案里多了一串 [编号],观感上没那么干净,而且模型偶尔标得不够精确,这个我还在调。但比起"答得漂亮却没法验证",我宁可要这串编号。

模型那层我直接用讯飞星辰的现成大模型 API,按需调用,不用自己维护推理服务,省下的精力都用在把这套引用标注磨准上了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐