掌握RAG Prompt工程:从新手到大模型高手,收藏这份进阶指南
2026/6/26 15:17:27 网站建设 项目流程

本文深入解析RAG问答系统的Prompt工程,强调其与普通Prompt的不同之处在于切断模型对参数知识的依赖。文章详细介绍了System Prompt和User Prompt的设计原则、约束措辞的强弱对比、长上下文处理策略以及Prompt迭代测试方法。通过实际案例和实验数据,揭示了引用要求在反幻觉中的关键作用,并提供了面试中如何回答RAG Prompt设计的建议。掌握这些技巧,能有效提升RAG系统的准确性和可靠性。

前段时间有个学员来找我复盘,他面了京东的大模型工程岗,项目里做了一套金融保险公司的 RAG 问答系统。他说被面试官问到怀疑人生。他的 RAG 系统在检索阶段做得相当不错——向量召回精准,重排序也加了,Top-5 的文档质量很高。但面试官偏偏不问检索,直接奔着 Prompt 去了。

对话是这样的:

面试官:“你的检索结果准,那最终答案还是有幻觉,问题出在哪?”

他:“可能是检索召回的文档不够相关……”

面试官:“我刚说了检索结果很准。再想想。”

他沉默了几秒:“是不是模型能力不够强?”

面试官摇摇头:“我给你换 GPT-4,幻觉还在。你的 System Prompt 和 User Prompt 是怎么分工的?”

他:“System Prompt 写了角色,User Prompt 传了检索片段和用户问题……”

面试官:“那你的约束怎么写的?模型怎么知道它只能用你传进去的文档,不能用自己的知识?”

他彻底卡住了,支支吾吾说不清楚。

面试官最后说了一句话,让他记了很久:“Prompt 是 RAG 系统的最后一道防线,检索把对的文档找回来,Prompt 决定模型用不用这些文档。”

今天我们把 RAG 系统的 Prompt 工程从头到尾拆清楚。

一、RAG Prompt 的独特挑战:它和普通 Prompt 不一样


很多人把 RAG Prompt 当成普通 Prompt 来写,这是根本性的认知错误。

普通 LLM Prompt 的逻辑很简单:你问一个问题,模型用自己训练时积累的参数知识来回答。模型的知识边界就是答案边界,这是完全合理的设计。

RAG Prompt 的逻辑完全不同:你传进去问题 + 检索到的文档片段,要求模型只用这些文档片段来回答,不能用参数知识。

这里有一个根本性的矛盾:LLM 在预训练阶段见过海量文本,脑子里已经存了大量知识。当你给它一段检索文档,问它问题,它的默认行为是:把检索文档的信息和自己的参数知识混合使用。

这个混合,就是幻觉的来源。

拿我们项目举例。这是一个金融保险公司的 RAG 问答系统,语料库包含 5000 份保险合同和理赔文档。用户问:“重大疾病险的等待期是多久?”

检索系统召回了一份特定产品的条款,明确写着等待期 180 天。但如果 Prompt 写得不好,模型可能回答 90 天——因为市场上有些产品确实是 90 天,这个信息在模型预训练数据里存在。模型没有意识到它应该只看你给它的那份文档,它默默地把两个知识源混合了。

用户拿到错误的等待期信息,去理赔,被拒。这是真实的业务风险。

所以 RAG Prompt 的核心任务是:切断模型对参数知识的依赖,强制它只从检索文档里找答案。

那具体怎么解决这个混合问题?从 System Prompt 的结构设计开始说起。

RAG专用Prompt结构设计

二、System Prompt 设计:角色 + 规则 + 负面约束


System Prompt 是整个 RAG Prompt 架构的基础层,它做三件事:定义角色、设置规则、写明负面约束。

先看我们在保险 RAG 项目中实际使用的 System Prompt:

你是金融保险公司的智能客服助手。 你只能基于提供的参考文档回答用户问题。 回答规则: 1. 只使用参考文档中明确提到的信息,不要添加文档中没有的内容 2. 如果参考文档中没有足够信息回答问题,直接说"根据现有资料,我无法完整回答这个问题",不要猜测 3. 回答时引用来源,格式:[来源:文档名称第X页] 4. 涉及金额、时限等关键数字,必须与文档原文完全一致 5. 不确定的信息前加"根据文档显示",确定的信息直接陈述

这段 System Prompt 的每一条都有其设计逻辑,我逐条解释。

角色定义:明确身份边界

