1. In-Context Learning (ICL) 的本质
In-Context Learning 是大语言模型最令人惊喜的能力之一。GPT-3 的论文发现,模型可以通过在 prompt 中提供示例,在无需梯度更新的情况下学习新任务。这打破了传统机器学习的范式。
GPT-3 的发现与影响
- GPT-3 在 2020 年展示了强大的 few-shot 学习能力
- 无需微调,仅通过上下文中的示例就能完成多种任务
- 开启了后续所有大语言模型工程的基础
理论解释:为什么 ICL 有效?
- 梯度下降假说 (Akyürek et al., 2023): Transformer 的 attention 机制实际上在执行一种隐式的梯度下降,通过示例调整内部的"权重"
- 贝叶斯推断假说 (Xie et al., 2022): ICL 本质上是贝叶斯推断的过程,模型在学习任务的内在分布
- 模式匹配假说: Attention 通过检索和匹配上下文中的相似模式来做出决策
理论洞见
最新研究表明,Transformer 的隐藏层可以显式地执行梯度下降步骤,这解释了为什么增加更多的 in-context 示例能持续提升性能。
影响 ICL 效果的关键因素
| 因素 | 说明 | 最佳实践 |
|---|---|---|
| 示例数量 | 更多示例通常更好,但存在递减效应 | 3-8 个示例通常达到较好的平衡 |
| 示例顺序 | 顺序会显著影响结果(位置偏差) | 将困难的示例放在中间,简单的放在最后 |
| 示例选择 | 示例的质量和相关性比数量更重要 | 选择与测试样本相似的示例 |
| Label Space | 输出空间的大小会影响性能 | 保持标签空间一致 |
ICL 的理论解释? 可以从三个角度解释:(1) 隐式梯度下降 - attention 调整参数;(2) 贝叶斯推断 - 学习任务分布;(3) 模式匹配 - 检索相似上下文。最新研究倾向于支持梯度下降假说。
2. 基础提示技术
Zero-shot 提示
直接提问,不提供任何示例。对于简单任务或模型已充分训练的任务有效。
Few-shot 提示
在 prompt 中提供 2-8 个示例,帮助模型理解任务。这是最常用的技术。
示例选择策略
- 随机选择: 简单但可能性能不稳定
- 基于相似度的选择 (kNN): 在嵌入空间中找到与测试样本最相似的 k 个示例
- 计算测试样本的嵌入向量
- 在示例库中找到最相近的示例
- 性能通常提升 5-15%
- 多样性选择: 选择覆盖不同类别/特征的示例,避免重复
- 难度感知选择: 包含与测试样本难度相近的示例
标签平衡与格式一致性
不良实践 ❌
- 5 个正例,1 个负例(不均衡)
- 有的示例用 JSON,有的用纯文本
- 格式不一致导致模型困惑
最佳实践 ✓
- 每个类别 2-3 个示例(均衡)
- 所有示例使用统一的格式
- 保持输入输出结构一致
3. Chain-of-Thought (CoT) 推理
Wei et al. (2022) 的论文发现,只需在 prompt 中添加 "Let's think step by step",就能大幅提升复杂推理任务的性能。这个简单的技巧开启了整个推理时代。
CoT 的三个关键形式
Few-shot CoT
在示例中显式展示推理过程,让模型学习如何分步思考。
Zero-shot CoT
不提供示例,只在问题前加入"让我们逐步思考"。即使不学习示例,也能触发推理能力。
Verifiable CoT
生成的推理步骤可以被验证,每一步都有明确的推理依据。
为什么 CoT 有效?
CoT 何时有效?何时无效?
| 任务类型 | CoT 效果 | 原因 |
|---|---|---|
| 数学运算 | ✓ 非常有效 | 需要多步推理,分解显著有效 |
| 逻辑推理 | ✓ 非常有效 | 可将复杂逻辑分解为步骤 |
| 代码生成 | ✓ 有效 | 描述算法步骤有助于生成代码 |
| 常识推理 | ✓ 有效 | 显式推理激活相关知识 |
| 事实回忆 | ✗ 无效 | 不需要推理,CoT 可能干扰 |
| 情感分析 | ✗ 可能降低 | 过度分析可能改变判断 |
| 简单分类 | ✗ 可能降低 | 额外的推理步骤增加出错机率 |
CoT 为什么有效?什么任务适合? CoT 通过将问题分解为子步骤,为模型提供"工作记忆",每一步的难度都较低。适合多步推理任务(数学、逻辑、编程),不适合简单事实回忆或情感分析。
4. 高级推理框架
Self-Consistency (Wang et al., 2023)
不再依赖单一的推理路径,而是采样多条不同的 CoT 路径,然后对最终答案进行多数投票。
性能提升
在 GSM8K(数学问题数据集)上的提升:CoT 单条路径 57.1% → Self-Consistency(多条路径投票)74.4%,提升约 17.3 个百分点。这表明多样性采样的强大效果。
Tree of Thoughts (ToT)
将推理建模为树搜索问题。每一步不只生成一个想法,而是生成多个"思路",用模型评估每个思路的前景,然后选择最好的继续展开。
ToT 的三个关键步骤
- Generate: 生成多个"想法"或"思路"
- Evaluate: 用模型评估每个思路的质量和前景
- Search: 使用 BFS 或 DFS 搜索最优路径
适用场景
- 创意写作(生成多个故事线)
- 数学证明(多条证明思路)
- 规划问题(多种方案比较)
- 代码调试(多个修复策略)
Graph of Thoughts (GoT)
ToT 的扩展版本,允许节点之间更灵活的连接。不仅是树结构,还可以合并不同分支的信息,形成有向图。适合需要整合多条思路的复杂推理。
Least-to-Most Prompting
将大问题分解为子问题的有序列表,然后依次解决,前面的答案用于后续问题。
Step-Back Prompting
先将问题"退一步",抽象化为高层概念,回答抽象问题,再回到具体问题。
推理框架对比
| 框架 | 复杂度 | 性能提升 | 适用场景 | 计算成本 |
|---|---|---|---|---|
| CoT | 低 | +5-20% | 多步推理 | 低(1次调用) |
| Self-Consistency | 低 | +10-25% | 答案验证 | 中(N次调用) |
| ToT | 高 | +15-40% | 创意/规划 | 高(搜索) |
| GoT | 高 | +20-45% | 复杂推理 | 高(图搜索) |
| Least-to-Most | 中 | +10-30% | 分解问题 | 中(多次调用) |
5. ReAct: Reasoning + Acting (Yao et al., 2023)
ReAct 的核心思想是:模型不仅需要推理,还需要与外界交互。通过交替进行 Thought(思考)和 Action(行动),模型可以使用工具、调用 API、检索信息,然后将观察结果融入下一步的推理。
ReAct 循环
完整的 ReAct Trace 示例
ReAct 的关键优势
- 工具整合: 模型知道何时以及如何使用工具(搜索、计算、代码执行)
- 动态调整: 基于观察结果调整推理策略
- 可验证性: 每一步都可以追踪和验证
- 实时性: 可以获取最新信息,而非依赖训练数据
ReAct 流程图
ReAct vs Pure Reasoning vs Pure Acting
Pure CoT(仅推理)
- ✓ 快速
- ✓ 确定性
- ✗ 知识过时
- ✗ 无法验证
- ✗ 易产生幻觉
Pure Tool Use(仅行动)
- ✓ 获取最新信息
- ✓ 可验证
- ✗ 无推理
- ✗ 工具调用不当
- ✗ 效率低
✓ ReAct(推理 + 行动)
最佳平衡:智能决策何时推理,何时使用工具。同时获得推理的深度和工具的准确性。
6. 结构化输出
现代 LLM 可以生成结构化的、机器可读的输出格式,这对于将 LLM 集成到生产系统至关重要。
主要技术
JSON Mode / Structured Outputs
强制模型只输出有效的 JSON,遵循指定的 schema。
OpenAI Function Calling
定义函数 schema,模型会返回应该调用哪个函数及其参数。
Outlines / Instructor 库
通过约束生成,保证输出遵循特定的格式规范。
Pydantic 模型定义
使用 Pydantic 定义输出数据模型,确保类型安全和验证。
XML Tags 提示
Anthropic Claude 推荐使用 XML 标签明确划分结构。这比 JSON 提示更有效,因为 XML 的层级结构更清晰。
7. System Prompt 工程
System prompt 是 LLM 交互中最被低估的部分。一个精心设计的 system prompt 可以显著改变模型的行为、风格和输出质量。
System vs User vs Assistant 角色
| 角色 | 用途 | 特点 |
|---|---|---|
| System | 设置模型的全局行为和约束 | 在对话开始时设置,对整个对话有效 |
| User | 用户的输入和提问 | 会改变模型的回应,可能覆盖部分 system 设置 |
| Assistant | 模型的回应 | 可以在多轮对话中作为示例引导模型 |
角色设定的影响
一个简单的角色设定就可以大幅改变模型的行为:
约束条件与输出控制
Safety Guardrails 在 System Prompt 中的作用
安全设计的重要性
System prompt 中明确的安全约束可以防止模型被滥用。例如,明确说明哪些话题不讨论、如何处理敏感信息等。
System Prompt 最佳实践
- 明确性: 清楚地说明期望的行为
- 具体性: 给出具体的约束和格式要求
- 示例: 用示例展示期望的行为
- 简洁性: 避免冗长的说明
- 可测试性: 设定可以验证的目标
8. 自动化提示优化
DSPy: 提示工程的编程范式
DSPy 将 prompting 转变为编程问题。不再手动编写 prompt,而是定义数据流和模块,使用自动化优化器来改进提示和参数。
核心概念
- Module: 像函数一样的组件,包含 prompt 和处理逻辑
- ChainOfThought: 自动生成 CoT 提示
- ReAct: 自动生成推理+行动提示
- Optimizer: 自动搜索最优的 prompt
优化器类型
- BootstrapFewShot: 自动搜索最优的示例集
- MIPRO: 混合整数规划优化,优化 prompt 和示例
- BayesianSignatureOptimizer: 贝叶斯优化
APE: Automatic Prompt Engineering
用 LLM 自身生成候选 prompt,然后在验证集上评估,自动选择最优的 prompt。
候选 Prompts
上评估
最优 Prompt
上验证
OPRO: Optimization by Prompting
用 LLM 本身来优化 prompt。根据历史评分,让 LLM 改进 prompt,不断迭代。这是"用 LLM 优化 LLM"的范式。
9. 多模态提示
现代 LLM 如 GPT-4V 和 Claude 3 已具备强大的视觉理解能力。多模态提示涉及在 prompt 中融合图像、文本和其他信息。
视觉理解能力
- 图像描述: 生成详细的图像说明
- OCR: 识别图像中的文字
- 图表理解: 解读图表、表格、图形
- 物体识别: 识别图像中的对象
- 视觉推理: 基于视觉信息进行推理
视觉 CoT: 在图像上进行推理
引导模型关注特定区域
10. 提示注入与安全
随着 LLM 的广泛应用,提示注入攻击已成为新的安全威胁。攻击者可以通过精心构造的输入改变模型的行为。
两类提示注入攻击
直接注入 (Direct Injection)
攻击者直接在用户输入中嵌入恶意指令。
间接注入 (Indirect Injection)
攻击者在外部数据(网页、数据库、邮件)中嵌入恶意指令,然后这些数据被提送给 LLM。
防御策略
1. Input Sanitization(输入清理)
- 检测和移除可疑的指令模式
- 验证输入的预期格式
- 对特殊字符进行转义
2. System Prompt 隔离
使用明确的分界符和标签将 system 部分和用户输入部分分开。
3. Output Validation(输出验证)
- 检查模型输出是否泄露敏感信息
- 验证输出格式的合规性
- 检测不寻常的行为(如突然改变风格)
4. 多层防御
- 结合多个防御层
- 定期审计和测试
- 监控异常行为
- 限制模型的权限和能力
什么是 Prompt Injection?如何防御? 直接注入是在用户输入中嵌入恶意指令;间接注入是在外部数据中嵌入。防御方法:(1) 输入清理 - 检测可疑模式;(2) 隔离 - 明确分界用户输入和系统指令;(3) 验证输出 - 检查是否泄露信息;(4) 多层防御 - 综合应用。
11. 面试高频问题 (Top 10)
关于技术面试的建议
在回答这些问题时,不仅要理论理解,还要展示实践经验。准备具体的例子和数据点(如性能提升的数字)。
-
In-Context Learning (ICL) 的理论解释是什么?为什么不需要梯度更新就能学习?
考查: 对 ICL 机制的深度理解。预期答案应该讨论梯度下降假说、贝叶斯推断和 attention 的隐式学习。
-
Few-shot 学习中,示例的顺序、数量和选择方式如何影响性能?
考查: 对 ICL 因素的实际认识。应该提到位置偏差、相似度选择(kNN)的有效性。
-
Chain-of-Thought (CoT) 为什么有效?什么任务适合,什么任务不适合?
考查: 对推理机制的理解。应该解释分解、工作记忆、降低单步难度。给出具体的任务分类。
-
Self-Consistency 和 Tree of Thoughts 的区别是什么?
考查: 对高级推理框架的比较分析。SC 通过多样性采样投票;ToT 通过树搜索和评估。
-
ReAct 如何解决纯 CoT 的局限性?
考查: 推理与工具使用的结合。应该提到动态调整、工具集成、知识实时性。
-
为什么结构化输出(JSON Mode、Function Calling)很重要?
考查: 对生产系统的理解。应该讨论可靠性、集成性、自动化处理。
-
System Prompt 如何影响模型的行为?给出设计良好的 System Prompt 的原则。
考查: 对提示工程实践的掌握。应该强调明确性、具体性、可测试性。
-
DSPy 如何改变传统的 prompting 方式?
考查: 对提示自动化的理解。应该解释编程范式、模块化、自动优化。
-
什么是 Prompt Injection?如何防御?
考查: 对 LLM 安全的认识。应该区分直接和间接注入,提出多层防御策略。
-
在实际项目中,你如何选择合适的提示工程技术?
考查: 实践经验和判断力。应该展示根据任务性质、成本约束、性能需求进行权衡的能力。
面试准备建议
除了理论知识,重点准备:
- 具体的项目例子和数据点(性能提升的百分比、成本节省等)
- 对不同模型的理解(GPT、Claude、Gemini 等)
- A/B 测试和评估方法论
- 成本与性能的权衡分析
- 生产环境中遇到的实际问题和解决方案