RAG 生成阶段 Prompt 怎么构建?
检索上下文如何组织,常见模板与策略详解
原题:在RAG系统的生成阶段,如何基于检索到的上下文构建有效的Prompt?有哪些常见的Prompt模板或策略?
Prompt工程 · 字节真题
回答与解析
核心原则:清晰分层 + 信息密度最大化
RAG的Prompt设计关键是让模型明确知道"要回答什么"和"能参考什么",避免检索内容淹没指令或模型混淆角色。
常见模板结构
1. 经典QA式(最通用)
[系统指令]
你是一个基于文档回答问题的助手。请严格根据提供的参考资料回答,如果资料不足请明确说明。
[参考资料]
{doc1_content}
{doc2_content}
[用户问题]
{query}
[要求]
- 优先综合多段资料
- 不确定时回答"根据现有资料无法确定"
2. 带引用标记式(防幻觉+溯源)
基于以下带编号的信息回答问题,引用格式为[1][2]:
[1] {doc1}
[2] {doc2}
问题:{query}
关键:强制模型输出引用标记,便于后处理校验。
3. 对话历史融合式(多轮RAG)
历史对话:
User: {prev_q}
Assistant: {prev_a}
当前可参考的新资料:
{retrieved_context}
当前问题:{current_q}
进阶策略
| 策略 | 作用 |
|---|---|
| 动态Few-shot | 从检索结果中挑1-2个高质量问答对作为示例注入 |
| 上下文重排序 | 把最相关的文档放Prompt末尾(近因效应) |
| 置信度提示 | 要求模型输出"确定性分数"或"需澄清"标记 |
| 角色隔离 | 用XML标签<context> <question>严格分隔 |
字节场景的特殊考量
- 短内容平台:检索结果可能是碎片化评论,Prompt需强调"综合多方观点"
- 时效性内容:加入时间戳提示,让模型优先参考最新资料
- 安全过滤:系统指令层前置审核规则,与生成指令解耦
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 一句话定位:本质是让模型知道‘回答什么’和‘参考什么’
- 经典模板:QA式、带引用式、对话历史融合式
- 进阶策略:动态Few-shot、上下文重排序
- 落地风险:前提、失败场景、取舍
这道题其实本质在问一件事:你怎么让大模型在生成时,既充分利用检索到的上下文,又不被它带偏,还能产出可信的回答。核心就两个点,让模型明确知道‘要回答什么’和‘能参考什么’,同时把信息密度做到最大,别让指令淹没在资料里。
先说说最常见的模板结构。最通用的就是经典QA式,系统指令先定好角色,说‘你是基于文档回答的助手,严格根据参考资料回答,资料不足就说明’,然后把检索结果拼进去,最后放用户问题。这个模板好处是简单直接,但有个坑,如果检索结果太长或太杂,模型容易忽略指令。所以我会在模板末尾加一段明确的约束,比如‘优先综合多段资料,不确定时回答“根据现有资料无法确定”’。
再一个就是带引用标记的模板,这个在防Hallucination和溯源时特别有用。我会给每段资料编个号,比如[1][2],要求模型回答时必须带引用标记。这样下游校验时,一眼就能看出哪句话对应哪段资料。不过前提是检索结果本身质量要过关,如果资料本身就不相关,模型硬引用反而会误导用户。
还有对话历史融合式,主要用在多轮RAG场景。比如客服系统里,用户先问‘退款政策’,再追问‘那退货运费谁出’,这时候要把历史对话和当前检索到的资料一起放进去,模型才能理解上下文。但这里有个风险,历史对话太长会稀释当前资料的重要性,所以我会控制历史轮数,最多保留两轮。
进阶策略里我重点讲两个。一个是动态Few-shot,从检索结果里挑一两个高质量问答对作为示例,注入到Prompt里。这比单纯给指令更直观,模型看到例子就知道该怎么组织答案。但前提是检索到的示例确实优质,如果示例本身有错,反而会带偏模型。另一个是上下文重排序,把最相关的文档放在Prompt末尾,利用In-Context Learning的近因效应。这个在实测中效果很明显,但要注意,如果相关性判断不准,把不相关的放末尾,模型反而会忽略真正重要的资料。
落地时有个常见失败场景:检索到的上下文中,不同资料相互矛盾。比如企业SOP文档,旧版本说‘满200减50’,新版本说‘满300减80’,模型如果只依赖其中一段就会出错。我的做法是在Prompt里加一句‘如果资料冲突,以最新时间戳为准’,同时要求模型输出时注明‘根据某年某月版本’。
说到这,其实还有一个更激进的方向,让模型自己决定要不要调用检索,而不是每次都硬塞上下文。比如Self-RAG的思路,模型先生成一个初步答案,再判断是否需要检索补充。这个在知识库更新频繁的场景特别有用,但实现复杂度也高。
所以整体上,我更倾向于根据不同场景组合使用模板:客服退款这种高频简单问题,经典QA式加引用标记就够了;政策解读这种依赖多段资料的,就加动态Few-shot和重排序。核心前提是检索质量要过硬,否则Prompt设计得再好也白搭。
关键一句:让模型自己决定是否调用的Self-RAG思路
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服RAG,用户问‘这个手机续航怎么样’,系统从文档库捞了产品参数和几条评测。你打算怎么把这些内容拼成一个Prompt,让模型既能用上资料,又别自己瞎编?
- 问法 2 · 层层追问
RAG里检索回来的文档怎么喂给模型比较好?……你直接拼一段文字丢进去?……那如果资料太长、或者相互矛盾,Prompt里怎么处理才能让模型正确理解?
- 问法 3 · 直球架构
现在让你设计一个RAG生成阶段的Prompt模板,要求模型严格基于上下文回答,并且能输出引用来源。你给出具体的模板结构,再讲讲有哪些能提升质量的策略。