RAG提示词工程:从入门到精通,让你的大模型不再“幻觉”!
一、提示词是 RAG 的最后一道关卡
经过前几天的学习,我们已经掌握了如何将文档切块、向量化并高效检索。现在,检索到了相关的文本片段,我们需要把它们和用户的问题一起"喂"给大模型。
如何组织这个喂食的方式,就是 RAG 提示词工程的核心。
一个精心设计的提示词能让大模型:
- 严格基于检索到的内容作答,不凭空编造
- 在答案中注明参考来源
- 当检索内容不足时,诚实说"我不知道"
- 以用户期望的格式和风格输出
二、RAG 提示词的基础结构
一个标准的 RAG 提示词由四个部分组成:
┌─────────────────────────────────────────────┐│ 1. 角色定义(Role) ││ 告诉模型它是谁,有什么职责 │├─────────────────────────────────────────────┤│ 2. 行为规则(Rules) ││ 明确回答的约束和格式要求 │├─────────────────────────────────────────────┤│ 3. 检索上下文(Retrieved Context) ││ 插入检索到的文档片段 │├─────────────────────────────────────────────┤│ 4. 用户问题(User Question) ││ 原始用户输入 │└─────────────────────────────────────────────┘
三、从基础到高级的提示词设计
Level 1:最简版本
def basic_rag_prompt(context: str, question: str) -> str: returnf"""根据以下参考资料回答用户问题:参考资料:{context}用户问题:{question}回答:"""
问题:模型可能忽略上下文,直接用训练知识作答;无法处理上下文不足的情况。
Level 2:加入防幻觉约束
def safe_rag_prompt(context: str, question: str) -> str: system = """你是一位严谨的知识助手。## 规则1. 只根据下方"参考资料"中的内容回答问题2. 如果参考资料中没有足够信息,请明确回答:"根据现有资料,我无法回答这个问题。"3. 不要编造、推测或使用训练数据中的知识来补充答案4. 回答要简洁准确,避免冗余""" user = f"""## 参考资料{context}## 用户问题{question}""" return system, user
改进:明确禁止模型超出上下文范围作答。
Level 3:带来源引用的提示词
让模型在答案中标注来源,提升可信度和可追溯性:
CITATION_PROMPT = """你是一位严谨的知识助手,擅长基于文档资料给出有来源依据的答案。## 行为规则1. 仅使用下方"参考资料"中的内容回答问题2. 引用信息时用 [来源N] 的格式标注,如:RAG 技术在 2020 年由 Meta AI 提出 [来源1]3. 在答案末尾列出所有引用的完整来源信息4. 若参考资料不足以回答,明确说明并建议用户查阅其他资料5. 禁止凭空编造内容## 参考资料{context}## 问题{question}## 回答格式[正文,含 [来源N] 引用标注]**引用来源:**- [来源1] {source_1_metadata}- [来源2] {source_2_metadata}"""
Level 4:生产级完整模板
from langchain_core.prompts import ChatPromptTemplateRAG_SYSTEM_PROMPT = """你是 {assistant_name},一位基于知识库回答问题的专业助手。## 身份与职责- 你只能基于下方提供的参考资料回答问题- 你的回答应当准确、简洁、有据可查## 严格规则(不可违反)1. **不编造**:若参考资料中无相关信息,回答"当前资料中未找到相关信息,建议您直接查阅官方文档"2. **不猜测**:禁止推断或补充资料中未明确陈述的内容3. **标注来源**:每个关键事实后用 [文档X] 标注来源4. **置信度声明**:若信息可能已过时,请注明"此信息来自 {doc_date},建议核实最新情况"## 输出格式- 使用 Markdown 格式- 关键信息用**加粗**标注- 超过 3 点时使用列表"""RAG_USER_TEMPLATE = """## 参考资料{context}---## 用户问题{question}"""prompt = ChatPromptTemplate.from_messages([ ("system", RAG_SYSTEM_PROMPT), ("human", RAG_USER_TEMPLATE)])
四、上下文构建的最佳实践
4.1 文档格式化
不要把文本块直接拼接,要为每个片段加上清晰的分隔和来源标识:
def format_context(docs: list) -> str: formatted = [] for i, doc inenumerate(docs, 1): source = doc.metadata.get("source", "未知来源") page = doc.metadata.get("page", "") page_info = f" 第{page}页"if page else"" formatted.append(f"[文档{i}] 来源:{source}{page_info}\n"f"{doc.page_content}\n" ) return"\n---\n".join(formatted)
4.2 控制上下文长度
上下文过长会导致"大海捞针"问题(Long-context Lost-in-the-middle 效应)——模型对放在中间的信息关注度最低:
相关性位置实验(Anthropic/Stanford 研究):├── 放在开头:准确率 ~70%├── 放在中间:准确率 ~40% ← 显著下降└── 放在结尾:准确率 ~65%
策略:
- Top-K 不要超过 5~6 个片段(1000~3000 token 上下文)
- 把相关性最高的片段放在第一位或最后一位
def reorder_docs_lost_in_middle(docs):"""相关性最高的放首尾,次要的放中间""" iflen(docs) <= 1: return docs reordered = [] for i, doc inenumerate(docs): if i % 2 == 0: reordered.append(doc) # 偶数放前面 else: reordered.insert(0, doc) # 奇数插入最前 return reordered
4.3 查询与上下文的关联提示
在提示词中明确指引模型关注与问题相关的部分:
context_prompt = f"""以下是与问题"{question}"相关的参考资料(按相关性排列):{formatted_context}请特别关注与"{question}"直接相关的信息。"""
五、防幻觉的五大策略
| 策略 | 实现方式 | 效果 |
|---|---|---|
| 明确禁止 | 提示词中写"禁止编造" | 基础防护 |
| 引用机制 | 要求标注来源 [文档N] | 迫使模型寻找依据 |
| 拒绝兜底 | 提供"我不知道"的模板 | 允许模型优雅退出 |
| 置信度声明 | 要求模型说明确定程度 | 用户自行判断 |
| 后处理验证 | 用代码检查答案中的引用是否存在 | 程序化防护 |
def validate_citations(answer: str, docs: list) -> bool:"""验证答案中的引用是否真实存在于检索结果中""" import re cited_indices = re.findall(r'\[文档(\d+)\]', answer) for idx in cited_indices: if int(idx) > len(docs): returnFalse# 引用了不存在的文档 returnTrue
六、完整 RAG Chain 示例
from langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthroughfrom langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4o-mini", temperature=0)def format_docs(docs): return format_context(docs) # 使用上文定义的格式化函数rag_chain = ( {"context": retriever | format_docs,"question": RunnablePassthrough() } | prompt # 使用 Level 4 的提示词模板 | llm | StrOutputParser())answer = rag_chain.invoke("RAG 和微调的核心区别是什么?")print(answer)
七、总结与预告
今天掌握了 RAG 提示词工程的完整体系:
- 四层提示词结构:角色 → 规则 → 上下文 → 问题
- 从 Level1 到 Level4 的递进式提示词设计
- Lost-in-the-middle 效应和上下文重排策略
- 防幻觉的 5 大实现策略
- 完整 LangChain RAG Chain 示例
明天预告(Day07):用 LangChain 搭建第一个完整的 RAG 应用——把前 6 天的所有知识串联起来,实现一个可以在本地运行的 PDF 问答系统,代码量不超过 100 行。
知识点索引
| # | 知识点 | 说明 |
|---|---|---|
| 1 | System Prompt | 系统提示词,定义模型角色和行为规则 |
| 2 | Context Stuffing | 将检索内容填入提示词的过程 |
| 3 | Hallucination Guard | 防幻觉约束,通过提示词限制模型行为 |
| 4 | Citation | 引用标注,要求模型注明信息来源 |
| 5 | Lost-in-the-Middle | 模型对长上下文中间部分关注度下降的现象 |
| 6 | Graceful Degradation | 优雅降级,在信息不足时诚实说明 |
| 7 | Prompt Template | 提示词模板,参数化的提示词结构 |
| 8 | RAG Chain | RAG 流水线,检索+提示+生成的完整链路 |
说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。
结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”
我先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。
即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!
这绝非空谈。数据说话
2025年的最后一个月,脉脉高聘发布了《2025年度人才迁徙报告》,披露了2025年前10个月的招聘市场现状。
AI领域的人才需求呈现出极为迫切的“井喷”态势