“你是金融保险公司的智能客服助手”——这句话不只是客套,它在给模型划定知识边界。一个保险客服助手,不应该去聊股票行情,不应该去聊其他公司的产品。角色定义是第一层过滤。

紧接着"你只能基于提供的参考文档回答用户问题",这是整个 System Prompt 最重要的一句话。注意用词是"只能",不是"尽量",不是"主要",是"只能"。这个词的强度直接影响模型的行为。

规则第1条:正向约束

“只使用参考文档中明确提到的信息”——这是正向约束,告诉模型能做什么。关键词是"明确提到",不是"相关的",不是"可以推断的",是"明确提到"。这把推理空间大幅压缩,强迫模型找原文,而不是推断。

规则第2条:拒绝兜底

当检索文档里真的没有答案时,模型该怎么办?这条规则给了明确指令:承认不知道,不猜测。很多初级写法里没有这条,导致模型在文档信息不足时,会悄悄调用参数知识来"补全"答案,这正是幻觉的高发场景。

规则第3条:引用要求(反幻觉的核武器)

强制引用来源,格式:[来源:文档名称第X页],这条规则的效果在后面的数据对比里你会看到。它的原理是:模型要写出引用,必须真的在文档里找到对应内容。如果文档里没有,它无法凭空捏造一个引用(当然极少数情况也会捏造,但概率大幅下降)。引用要求本质上是给模型增加了一个"验证步骤",它必须先找到原文,再写回答。

规则第4条:数字核实

金融保险场景里,数字错误是最危险的。等待期、保额、免赔额、理赔时限——任何一个数字写错都可能产生纠纷。这条规则把数字单独列出来,加强约束。

规则第5条:置信度标记

"根据文档显示"vs 直接陈述,这是一种微妙但有用的设计。它让回答本身携带置信度信息,用户可以据此判断信息的可靠程度。

System Prompt 把规则定好了,User Prompt 要解决的是如何把每次请求的内容结构化地传进去。

三、User Prompt 设计:问题 + 上下文的结构化组织


System Prompt 设好了基础规则,User Prompt 负责把每次请求的具体内容传进去:检索到的文档片段 + 用户问题。

关键点在于格式化。你不能把五段检索文档直接拼一起扔给模型,模型会搞不清楚哪段是哪段。

看我们项目的实际实现:

def build_rag_prompt(query: str, retrieved_docs: list) -> str: # 格式化参考文档 context_parts = [] for i, doc in enumerate(retrieved_docs, 1): context_parts.append( f"参考文档{i}(来自:{doc['source']}):/n{doc['text']}" ) context = "/n/n".join(context_parts) user_prompt = f"""参考文档: {context} 用户问题:{query} 请基于以上参考文档回答用户问题。如果文档中没有足够信息,请如实说明。""" return user_prompt

这段代码的设计有几个细节值得说明。

第一,每段文档标了编号和来源。参考文档1(来自:XX产品条款第3页)这样的格式,让模型在引用时有依据,不用自己猜来源名称。

第二,文档之间用双换行分隔。这比单换行更清晰,减少文档边界模糊带来的混淆。

第三,问题放在文档后面,不放在前面。这个顺序是有讲究的。大量实验表明,先文档后问题的顺序,比先问题后文档的顺序,幻觉率更低。原因可能是:先文档让模型先把上下文"读进去",再看问题时有了基础,而先问题可能激活模型的参数知识,导致后续处理文档时仍受参数知识干扰。

第四,结尾的指令再次重申了"基于文档"和"没有就说没有"。System Prompt 的规则有时候在长上下文中会被稀释,User Prompt 末尾再提一次,起到强化作用。

格式定好了,下一步是弄清楚约束措辞本身的强弱差异有多大。

四、约束写法的强弱对比:一字之差,幻觉率相差一倍


System Prompt 里的约束,措辞不同,效果差异极大。这不是玄学,是可以量化的。

我们在 200 条测试样本上做了系统对比,来看不同约束写法的效果:

弱约束写法:

参考以上文档回答用户问题。

这句话看似没问题,但"参考"这个词给了模型很大的自由度。“参考"意味着"可以不完全依赖”,模型于是把参数知识混进来,幻觉率 18%。

中等约束写法:

请主要基于参考文档回答问题,尽量不要添加文档之外的内容。

加了"主要"和"尽量",但这两个词依然是软性约束。模型理解为:如果文档不够用,我可以补充一点自己的知识。幻觉率 12%,有改善但不够好。

强约束写法:

只能使用参考文档中明确提到的信息,文档中未提及的内容不得回答。

