03.1 - 生成模型选择与 Prompt 设计
定位: RAG 的输出端——选择适合场景的生成模型并设计高质量的 Prompt 模板 面试高频度: ⭐⭐⭐⭐ 考查方式: 模型选型、Prompt 模板结构、模型-场景匹配
一、这是什么?为什么需要它?
是什么
生成模型选择 + Prompt 设计 = RAG 系统的"大脑和嘴巴"
- 模型选择:决定推理能力、输出质量、成本
- Prompt 设计:决定如何使用检索到的信息、如何约束输出格式
检索到的文档块只是"原料",生成模型和 Prompt 才是"厨师"。
原料再好,厨师不行也做不出好菜。为什么两者同等重要?
场景 1:选对了模型,Prompt 写得差
模型:GPT-4(能力很强)
Prompt:只是简单拼接检索结果和问题,没有系统指令
结果:模型可能忽略检索结果,用自己的知识生成 -> 依然可能幻觉
场景 2:Prompt 写得好,选错了模型
Prompt:精心设计了指令、格式、约束
模型:一个能力较弱的小模型(3B 参数)
结果:模型理解不了复杂指令,无法遵循格式 -> 输出混乱
结论:模型能力 + Prompt 设计 = 两大支柱,缺一不可二、原理拆解
2.1 生成模型选型要素
| 选型维度 | 说明 | 影响因素 |
|---|---|---|
| 推理能力 | 能否理解复杂检索结果并推理 | 模型参数量、训练数据质量 |
| 上下文窗口 | 一次能处理多少 tokens | 直接影响能传入多少检索块 |
| 指令遵循 | 能否严格遵循 Prompt 指令 | RLHF 对齐质量、指令微调 |
| 输出格式 | 是否能输出 JSON/结构化数据 | 模型对齐程度 |
| 延迟 | 首 token 生成速度 | 模型大小、量化、推理引擎 |
| 成本 | 每百万 token 的价格 | 商业 vs 开源、参数量 |
主流生成模型对比:
| 模型 | 参数量 | 上下文窗口 | 推理能力 | 延迟 | 成本 | 部署 |
|---|---|---|---|---|---|---|
| GPT-4o/GPT-4o-mini | 商业 | 128K | 最高 | 中/快 | 高/中 | API |
| Claude 3.5 Sonnet | 商业 | 200K | 高 | 中 | 高 | API |
| Gemini 1.5 Pro | 商业 | 1M | 高 | 中 | 中 | API |
| Llama 3.1 70B/8B | 70B/8B | 128K | 高/中 | 慢/快 | 低 | 自部署 |
| Qwen2.5 72B/7B | 72B/7B | 128K | 高/中 | 慢/快 | 低 | 自部署 |
| DeepSeek-V2/V3 | 商业/开源 | 128K | 高 | 快 | 低 | API/自部署 |
| Mistral Large/Small | 商业/开源 | 128K | 高/中 | 中/快 | 中/低 | API/自部署 |
2.2 RAG Prompt 模板结构
一个完整的 RAG Prompt 应该包含以下部分:
===== 系统指令 =====
你是一个基于提供文档回答问题的AI助手。
规则:
1. 严格基于提供的文档回答问题
2. 如果文档中没有相关信息,请明确告知"文档中没有相关答案"
3. 不要编造信息或使用自己的知识补充
4. 在回答末尾标注引用的文档来源
===== 文档上下文 =====
[文档1] 来源:员工手册.pdf 第3章
根据公司规定,员工每年享有15天带薪年假...
[文档2] 来源:考勤制度.pdf 第5条
年假申请需提前3个工作日通过HR系统提交...
===== 用户问题 =====
公司的年假政策是什么?如何申请?
===== 输出格式 =====
请按以下格式回答:
{ "answer": "...", "sources": ["..."] }2.3 Prompt 模板关键设计原则
原则 1:指令优先
好的 Prompt 把指令放在最前面,文档放在中间,问题放在最后:
[指令] -> [文档] -> [问题]
原因:模型注意力在开头和结尾最强。指令放在开头确保模型"记住"规则原则 2:检索结果排序标注
给每个检索块标注相关性:
[非常相关] 第3章 年假规定...
[部分相关] 第5章 考勤制度...
[仅供参考] 第8章 加班补贴...
原因:让模型知道哪些信息最重要,优先使用高相关性内容原则 3:反幻觉约束
不充分的约束:
"请回答问题"
充分的约束:
"如果你在提供的文档中找不到相关信息,
请直接回答'文档中未找到相关信息',
不要根据自己的知识回答,不要补充文档之外的信息。"2.4 模型-场景匹配指南
你的 RAG 场景需要什么?
|
+-- 简单问答(FAQ/知识库)?
| -> 小模型(7B-8B)+ 精简Prompt
| -> 示例:Qwen2.5-7B / Llama3.1-8B / GPT-4o-mini
|
+-- 复杂推理(法律/医疗)?
| -> 大模型(70B+/商业API)+ 详细指令
| -> 示例:GPT-4o / Claude 3.5 / DeepSeek-V3
|
+-- 结构化输出(JSON/代码)?
| -> 指令遵循强的模型 + 严格输出格式
| -> 示例:GPT-4o / DeepSeek-V3
|
+-- 高吞吐、低成本?
| -> 小模型 + 量化 + 批处理
| -> 示例:Llama3.1-8B (INT4) / Qwen2.5-7B
|
+-- 多语言/中文为主?
-> 中文优化模型
-> 示例:Qwen2.5 / DeepSeek / Yi三、图解全景
RAG Prompt 的生命周期
+------------------------------------------------------------------+
| RAG Prompt 组装到输出的全过程 |
| |
| 1. 基础模板准备(离线) |
| +----------------------+ |
| | 系统指令(固定部分) | |
| | + 规则说明 | |
| | + 输出格式要求 | |
| | + 反幻觉约束 | |
| +----------------------+ |
| |
| 2. 在线组装 |
| +------------------------------------------------------+ |
| | 系统指令(固定) + 检索结果(动态) + 用户问题(动态) | |
| +------------------------------------------------------+ |
| |
| 3. 生成 |
| +------------------------------------------------------+ |
| | LLM 处理 Prompt -> 生成回答 -> 需要时格式化为 JSON/文本 | |
| +------------------------------------------------------+ |
| |
| 4. 输出后处理 |
| +------------------------------------------------------+ |
| | 提取引文来源 -> 校验输出是否符合格式 -> 返回用户 | |
| +------------------------------------------------------+ |
+------------------------------------------------------------------+四、实战验证
4.1 不同模型的 Prompt 响应实验
python
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# 构造 RAG Prompt
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个基于文档回答的助手。
规则:
- 仅基于以下文档回答
- 如果文档中没有答案,说"文档中未找到"
- 引用文档来源"""),
("human", "文档:{context}\n\n问题:{question}")
])
# 测试不同模型
models_to_test = [
("gpt-4o-mini", "GPT-4o-mini"),
("gpt-4o", "GPT-4o"),
("claude-3-5-sonnet-20241022", "Claude 3.5"),
]
context = "根据员工手册第3章,年假为15天。"
question = "年假有多少天?"
for model_name, label in models_to_test:
llm = ChatOpenAI(model=model_name)
chain = prompt | llm
response = chain.invoke({"context": context, "question": question})
print(f"{label}: {response.content[:100]}")4.2 Prompt 模板对比实验
bash
# 实验:对比不同 Prompt 模板对 RAG 质量的影响
# 使用 RAGAS 评估
# Prompt A(简单拼接):
# 文档:{context}
# 问题:{question}
# 预期:faithfulness ~0.65
# Prompt B(带指令):
# 系统:你是基于文档回答的助手...
# 文档:{context}
# 问题:{question}
# 预期:faithfulness ~0.78
# Prompt C(完整模板):
# 系统:严格规则+格式要求
# 排序后的文档+标注
# 问题+输出格式
# 预期:faithfulness ~0.85五、面试视角
| 问题 | 答案要点 |
|---|---|
| RAG 的 Prompt 和普通 Prompt 核心区别? | RAG Prompt 必须包含检索结果上下文,并且需要明确指令让模型"使用文档而非自己的知识"。普通 Prompt 依赖模型自身知识,RAG Prompt 约束模型使用外部知识 |
| 生成模型选型时最重要的因素? | 1) 推理能力(能否理解复杂检索结果);2) 上下文窗口(能否容纳足够多的检索块);3) 指令遵循(能否严格遵循反幻觉约束) |
| 为什么建议模型使用检索结果前先排序? | 模型注意力机制倾向于关注信息开头和结尾。把最相关的文档块放在最前面,提高模型使用高相关性信息的概率 |
| 反幻觉 Prompt 设计的核心技巧? | 1) 明确说要"基于文档"回答;2) 说"不知道就说不知道"; 3) 禁止补充文档外的信息;4) 要求标注来源;5) 用否定句约束("不要编造") |
📚 相关链接
- **上下文窗口管理** — 窗口不够时的处理策略
- **什么是RAG** — RAG 基础概念
- **评估指标详解** — 输出质量评估
- <- 返回 **生成融合索引**