2025年前10个月,新发AI岗位量同比增长543%,9月单月同比增幅超11倍。同时,在薪资方面,AI领域也显著领先。其中,月薪排名前20的高薪岗位平均月薪均超过6万元,而这些席位大部分被AI研发岗占据。
与此相对应,市场为AI人才支付了显著的溢价:算法工程师中,专攻AIGC方向的岗位平均薪资较普通算法工程师高出近18%;产品经理岗位中,AI方向的产品经理薪资也领先约20%。
当你意识到“技术+AI”是个人突围的最佳路径时,整个就业市场的数据也印证了同一个事实:AI大模型正成为高薪机会的最大源头。
最后
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。
我整理出这套 AI 大模型突围资料包【允许白嫖】:
- ✅从入门到精通的全套视频教程
- ✅AI大模型学习路线图(0基础到项目实战仅需90天)
- ✅大模型书籍与技术文档PDF
- ✅各大厂大模型面试题目详解
- ✅640套AI大模型报告合集
- ✅大模型入门实战训练
这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

①从入门到精通的全套视频教程
包含提示词工程、RAG、Agent等技术点

② AI大模型学习路线图(0基础到项目实战仅需90天)
全过程AI大模型学习路线

③学习电子书籍和技术文档
市面上的大模型书籍确实太多了,这些是我精选出来的

④各大厂大模型面试题目详解

⑤640套AI大模型报告合集

⑥大模型入门实战训练

👉获取方式:
有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)