"只能"和"不得"是强制性语气,没有任何弹性空间。幻觉率 9%。

强约束 + 引用要求:

只能使用参考文档中明确提到的信息,文档中未提及的内容不得回答。 每一个陈述必须标注来源,格式:[来源:文档名称第X页]。

加上引用要求后,模型被迫先找原文,再写答案。幻觉率降至 7%,有引用的回答占比从 32% 升至 91%。

这里有一个有意思的 badcase,可以说明问题。

测试集里有一条问题:"意外险的等待期是多久?"检索系统召回了 A 产品的条款(等待期 0 天,意外险通常无等待期)和 B 产品的条款(等待期 15 天,这个产品比较特殊)。

弱约束下,模型回答:“意外险通常没有等待期,但也有产品设置 30 天等待期。”——30 天这个数字来自哪里?是模型参数知识里其他产品的数据,文档里根本没有。

强约束 + 引用要求下,模型回答:“根据文档显示,A产品意外险等待期为 0 天 [来源:A产品条款第2页],B产品意外险等待期为 15 天 [来源:B产品条款第3页]。如需了解具体产品,请告知产品名称。”——精准,有引用,拒绝了编造。

约束写法解决了正常长度输入的问题,但当检索结果很多、上下文变得很长时,还有另一个挑战需要处理。

五、长上下文压缩策略:超长时怎么处理


我们项目里,用户有时会问跨产品的比较类问题,或者问涉及多个条款的复杂问题。检索系统可能召回 10-15 个片段,总 token 数轻松超过 32K。

超长上下文带来两个问题:第一,超过模型的上下文窗口,直接报错;第二,即使没超,"迷失在中间"现象(Lost in the Middle)——模型对上下文中间部分的注意力显著弱于开头和结尾,导致关键信息被忽略。

我们用了三种策略,根据场景选择:

策略一:截断法

保留相关性最高的 Top-3 片段,其余丢弃。实现最简单,延迟几乎不增加,但信息损失大,适合对速度敏感、问题比较简单的场景。

策略二:压缩法(我们主要用的)

用 LLM 把每个片段压缩为关键信息摘要,保留核心内容,剔除冗余。信息损失小,但增加了一次 LLM 调用的延迟。看具体实现:

def compress_context(docs: list, query: str, max_tokens: int = 2000) -> str: """超出token限制时,压缩每个文档片段""" compressed = [] for doc in docs: if len(doc['text']) > 500: # 用LLM提炼关键信息 summary = llm.invoke( f"从以下文本中提炼与问题'{query}'相关的关键信息(50字以内):/n{doc['text']}" ) compressed.append(summary.content) else: compressed.append(doc['text']) return "/n/n".join(compressed)

注意压缩提示词里有'{query}'——这是 query-aware 压缩,不是通用摘要。模型会优先保留与用户问题相关的信息,而不是文档本身认为重要的信息。这个细节影响很大,用通用摘要的话,压缩出来的内容往往是文档的前几句(因为那里通常是主题句),而不是用户真正需要的那部分。

策略三:分批处理

把 N 个文档片段分成几批,每批单独问模型,得到多个中间答案,最后再用一次 LLM 把中间答案合并成最终答案。适合超长文档,但延迟最高,也最复杂。我们在用户问"帮我总结所有产品的等待期规定"这类问题时才启用。

Prompt优化前后幻觉率对比

三种策略加起来,超过 32K token 的请求处理成功率从 45% 提升到 92%。另外 8% 基本是极端情况(单个文档本身就超长,无法有效压缩),我们对这类请求做了降级处理,返回"该文档过长,建议直接查阅原文"。

长上下文处理好之后,整个 Prompt 体系还需要一套系统的测试方法来验证效果,不能靠感觉。

六、Prompt 迭代测试方法:怎么知道你的 Prompt 好不好


写完 Prompt 不能靠感觉判断好坏,必须建立系统的评测机制。

我们的做法是建立 Prompt 版本库,用 Git 管理每一版 Prompt,提交记录里写清楚改了什么、为什么改、改后的测试指标变化。这样几个月后回头看,能清楚地看到每次优化的效果,也能方便地回滚。

评测指标:忠实度(Faithfulness)

衡量 RAG 系统幻觉的核心指标是忠实度——模型的回答有多大比例可以在检索文档里找到原文依据。

我们在 200 条测试样本上计算忠实度,样本覆盖了:

  • 文档里有明确答案的问题(应该回答正确)
  • 文档里只有部分答案的问题(应该部分回答,说明缺失)
  • 文档里完全没有答案的问题(应该拒绝回答)

