模型只输出概率:AI Engineer 的第一个底层认知

53 阅读13分钟

cover1.webp

一|拆掉认知的幻觉

作为 AI Engineer,在你写下第一行 Prompt、搭建第一个 AI 接口,或者决定是否要把系统中的某个能力交给大模型之前,你必须先解决一个会持续影响你所有工程判断的底层问题:

LLM,到底是不是在“思考”?

这个问题乍一看像是哲学讨论,但对 AI Engineer 来说,它其实是一个极其具体、而且代价很高的工程判断问题。

一旦这里的认知是错的,后面的系统设计几乎一定会出问题:

  • 你会系统性地高估模型的能力边界
  • 你会把本该由代码承担的确定性逻辑,错误地交给大模型
  • 你会反复用 Prompt 去“补救”,那些原本应该在系统层解决的问题

最终的结果往往是:

一个看起来很聪明,但在真实场景下极不稳定的系统。

在进入工程层面的解释之前,我们先拆掉一个几乎所有人都会不自觉接受的认知幻觉。

当你问 ChatGPT:“今天天气怎么样?”

或者提出一个更偏逻辑的问题:“帮我写一个 Python 的冒泡排序。”

当界面上出现“正在思考”“正在计划”的提示时,你的大脑几乎会自动生成这样一幅画面:

对面坐着一个“懂你在问什么的人”,

他理解问题、检索记忆、组织答案,

然后把结果告诉你。

这个画面,正是 AI Engineer 必须主动删除的第一个认知幻觉。

因为从工程角度看,在推理阶段,LLM 并没有在“理解问题”或“制定计划”。

它所做的事情只有一件:

在给定上下文的条件下,计算下一个 Token 出现的概率。

没有理解,没有意图,也没有“想好整句话”。

只有一次又一次的概率计算。

二|神经网络的本质:数值预测器

先给一个结论,这句话你可以直接记住:

神经网络不认识世界,它只会算数字。

无论模型今天叫 CNN、Transformer,还是 GPT、LLaMA;

无论参数是百万级,还是千亿级;

在工程层面,它们做的事情本质上完全一致。

你可以把任何神经网络,都当成一个黑盒函数:

** 输入一串数字 → 经过一堆计算 → 输出一串数字**

没有理解,没有常识,也没有“想明白了再回答”。它只是在做计算。

net-without-lab.webp

如果你看一张神经网络的结构图,你会发现里面没有现实世界的建模,没有“人”、没有“花”,也没有“文字”。

只有三样东西:输入的数字、中间的计算结果,以及输出的数字。

那些连线旁边的小数,本质上只是乘法系数。

你看到的不是“智能”,而是一张正在工作的计算图。

问题自然就来了:

既然神经网络只认识数字,那现实世界的问题怎么办?比如我该如何使用神经网络预测某组人群里的个体是男性还是女性?

答案其实很简单,也很工程—— 先把现实问题,翻译成数字。

一个“人”,不能直接丢给模型,

但可以被压缩成一组特征向量:

[175, 42, 130, 58]

身高、鞋码、声频、头围。

这些数字,才是模型真正“看到”的输入。

net-withlabel.webp

当这组数字进入网络,模型输出的也不是“男性”或“女性”,而是一组概率分布:

Label 00.82
Label 10.18

模型只负责一件事:告诉你在当前条件下,哪个结果更可能。

至于如何解释这些概率、要不要采纳、阈值怎么设、规则如何兜底 —— 这些,从来不属于模型,而是工程师的责任。

一旦理解了这套“输入特征 → 输出概率”的机制,你就看懂了绝大多数 AI 模型:

  • 图像识别:输入像素,输出是猫或狗的概率
  • 推荐系统:输入用户特征,输出点击或跳过的概率
  • 风控系统:输入交易记录,输出正常或诈骗的概率

网络结构没变,变的只是输入特征的定义,以及输出结果的解释方式。

到这里,我们讲的仍然是最常见的一类 AI:分类预测。

输入一组特征,输出“它是什么”。

而通向大语言模型(LLM),只需要对这套结构做一个微小但决定性的改变:

把“预测对象”,从“类别”,换成“下一个元素”。

以前,是输入特征,预测属于哪个类别;

现在,是输入一段上下文,预测下一个 Token 最可能是什么。

你会发现,模型、概率、阈值、工程责任这些都没变,变的只是:

输出端从几个固定标签,变成了一个巨大的“下一步候选集合”。

而这一步,正是普通神经网络,走向大语言模型的起点。

llm-net.webp

三|序列生成的奥秘:文字接龙与滑动窗口

那么,这个“预测下一步”的过程究竟是怎么发生的?

还记得我们前面说过的原则吗:神经网络的输入是数字,也只能输出数字。

所以如果要让它写出英文,比如补全一句经典的故事开场白 “Once upon a time…”,第一步不是“理解含义”,而是一个更朴素的工程问题:怎么把字母变成数字?

为了先把机制讲清楚,我们用一个最笨、但最直观的教具:给 26 个英文字母编号,比如 a=1,b=2……

(注意:这里用“字符”只是为了好理解;真实的大语言模型用的是更复杂的 Token,我们之后会讲。)

1)概率的“打分”

假设我们要让模型基于开头 “Once upon a t”开始补全后面的部分,

我们先把 “Once upon a t” 翻译成数字序列,输入给网络。

此时,输出层不再是两个神经元(像前面预测性别那样),而是扩展为 26 个输出(对应 26 个字母;如果考虑空格和标点,还会更多)。

关键来了:模型不会直接告诉你“下一个是 i”。

它只会给出 26 个候选目标打分——也就是“每个字母代表的数字在当前网络计算后的概率大小下”。

当模型“看”到这串输入后,会在输出端算出一组分数:

代表 i 的数字的分数最高,于是它对应的概率最大;而 x、y 之类的概率可能接近 0。

我们把概率最高的那个结果取出来,再翻译回字母并进行拼接——Bingo!得到 “Once upon a ti”。

2)核心机制:自回归生成与滑动窗口

但这只生成了一个字母。那它是怎么写出一整句话的?

答案是大模型生成的核心机制:自回归(Autoregressive)

通俗点说就是:“基于输入生成一个元素,再把新元素拼接回去。”

第一步:输入 “Once upon a t”,模型预测出 “i”。

第二步:把 “i” 拼到末尾,变成 “Once upon a ti”。

第三步:关键点来了——模型的输入窗口是固定大小的。为了把新的 “i” 放进去,我们必须把最前面的内容挤出去一点。

于是新的输入变成了 “nce upon a ti”。模型再次计算概率,这次它预测下一个字符是 “m”。循环往复……

模型就这样“吃进去”一串旧的,“吐出来”一个新的,再把新的喂给自己,直到它顺着概率,一步步写出 “Once upon a time”。

这就是所谓的上下文长度(Context Length)

无论今天的 LLM 有多强,它能“记住”并作为参考的,始终是这个固定窗口里的内容。

总结一下,从工程本质看,大语言模型(LLM)就是一个超级复杂的“基于概率计算的文字接龙机器”。

它并不懂童谣的含义,也不懂悲伤或快乐。它只是在不断计算:

在给定的上文中,下一个最可能出现的字符是哪一个

四|规模改变一切:从“拼字母”到“读单词”

讲到这里,你已经看清了 LLM 的骨架:

它就是一个“文字接龙机器”,在给定上文的条件下,一步步预测下一个元素。

但如果它真的像我们刚才演示的那样——一个字母一个字母地接龙——那 ChatGPT 大概率会变成一个“人工智障”。

为什么?因为在字符级别,模型既看不远**,也**算得慢,

更重要的是——大量算力被消耗在几乎没有语义价值的拼写选择上。

为了让 AI 真正可用,还需要完成一次关键的预测规模的进化:

从预测字符(Character),升级为预测 Token,这不是”更多更强“这么简单,而是直接决定它能不能用

1. 字符级接龙的三个工程瓶颈

继续沿着上一节的机制往下想。假设模型真的按照我们刚才演示的方式,一个字符一个字符地去补全那句经典开场白: “Once upon a time …”

如果预测单位是字符,它会立刻遇到三个非常现实的工程问题。

  • 视野狭窄(语境短): 假设模型的“窗口”只能容纳 10 个单位。在字符级设定下,它看到的可能只是 "Once upon " 这一小段字符。这些信息,勉强够它拼下一个字母,却不足以维持稳定的语境,更谈不上连贯的叙事。
  • 效率极低(算力浪费): 要生成一句完整的话,字符模型必须为每一个字母、空格和标点都跑一次预测。一句很短的文本,也可能需要几十次完整计算。这不是“慢一点”,而是算力和成本都会被成倍放大的工程问题。
  • 语义稀薄(算力用错地方): 单个字母本身几乎不承载独立语义。模型不得不把大量算力花在学习“t 后面常见 i”“q 后面常见 u”这类拼写层面的统计规律上,而不是把算力用在更高层的语义选择上——比如,“Once upon a time”之后,更可能接怎样的叙事结构。

