RAG 中如何设计 Prompt 来有效利用检索到的文档?
RAG 中如何设计 Prompt 来有效利用检索到的文档?
这道题考的是 RAG(检索增强生成)系统中 Prompt 设计的完整链路能力。面试官想看你能不能把"先找后用"这件事讲清楚——怎么让模型找到对的东西,怎么把找到的东西喂对。
我从四个方面来讲:RAG 基本工作原理、检索前的查询优化、检索后的文档处理、进阶的高级策略。
1. 先搞懂 RAG 怎么工作
RAG 的核心就四个字:先找后写。
用户问一个问题 → 系统去知识库里找相关文档 → 把文档塞进 Prompt → 大模型根据文档内容生成回答。
这就像你写论文时,老师要求你标注参考文献来源。Prompt 里那段检索到的文档,就是你的"参考资料"。模型的任务是:忠实引用这些资料,不要自己瞎编。
配图:RAG 工作流程图,展示 Query → Embedding → 向量检索 → Top-K 文档 → 拼接 Prompt → LLM 生成回答
理解这一点很关键:Prompt 不是凭空发挥,而是带着脚镣跳舞。脚镣就是检索到的文档。
2. 检索前——让 Query 更容易被找到
好多人忽视这一步。上来就直接问,检索效果差,怪模型不行。其实问题出在 query 本身。
查询改写:把口语变成检索词
你问"那个绿房子旁边怎么走",搜不到任何东西。但问"最近的地铁站在哪",系统能给你准确定位。
用户提问往往是口语化的、模糊的。直接拿去做检索,效果不好。
HyDE(Hypothetical Document Embeddings) 就是解决这个问题的。它让大模型先根据问题生成一个"假设答案",再用这个假设答案去检索。
流程是这样的:用户 Query → LLM 生成假设文档 → 假设文档向量化 → 检索匹配 → 返回真实文档。
为什么这样有效?因为假设答案包含了关键词和语义信息,和知识库里的真实文档更接近。
配图:HyDE 工作原理图,展示原始 Query → 生成假设文档 → 向量化 → 检索匹配 → 返回真实文档
query 扩写和分解
复杂问题要拆开问。"苹果公司的创始人是谁,他们创办时有什么故事"——这个问题其实包含两个子问题:创始人是谁、创业故事。
拆成两个 query 分别检索,再合并结果,比一个 query 效果好很多。
3. 检索后——把文档喂给模型的方式决定了答案质量
找到文档只是第一步。怎么把文档组织好塞进 Prompt,直接决定模型输出的质量。
文档要排序、要精简
检索回来 Top-K 个文档,不要一股脑全塞进去。
第一件事:排序。 把最相关的放前面。模型对上下文开头和结尾的内容记忆最强,中间的容易"遗忘"。
第二件事:精简。 每个文档只取和问题相关的片段。模型上下文窗口有限,废话多了,有效信息就被挤出去了。
块大小选择很重要。常见的是 256-512 tokens。太短了上下文碎片化,太长了引入无关信息。
Prompt 模板结构
一个好的 RAG Prompt 大致长这样:
你是一个知识助手。请基于以下参考资料回答用户问题。
【参考资料】
{retrieved_docs}
请注意:
- 只基于参考资料回答,不要编造
- 如果参考资料没有涉及,就说"我不知道"
- 引用时要忠实原文,不要自己发挥
【用户问题】
{query}
这个模板的关键点:
- 明确告诉模型这是参考资料,不是模型自己的知识
- 明确指令"不要编造",降低幻觉
- 设置"不知道"的出口,避免硬编
配图:检索后处理流程图,展示原始检索结果 → 去重精简 → 排序 → 拼接为上下文 → 构造 Prompt
引用来源标注
如果业务需要,你可以让模型在回答时标注来源。
根据参考资料[1],苹果公司由史蒂夫·乔布斯等人创立...
这样用户可以追溯原文,增加可信度。
4. 加分项——高级检索策略让 Prompt 效果翻倍
上面是基础,下面说几个能让你脱颖而出的点。
混合搜索:关键词 + 语义的组合拳
纯语义搜索遇到专业术语容易翻车。搜"Transformer 架构",可能返回的是变形金刚的新闻。
关键词搜索(BM25)专治这种问题。
混合搜索就是同时跑语义搜索和关键词搜索,合并结果再重排序。取长补短,效果比单一搜索好。
配图:混合搜索架构图,展示 Query 同时进入语义搜索和关键词搜索,结果合并后重排序
迭代检索:复杂问题的多轮推理
有些问题一次检索搞不定。
比如"为什么特斯拉的市值比丰田高?",这需要检索两家公司的财务数据、市场分析、媒体报道,然后综合分析。
迭代检索就是:初始查询 → 检索 → 生成初步回答 → 判断是否需要深入 → 再次检索 → 最终回答。
模型可以自己判断第一次检索是否充分,决定要不要继续。
配图:迭代检索示意图,展示初始查询 → 检索 → 生成初步回答 → 判断是否需要深入 → 再次检索 → 最终回答
嵌入模型微调
通用 Embedding 在特定领域效果差。医学文档用通用模型,检索准确率堪忧。
在业务数据上微调 Embedding,能显著提升检索质量。这是很多人忽略的点。
CRAG:检索结果质量检测
检索回来的文档可能不相关。怎么办?
CRAG(Corrective Retrieval Augmented Generation) 就是加一个纠错层。它会检测检索结果的质量,如果相关性太低,触发网络搜索补充,或者让模型基于少量相关片段回答。
这不是 Prompt 设计本身,但和整体效果强相关。
面试怎么答
基础版
"RAG 中的 Prompt 设计分三个阶段。
检索前,要做好查询改写。用户问题往往是口语化的,需要通过 HyDE 或者 query 扩写让检索词更精准。
检索后,要对文档做处理:排序、精简、截取相关片段。不要把所有文档一股脑塞进去,块大小控制在 256-512 tokens 左右。
生成时,Prompt 要明确这是参考资料,指令模型只基于上下文回答,不要编造,设置'不知道'的出口。
一个基本模板是:角色设定 + 检索上下文 + 引用指令 + 用户问题。"
加分版
"基础的三阶段我刚才说了,加分项有几个:
混合搜索结合语义和关键词检索,解决专业术语和模糊语义的双重需求。
迭代检索处理复杂问题,让模型自己判断是否需要多轮检索。
嵌入模型微调在特定领域很关键,通用模型效果有限。
CRAG 纠错能主动检测低质量检索结果,触发补充检索或降级处理。
从系统角度看,Prompt 设计不是孤立的,和分块策略、检索策略相互影响,需要整体优化。"
一句话总结
RAG 中 Prompt 设计的核心是:检索前优化 query、检索后组织好文档、生成时明确指令,三阶段协同,缺一不可。
