LLM 如何理解提示词
要写好提示词,首先需要理解大语言模型是如何"读懂"你写的提示词的。本节将揭开 LLM 处理提示词的内部机制,帮助你从根本上理解"为什么有些提示词有效,有些无效"。
Token:LLM 的最小理解单位
LLM 不是按照"字"或"词"来理解文本的,而是使用 Token(词元)作为最小处理单位。
什么是 Token?
Token 是文本被切分后的最小片段。不同的模型使用不同的分词算法(Tokenizer),但基本原理相似:
# 使用 tiktoken(OpenAI 的分词库)演示 Token 切分
import tiktoken
# GPT-4 使用 cl100k_base 编码
encoder = tiktoken.encoding_for_model("gpt-4")
# 英文示例
text_en = "Hello, how are you?"
tokens_en = encoder.encode(text_en)
print(f"英文: '{text_en}'")
print(f"Token IDs: {tokens_en}")
print(f"Token 数量: {len(tokens_en)}")
# 输出: Token 数量: 6
# 中文示例
text_zh = "你好,世界!"
tokens_zh = encoder.encode(text_zh)
print(f"\n中文: '{text_zh}'")
print(f"Token IDs: {tokens_zh}")
print(f"Token 数量: {len(tokens_zh)}")
# 输出: Token 数量: 7(中文通常需要更多 Token)
# 查看每个 Token 对应的文本
for token_id in tokens_zh:
print(f" ID {token_id} -> '{encoder.decode([token_id])}'")
Token 与成本的关系
| 模型 | 输入价格(每百万 Token) | 输出价格(每百万 Token) | 上下文窗口 |
|---|---|---|---|
| GPT-4o | $2.50 | $10.00 | 128K |
| GPT-4o-mini | $0.15 | $0.60 | 128K |
| Claude 3.5 Sonnet | $3.00 | $15.00 | 200K |
| DeepSeek-V3 | $0.27 | $1.10 | 128K |
💡 提示:理解 Token 机制可以帮助你控制成本——更精炼的提示词不仅效果更好,花费也更少。
上下文窗口:LLM 的"工作记忆"
LLM 的上下文窗口(Context Window)是它一次能"看到"的全部文本长度,包括你的提示词和它的回复。
System Prompt] --> B[对话历史
History] B --> C[当前用户输入
User Input] C --> D[模型输出
Assistant Output] end E[超出窗口的内容
会被截断丢失] -.-> A style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style B fill:#b3e5fc,stroke:#0277bd,stroke-width:2px style C fill:#fff9c4,stroke:#f9a825,stroke-width:2px style D fill:#c8e6c9,stroke:#43a047,stroke-width:2px style E fill:#ffcdd2,stroke:#c62828,stroke-width:2px
上下文窗口的关键特性
- 有限容量 — 128K Token ≈ 约9.6万个汉字,听起来很多,但在复杂对话或长文档分析中很快会用完
- 先进先出 — 当超出窗口限制时,最早的内容会被丢弃
- 注意力衰减 — 研究表明,LLM 对上下文中间位置的内容关注度较低("Lost in the Middle" 现象,Liu et al., 2023)
- 重要信息位置 — 将最关键的信息放在提示词的开头或结尾,效果更好
"Lost in the Middle" 效应
这是一个经过学术验证的现象:当 LLM 需要从长上下文中检索信息时,放在开头和结尾的信息被正确使用的概率显著高于中间位置的信息。
准确率: ~90%"] A --> C["中间位置
准确率: ~50-60%"] A --> D["结尾位置
准确率: ~85%"] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style B fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px style C fill:#ffcdd2,stroke:#c62828,stroke-width:2px style D fill:#c8e6c9,stroke:#43a047,stroke-width:2px
⚠️ 实战建议:在编写长提示词时,把最关键的指令和约束放在开头(系统提示词/指令部分)和结尾(最终要求部分),避免将核心信息埋在大段背景资料的中间。
注意力机制:LLM 如何"聚焦"
LLM 的核心是 Transformer 架构 中的 自注意力机制(Self-Attention)。简单来说,模型在生成每一个 Token 时,会"回顾"之前的所有 Token,并决定对哪些 Token 投入更多"注意力"。
计算斐波那契数列的函数"] A --> B["'请' — 指令标记"] A --> C["'Python' — 语言约束,高权重"] A --> D["'斐波那契数列' — 任务目标,最高权重"] A --> E["'函数' — 输出格式约束"] end B --> F["模型分配注意力权重"] C --> F D --> F E --> F F --> G["生成: def fibonacci..."] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:3px style D fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px style C fill:#fff9c4,stroke:#f9a825,stroke-width:2px style E fill:#fff9c4,stroke:#f9a825,stroke-width:2px style F fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style G fill:#c8e6c9,stroke:#43a047,stroke-width:3px
这意味着什么?
理解注意力机制对提示工程有以下实际指导意义:
- 关键词很重要 — 模型会对特定的"信号词"分配更高的注意力权重,例如"必须"、"禁止"、"格式"等
- 顺序影响结果 — 提示词中各部分的排列顺序会影响模型对任务的理解
- 明确优于含糊 — "写一个函数"比"做点什么"给模型更清晰的信号
- 冗余会稀释注意力 — 过多无关信息会"分散"模型的注意力,降低输出质量
概率生成:LLM 的回答方式
LLM 的本质是下一个 Token 的概率预测器。给定已有的文本序列,模型预测下一个 Token 最可能是什么。
Temperature 参数
Temperature(温度)是控制输出随机性的核心参数:
from openai import OpenAI
client = OpenAI()
# Temperature = 0: 最确定性的输出(几乎总是选择概率最高的 Token)
response_deterministic = client.chat.completions.create(
model="gpt-4o",
temperature=0,
messages=[
{"role": "user", "content": "1+1等于多少?"}
]
)
# 多次调用结果一致: "1+1等于2。"
# Temperature = 0.7: 平衡创意与准确性(推荐的默认值)
response_balanced = client.chat.completions.create(
model="gpt-4o",
temperature=0.7,
messages=[
{"role": "user", "content": "写一首关于春天的短诗"}
]
)
# 每次调用可能产生不同但合理的诗
# Temperature = 1.5: 高创意(更多随机性,可能不连贯)
response_creative = client.chat.completions.create(
model="gpt-4o",
temperature=1.5,
messages=[
{"role": "user", "content": "写一首关于春天的短诗"}
]
)
# 结果更出人意料,但可能不够连贯
Temperature 选择指南
| Temperature | 特点 | 适用场景 |
|---|---|---|
| 0 | 确定性最强,输出最稳定 | 数据分析、代码生成、事实问答 |
| 0.3-0.5 | 略有变化但整体稳定 | 文档撰写、邮件回复、翻译 |
| 0.7-0.9 | 平衡创意与连贯性 | 内容创作、头脑风暴、对话 |
| 1.0-1.5 | 高创意、高随机性 | 诗歌创作、创意写作(需人工筛选) |
Top-P 参数(核采样)
Top-P(也称为 Nucleus Sampling)是另一个重要的采样参数,它控制模型从概率最高的前 N% 的 Token 中采样:
# Top-P = 0.1: 仅从概率最高的前10% Token中采样
response = client.chat.completions.create(
model="gpt-4o",
temperature=0.7,
top_p=0.1, # 更集中、更可预测的输出
messages=[{"role": "user", "content": "解释量子计算"}]
)
# Top-P = 0.95: 从概率最高的前95% Token中采样(默认值)
response = client.chat.completions.create(
model="gpt-4o",
temperature=0.7,
top_p=0.95, # 更多样化的输出
messages=[{"role": "user", "content": "解释量子计算"}]
)
💡 提示:通常建议调整 Temperature 或 Top-P 其中之一,而不是同时调整两者。
System Prompt vs User Prompt
现代 LLM API 区分了不同角色的消息,理解这一点对提示工程至关重要:
系统提示词] --> D[模型行为] B[User
用户消息] --> D C[Assistant
模型回复] --> D end A1["定义身份、规则、约束
设定输出格式和边界
优先级最高"] -.-> A B1["传达任务和问题
提供上下文信息
触发模型回复"] -.-> B C1["模型生成的回复
也用于多轮对话
提供对话上下文"] -.-> C style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style B fill:#fff9c4,stroke:#f9a825,stroke-width:2px style C fill:#c8e6c9,stroke:#43a047,stroke-width:2px style D fill:#ede7f6,stroke:#5e35b1,stroke-width:3px
实际 API 调用示例
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": """你是一位资深的Python技术顾问。
请遵守以下规则:
1. 所有代码示例使用 Python 3.12+ 语法
2. 包含类型注解和 docstring
3. 提供错误处理
4. 回复使用中文,但代码注释使用英文
5. 如果问题超出 Python 范围,请礼貌地说明"""
},
{
"role": "user",
"content": "如何实现一个线程安全的单例模式?"
}
]
)
print(response.choices[0].message.content)
System Prompt 的作用层次
温度与提示词精度的关系
一个重要但常被忽视的概念:提示词的精确度和 Temperature 参数共同决定了输出质量。
核心洞察:与其依赖 Temperature 来控制输出质量,不如在提示词本身上下功夫——一个精心设计的提示词在任何 Temperature 下都能产生更好的结果。
本章要点
- ✅ LLM 以 Token 为最小单位处理文本,中文通常比英文需要更多 Token
- ✅ 上下文窗口是有限的,重要信息应放在开头或结尾位置
- ✅ "Lost in the Middle" 是真实存在的注意力衰减现象
- ✅ Temperature 控制输出随机性,不同任务需要不同设置
- ✅ System Prompt 定义模型的身份、规则和边界,是提示工程的核心工具
- ✅ 精确的提示词比调参数更能提升输出质量
下一步:提示词的基本结构与编写原则 🚀