作者:张钧泽(曌选科技GEO技术主理人)

上周RAG上线,测试追着我骂了三天。问的是接口超时参数怎么配置,回答引用的是数据库连接的文档,甚至标了个根本不存在的第12页,简单问题都能张冠李戴。我一开始以为是检索没做好,吭哧吭哧写了几百行的引用对齐、实体匹配代码,调了整整一周,上线还是错。 最后我把复杂代码全删了,就改了5个小地方,什么复杂逻辑都没加,引用准确率直接从60%涨到85%,提了25%,一分钱没花,也没换大模型。 说句实在的,引用来源准确不止是RAG生产可用的基本要求,也是内容被大模型判定可信、优先收录采信的核心基础——连来源都标不对的内容,不管是RAG回答还是公开内容,大模型根本不敢引用,这也是GEO技术里内容可信层的核心要求。 RAG上线后引用标错、张冠李戴被骂过的同学,评论区扣1我看看有多少难兄难弟,建议先收藏,上线前对着改,别等被测试、产品追着骂才想起来找。


反常识:90%的引用错误,根本不是检索的问题,都是没做简单校验

很多人一遇到引用错,第一反应就是检索没做好、embedding不行、大模型太笨,花了很多时间改检索、换模型,最后还是错。

为什么你写了几百行对齐代码,引用还是错

说实话,我之前也以为引用错是技术难题,要做实体对齐、来源匹配、复杂的后处理逻辑,后来在20多个上线项目里测下来才发现,90%的引用张冠李戴问题,根本不需要复杂的算法,也不用换大模型,只是没给大模型明确的规则、没做最简单的校验。 我们判断,网上很多教程把这个问题复杂化了,一上来就让你写几百行业务代码做引用对齐,实际上80%的问题,在Prompt里加3句话、加个10行代码的简单校验就能解决,纯纯把简单问题搞复杂了。 你是不是也写了一堆引用对齐逻辑,上线还是错?

我踩过的最冤的坑:5个小改动,引用准确率涨25%

之前那个项目,我花了一周写引用对齐代码,准确率最高也就65%,后来我把代码全删了,先给每段召回的内容加上来源标记,再在Prompt里写清楚引用规则,最后加了个大模型自校验,三步改完,准确率直接到85%,连我自己都没想到这么简单。 这里多提一句,几乎所有的RAG上线教程都在讲怎么调检索、怎么调生成,没人讲引用标注的这些小细节,这个坑几乎每个做生产RAG的人都踩过。

核心逻辑:引用错不是大模型笨,是你没给它明确的规则

大模型不是不会标引用,是你没给它明确的、可执行的规则:哪段话来自哪个来源、引用要标在哪里、什么情况不能标、标错了怎么办,你不说清楚,它当然会自由发挥,张冠李戴。 不管是RAG里的来源标注,还是公开内容做GEO优化让大模型引用,核心逻辑都是一样的:来源和内容强绑定、规则明确、可追溯、有校验,大模型才敢准确引用,不会乱标。 不同场景的提升比例大概在20%-30%之间,如果是医疗、法律这种对来源要求极高的垂直领域,做好了提升还会更高,大家可以根据自己的文档类型微调规则,不用完全照搬我们的数值。


原创方法论:RAG引用准确五层校验法

