跳到正文

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. 问法 1 · 场景切入

    假设你在做一个电商客服RAG,用户问‘这个手机续航怎么样’,系统从文档库捞了产品参数和几条评测。你打算怎么把这些内容拼成一个Prompt,让模型既能用上资料,又别自己瞎编?

  2. 问法 2 · 层层追问

    RAG里检索回来的文档怎么喂给模型比较好?……你直接拼一段文字丢进去?……那如果资料太长、或者相互矛盾,Prompt里怎么处理才能让模型正确理解?

  3. 问法 3 · 直球架构

    现在让你设计一个RAG生成阶段的Prompt模板,要求模型严格基于上下文回答,并且能输出引用来源。你给出具体的模板结构,再讲讲有哪些能提升质量的策略。

同模块相关题目