AI 模型与 Token
Claude Code 背后的 AI 引擎——LLM、Token、上下文窗口、温度、幻觉等核心概念
什么是 LLM(大语言模型)?
LLM = Large Language Model(大语言模型),简单说就是一个训练过的"超大脑"——它读过互联网上数以万亿计的文字,学会了"给定前文,下一个词最可能是什么"的规律。
把它想象成:你把一部百科全书读了 1000 遍,最后你能根据上下文预测接下来会写什么。LLM 就是这样——它不是真正"理解"语言,而是基于统计规律做概率预测。
但这个"概率预测"已经强大到令人惊讶的地步——它能写代码、回答问题、翻译语言、分析数据,甚至进行复杂的推理。
Claude 的模型家族
Claude Code 背后是 Anthropic 公司开发的 Claude 模型家族。具体可用模型会随账号、地区和官方发布节奏变化,但可以按能力层级理解:
| 模型 | 类比 | 能力 | 速度 | 成本 | 适合场景 |
|---|---|---|---|---|---|
| Fable | 顶级专家会诊 | 最高能力 | 慢 | 最高 | 高风险架构、复杂推理、关键决策 |
| Opus | 米其林餐厅 | 最强推理 | 最慢 | 最贵 | 复杂架构设计、深度分析 |
| Sonnet | 日常餐厅 | 平衡推理 | 中等 | 中等 | 日常编程、代码审查 |
| Haiku | 快餐店 | 基础推理 | 最快 | 最便宜 | 简单问答、分类、提取 |
最重要的区别是"推理深度"
- Haiku:直接给答案,像查字典
- Sonnet:思考一下再回答,像学生解题
- Opus:深思熟虑后给出精确答案,像专家花一小时才做出判断
- Fable:用于最难、最贵、最需要可靠判断的任务
怎么选模型?
| 场景 | 推荐模型 |
|---|---|
| 修改单个文件的小 bug | Haiku |
| 日常功能开发、代码审查 | Sonnet |
| 设计新架构、复杂重构 | Opus |
| 分析不确定的复杂问题 | Opus 或 Fable |
在 Claude Code 中切换模型:
/model opus # 切到 Opus
/model sonnet # 切到 Sonnet
/model haiku # 切到 Haiku什么是 Token?
Token 是 LLM 处理文本的最小单位,也是计费的基本单元。
Token 不等于字符
LLM 不是按字母或汉字处理文本的,而是按 Token。一个 Token 大约是:
- 英文:约 4 个字符 ≈ 3/4 个单词。
"Hello world"≈ 2-3 个 Token - 代码:变化较大。
function hello() {≈ 5 个 Token - 标点符号:通常 1 个 Token
中文的 Token 成本
这是一个容易被忽略的"隐藏税费":
中文每个字约需 1.5-2 个 Token,同样含义的内容,中文比英文多消耗约 2 倍 Token。
原因是技术层面的:LLM 的分词器(Tokenizer)是基于英文语料训练的。中文字符在 UTF-8 编码中占 3 个字节,而英文只占 1 个字节,导致中文的"Token 效率"更低。
实际影响:
英文: "Fix the login bug" ≈ 5 Token
中文: "修复登录 bug" ≈ 8 Token这意味着同样的对话,用中文交流的成本约是英文的 2 倍。
Token 的两个方向
| 方向 | 含义 | 包含内容 |
|---|---|---|
| 输入 Token | 你发给 Claude 的 | 你的提问 + 对话历史 + 文件内容 + CLAUDE.md + 系统指令 |
| 输出 Token | Claude 回复的 | 回答文本 + 工具调用 + 代码 |
两者分别计费,输出 Token 通常比输入更贵。
上下文窗口
什么是上下文窗口?
上下文窗口 = Claude 的"短期记忆容量",用 Token 数量衡量。
想象 Claude 坐在一张办公桌前,桌子大小固定。桌上放着:
- 你刚才说的话
- Claude 之前的回答
- 读取的文件内容
- 命令执行的结果
- CLAUDE.md 配置
- Auto Memory 笔记
- 系统指令
当桌子坐满了,新信息要进来,旧信息就得被移走。
各模型的上下文大小
上下文窗口不是永久固定值,会随模型版本、产品形态和账号权限变化。阅读官方模型页时重点看两个字段:
| 字段 | 含义 |
|---|---|
| Context window | 一次请求最多能放多少输入内容 |
| Max output | 单次回答最多能生成多少内容 |
在 Claude Code 里,真正需要关心的是:当前对话、读取过的文件、命令输出、CLAUDE.md、系统指令都会一起占上下文。模型窗口再大,长时间会话也会被工具输出和历史讨论塞满。
满了会怎样?
Claude Code 有自动管理机制:
- 优先清除工具输出:命令运行结果最先被丢弃
- 压缩对话历史:把长讨论总结成几句关键信息
- 永不丢弃关键内容:当前请求和 CLAUDE.md 受保护
自动压缩与 /compact
自动压缩怎么工作?
当对话接近上下文窗口上限时,Claude Code 会自动触发压缩:
- 把之前的对话发给 Claude 自己
- Claude 生成一份"摘要"——保留关键决策和代码改动,删除冗余讨论
- 摘要替换原始对话
- 释放大量 Token 空间
示例:
压缩前:对话历史占 120,000 Token
压缩后:摘要占 30,000 Token
释放:90,000 Token 可继续使用手动压缩:/compact
你可以主动触发:
/compact还可以指定重点:
/compact 重点保留关于认证模块的改动这样 Claude 在压缩时会特别注意保留你最关心的内容。
压缩会丢失信息吗?
会。这是有损压缩——像 MP3 音乐压缩一样,细节可能丢失。所以:
- 重要的规则写在 CLAUDE.md 里(永远不被压缩)
- 不要依赖很早之前的对话内容
- 如果某个信息很重要,让 Claude 保存到 Memory
流式输出(Streaming)
为什么回复是一个字一个字出来的?
LLM 生成回复不是一瞬间完成的,而是逐词生成的:
- 想到第 1 个字 → 立即发给你
- 基于已生成的内容,想到第 2 个字 → 立即发给你
- 依此类推……
两种输出模式对比
非流式(一次性返回):
- Claude 内部想好完整答案(耗时 10 秒)
- 一口气全发给你
- 你等 10 秒,然后突然出现整屏文字
流式(边想边说):
- 第 1 个字 0.1 秒后出现
- 第 2 个字 0.2 秒后出现
- 你感觉是在和真人对话
流式的好处
- 感知更快:不用干等,立刻看到回复在生成
- 可以中途打断:发现方向不对,按 Ctrl+C 停止,不浪费后续 Token
- 即时反馈:可以在回复还没完时就开始思考
温度(Temperature)
什么是温度?
温度是控制回答"随机性"的参数,范围通常是 0-1。
想象掷骰子:
- Temperature = 0(冰冻):骰子被固定,每次都掷出同一面。回答完全确定
- Temperature = 0.5(温热):骰子能活动一点,结果有轻微变化
- Temperature = 1(正常):普通骰子,每次可能不同
对实际使用的影响
| 温度 | 行为 | 适合场景 |
|---|---|---|
| 接近 0 | 每次回答几乎相同,最"保守" | 代码生成、数学计算 |
| 0.5 | 有轻微变化,但整体一致 | 日常问答 |
| 接近 1 | 每次都可能不同,更"有创意" | 创意写作、头脑风暴 |
为什么同一个问题每次回答不同?
因为 LLM 的输出是概率性的。在每个位置,它会从多个候选词中按概率抽样选择一个。温度越高,低概率的词被选中的机会越大,回答的变化就越大。
Claude Code 的处理:Claude Code 根据任务类型自动调整温度——代码任务用低温度保证准确性,解释性任务允许适度变化。
Tool Use(工具调用)
Claude 怎么"决定"用哪个工具?
Claude Code 不只是聊天——它能调用工具(读文件、运行命令、搜索代码等)。这个能力叫 Tool Use / Function Calling。
工作原理:
- 你问:"检查 src/ 里有没有语法错误"
- Claude 的大脑分析这个请求,判断需要什么工具
- Claude 输出一个结构化的工具调用请求:
Bash("pnpm lint") - Claude Code 系统执行这个工具
- 结果返回给 Claude
- Claude 基于结果生成自然语言回复
这不是硬编码的规则
Claude 不是通过 if/else 规则选择工具的——它是通过理解你的意图,像人一样判断"用什么工具最合适"。
这意味着:
- 大多数时候它选对了
- 偶尔会选错(比如该用 Grep 时用了 Bash)
- 你可以纠正它:"不要用 Bash grep,用 Grep 工具"
工具调用的成本
每次工具调用会增加对话的 Token 消耗:
- 工具的参数(输入 Token)
- 工具的返回结果(输入 Token——因为结果要放回上下文)
- Claude 对结果的分析(输出 Token)
一次 Read 操作读取一个 1000 行的文件,可能消耗数千 Token。
幻觉(Hallucination)
什么是幻觉?
幻觉 = LLM 编造事实,并且说得很自信。
比如:
- 说一个根本不存在的 npm 包
- 引用一篇不存在的论文
- 编造一个函数的 API 参数
- 给出错误的统计数据
为什么会幻觉?
LLM 学的是"概率分布",不是"事实数据库"。
想象 Claude 学过 1000 万篇文章。当你问它一个问题时,它不是去"查找"答案,而是根据统计规律"预测"最可能的回答。
如果训练数据中没有精确答案,Claude 会:
- 根据相似的内容,拼凑一个"看起来合理"的答案
- 用自信的语气说出来(因为 LLM 不知道什么是"不确定")
- 你信以为真——这就是幻觉
常见的幻觉类型
| 类型 | 示例 |
|---|---|
| 虚假的 API/函数 | "你可以用 fs.readFileAsync() 读取文件" — 这个函数不存在 |
| 虚假的包/库 | "安装 react-super-table 组件" — 这个包可能不存在 |
| 虚假的命令参数 | "git log --show-files" — 这个参数不存在 |
| 虚假的引用 | "根据 React 官方文档第三章..." — 内容可能是编的 |
| 错误的数字 | 统计数据、百分比、日期 |
在 Claude Code 中怎么防范?
- 让 Claude 搜索验证:不确定的信息让它 WebSearch 或 WebFetch 确认
- 提供参考文件:把正确的文档给 Claude 读,减少"猜测"
- 验证代码:Claude 生成代码后运行
pnpm build或pnpm lint检查 - 质疑不确定的内容:如果 Claude 说的 API 你没见过,让它先 grep 项目确认
关键认知:Claude 不是"偶尔出错",而是本质上就是在做概率预测。它大多数时候预测得很准,但永远不能 100% 信任——尤其是具体的函数名、参数、数字。
/cost:理解费用
计费模型
Claude Code 按 Token 计费:
| 类型 | 说明 | 相对成本 |
|---|---|---|
| 输入 Token | 你发给 Claude 的所有内容 | 基础 |
| 输出 Token | Claude 的回复和工具调用 | 约 3-5 倍 |
| 缓存 Token | 重复使用的系统提示 | 约 1/10 |
为什么对话越长越贵?
每条新消息都要携带整个对话历史:
第 1 条消息:
输入 = 系统提示 + CLAUDE.md + 你的问题
消耗:约 5,000 Token
第 2 条消息:
输入 = 系统提示 + CLAUDE.md + 第 1 条对话 + 新问题
消耗:约 15,000 Token
第 3 条消息:
输入 = 系统提示 + CLAUDE.md + 全部对话历史 + 新问题
消耗:约 30,000 Token对话越长,每条消息的输入 Token 越多。这就是为什么:
- 长对话会自动压缩
- 建议用
/clear在不相关的任务间切换 - 子代理(Subagent)帮助隔离高消耗的任务
降低成本的方法
- 简单任务用 Haiku:成本约为 Opus 的 1/10
- 任务间清空:
/clear重置上下文 - 用 /compact:定期压缩减少历史占用
- 精确提问:模糊的问题导致 Claude 读更多文件、做更多搜索
- 检查 /cost:定期查看消耗,了解什么操作最费钱