三类样本都要测,光测第一类是不够的。很多团队在"文档有答案"的情况下表现不错,但在"文档没答案"时模型会编造,这才是最危险的场景。

典型 badcase 复盘

测试过程中发现一个高频 badcase:用户问"等待期多久",模型回答时混入了其他产品的数据。

复盘下来,原因有三层:

第一层,检索召回了多个产品的条款片段,模型混淆了。这是检索层的问题,但 Prompt 也要应对这种情况。

第二层,Prompt 里没有要求模型区分不同产品分开回答。加了"如果文档涉及多个产品,请分产品分别回答"之后,混淆大幅减少。

第三层,引用要求不够细。之前要求"标注文档名称",但文档名称里有时候没有产品名称,加了"引用时必须包含产品名称"之后,模型被迫把产品信息搞清楚才能写引用。

这种层层深挖的 badcase 复盘,是 Prompt 迭代最有价值的工作。每个 badcase 背后都有原因,找到原因,加一条规则,验证效果,这就是 Prompt 工程的核心循环。

掌握了这套设计和测试方法,再遇到面试官追问 RAG Prompt 的问题,就可以有条理地把这几个层次都讲清楚。

RAG上下文长度处理策略

七、面试怎么答 RAG Prompt 设计?


面试官问这个问题,考察的是三个层次的理解:知道问题在哪、知道怎么设计、知道怎么验证。

第一层:说清楚 RAG Prompt 的独特性

不要一上来就讲技术细节。先定性:RAG Prompt 和普通 Prompt 的根本差异在于,普通 Prompt 让模型用参数知识回答,RAG Prompt 要切断参数知识依赖,强制模型只用检索文档。这个前提讲清楚,面试官知道你理解问题的本质。

第二层:讲 System/User 分工原则

System Prompt 管"规则",是跨所有请求不变的:角色定义、回答约束、引用要求、拒绝策略。User Prompt 管"内容",是每次请求不同的:这次检索到的文档、这次用户的问题。

分工清晰有两个好处:一是逻辑清晰,调试容易;二是 System Prompt 可以复用,修改规则时不用动 User Prompt 的构建逻辑。

第三层:讲约束强度和引用要求

面试官通常会追问:你具体怎么写约束?这里要把"弱约束 vs 强约束"的对比讲清楚,然后重点讲引用要求。引用要求是 RAG Prompt 里反幻觉效果最显著的单一手段,要说清楚原理:强制引用迫使模型先找原文,无法凭空编造。

第四层:讲长上下文处理

很多候选人讲到第三层就停了,能讲到长上下文处理的人不多。这里说三个策略(截断、压缩、分批),以及 query-aware 压缩的细节,是很好的加分项。

第五层:讲评测方法

如果面试还有时间,补一句 Prompt 迭代怎么测:建版本库、200 条测试集、跑忠实度指标、复盘 badcase。这说明你不是靠感觉写 Prompt,而是有系统方法。能讲到这一层,基本稳了。

一个完整的回答框架(60 秒版本):

"RAG Prompt 的核心挑战
检索把对的文档找回来,Prompt 决定模型用不用这些文档。两者缺一不可。

最后

如果说程序员已经是高薪职业,那么干AI的程序员,就是高薪中的高薪。

现在的市场,已经用数据给程序员指明了方向:学AI大模型,就是冲刺高薪的最优解!

看着身边越来越多的同行转型大模型、拿到高薪offer,很多人心里都动了心,但真正的难题来了:零基础小白不知道从哪入门?有基础的程序员找不到系统学习路径?实战项目练手无门?面试不知道考什么?

别慌!今天就给大家整理了一份【2026年最新版】AI大模型免费学习资源包,覆盖从入门到实战、从理论到面试、从基础到进阶的全流程,所有资料均已整理归档,无冗余、无套路,免费分享给每一位想抓住AI风口的程序员和小白!

👇👇扫码免费领取全部内容👇👇

1、大模型系统化学习路线

2、大模型学习书籍&文档

3、AI大模型最新行业报告

4、大模型项目实战&配套源码

5、大模型大厂面试真题

四阶段精细化学习规划(附时间节点,可直接照做)

结合上述资源,给大家整理了一份可直接落地的四阶段学习规划,总时长约2个月,小白可循序渐进,程序员可根据自身基础调整节奏,高效掌握大模型核心能力,快速实现从“入门”到“能落地、能面试”的跨越。

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范
第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署
第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建
第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

👇👇扫码免费领取全部内容👇👇

6、这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询