这就好比让一个成年人读《红楼梦》,但他必须只能看拼音,而且还要一个字母一个字母地拼读。不是不能读,而是又慢、又累、还抓不住重点

2. 关键升级:预测单位从“字符”换成 Token

要让这台“接龙机器”真的可用,我们必须完成一次关键进化:

把预测单位从 Character(字符),升级为 Token。

Token 可以理解为更大的语义块:

可能是一个完整单词,也可能是词根/常见片段(比如 “time”、" upon"、"ing" 这类更“成块”的单位)。

同样还是那句 “Once upon a …”:

  • 字符级:模型需要逐个预测 t i m e
  • Token 级:模型可以直接把 [time] 作为一个候选整体来竞争

这一步的意义不是“跑得更快”这么简单,而是:

模型终于能在更接近“语义”的颗粒度上做选择,而不是在“拼写”的颗粒度上挣扎。

3. 规模暴增带来的两个“物理优势”

预测单位升级为 Token,会直接带来两个规模层面的跃迁——这也是大模型变强的物理基础:

  • 更大的选择空间(Vocabulary)

    字符级输出层可能只有几十个候选(字母 + 标点)。

    Token 级输出层通常是几万个候选。

    这意味着模型每一步不是在 26 个字母里“拼”,而是在几万个语义块里“选”——选中的那一个,往往已经带着明确含义。

  • 更长的有效上下文(Context)

    窗口大小是按 Token 计的。

    在同样的窗口容量下:Token 越大,承载的信息越多。

    于是模型不仅能记得 “Once upon a …”,还更可能把后面更长的叙事结构维持住:人物、指代、伏笔、风格一致性。

从字符到 Token,就像从“拼字母”升级到“读单词”。

它让模型减少无意义的拼写计算,把算力真正用在“语义选择”上——这才是 ChatGPT 看起来更像在思考的起点。

五|模型只输出概率,系统负责结果:AI 工程师必须建立的底层认知

讲到这里,我们已经把 LLM 的外壳彻底拆开了。

它没有“灵魂”,没有“思想”,也不存在一个在后台苦思冥想、理解问题的小人。

它甚至并不真正理解“句子”。

在推理阶段,它始终只做一件事:

基于当前的 Token,一次、再一次地预测下一个概率最高的 Token。

你今天看到的那些

“看起来像在理解你、像在思考问题的回答”,

本质上只是概率预测在足够大的模型规模足够长的上下文窗口下,持续滚动出来的结果。

理解这一点,是区分

AI 使用者合格 AI 工程师 的真正分水岭。

一旦你接受了**“大模型的本质是概率系统”** 这个事实,很多原本看起来诡异、不可控的现象,都会在工程上变得清晰而合理:

  • 模型为什么会一本正经地胡说八道(Hallucination)?

    → 因为它并不判断真假,只是在当前上下文中选择概率更高的输出。

  • Prompt 为什么能“塑造角色”?

    → 因为你改变的不是模型人格,而是概率分布的搜索空间。

  • 为什么 Prompt Engineering 从来不是“教模型思考”?

    → 因为你无法教一个概率分布去思考,你只能引导 Token 在庞大概率分布的落点。

这正是接下来一系列内容想做的事情。

不是教你如何写更花哨的 Prompt,也不是教你如何把模型“当人一样对待”。

而是在清楚模型绝不完全等于智能的前提下,

设计一个在工程上可控、在行为上可靠、在现实世界中不出事的系统

请从这里开始,建立AI Engineer职业生涯中最重要的一条认知底线:

AI Engineering 的本质,是用确定性的代码逻辑,去约束、引导、修正那个不确定的概率系统。

AI Engineer不负责创造“灵魂”, 而是让概率系统在现实世界中沿着正确的轨道运行。


阅读更多 AI 工程化实验室系列文章 或关注公众号 AI工程化实验室,深入探索 RAG优化、Agent编排硬核技术干货。