前置知识
阅读本文前,建议先了解:
- 大模型基础理论 - LLM 基本原理
- 01-Token 与分词 - Token 与上下文
一、什么是 Prompt?
Prompt(提示词) 是你与 LLM 对话时输入的文字。你可以把它理解为:
- 对 LLM 说话的方式
- 给 LLM 的”指令”
- 与 LLM 沟通的”桥梁”
你(输入):"请帮我总结这篇文章的主要内容"
↓
Prompt
↓
LLM:返回一篇摘要
[!比喻] Prompt 像什么? Prompt 就像是”魔法师的咒语”。同样的 LLM(就像同一个魔法师),用不同的咒语(Prompt),会召唤出不同的结果。
二、完整提示词的组成要素(核心概念)
广义 Prompt vs 狭义 Prompt
- 狭义 Prompt:仅指用户当前输入的那句话
- 广义 Prompt(完整提示词/Full Prompt):系统提示词 + 历史信息 + 用户输入的总和
在实际工程中,**发送给模型的完整 Prompt(Full Prompt)**是由多个部分组成的,而不仅仅是用户当前输入的那句话:
完整 Prompt = 系统提示词 + 历史信息 + 用户输入
2.1 核心概念关系图
这几个概念经常混用,但它们在技术实现和实际应用中有着明确的层级和功能区别。我们可以用**“剧本与舞台”**的关系来理解。
┌─────────────────────────────────────────────────────────────────────────┐
│ 上下文窗口 (Context Window) │
│ (LLM 能记住的最大容量/容器) │
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ 完整提示词 (Full Prompt) │ │
│ │ (实际发送给模型的所有文本内容) │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ 系统提示词 │ │ 历史信息 │ │ 用户输入 │ │ │
│ │ │ (System Prompt) │ │ (History) │ │ (User Input) │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ ★ 设定角色/规则 │ │ ★ 之前的对话 │ │ ★ 当前的问题 │ │ │
│ │ │ ★ 优先级最高 │ │ ★ 记忆上下文 │ │ ★ 触发新回复 │ │ │
│ │ │ ★ 通常固定不变 │ │ ★ 随对话增长 │ │ ★ 每次变化 │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │ │ │ │
│ │ └──────────────────┬──────────────────┘ │ │
│ │ │ │ │
│ │ 合并为 Token 流 │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ 注意:完整提示词的大小 ≤ 上下文窗口容量 │
└─────────────────────────────────────────────────────────────────────────┘
2.2 详细定义与区别
| 概念 | 英文 | 定义 | 作用 | 可变性 | 优先级 |
|---|---|---|---|---|---|
| 上下文窗口 | Context Window | 模型一次能处理的最大令牌数 (Token Limit) | 决定模型能”记住”多少内容 | 固定 (由模型决定,如 8K, 128K) | N/A (是限制条件) |
| 系统提示词 | System Prompt | 开发者预设的底层指令 | 定义 AI 的身份、底线、风格 | 会话中通常不变 | 最高 (覆盖用户指令) |
| 历史信息 | History | 当前会话中过去的对话记录 | 提供记忆,保持对话连贯性 | 随对话轮数增加 | 中 (提供背景) |
| 用户输入 | User Input | 用户当前发送的具体消息 | 提出新任务或新问题 | 每条消息都变 | 高 (直接触发任务) |
| 提示词 | Prompt | 广义:上述所有内容总和 狭义:仅指用户输入 | 驱动模型生成输出的燃料 | 取决于指代范围 | 取决于内容 |
2.3 它们如何协同工作?(动态流程)
┌─────────────────────────────────────────────────────────────────────┐
│ 对话进行中的动态变化 │
└─────────────────────────────────────────────────────────────────────┘
【第 1 轮对话】
┌───────────────────────────────────────────────┐
│ 上下文窗口 [====================......] 20% │
│ [System] + [User: 你好] │
└───────────────────────────────────────────────┘
↓ 生成回复
【第 10 轮对话】
┌───────────────────────────────────────────────┐
│ 上下文窗口 [================================] 80% │
│ [System] + [历史 1-9 轮] + [User: 继续] │
└───────────────────────────────────────────────┘
↓ 生成回复
【第 100 轮对话 (超出窗口)】
┌───────────────────────────────────────────────┐
│ 上下文窗口 [================================] 100%│
│ [System] + [历史 90-99 轮] + [User: 继续] │
│ ↑ │
│ 最早的历史被"遗忘"(截断) │
└───────────────────────────────────────────────┘
关键点说明:
- 包含关系:
System Prompt+History+User Input共同组成了发送给模型的Full Prompt。 - 容量限制:这个
Full Prompt的长度不能超过Context Window。 - 遗忘机制:当对话过长,
History会被截断(通常是最早的对话先被丢弃),但System Prompt通常会被强制保留在窗口最前端。
2.4 通俗类比:剧场演出
为了更好理解,我们可以把它们比作一场话剧演出:
| 概念 | 剧场类比 | 说明 |
|---|---|---|
| 上下文窗口 | 舞台的大小 | 舞台只有这么大,能站的人和道具有限。如果人太多,最早上台的得下去 |
| 系统提示词 | 剧本大纲与导演要求 | ”这是一场喜剧,演员不能骂人,必须穿古装”。这是演出前定好的,整场演出不能变 |
| 历史信息 | 已经演过的剧情 | 观众和演员需要记得前面发生了什么,剧情才能连贯 |
| 用户输入 | 观众此刻的互动/下一句台词 | 观众说:“主角现在该做什么?” 演员根据剧本和之前的剧情来回应 |
| 提示词 | 整场演出的所有信息包 | 演员在开口前,脑海里综合了剧本、之前的剧情和观众的互动,这些总和就是 Prompt |
2.5 常见误区澄清
┌─────────────────────────────────────────────────────────────────┐
│ 误区 vs 真相 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ❌ 误区 1: "Prompt 就是用户输入的那句话" │
│ ✅ 真相:工程上,Prompt 是 System+History+Input 的总和 │
│ │
│ ❌ 误区 2: "上下文窗口越大,模型越聪明" │
│ ✅ 真相:窗口大代表"记忆力好",不代表"智商高"(推理能力) │
│ │
│ ❌ 误区 3: "System Prompt 可以被用户输入覆盖" │
│ ✅ 真相:通常 System 优先级更高,但复杂的用户输入可能诱导越狱 │
│ │
│ ❌ 误区 4: "历史信息会永远保存" │
│ ✅ 真相:超过上下文窗口后,旧历史会被丢弃 (除非使用外部向量数据库) │
│ │
└─────────────────────────────────────────────────────────────────┘
三、为什么 Prompt 如此重要?
同样的 LLM,不同的 Prompt,效果可能天差地别:
❌ 差 Prompt:
"写一首诗"
✅ 好 Prompt:
"请写一首关于春天的七言绝句,要求:
1. 描绘花朵盛开的景象
2. 表达对生机勃勃的喜爱
3. 押 ang 韵"
| Prompt 质量 | 效果 |
|---|---|
| 模糊、简单 | LLM”猜测”你的意图,可能答非所问 |
| 清晰、具体 | LLM 精准理解,给出你想要的结果 |
这就是所谓的 “Prompt Engineering”(提示词工程) ——通过优化 Prompt 来获得更好的结果。
四、LLM 是如何处理 Prompt 的?(关键原理)
这部分很重要!理解原理,才能更好地编写 Prompt。
4.1 完整流程回顾
回顾 第一章 的内容,LLM 处理 Prompt 的流程是:
你输入的 Prompt
↓
分词器 → Token 序列
↓
嵌入层 → 向量表示
↓
Transformer 处理(注意力机制)
↓
预测下一个词的概率
↓
自回归生成 → 输出回答
4.2 LLM 如何”理解”Prompt?
LLM 并不像人类一样”理解”Prompt,它做的事情是:根据训练时学到的语言规律,预测最可能的下一个词。
这意味着:
- LLM 没有”意图”:它不知道你真正想要什么,只是根据概率猜测
- LLM 很”听话”:你说什么,它就往那个方向猜
- LLM 受限于训练数据:它会继承训练数据中的偏见和知识
重要提醒
LLM 不是”智能生命体”,它只是一个超级强大的”概率预测机器”。理解这一点,是写好 Prompt 的第一步。
4.3 Prompt 中的信息是如何被”利用”的?
LLM 处理 Prompt 时,会做以下几件事:
Prompt: "你是一个专业的数学老师,请解答这道数学题:1+1=?"
↓
LLM 内部处理
↓
┌─────────────────────────────────────────────────────┐
│ 1. 识别角色 │
│ "数学老师" → 激活相关的语言模式 │
│ │
│ 2. 理解任务 │
│ "解答数学题" → 这是一个问答任务 │
│ │
│ 3. 提取关键信息 │
│ "1+1=?" → 这是需要计算的表达式 │
│ │
│ 4. 结合上下文 │
│ 之前的对话历史(如果有的话) │
└─────────────────────────────────────────────────────┘
↓
生成回答:"1+1=2"
五、Prompt 的组成要素(用户视角)
从用户构建 Prompt 的角度,一个完整的 Prompt 通常包含以下要素:
5.1 指令(Instruction)
告诉 LLM 要做什么:
"请总结..."
"翻译以下..."
"写一篇关于..."
5.2 背景(Context)
提供必要的背景信息:
"假设你是一个物理学家..."
"基于以下文档..."
5.3 输入数据(Input)
具体要处理的内容:
"请翻译这句话:Hello World"
5.4 输出格式(Output Format)
指定期望的输出形式:
"用 JSON 格式返回"
"用列表形式列出"
"不超过 100 字"
5.5 示例
【完整 Prompt 示例】
角色:你是一位专业的美食评论家(背景)
任务:请点评以下餐厅(指令)
餐厅:鼎泰丰,主打小笼包(输入)
要求:用 200 字以内的评论,突出口味和服务(输出格式)
六、Prompt 的局限性
虽然 Prompt 很强大,但它也有局限:
6.1 无法突破知识边界
LLM 的知识局限于训练数据,不知道训练之后的新信息。
❌ "2024 年最新的 iPhone 型号是什么?"
→ LLM 可能不知道(如果训练数据截止到 2023 年)
6.2 可能产生”幻觉”
LLM 可能生成看似合理但实际错误的内容。
❌ "请提供北京到上海的距离"
→ LLM 可能给出一个编造的数字
6.3 对措辞很敏感
细微的措辞变化可能导致完全不同的结果。
"分析这篇文章的优点" vs "批评这篇文章的缺点"
→ 可能给出完全不同的回答
6.4 无法真正”思考”
LLM 只是预测下一个词,没有真正的推理能力(虽然可以伪装)。
应对局限性的方法
- 使用 上下文 提供准确信息
- 使用 Function Call 获取实时信息
- 通过好的 Prompt 技巧引导更准确的回答
七、总结:关系公式
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 发送给 LLM 的实际数据 (Full Prompt) │
│ = │
│ System Prompt (角色) │
│ + │
│ Conversation History (记忆) │
│ + │
│ Current User Input (任务) │
│ │
│ ⚠️ 约束条件: │
│ Length(Full Prompt) ≤ Context Window Size │
│ │
└─────────────────────────────────────────────────────────────────┘
核心要点:
- Prompt 是与 LLM 沟通的桥梁(广义包含 System+History+Input)
- LLM 处理 Prompt 的方式是:根据概率预测下一个词
- 好的 Prompt 需要:清晰的指令 + 充分的背景 + 明确的输出格式
- 理解 LLM 的局限性,才能更好地使用它
[!比喻] 一句话总结 上下文窗口是容器,系统提示词是容器的底色,历史信息是容器里已装的水,用户输入是刚倒入的新水,而提示词是容器里所有水的总和。
八、延伸阅读
- 01-Token 与分词 - Token 与上下文限制
- 02-有效 Prompt 的构建方法 - 学习构建有效 Prompt 的技巧
- 03-Prompt_engineering 技巧 - 进阶 Prompt 工程技巧
- 03-预训练与微调 - 了解 LLM 的训练过程
- Function Call - 获取实时信息的方法