模型答非所问?理解 Prompt、上下文与 In-Context Learning
你让模型”总结这篇文章”,它照做了;你换个说法”用三点概括核心观点”,它也能懂。但当你把同样的问题丢进一个长对话、或者加上 10 个示例再问——效果可能天差地别。
为什么?因为 LLM 不会”理解”你的意图,它只会对齐你给的上下文模式。你给它怎样的 Prompt、多大的上下文、多少示例,它就呈现怎样的能力。
这不是玄学,而是三个可操作的概念:
- Prompt(提示) — 你给模型的”剧本”,决定它做什么、怎样做
- Context Window(上下文窗口) — 模型的”短期记忆”,一次能”看到”多少内容
- In‑Context Learning(上下文学习) — 通过示例让模型”即学即用”,无需微调
搞懂它们,你就知道为什么同一个模型有时靠谱、有时跑偏,以及怎么设计 Prompt 才能稳定发挥。
📜 一、Prompt —— 给 LLM 的”剧本”
Prompt 就像导演给演员的剧本,告诉 LLM 做什么、怎样做、输出什么格式。
💡 Prompt 的处理流程:你输入的 Prompt → Tokenize(分词,见第一篇)→ Embedding(向量化)→ 进入 Transformer 处理 → 生成输出
1.1 按示例数量分类的 Prompt 类型
根据是否提供示例,Prompt 可以分为三类:
| 类型 | 定义 | 示例数量 | 示例 | 作用 |
|---|---|---|---|---|
| Zero‑Shot Prompt | 不提供示例,仅给指令 | 0 个 | “请总结以下段落的核心观点。” | 模型依赖预训练知识直接推理 |
| Few‑Shot Prompt | 提供少量输入‑输出示例 | 1–5 个 | 输入: A -> 1, B -> 2,然后问 C -> ? |
通过示例引导模型学习任务模式与输出风格 |
| Many‑Shot Prompt | 提供大量输入‑输出示例 | 5+ 个 | 提供 10+ 个示例,展示复杂模式 | 学习更复杂的任务模式,但会占用更多 Context Window |
比喻理解:
- Zero‑Shot 就像演员即兴表演
- Few‑Shot 就像给演员提前排练几次,告诉他们节奏和风格
- Many‑Shot 就像让演员反复观看大量经典表演,学习复杂的表演技巧
💡 选择建议:
- 简单任务:Zero‑Shot 通常足够
- 中等复杂度:Few‑Shot 效果更好(如客服话术风格、工单分类——给 2–3 个示例即可对齐输出格式)
- 复杂任务:Many‑Shot 可能有效,但要注意 Context Window 限制
1.2 User Prompt(用户指令)
User Prompt 是用户每次对话时输入的具体问题或任务指令:
特点:
- 每次对话都可能不同
- 包含具体的任务需求、问题或上下文
- 优先级相对 System Prompt 较低
示例:
请总结以下文章的核心观点:
[文章内容...]将以下 Python 代码转换为 JavaScript:
def hello():
print("Hello, World!")
💡 设计要点:User Prompt 应该清晰、具体、包含必要的上下文,避免模糊或歧义的表达。
1.3 System Prompt(系统指令)
System Prompt 是 LLM 的”身份设定”,它常具有比用户 Prompt 更高的优先级:
用途:定义模型角色、风格、全局行为规则
示例:
你是一个严谨、专业的测试专家。
你只输出 Markdown 表格,不写解释文字。
✅ 建议:合理设置 System Prompt,有助于模型行为一致、稳定
1.4 User Prompt vs System Prompt
💡 两个维度的区别:User/System 是按「谁发送」划分;Zero/Few/Many-Shot 是按「是否提供示例」划分。两者可以组合使用,例如 User Prompt 可以是 Zero-Shot 或 Few-Shot。
在实际使用中,LLM 通常接收两种类型的 Prompt:
| 类型 | 定义 | 特点 | 使用场景 |
|---|---|---|---|
| System Prompt | 系统级指令,定义模型的”身份”和全局行为 | • 优先级更高 • 通常只设置一次 • 贯穿整个对话 |
角色设定、输出格式要求、行为约束 |
| User Prompt | 用户的具体问题或任务 | • 每次对话都可能不同 • 优先级相对较低 |
具体问题、任务指令、对话内容 |
示例对比:
System Prompt(设置一次): |
💡 关键理解:System Prompt 是”背景设定”,User Prompt 是”当前任务”。两者配合使用,才能让模型既保持一致性,又能灵活应对不同任务。
🪟 二、Context Window —— 模型的”短期记忆”
LLM 不可能”无限记忆”,它有一个长度限制 —— Context Window。
2.1 什么是 Context Window
定义:模型在一次推理中”看到”的最大 Token 数
💡 为什么用 Token 衡量? 因为 Token 是模型处理的最小单位(见第一篇),所有输入都必须先 Tokenize 才能进入模型。
组成部分:System Prompt + 历史对话 + 当前输入 + 模型已生成的内容(自回归生成时作为上下文)
物理限制:Transformer 中 Self‑Attention 的计算复杂度与 Token 数量平方相关(见第一篇的 Self-Attention 部分)。当 Token 数量过多时,计算代价将迅速上涨(如 1000 Token 需要 100 万次计算,10000 Token 需要 1 亿次计算)
实际示例:
- 一段 1000 字的中文文章 ≈ 500-800 Token(取决于分词方式)
- GPT-4 的 Context Window:128k Token(约 25-30 万字)
- Claude 3.5 的 Context Window:200k Token(约 40-50 万字)
超过限制的后果:当超过限制,最早的 Token 会被”遗忘” —— 即”上下文溢出 (overflow)”
比喻:Context Window 就像办公桌,一张桌子放太多纸,旧纸就被挤下桌面
2.2 应对 Context Window 限制的策略
当 Context Window 接近或超过限制时,可以使用以下策略:
| 策略 | 方法 | 效果 | 适用场景 |
|---|---|---|---|
| 摘要 (Summarization) | 将旧对话 / 内容整理为简短摘要 | 节省 Token,保留关键信息 | 长对话、多轮交互 |
| 记忆模块 (Memory) | 抽取关键信息存入外部数据库,当需要时检索 | 关键信息不丢失 | Agent 系统、长期记忆需求 |
| RAG (Retrieval‑Augmented Generation) | 只把与当前任务相关的片段放入窗口 | 支持超长文档处理 | 知识库问答、文档分析 |
实际应用示例:
场景:处理 100 页技术文档 |
💡 最佳实践:用摘要 / Memory / RAG 结合起来,是处理长对话 / 文档时的常见实践。RAG 会在第 4 篇中详细讲解。
✨ 三、In‑Context Learning (ICL) —— LLM 的”魔法”
ICL 允许 LLM 无需微调,仅通过 Prompt(尤其 Few‑Shot + 示例)学习新任务 / 模式
💡 Few‑Shot Prompt 与 ICL 的关系:Few‑Shot Prompt(见第一部分 1.1)是 ICL 的典型实现方式。当你提供示例时,模型就在进行 In‑Context Learning。
3.1 ICL 的本质
不是改变模型参数
而是在 Context Window 内识别输入‑输出示例之间的”模式 / 结构”,并应用到新输入上
效果:快速上手新任务、无需大量数据
比喻:就像老师黑板上写几个例子,学生看懂规则,就能回答新问题
3.2 成功应用 — 思维链 (Chain‑of‑Thought, CoT)
CoT 是 ICL 的经典用法,在复杂推理、逻辑题、数学题中尤其有用
做法:Prompt 要求模型”先写思考过程 (step by step),再给答案”
好处:
激活模型内部”逻辑推理链”
提供更多 Token “空间”给中间推理
输出可读、可复查、方便调试
| CoT 类型 | 使用方式 | 示例 (prompt) |
|---|---|---|
| Zero‑Shot CoT | 在问题后加一句 “请一步步思考” | … + 请一步步思考。 |
| Few‑Shot CoT | Few‑Shot 示例中包含完整思考过程 | [输入] → [详细思考过程] → [输出] |
⚠️ 重要区别:ICL / CoT 与 Fine‑Tuning(微调) 是不同的:
维度 ICL / CoT Fine‑Tuning 是否改变模型参数 ❌ 不改变 ✅ 改变(更新模型权重) 持久性 临时(只在当前 Context Window 有效) 永久(模型参数已更新) 成本 低(只需提供示例) 高(需要训练数据和计算资源) 适用场景 快速尝试新任务、临时调整 需要长期稳定行为、领域定制 💡 简单理解:ICL 是”临时教学”,Fine‑Tuning 是”永久改造”
3.3 Fine‑Tuning(微调)详解
既然提到了 Fine‑Tuning,我们有必要了解其基础,以便在 ICL 和 Fine‑Tuning 之间做出正确选择。Agent 能力调优中的微调实践(LoRA、PEFT、RLHF-A)详见第 16 篇。
3.3.1 什么是 Fine‑Tuning
Fine‑Tuning(微调) 是在预训练模型的基础上,使用特定任务的数据集继续训练,更新模型参数,使模型适应特定任务或领域。
比喻理解:
- 预训练模型 = 一个受过”通识教育”的学生(知道很多通用知识)
- Fine‑Tuning = 针对特定专业(如医学、法律)进行”专业培训”
- 训练后的模型 = 既保留通识知识,又具备专业能力
3.3.2 Fine‑Tuning 的工作原理
Fine‑Tuning 的核心流程:
1. 准备数据:收集特定任务的标注数据(如问答对、分类样本) |
关键点:
- 不是从零训练:基于预训练模型,利用已有的通用知识
- 参数更新:模型内部的权重(Weight)会根据新数据调整
- 永久改变:训练完成后,模型行为永久改变
3.3.3 Fine‑Tuning 的常见方法
根据更新参数的范围,Fine‑Tuning 可以分为:
| 方法 | 更新范围 | 参数量 | 成本 | 适用场景 |
|---|---|---|---|---|
| Full Fine‑Tuning(全量微调) | 更新所有参数 | 100% | 高(需要大量 GPU) | 数据充足、计算资源丰富 |
| LoRA (Low‑Rank Adaptation) | 只更新少量低秩矩阵 | < 1% | 低(节省显存和计算) | 资源有限、快速迭代 |
| Adapter | 在模型中插入小型适配层 | < 5% | 中 | 多任务场景、模块化设计 |
| Prompt Tuning | 只训练可学习的 Prompt 向量 | 极少量 | 极低 | 轻量级任务适配 |
💡 LoRA 是目前最流行的 Fine‑Tuning 方法:
简单理解:想象模型是一个巨大的调音台,有 1000 个旋钮(参数)。全量微调需要调整所有 1000 个旋钮,而 LoRA 只添加少量”小旋钮”(参数量 < 1%),通过这些小旋钮就能控制整个调音台的效果。
技术原理:LoRA 不直接修改原始模型参数,而是在模型旁边添加小型适配器。这些适配器只包含极少的参数(通常 < 1%),但通过巧妙的数学方法,能够”模拟”全量微调的效果。
优势:
- ✅ 成本低:只需训练 < 1% 的参数,显存和计算需求大幅降低
- ✅ 效果好:效果接近全量微调(通常能达到 90%+ 的效果)
- ✅ 灵活:可以轻松切换不同的 LoRA 适配器,实现”一个模型,多种能力”
实际应用:现在很多开源模型(如 Stable Diffusion、LLaMA)的微调都使用 LoRA,因为它能让普通用户用消费级 GPU 就能训练自己的模型。
3.3.4 何时选择 Fine‑Tuning vs ICL
选择 Fine‑Tuning 还是 ICL,取决于你的具体需求:
| 考虑因素 | 选择 ICL | 选择 Fine‑Tuning |
|---|---|---|
| 任务频率 | 偶尔使用、临时任务 | 频繁使用、长期需求 |
| 数据量 | 少量示例即可 | 有大量标注数据(通常 > 1000 条) |
| 计算资源 | 无特殊要求 | 需要 GPU/TPU 训练(详见扩展说明) |
| 响应速度 | 可能较慢(Context Window 较长) | 推理速度快(模型已优化) |
| 成本 | 低(只需 API 调用) | 高(训练成本 + 推理成本) |
| 灵活性 | 高(可随时调整 Prompt) | 低(需要重新训练才能调整) |
实际决策示例:
场景 1:偶尔需要翻译技术文档 |
💡 最佳实践:
- 先尝试 ICL:对于新任务,先用 Few‑Shot Prompt 测试效果
- 再考虑 Fine‑Tuning:如果 ICL 效果不理想,或需要长期稳定使用,再投入资源进行 Fine‑Tuning
- 混合使用:Fine‑Tuning 后的模型仍可使用 ICL 进行进一步优化
🔍 总结 — 与 LLM 有效对话的三把”钥匙”
Prompt = 剧本,清晰、具体的 Prompt 是控制 LLM 的基础
Context Window = 桌面,合理管理上下文,防止”记忆溢出”
ICL / CoT = 魔法,通过示例 + 思考链,让模型迅速适应新任务
掌握它们,就可以设计结构化、高稳定性的 Prompt,实现复杂任务处理。
📚 延伸阅读(含可直接访问链接)
以下资源按主题分类,每个资源都附有简要说明,帮助你选择合适的学习材料。
💬 Prompt Engineering(提示工程)
OpenAI Prompt Engineering Guide(OpenAI 官方指南):OpenAI 官方的 Prompt 工程指南,涵盖基础技巧和最佳实践。强烈推荐新手阅读,内容全面且实用。
Prompt Engineering Guide(社区指南):社区维护的 Prompt 工程综合指南,包含大量示例和技巧。适合想系统学习的读者,内容更新及时。
Anthropic Prompt Engineering(Claude 指南):Anthropic 官方的 Prompt 工程指南,特别针对 Claude 模型优化。适合使用 Claude 的开发者。
🎯 In‑Context Learning(上下文学习)
Language Models are Few‑Shot Learners(GPT‑3 原始论文):GPT‑3 的原始论文,首次系统性地展示了 Few‑Shot Learning 的能力。必读论文,适合想深入了解 ICL 原理的读者。
What Makes In‑Context Learning Work?(ICL 工作原理):深入分析 ICL 为什么有效的研究论文。适合想理解 ICL 底层机制的读者。
In‑Context Learning 综述:ICL 的全面综述论文,涵盖原理、应用和最新进展。适合想系统了解 ICL 的读者。
🔗 Chain‑of‑Thought(思维链)
Chain‑of‑Thought Prompting Elicits Reasoning in Large Language Models(CoT 原始论文):CoT 的开创性论文,展示了如何通过思维链提升模型推理能力。必读论文,适合所有读者。
Auto‑CoT: Automatic Chain of Thought Prompting(自动 CoT):自动生成 CoT 示例的研究,适合想自动化 CoT 的开发者。
Tree of Thoughts: Deliberate Problem Solving with Large Language Models(思维树):CoT 的进阶方法,通过树状结构探索多种推理路径。适合想处理复杂推理任务的读者。
🪟 Context Window(上下文窗口)
Scaling Transformer to 1M tokens and beyond with RMT(超长上下文):研究如何扩展 Transformer 的上下文长度。适合想了解长上下文技术的读者。
Lost in the Middle: How Language Models Use Long Contexts(长上下文利用问题):分析 LLM 在长上下文中的表现,发现模型更关注开头和结尾。重要发现,适合所有读者。
Context Window Management(上下文管理实践):Pinecone 的上下文管理实践指南,包含 RAG 等解决方案。适合需要处理长文档的开发者。
🔧 System Prompt & User Prompt
System Prompt Best Practices(System Prompt 最佳实践):OpenAI 关于 System Prompt 的最佳实践指南。强烈推荐,适合所有开发者。
Prompt Engineering for Claude(Claude Prompt 指南):Anthropic 关于 System Prompt 的详细指南。适合使用 Claude 的开发者。
🎓 Fine‑Tuning(微调)
LoRA: Low‑Rank Adaptation of Large Language Models(LoRA 论文):LoRA 的原始论文,介绍了参数高效的微调方法。必读论文,适合想进行模型微调的读者。
Parameter‑Efficient Fine‑Tuning(参数高效微调综述):全面综述各种参数高效微调方法。适合想了解微调技术的读者。
Hugging Face Fine‑Tuning Guide(微调实战指南):Hugging Face 的模型微调实战指南,包含代码示例。强烈推荐,适合想动手实践的开发者。
🛠️ 实战工具与框架
LangChain Prompt Templates(LangChain Prompt 模板):LangChain 的 Prompt 模板系统,方便构建复杂 Prompt。适合使用 LangChain 的开发者。
PromptLayer(Prompt 管理工具):Prompt 版本管理和分析工具,帮助优化 Prompt 效果。适合需要管理大量 Prompt 的团队。
OpenAI Evals(评估框架):OpenAI 开源的 Prompt 评估框架,帮助测试和优化 Prompt。适合需要系统评估 Prompt 的开发者。
🇨🇳 中文资源
Prompt Engineering 中文指南:Prompt Engineering Guide 的中文版本,内容全面。适合中文读者。
LLM 应用开发实践(中文博客):Lilian Weng 的 Prompt Engineering 博客文章,有中文翻译版本。适合中文读者,内容深入。
🔔 系列说明
本文是《🧠 LLM/Agent 从入门到精通:告别浅尝辄止》系列第 2 篇。上一篇:ChatGPT 几秒出千字?背后只做了一件事。下一篇:想要 JSON 却得到废话?Prompt 工程的三大核心技巧 —— 如何设计结构化、高稳定性的 Prompt?如何确保输出格式稳定、可解析?
💡 扩展:为什么 Fine‑Tuning 需要 GPU/TPU?
微调工程实践(LoRA、PEFT、RLHF-A)详见第 16 篇能力调优。本篇补充:Fine‑Tuning 需要 GPU/TPU 训练,这到底意味着什么?普通用户能进行 Fine‑Tuning 吗?
什么是 GPU 和 TPU?
GPU(Graphics Processing Unit,图形处理器):
- 原本用于游戏、图像处理
- 擅长并行计算(同时处理大量简单运算)
- 深度学习训练需要大量矩阵运算,GPU 正好擅长
TPU(Tensor Processing Unit,张量处理器):
- Google 专门为 AI 训练设计的芯片
- 比 GPU 更高效,但主要 Google 内部使用
比喻理解:
- CPU(普通电脑处理器) = 一个数学教授,能解决复杂问题,但一次只能做一个
- GPU = 1000 个小学生,虽然每个能力有限,但能同时做大量简单计算
- 训练 LLM = 需要同时计算几百万个数字,GPU 的并行能力正好匹配
为什么训练需要 GPU/TPU?
核心原因:训练 LLM 需要海量矩阵运算
实际数据:
| 操作 | CPU 耗时 | GPU 耗时 | 加速比 |
|---|---|---|---|
| 训练小型模型(100M 参数) | 数周 | 数小时 | 100+ 倍 |
| 训练中型模型(7B 参数) | 数年 | 数天 | 1000+ 倍 |
| 训练大型模型(70B+ 参数) | 几乎不可能 | 数周 | 无法计算 |
为什么 CPU 这么慢?
- CPU 核心少(通常 4-16 个),一次只能处理少量数据
- GPU 核心多(数千个),能同时处理大量数据
- 训练需要计算数百万个参数的梯度,GPU 的并行能力是关键
Fine‑Tuning 需要多少资源?
不同方法的资源需求:
| 方法 | 模型大小 | GPU 显存需求 | 训练时间(示例) | 成本估算 |
|---|---|---|---|---|
| Full Fine‑Tuning | 7B 参数 | 40GB+ | 数天 | 高(需要 A100/H100) |
| LoRA | 7B 参数 | 16GB | 数小时 | 中(RTX 3090/4090 即可) |
| LoRA | 13B 参数 | 24GB | 数小时 | 中(需要多卡或 A100) |
| LoRA | 70B 参数 | 80GB+ | 数天 | 高(需要多张 A100) |
💡 注意:以上是粗略估算,实际需求取决于:
- 数据集大小
- 训练轮数(Epoch)
- 批次大小(Batch Size)
- 优化器选择
普通用户如何获得 GPU 资源?
方案 1:云服务(推荐新手)
| 平台 | 特点 | 价格(示例) | 适用场景 |
|---|---|---|---|
| Google Colab | 免费(有限制) | 免费 / $10/月 | 学习、小模型实验 |
| Kaggle | 免费(每周 30 小时) | 免费 | 学习、竞赛 |
| AWS / Azure / GCP | 按需付费 | $0.5-5/小时 | 生产环境、大模型 |
| RunPod / Vast.ai | 共享 GPU | $0.2-2/小时 | 性价比高 |
方案 2:购买 GPU(适合长期使用)
- 消费级 GPU(如 RTX 3090/4090):适合 LoRA 微调中小型模型
- 专业级 GPU(如 A100/H100):适合全量微调大模型,但价格昂贵(数万元)
方案 3:使用 Fine‑Tuning API(最简单)
- OpenAI Fine‑Tuning API:上传数据,OpenAI 帮你训练
- Anthropic Claude Fine‑Tuning:类似服务
- 优势:无需管理 GPU,按使用付费
- 劣势:成本较高,灵活性较低
实际成本对比
场景:微调一个 7B 参数的模型(使用 LoRA)
方案 A:使用云 GPU(RunPod,RTX 4090) |
总结
- GPU/TPU 是必需的:没有它们,Fine‑Tuning 几乎不可能完成
- 普通用户也能 Fine‑Tuning:通过云服务或 LoRA 方法,成本可控
- 推荐路径:
- 新手:先用 Google Colab / Kaggle 免费资源学习
- 进阶:使用云 GPU 服务(RunPod / Vast.ai)进行实际项目
- 专业:考虑购买 GPU 或使用 Fine‑Tuning API
💡 关键理解:Fine‑Tuning 需要 GPU,但通过云服务和 LoRA 等优化方法,普通用户也能以合理成本进行 Fine‑Tuning。













