Skip to content

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商业200KAPI
Gemini 1.5 Pro商业1MAPI
Llama 3.1 70B/8B70B/8B128K高/中慢/快自部署
Qwen2.5 72B/7B72B/7B128K高/中慢/快自部署
DeepSeek-V2/V3商业/开源128KAPI/自部署
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 基础概念
  • **评估指标详解** — 输出质量评估
  • <- 返回 **生成融合索引**

Knowledge4J — Java 知识库