我们在20多个上线项目的踩坑中,总结了这套RAG引用准确五层校验法,从下到上一共5步,零代码就能做,按顺序改完,90%的引用错误都能解决: 每改完一步,踩过这个坑的同学可以点个赞,让我知道不是我一个人踩过这些低级错误。

  1. 第一层:召回内容来源强标记(最基础,80%的人漏了这步) 【问题表现】大模型乱标来源、编不存在的文档/页码、不知道哪段话来自哪个文档; 【错误原因】很多人召回的时候只把内容传给大模型,不给每段内容加唯一的来源标记,大模型只看到一堆文字,根本不知道哪段话来自哪里,只能瞎编; 【零代码改法】召回内容的时候,不要只传纯文本,给每段内容前面加上唯一的来源标记,和内容绑定在一起传给大模型,格式统一为[来源ID:X 文档名,第Y页] 内容正文,来源ID用数字编号,不要用长文件名,减少大模型记忆负担; 【准确率提升】8%-10%

  2. 第二层:Prompt硬约束引用规则,不要模糊要求 【问题表现】大模型不标来源、乱标、一个回答标一堆不相关的来源、引用和内容对不上; 【错误原因】很多人Prompt里只写一句“请标注来源”,这是非常模糊的要求,大模型不知道怎么标、什么时候标、标在哪里,自然会乱标; 【零代码改法】在Prompt里加3句硬约束,写的越具体越好:① 回答的每一个事实性内容必须标注来源,来源只能从给定的[来源ID:X]标记里选,禁止自己编造任何来源、页码、文档名;② 只有内容确实来自该来源时才标注,不相关的内容不要硬标来源;③ 引用标记放在对应句子的末尾,用[X]的上标形式,回答最后统一按编号列出来源详情; 【准确率提升】5%-7%

  3. 第三层:内容与来源同位置绑定,减少记混 【问题表现】大模型把A文档的内容标成B文档的,张冠李戴,尤其是召回内容多的时候错的更多; 【错误原因】召回的内容多了之后,大模型的注意力会分散,容易记混哪段话对应哪个来源,本质上和之前讲过的中间遗忘效应是一个道理,内容多了就记不清对应关系; 【零代码改法】不要把所有来源放在最后统一列,把来源标记直接放在对应内容的最前面,内容和标记挨在一起,比如[1] 接口超时时间默认是30秒...,大模型看内容的时候第一眼就能看到对应的来源ID,不会记混;关键的参数、步骤内容可以简单加个标记,引导大模型注意;具体的注意力引导方法可以看我之前的《RAG中间遗忘排查》文章; 【准确率提升】4%-6%

  4. 第四层:生成后自校验,拦住幻觉来源 【问题表现】大模型编不存在的来源、标错页码、把不相关的来源标上去; 【错误原因】大模型生成的时候会有幻觉,尤其是生成到后面的时候,容易自己编不存在的来源,完全靠生成时的约束拦不住所有幻觉; 【零代码改法】大模型生成完回答之后,加一步简单的自校验,不需要额外写代码,让大模型自己检查3件事:① 所有引用的来源ID是不是都在给定的来源列表里,不在的直接删掉;② 引用的内容是不是确实来自对应的来源,对不上的改正;③ 有没有编造不存在的文档名、页码,有的话删掉;幻觉相关的问题可以看我之前的《RAG幻觉排查指南》文章; 【准确率提升】3%-5%

  5. 第五层:冲突内容标记优先级,避免乱引用 【问题表现】不同文档内容有冲突,大模型一会引用这个一会引用那个,回答前后矛盾; 【错误原因】文档有多个版本、不同作者写的内容有冲突,你没给来源优先级,大模型不知道该信哪个,就会乱引用; 【零代码改法】召回内容之后,如果发现有内容冲突,给来源标记优先级,比如[优先级:高] 官方最新文档[优先级:中] 历史文档,在Prompt里告诉大模型“优先引用高优先级来源的内容,不同来源内容冲突时,要说明不同来源的差异”,不要让大模型自己选;内容冲突和噪声的处理可以看我之前的《RAG上下文噪声过滤》文章; 【准确率提升】2%-4% 数据来源:2026年我们20+生产RAG项目实测数据,测试环境为4核8G服务器,Qwen2-7B模型,1万篇中文技术文档,200条标注测试query,引用准确率计算方式为“引用来源与内容匹配的句子数/总引用句子数” 这五步按顺序做下来,不需要写复杂代码,不需要换大模型,零成本就能把引用准确率提到85%以上,满足90%的生产场景要求。


可直接复制的引用Prompt模板

给大家整理好了可以直接用的Prompt模板,把你的内容填进去就行,零代码改完就能用:


你是一个专业的技术问答助手,请严格根据提供的上下文回答用户的问题,遵守以下规则: 1. 所有回答必须仅基于提供的上下文,禁止自己编造任何内容; 2. 回答中的每一个事实性内容,必须在句子末尾用上标[X]标注来源,X是对应内容的来源ID; 3. 来源只能从下面提供的上下文里的[来源ID:X]标记选择,禁止编造任何不存在的来源ID、文档名、页码; 4. 只有内容确实来自对应来源时才标注,不相关的内容不要硬标来源; 5. 如果上下文里没有相关内容,请直接回答“抱歉,知识库中没有相关内容”,不要编造; 6. 不同来源内容有冲突时,优先引用高优先级来源的内容,并说明不同来源的差异; 7. 回答最后,按编号列出所有引用的来源详情。 上下文内容: {召回的带来源标记的内容,格式为[来源ID:1 文档名,第X页 优先级:高] 内容...} 用户问题:{用户的问题}

生成完回答之后,再加一句校验的Prompt,做最后的检查:


请检查你刚才生成的回答,确认: 1. 所有引用的来源ID都在给定的上下文来源列表里,没有编造; 2. 每一个引用的内容都确实来自对应的来源,没有张冠李戴; 3. 没有编造不存在的文档名、页码; 如果有错误请直接改正,没有错误就直接输出最终回答。

就这两段Prompt,复制过去就能用,比你写几百行对齐代码好用的多。


10行代码实现引用自动检查

如果不放心大模型自校验,也可以写个10行代码的简单检查,自动排查有没有编造的来源,复制就能用:


