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 序列。
在给定输入 token 序列后,大模型每次会执行一次完整的推理,它以 im_start 这个 special token 开始,递归地吐出下一个 token,直到吐出 im_end 为止。
<|im_end|> 才停。在这里再次强调大模型只会做 NTP 这一件事情,什么时候吐什么 token 这个能力是通过训练获得的。
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 示例:
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《劳动合同法》明确规定,竞业限制仅适用于**高级管理人员、高级技术人员和其他负有保密义务的人员**。普通的初级前端开发通常不在此列。除非公司能举证该员工掌握了核心底层代码或商业机密,并且在离职后按月支付了竞业限制补偿金,否则这份协议在劳动仲裁时极易被判定对该员工不具备约束力。"
}
]
}
1 第 1 轮结束后的序列
2 第 2 轮结束后的序列(同一条,更长了)
其对应的 token 序列如下 *为了可读性上文已做换行处理,实际上是一个连续且完整的 token 序列
展开完整 token 序列
在终端里运行 python -m mybot.llm:给模型发一句 “Hello”,看最原始的 NTP 流式逐 token 回复。需先在本地启动 ttyd 终端服务。
- 逐 token 流式——回复不是一次吐出,而是一个 token 接一个 token
- 思考段可见——打开
LLM_SHOW_THINKING=true能看到模型的 <think> 内容
先启动 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 计量与费用计量是始终准确的吗