京东面试官都在问的RAG Prompt教程(非常详细),解决幻觉从入门到精通,收藏这一篇就够了!

📅 发布时间:2026/7/7 23:33:55 👁️ 浏览次数:
京东面试官都在问的RAG Prompt教程(非常详细),解决幻觉从入门到精通,收藏这一篇就够了!
前段时间有个学员来找我复盘他面了京东的大模型工程岗项目里做了一套金融保险公司的 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 的核心挑战是切断模型对参数知识的依赖。我们 System Prompt 负责三件事角色定义、强约束只能用文档不得猜测、引用要求每句话必须标来源。User Prompt 负责格式化检索文档和用户问题。约束写法上只能’比’尽量’效果差很多加引用要求后幻觉率从 18% 降到 7%。上下文超长时我们用 query-aware 压缩根据用户问题提炼每个片段的关键信息处理成功率从 45% 提到 92%。整个 Prompt 迭代用版本库管理在测试集上跑忠实度指标通过 badcase 复盘找问题。”总结RAG Prompt 设计不是写一段文字那么简单。System Prompt 是规则层负责角色定义和约束体系User Prompt 是内容层负责格式化检索文档和用户问题。约束要用强制性语气只能和不得比尽量和主要有效得多。引用要求是反幻觉效果最显著的单一手段强制模型先找原文才能写答案。长上下文用 query-aware 压缩来处理保留与用户问题最相关的信息。整个体系要用测试集和忠实度指标来量化用 badcase 复盘来持续迭代。检索把对的文档找回来Prompt 决定模型用不用这些文档。两者缺一不可。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】