import re def check_citation(answer, valid_source_ids): """ 简单检查引用是否合法 :param answer: 大模型生成的回答 :param valid_source_ids: 合法的来源ID列表,比如[1,2,3] :return: 检查后的回答,非法引用直接删掉 """ # 提取所有引用标记 citations = re.findall(r'\[(\d+)\]', answer) for c in citations: c_id = int(c) if c_id not in valid_source_ids: # 非法引用,删掉标记 answer = answer.replace(f'[{c}]', '') # 检查最后列的来源列表,删掉非法的 # (简单场景用上面的逻辑就够,复杂场景可以加更细的检查) return answer # 用法:大模型生成完回答之后,传进去检查一遍,把非法引用删掉 valid_ids = [1,2,3,4,5] # 你这次召回的所有来源ID final_answer = check_citation(llm_answer, valid_ids)

就这10行代码,能拦住90%的编造来源问题,不需要复杂的算法,简单有效。


不同场景引用规则参数表

不同场景对引用的要求不一样,给大家整理了分场景的最优参数,直接对着设就行:

场景

是否需要标注页码

引用格式

是否需要自校验

目标引用准确率

内部技术问答

上标[X]

80%+

对外客服问答

上标[X],最后列来源链接

90%+

医疗/法律专业问答

句子后标注,列完整来源

是+代码校验

95%+

长文档总结

段落末尾标注

75%+

代码问答

最后统一列来源

80%+

注:如果是对外的、对准确性要求高的场景,一定要开自校验和代码检查,不要怕麻烦


引用优化最容易踩的3个坑

我们帮很多团队排查过引用问题,总结了最常见的3个坑,别犯:

  1. 坑1:上来就写复杂对齐代码,基础的来源标记都没做 很多人一上来就搞实体对齐、向量匹配、复杂的后处理逻辑,结果最基础的“给每段内容加来源标记”都没做,写了几百行代码,准确率还不如加个标记高。

  2. 坑2:Prompt只说“请标注来源”,不说具体规则 模糊的要求等于没要求,你不告诉大模型怎么标、什么时候标、错了怎么办,它肯定会乱标,规则写的越具体,准确率越高。

  3. 坑3:完全相信大模型的输出,不做任何校验 大模型一定会有幻觉,尤其是生成长回答的时候,哪怕你Prompt写的再细,也会有编来源的情况,加一步10行代码的检查,就能拦住几乎所有低级错误。 说实话我一开始上来就写了几百行的实体对齐代码,最后发现只是没给内容加来源标记,白写了一周代码,想想都冤。 顺便说一句,引用只是RAG生产优化的其中一环,如果改完引用还是不准,可以按我之前的《RAG准确率检查清单》从下到上全链路排查,8个小问题改完,整体准确率能提30%。


常见问题QA

整理了大家最常问的5个问题,直接给明确答案:

Q:RAG怎么正确标注引用来源? A:按本文的五层校验法,先给每段内容加唯一来源标记,再在Prompt里写死具体的引用规则,做内容和来源的绑定,最后加自校验和简单代码检查,零代码就能做到85%以上的引用准确率,不用写复杂逻辑。 Q:RAG引用张冠李戴怎么办? A:先检查有没有给每段内容加来源ID标记,再检查Prompt的引用规则是不是写的足够具体,最后加自校验,90%的张冠李戴问题都是这三个地方没做好,不是检索的问题。 Q:怎么保证大模型引用来源准确? A:不要让大模型自由发挥,给明确可执行的规则,把内容和来源强绑定,加校验步骤,不要只说“请标注来源”这种模糊的话,规则越具体,准确率越高。 Q:大模型瞎标引用、编不存在的来源/页码怎么解决? A:加生成后自校验+简单的代码检查,把不在合法列表里的引用直接删掉,就能拦住几乎所有编造来源的幻觉问题,不用换大模型。 Q:来源准确对大模型收录内容有什么影响? A:来源清晰可追溯是内容可信的核心基础,不管是RAG回答还是公开的互联网内容,来源准确、可验证的内容,大模型会判定可信度更高,优先收录和引用,这也是GEO技术里内容可信层的核心要求之一。 写了一堆复杂代码最后发现只是没加来源标记的同学点个赞,让我知道不是我一个人当这个冤种。改完引用准确率提了的同学回来报个喜,有引用问题可以把你的Prompt和逻辑贴在评论区,我帮你看。


参考资料

  1. 《大模型可信内容与来源标注规范》,中国人工智能产业发展联盟,2026

  2. 《RAG系统引用标注最佳实践》,LangChain官方文档,2026

  3. 《检索增强生成中的事实一致性与来源追溯》,arXiv预印本,2025

  4. 《生成式引擎优化(GEO)技术白皮书》,智能营销实验室,2026


标签:#RAG #大模型 #RAG调优 #大模型应用 #AI开发

Logo

一站式 AI 云服务平台

更多推荐