LuoLuoLuoLuo Wiki
背景知识

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:用于最难、最贵、最需要可靠判断的任务

怎么选模型?

场景推荐模型
修改单个文件的小 bugHaiku
日常功能开发、代码审查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 + 系统指令
输出 TokenClaude 回复的回答文本 + 工具调用 + 代码

两者分别计费,输出 Token 通常比输入更贵。


上下文窗口

什么是上下文窗口?

上下文窗口 = Claude 的"短期记忆容量",用 Token 数量衡量。

想象 Claude 坐在一张办公桌前,桌子大小固定。桌上放着:

  • 你刚才说的话
  • Claude 之前的回答
  • 读取的文件内容
  • 命令执行的结果
  • CLAUDE.md 配置
  • Auto Memory 笔记
  • 系统指令

当桌子坐满了,新信息要进来,旧信息就得被移走。

各模型的上下文大小

上下文窗口不是永久固定值,会随模型版本、产品形态和账号权限变化。阅读官方模型页时重点看两个字段:

字段含义
Context window一次请求最多能放多少输入内容
Max output单次回答最多能生成多少内容

在 Claude Code 里,真正需要关心的是:当前对话、读取过的文件、命令输出、CLAUDE.md、系统指令都会一起占上下文。模型窗口再大,长时间会话也会被工具输出和历史讨论塞满。

满了会怎样?

Claude Code 有自动管理机制:

  1. 优先清除工具输出:命令运行结果最先被丢弃
  2. 压缩对话历史:把长讨论总结成几句关键信息
  3. 永不丢弃关键内容:当前请求和 CLAUDE.md 受保护

自动压缩与 /compact

自动压缩怎么工作?

当对话接近上下文窗口上限时,Claude Code 会自动触发压缩:

  1. 把之前的对话发给 Claude 自己
  2. Claude 生成一份"摘要"——保留关键决策和代码改动,删除冗余讨论
  3. 摘要替换原始对话
  4. 释放大量 Token 空间

示例

压缩前:对话历史占 120,000 Token
压缩后:摘要占 30,000 Token
释放:90,000 Token 可继续使用

手动压缩:/compact

你可以主动触发:

/compact

还可以指定重点:

/compact 重点保留关于认证模块的改动

这样 Claude 在压缩时会特别注意保留你最关心的内容。

压缩会丢失信息吗?

。这是有损压缩——像 MP3 音乐压缩一样,细节可能丢失。所以:

  • 重要的规则写在 CLAUDE.md 里(永远不被压缩)
  • 不要依赖很早之前的对话内容
  • 如果某个信息很重要,让 Claude 保存到 Memory

流式输出(Streaming)

为什么回复是一个字一个字出来的?

LLM 生成回复不是一瞬间完成的,而是逐词生成的:

  1. 想到第 1 个字 → 立即发给你
  2. 基于已生成的内容,想到第 2 个字 → 立即发给你
  3. 依此类推……

两种输出模式对比

非流式(一次性返回):

  • Claude 内部想好完整答案(耗时 10 秒)
  • 一口气全发给你
  • 你等 10 秒,然后突然出现整屏文字

流式(边想边说):

  • 第 1 个字 0.1 秒后出现
  • 第 2 个字 0.2 秒后出现
  • 你感觉是在和真人对话

流式的好处

  1. 感知更快:不用干等,立刻看到回复在生成
  2. 可以中途打断:发现方向不对,按 Ctrl+C 停止,不浪费后续 Token
  3. 即时反馈:可以在回复还没完时就开始思考

温度(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

工作原理:

  1. 你问:"检查 src/ 里有没有语法错误"
  2. Claude 的大脑分析这个请求,判断需要什么工具
  3. Claude 输出一个结构化的工具调用请求:Bash("pnpm lint")
  4. Claude Code 系统执行这个工具
  5. 结果返回给 Claude
  6. 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 会:

  1. 根据相似的内容,拼凑一个"看起来合理"的答案
  2. 用自信的语气说出来(因为 LLM 不知道什么是"不确定")
  3. 你信以为真——这就是幻觉

常见的幻觉类型

类型示例
虚假的 API/函数"你可以用 fs.readFileAsync() 读取文件" — 这个函数不存在
虚假的包/库"安装 react-super-table 组件" — 这个包可能不存在
虚假的命令参数"git log --show-files" — 这个参数不存在
虚假的引用"根据 React 官方文档第三章..." — 内容可能是编的
错误的数字统计数据、百分比、日期

在 Claude Code 中怎么防范?

  1. 让 Claude 搜索验证:不确定的信息让它 WebSearch 或 WebFetch 确认
  2. 提供参考文件:把正确的文档给 Claude 读,减少"猜测"
  3. 验证代码:Claude 生成代码后运行 pnpm buildpnpm lint 检查
  4. 质疑不确定的内容:如果 Claude 说的 API 你没见过,让它先 grep 项目确认

关键认知:Claude 不是"偶尔出错",而是本质上就是在做概率预测。它大多数时候预测得很准,但永远不能 100% 信任——尤其是具体的函数名、参数、数字。


/cost:理解费用

计费模型

Claude Code 按 Token 计费:

类型说明相对成本
输入 Token你发给 Claude 的所有内容基础
输出 TokenClaude 的回复和工具调用约 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)帮助隔离高消耗的任务

降低成本的方法

  1. 简单任务用 Haiku:成本约为 Opus 的 1/10
  2. 任务间清空/clear 重置上下文
  3. 用 /compact:定期压缩减少历史占用
  4. 精确提问:模糊的问题导致 Claude 读更多文件、做更多搜索
  5. 检查 /cost:定期查看消耗,了解什么操作最费钱

On this page