02 LLM Call

LLM Call

LLM 是如何开口说话的。

本章聚焦  →  LLM 的底层机理 · 一切能力都始于 next-token prediction

2.1 LLM 推理

始终记住 LLM 只能且只会做一件事情,给定一串连续 token,预测下一个 token。

直觉类比

只会接话的人

把 LLM 想成一个“只会接话的人”:每次它只盯着“到目前为止已经出现的 token”,猜下一个最可能的 token——然后把这个 token 接上去,再猜下一个。它并不预先在脑子里把整句话规划好再往外说。

那它为什么读起来通顺、甚至聪明?因为“下一个最可能的 token 是什么”这件事,是在海量文本上训练出来的统计直觉。连贯与智能,是这种逐字续写在巨大规模下“涌现”出来的结果,而不是它在心里“打腹稿”。

无论是思考推理、多轮对话、还是工具调用、亦或是复杂的 Agent 任务流程,都是这一个核心工作模式的延展。

以下是 ShareGPT 格式对应的一个极简 LLM 输入输出样例,符合我们的常规理解。

[
  {
    "system": "你是ChatGPT。",
    "conversations": [
      {
        "from": "human",
        "value": "你好!"
      },
      {
        "from": "gpt",
        "value": "你好,我是ChatGPT,有什么可以帮您?"
      }
    ]
  }
]

而在底层 LLM next token prediction 机制 (NTP) 中,这段输入输出本质上对应的是一个完整的 token 序列。

<|im_start|>systemGPT<|im_end|><|im_start|>user<|im_end|><|im_start|>assistantGPT<|im_end|>

在给定输入 token 序列后,大模型每次会执行一次完整的推理,它以 im_start 这个 special token 开始,递归地吐出下一个 token,直到吐出 im_end 为止。

图 1 · messages → token 序列 → 自回归生成
messages JSONsystem·user·assistantchat_template拼接·加特殊 token连续 token 序列含 <|im_start|>/<|im_end|>LLM 推理预测下一个 tokentn+1遇 EOS/im_end 停assistant content完成 ✓append 回序列 · 继续(自回归)
把对话拼成一条连续的 token 序列后,模型每次只预测下一个 token(tn+1),再把它追加回序列继续预测——如此自回归,直到命中 <|im_end|> 才停。

在这里再次强调大模型只会做 NTP 这一件事情,什么时候吐什么 token 这个能力是通过训练获得的。

现场演示 · 最简 LLM Call(第 1 次提交)
这是 mybot 的第一次提交——整个项目只有一个 mybot/llm.py。在终端运行 python -m mybot.llm:给模型发一句 “Hello”,看最原始的单次 LLM 回复——没有多轮、没有工具、没有前端。(此终端固定指向第 1 次提交,与本章其余演示的后端相互独立。)

2.2 多轮对话与 thinking

thinking 是模型的内嵌能力,它不是一种黑盒能力,而是通过 <think>...</think> 这种 template 嵌入到 assistant 回复开头的一种 token 组织模板。它是在训练阶段教会模型的一种生成姿势。

直觉类比

草稿纸 / 自言自语

<think>…</think> 不是什么黑盒能力,它是训练阶段教给模型的一种“生成姿势”:先在一块草稿区里把推理过程一字一句写出来(自言自语),再据此写出给用户看的正式答案。

简单说,”先打草稿、再答题”。但草稿本身也要一个 token 一个 token 地生成——所以 thinking 不是免费的,它是用额外的 token 消耗,去换取更高的答案质量。

以下是 LLM 展开 thinking 推理的 token inference 示例:

<|im_start|>systemAI<|im_end|><|im_start|>user<|im_end|><|im_start|>assistant<think>百...</think>...**30%**<|im_end|>

thinking 不是免费的,它是用 token 额外的 token 消耗换取更高的生成质量。

从消息序列(message list)的角度来看多轮 + thinking:

{
  "model": "gpt-4.1",
  "messages": [
    {
      "role": "system",
      "content": "你是晓法,一个专业的法律AI助手。"
    },
    {
      "role": "user",
      "content": "公司想在劳动合同里加一条“员工离职后5年内不得从事同类行业”,这合法吗?"
    },
    {
      "role": "assistant",
      "content": "<think>\n分析用户的法律问题:竞业限制期限。\n检索《劳动合同法》第二十四条:竞业限制期限不得超过二年。\n结论:5年的约定违法。超出两年的部分无效。\n</think>\n不合法。根据《劳动合同法》规定,竞业限制的期限**最长不得超过两年**。如果合同中约定了5年,超出两年的部分在法律上是无效的。"
    },
    {
      "role": "user",
      "content": "那如果是针对普通的初级前端开发人员呢?签2年总可以了吧?"
    },
    {
      "role": "assistant",
      "content": "<think>\n用户追问:竞业限制的主体适格性问题(初级前端开发人员)。\n检索《劳动合同法》第二十四条:竞业限制的人员限于用人单位的高级管理人员、高级技术人员和其他负有保密义务的人员。\n分析:普通的初级前端通常不属于高级技术人员。除非能证明其接触了核心商业机密(且公司支付了经济补偿),否则强制签署竞业限制极易被劳动仲裁委认定无效。\n</think>\n签2年虽然在“期限”上合法了,但在“人员身份”上大概率是无效的。\n\n《劳动合同法》明确规定,竞业限制仅适用于**高级管理人员、高级技术人员和其他负有保密义务的人员**。普通的初级前端开发通常不在此列。除非公司能举证该员工掌握了核心底层代码或商业机密,并且在离职后按月支付了竞业限制补偿金,否则这份协议在劳动仲裁时极易被判定对该员工不具备约束力。"
    }
  ]
}
图 2 · 多轮 = 不断加长的同一条 token 序列

1 第 1 轮结束后的序列

system系统设定
user第 1 轮提问
assistantthink + 回答
↓ 下一轮:把新的 user / assistant 段 追加到同一条序列末尾

2 第 2 轮结束后的序列(同一条,更长了)

system系统设定
user第 1 轮提问
assistantthink + 回答
user第 2 轮追问本轮追加
assistantthink + 回答本轮追加
每一轮都把新的 user / assistant 段追加到同一条序列末尾,整条再一次性摊平、喂回模型——所谓“上下文”,就是这条不断加长的连续 token 序列本身。

其对应的 token 序列如下  *为了可读性上文已做换行处理,实际上是一个连续且完整的 token 序列

展开完整 token 序列
<|im_start|>systemAI<|im_end|><|im_start|>user5<|im_end|><|im_start|>assistant<think>5</think>****5<|im_end|><|im_start|>user2<|im_end|><|im_start|>assistant<think></think>2****<|im_end|>
现场演示 · 直接调用 LLM(终端)

在终端里运行 python -m mybot.llm:给模型发一句 “Hello”,看最原始的 NTP 流式逐 token 回复。需先在本地启动 ttyd 终端服务。

thinking 演示看点
  • 逐 token 流式——回复不是一次吐出,而是一个 token 接一个 token
  • 思考段可见——打开 LLM_SHOW_THINKING=true 能看到模型的 <think> 内容
现场演示 · mybot 前端(多轮对话)

先启动 mybot(uv run mybot),在此直接与它对话。

多轮对话演示看点
  • 多轮对话——前几轮的内容会持续影响后续回答
  • 会话管理——每个会话独立保存、可新建可切换
  • 前端交互——网页端实时收发与流式渲染

2.3 小结与思考

本章小结
  • NTP 是唯一机制——LLM 只做一件事:给定一串 token,预测下一个,再把它接回序列继续预测,直到命中停止符。
  • 一切能力都是它的延展——多轮对话、思考推理、工具调用乃至复杂 Agent 流程,底层都是这同一条自回归序列在不断变长。
  • 多轮 = 同一条序列加长——每一轮都在序列尾部追加内容,模型每次看到的永远是“从头到现在”的完整序列。
  • thinking 不是免费的——<think> 是训练出来的“先打草稿、再答题”的生成姿势,用额外 token 换取更高的答案质量。
思考题
  • 阅读源码,了解 openai/anthropic llm api format 的区别
  • 多轮对话中,thinking/reasoing_content 应不应该保留到下一轮
  • 为什么建议采用官方 LLM API Package 来执行大模型推理
  • api 返还的 token 计量与费用计量是始终准确的吗
源码浏览器
选择左侧文件查看源码