跳到正文

RAG生成阶段Prompt整合策略

检索文档与用户查询整合策略,提升回答准确性与连贯性

原题:在RAG系统的生成阶段,如何基于检索到的文档和用户查询,设计并整合上下文信息到Prompt中,以有效引导大模型生成准确、有依据且连贯的回答?请说明关键策略及其对输出质量的影响。

Prompt工程 · 字节真题

回答与解析

核心策略:四层Prompt架构

1. 上下文预处理层

  • 筛选:按相关性分数阈值过滤,保留Top-K(通常3-5篇)
  • 排序:综合BM25分数、向量相似度、时效性加权排序
  • 去重:语义去重(embedding聚类)+ 精确去重(URL/ID去重)
  • 冲突标记:对矛盾信息打标签,提示模型"存在不同观点"

2. 上下文注入结构

[系统指令] 你是基于检索文档回答的助手,必须引用来源
[检索上下文] 
  [文档1] 内容...【来源:URL1】
  [文档2] 内容...【来源:URL2】
[用户查询] 原始问题
[输出约束] 1)先给出答案 2)标注引用编号 3)不确定时说明"信息不足"

3. 长度优化策略

  • 截断:按句子边界截断,保留前N个token
  • 摘要压缩:用轻量模型对长文档生成摘要后注入
  • 动态选择:根据问题类型选择片段级(细粒度)或文档级(粗粒度)

4. 可追溯性保障

  • 强制引用格式:要求模型输出[1] [2]等引用标记
  • 后置校验:生成后匹配引用编号与实际检索内容,过滤幻觉引用

对输出质量的影响

策略 直接影响
精准筛选 减少噪声干扰,降低幻觉概率
结构化模板 提升回答连贯性和格式一致性
来源强制标注 增强可信度,便于人工审核
冲突显式处理 避免模型武断选择,体现信息完整性

学习建议

建议先掌握RAG基本流程,理解检索与生成的衔接机制,结合实际案例练习Prompt设计,关注上下文排序、去噪与信息融合方法。

口语版讲法(约4分钟)

  • 一句话点题:本质是平衡相关性与可控性
  • 四层架构的核心设计:预处理、注入、长度、追溯
  • 业务场景举例:客服退款政策查询
  • 落地风险与取舍:冲突处理、引用幻觉、长度与精度平衡
  • 收尾判断:我更倾向结构化模板加引用强制,留延伸钉

这道题其实问的是:在RAG的生成阶段,怎么把一堆检索回来的文档整合进Prompt,让模型既准确又有依据,还能连贯回答。说白了,核心就是平衡两件事,一是文档和问题的相关性,二是模型输出的可控性。我不会一上来就堆策略,而是先想清楚这个Prompt到底该怎么组织。

我一般会用一个四层架构来设计。先讲第一层,上下文预处理。这块不能把检索结果直接往里塞,得先做筛选、排序和去重。比如相关性分数低于阈值的直接扔掉,保留Top-K,通常是3到5篇。排序上我会综合BM25分数、向量相似度还有时效性来加权。去重这块有个坑,就是语义重复,比如两篇文档用不同措辞说同一件事,得用Embedding聚类做语义去重,否则模型容易被重复信息带偏。

第二层是上下文注入的结构化模板。我习惯把Prompt分成几段:先是系统指令,告诉模型你是基于检索文档回答的助手,必须引用来源;然后是检索上下文,每篇文档按「内容【来源:URL】」的格式列出来;接着是用户查询;最后是输出约束,比如先给答案,再标注引用编号,不确定就说信息不足。这样模型就知道该按什么顺序干活。

第三层是长度优化。检索回来的文档可能很长,但上下文窗口有限。我一般会按句子边界截断,保留前N个token,或者用轻量模型对长文档做摘要压缩后再注入。这里有个动态选择策略,如果问题问得很细,比如「具体条款是什么」,那就用片段级,只取相关句子;如果问题比较泛,比如「这个政策的整体思路是什么」,那就用文档级,保留整篇。

第四层是可追溯性保障。我会强制模型输出引用标记,比如[1]、[2],生成后再做一次后置校验,看引用的编号和实际检索内容是否匹配,过滤掉那些幻觉引用。

举个例子,有个电商客服场景,用户问「我申请退款为什么被拒?」。检索回来的文档可能包括退款政策、订单状态、客服话术。如果我不做预处理,直接把一堆文档塞进去,模型可能从客服话术里摘一句「我们会在48小时内处理」,但实际政策说「退款需在收货后7天内申请」。模型如果没看到政策那篇,就会给出错误答案。所以预处理里我会按相关性排序,把政策文档放在最前面,并且对冲突信息打标签,提示模型「存在不同观点,请综合判断」。这样模型就能给出准确回答,比如「根据政策,您需要在收货后7天内申请,但您已超过期限,所以被拒。建议您联系客服特殊处理。」

落地时有个很现实的风险,引用幻觉。模型可能自己编一个[3]出来,但检索结果里根本没有第3篇。我上线时会特别关注这个,用后置校验脚本跑一遍,如果引用编号不存在,就触发重生成或者直接去掉那个引用。还有一个前提,就是检索质量本身要过关。如果检索回来的文档全是噪声,那Prompt设计得再好也没用。所以我会把检索和生成看成整体,检索端得先保证Recall够高。

说到这,其实还有一个延伸问题:当检索回来的文档之间有明显矛盾时,比如A文档说「退货免运费」,B文档说「运费自理」,模型该怎么处理?我目前的方案是让模型输出时主动标注矛盾,并给出不同来源的结论,但如果你希望模型能做判断,那就需要引入Self-RAG机制,让模型自己学会反思和选择。这块其实挺有意思,涉及到模型自主决策和可信度的平衡。

所以整体上,我更倾向于用结构化模板加引用强制来保障基本盘,再根据业务场景做动态调整。这样既不会让模型太发散,又能保证答案有据可查。

关键一句:当检索文档出现矛盾时,我如何处理:让模型输出矛盾标注,还是引入Self-RAG让模型自主判断?

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你在做一个智能客服系统,用户问了个售后问题,检索到了几个相关的政策文档。你怎么把这些文档组织到提示词里,让模型既能准确回答,又能说清楚“我是根据文档A的第X条得出的结论”?

  2. 问法 2 · 层层追问

    RAG里检索到的文档你一般怎么塞进提示词?……如果文档很多或者很长呢?……那如果文档之间信息有矛盾,你怎么处理?……最后怎么让模型输出时引用具体来源?

  3. 问法 3 · 直球架构

    请设计一个RAG生成阶段的Prompt模板,要求:1)整合检索到的Top-K文档;2)处理文档冲突;3)强制模型引用来源。说说你的关键策略和它们对输出质量的影响。

同模块相关题目