Skip to content

LLM 基础原理:理解你的 AI 搭档 🧠

"不理解工具的工作原理,就无法发挥它的全部潜力。"

1. Transformer 架构核心

1.1 Attention 机制:LLM 的"思考"方式

Transformer 的核心是 Self-Attention,它允许模型在处理每个 token 时"关注"输入序列中的所有其他 token。

输入: "The cat sat on the mat because it was tired"

                                   "it" 指的是什么?

Attention 权重:
  "it" → "cat": 0.72  ← 最高权重,模型理解 it 指 cat
  "it" → "mat": 0.15
  "it" → "sat": 0.08
  ...

工程启示:

  • 模型能理解长距离依赖,但 Attention 计算是 O(n²),这解释了上下文窗口限制
  • 相关信息放得越近,模型理解得越准确

1.2 上下文窗口 (Context Window)

模型上下文窗口约等于
GPT-4o128K tokens~100 页文档
Claude 3.5 Sonnet200K tokens~150 页文档
Gemini 1.5 Pro1M tokens~700 页文档

关键概念:

┌─────────────────────────────────────────────────────────────┐
│                    Context Window (128K)                     │
├──────────────┬──────────────────────────┬───────────────────┤
│ System Prompt│    User Messages &       │   Model Output    │
│   (固定)      │    Assistant History     │    (生成中)        │
│              │      (动态增长)            │                   │
└──────────────┴──────────────────────────┴───────────────────┘
        ↑                    ↑                      ↑
    通常 1-5K            可能占满                模型在此续写

"Lost in the Middle" 问题: 研究表明,模型对上下文开头和结尾的信息记忆最好,中间部分容易被"遗忘"。

python
# 最佳实践:重要信息放在开头或结尾
system_prompt = """
[CRITICAL RULES - READ FIRST]  # ← 开头
...important rules...

[CONTEXT]
...background info...

[REMINDER]  # ← 结尾
Always follow the CRITICAL RULES above.
"""

2. Tokenization:模型如何"看"文本

2.1 什么是 Token

LLM 不直接处理字符,而是处理 Token——介于字符和单词之间的文本单元。

输入文本: "Hello, world! 你好世界"

GPT-4 Tokenization:
["Hello", ",", " world", "!", " 你", "好", "世", "界"]
   1       2      3       4     5    6    7    8    = 8 tokens

注意:
- 英文单词通常是 1 token
- 中文每个字通常是 1-2 tokens
- 标点符号通常独立成 token
- 空格可能附着在后面的单词上

2.2 Token 计费与优化

javascript
// 粗略估算 (实际使用 tiktoken 库)
function estimateTokens(text) {
  // 英文: ~4 字符 = 1 token
  // 中文: ~1.5 字符 = 1 token
  const englishChars = text.replace(/[\u4e00-\u9fa5]/g, '').length;
  const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
  return Math.ceil(englishChars / 4 + chineseChars * 1.5);
}

成本优化技巧:

技巧描述节省比例
Prompt Caching缓存 System Prompt,只付一次钱可达 90%
压缩上下文摘要历史对话而非完整保留30-50%
选择合适模型简单任务用小模型10-100x

3. 生成过程:概率采样

3.1 Next Token Prediction

LLM 的核心任务是:给定上下文,预测下一个 token 的概率分布。

输入: "The capital of France is"

模型输出概率分布:
  "Paris"    : 0.92  ← 采样这个
  "the"      : 0.03
  "Lyon"     : 0.02
  "a"        : 0.01
  ...

3.2 采样参数详解

Temperature (温度)

控制概率分布的"锐利程度"。

原始概率: Paris(0.6), Lyon(0.2), Marseille(0.1), Bordeaux(0.1)

Temperature = 0.0 (Greedy):
  → 始终选择 Paris (概率最高)
  → 确定性输出,适合代码生成

Temperature = 1.0 (原始分布):
  → 按原始概率采样
  → 平衡创造性和准确性

Temperature = 2.0 (更平坦):
  → 概率变得更均匀: Paris(0.35), Lyon(0.25), Marseille(0.2), Bordeaux(0.2)
  → 更多随机性,可能产生意外输出

前端场景推荐设置:

场景Temperature理由
代码生成/重构0.0 - 0.2需要精确,避免 API 幻觉
Bug 修复0.0要么对要么错,不需要创意
文案生成0.7 - 0.9需要多样性和创意
头脑风暴1.0+需要发散思维

Top-P (Nucleus Sampling)

只从累积概率达到 P 的 token 中采样。

概率排序: Paris(0.6) > Lyon(0.2) > Marseille(0.1) > Bordeaux(0.1)

Top-P = 0.8:
  累积: Paris(0.6) + Lyon(0.2) = 0.8 ✓
  → 只在 [Paris, Lyon] 中采样
  → 排除低概率的长尾选项

Top-K

只从概率最高的 K 个 token 中采样。

Top-K = 2:
  → 只在 [Paris, Lyon] 中采样 (概率最高的 2 个)

组合使用:

javascript
// OpenAI API 调用示例
const response = await openai.chat.completions.create({
  model: "gpt-4",
  messages: [...],
  temperature: 0.2,  // 低温度保证稳定
  top_p: 0.1,        // 只考虑最可能的 token
  // 通常不需要同时设置 top_k
});

4. 模型能力边界

4.1 LLM 擅长什么

模式匹配与生成

  • 代码补全、翻译、摘要
  • 遵循格式和模板

知识检索 (训练数据内)

  • 解释概念、回答常见问题
  • 但可能不是最新信息

推理 (有限)

  • 简单逻辑推理
  • Chain-of-Thought 可增强复杂推理

4.2 LLM 不擅长什么

精确计算

// LLM 可能出错的场景
"计算 7823 * 4521"  // 可能给出近似值,不保证精确

// 解决方案:让 LLM 生成代码,然后执行
"写一个 Python 表达式计算 7823 * 4521,然后执行它"

实时信息

// LLM 不知道今天的信息
"今天的股价是多少?"  // 无法回答

// 解决方案:提供工具让 LLM 查询 API

持久记忆

// 每次对话是独立的
对话 1: "记住我喜欢 TypeScript"
对话 2: "我喜欢什么语言?"  // LLM 不记得

// 解决方案:外部记忆存储 + RAG

多步精确执行

// 长任务容易出错
"重构这 20 个文件,每个文件做这 5 件事"

// 解决方案:拆分为多次调用,每次做一件事

4.3 幻觉 (Hallucination)

模型可能自信地输出错误信息,尤其是:

  • 不存在的 API: React.useAsyncState() (虚构的)
  • 错误的版本信息: "React 18 移除了 useEffect" (错误)
  • 虚假的引用: "根据 MDN 文档..." (可能是编造的)

减少幻觉的策略:

  1. 提供上下文: 给出真实的 API 文档
  2. 要求引用: "只使用我提供的文档中的 API"
  3. 验证输出: 通过工具执行代码检查语法
  4. 降低温度: Temperature = 0 减少随机性

5. Prompt 如何影响模型行为

5.1 In-Context Learning

模型能从 Prompt 中的示例"即时学习"模式,而无需微调。

markdown
# Few-shot 示例

将以下英文 API 响应转换为中文用户友好的消息:

Input: {"error": "RATE_LIMITED", "retryAfter": 60}
Output: 您的操作太频繁了,请 60 秒后再试。

Input: {"error": "INVALID_TOKEN", "field": "email"}
Output: 邮箱格式不正确,请检查后重新输入。

Input: {"error": "QUOTA_EXCEEDED", "limit": 100}
Output: [模型会学习模式并生成类似格式的输出]

5.2 角色设定的本质

角色设定不是"让模型变成另一个人",而是激活特定的知识和行为模式

markdown
# 有效的角色设定
你是一名有 10 年经验的 React 性能优化专家。你熟悉:
- React DevTools Profiler 的使用
- useMemo/useCallback 的正确使用场景
- 虚拟列表和懒加载的实现
- 服务端渲染优化

# 为什么有效?
- 激活了训练数据中关于 React 性能的知识区域
- 建立了"专家"的行为预期(谨慎、有依据)
- 锁定了技术术语的语境

5.3 System Prompt vs User Prompt

特性System PromptUser Prompt
位置对话开头,固定不变每次用户输入
用途定义角色、规则、格式具体任务和问题
优先级通常更高可能覆盖 System
缓存可以被缓存,节省成本每次不同
javascript
const response = await anthropic.messages.create({
  model: "claude-sonnet-4-20250514",
  system: `你是一名前端架构师。
规则:
1. 只使用 TypeScript
2. 优先使用函数组件
3. 不使用 class 组件`,  // System Prompt - 持久规则
  messages: [
    { role: "user", content: "实现一个 Modal 组件" }  // User Prompt - 具体任务
  ]
});

6. 实战:诊断 Prompt 问题

6.1 常见问题诊断

症状可能原因解决方案
输出格式不稳定格式要求不够明确提供 JSON Schema 或示例
忽略某些规则规则太多或矛盾精简规则,检查冲突
输出与预期差异大上下文不足提供更多背景信息
API 名称错误幻觉提供真实 API 文档
回答太啰嗦未限制长度明确要求简洁

6.2 调试工作流

1. 明确预期输出

2. 检查 Prompt 是否包含足够信息

3. 降低 Temperature 测试确定性输出

4. 添加更多约束或示例

5. 检查是否有规则冲突

6. 尝试拆分复杂任务

7. 关键要点总结

  1. LLM 是概率模型: 不是数据库,输出基于"最可能的下一个 token"
  2. 上下文窗口有限: 重要信息放开头或结尾
  3. Temperature 控制随机性: 代码任务用低值,创意任务用高值
  4. 了解能力边界: 计算、实时信息、持久记忆需要外部工具
  5. 减少幻觉: 提供真实上下文,要求引用来源,验证输出

延伸阅读

前端面试知识库