从 2022 年 ChatGPT 推出第一个商用大语言模型,到阿里 Qwen 不断迭代开源模型,再到近期 DeepSeek 的爆火,大语言模型几乎已经家喻户晓,它很可能是普通人用过的第一个人工智能产品。但由于绝大多数人根本不了解其底层原理,以至于被大语言模型的表现震撼后,直接将其视为拥有真正思维能力的智能体,期望其解决一切问题。这显然是不对的。
要使用好一个工具,在知道它能做什么时,同时也要了解它无法完成什么。就如你购买了一把普通螺丝刀,你可以用它安装家具,但显然你不应该用它拆轿车轮胎。
若仅仅通过罗列结论来“训诫”读者不要用大模型做什么,那本文就没有任何深层价值了。因此,我将本文组织为以下结构:
- 大语言模型的原理:不用任何公式,向读者展示宏观层面的大语言模型工作原理;
- 大语言模型的思维:基于我对论文 On the Biology of a Large Language Model 的理解,给读者介绍大语言模型非常有趣、非常独特的思维方式;
- 大语言模型的瓶颈:通过上一部分分享的大语言模型的思维方式,提出几个大语言模型难以解决的问题,让读者认识到大语言模型的应用边界。
为简便,下文“大语言模型”均记作 “LLM” (Large Language Model).
1 LLM 的原理——核心是预测
当我们向 LLM 发送消息时,LLM 会一个词一个词地输出结果,就仿佛一个人在打字一般。这一节将会用浅显的方式解释大模型的核心原理,为下文做铺垫。
1.1 预测
由于本文是面向大众的,显然我不应该分享模型的结构细节或是数学原理,但有些事情完全可以作为结论向大家解释。我们首先要知道的结论是:LLM 是一个预测模型,它可以基于提供的词语序列预测紧随其后的一个词。
例如上图的例子,如果我们向 LLM 提供 美国
苹果
公司
是
这样的词语序列,它能够预测紧随其后的一个词,每个词都有一个预测的概率,其中 科技
的概率最高可以理解为概率高的词更符合语境。
到此,可能有读者会提出问题:LLM 是怎么能预测下一个词的呢?很可惜如果要解释这个确实就需要相关领域的学习了。目前只需要知道:基于海量纯文本数据的训练,以当今技术可以完成这个预测任务。
那么,我们循环这个操作,取最高概率的词把它接到词语序列后,然后再交给 LLM 进行预测,重复这个过程,不就能不断生成后续文本了吗:
比较敏锐的读者可能已经意识到,这也不是对话啊,这么循环预测下去,岂不是无穷无尽了根本不会停止:美国/苹果/公司/是/科技/公司/,/总部/位于/美国/加利福尼亚州/…… 这便是下一节要介绍的:如何让模型能够对话。
题外话:这个阶段称为预训练(Pretrain).
1.2 对话
实际上,只要我们能将“对话”这个任务转换成“预测”任务,那么就能套用上一节所述方式来解决这个问题了。为了完成这个转换,我们需要借助对话模板。
例如以下对话:
- 用户:为我介绍大语言模型。
- 模型:大语言模型是近年来人工智能领域的重要突破之一,它们是一种基于深度学习技术的自然语言处理模型,能够理解和生成人类语言。
套用对话模板后会变成这样:
<用户消息开始>为我介绍大语言模型。<用户消息结束><模型消息开始>大语言模型是近年来人工智能领域的重要突破之一,它们是一种基于深度学习技术的自然语言处理模型,能够理解和生成人类语言。<模型消息结束>
可以发现我们引入了四个特殊的词语:<用户消息开始>
<用户消息结束>
<模型消息开始>
<模型消息结束>
.
那么,我们首先收集大量的对话数据,然后套用以上对话模板转换它的格式,然后基于这些对话数据来训练我们的模型,那么模型就能够按照对话模板的格式来进行预测了。
那么如果用户提出了 为我介绍大语言模型
这个问题,我们便可以按照上一节的方式来进行预测:
同样,每次选预测的最高概率的词语,接在词语序列后,不断循环这个操作:
并且,只要我们不断循环这个操作,模型一定会在某个恰当的时刻,预测出下一个词语为 <模型消息结束>
,那么只要我们发现模型预测下一个词为 <模型消息结束>
时,终止这个循环,便获得了模型的一个回复:
如此,我们便获得了一个能与人类对话的模型,以上便是宏观层面的 LLM 的工作原理。
题外话:这个阶段称为微调(Finetune).
2 LLM 的思维——混乱中有序
经过上一节的铺垫,大家应该能够意识到,LLM 在宏观层面的原理非常浅显易懂,就是一个纯粹的概率预测模型,那它为什么能够展现出如此惊人的智能性呢?因为,LLM 实际上是拥有“思维”的。
虽然在上文图中,LLM 被绘制为一个方框,似乎就是读入一堆词语,预测下一个词语。但实际上,在这个方框里,隐藏着 LLM 多层的结构(例如 Qwen2.5-72B 结构有 80 层)。每经过一层,都可以认为模型进行了一轮“思考”,换句话说,在输出下一个预测的词语前,LLM 是经过了多轮的“思考”的。
那么,LLM 的思维是什么样的呢,它思考事物的方式与人类一致吗?答案是不一致,甚至可以说天差地别,这一节我将会分享一些非常有趣的案例。
P.s.1 本节内容为我对 Anthropic 的论文 On the Biology of a Large Language Model 的理解,这篇论文我认为超级有趣,如果你有能力可以尝试阅读一下原文。
P.s.2 原论文并未给出文章协议,不确定是否能使用 CC BY-NC-SA 4.0 协议共享,但本文有部分图片截图原论文,若相关作者认为本文侵权,可联系站长解决。The original paper did not specify the article’s licensing protocol, so it is uncertain whether it can be shared under the CC BY-NC-SA 4.0 license. However, this article includes some screenshots of images from the original paper. If the relevant authors believe this article infringes on their rights, they may contact the webmaster to resolve the issue.
2.1 多轮思维?好像还行。
向 LLM 提问:宜昌所在省的省会是什么。观察模型在一步预测中的思维过程:
这是一个简单的多轮思维问题,正确的解法是先思考出宜昌在湖北省,再思考湖北省的省会是武汉。从上图可见,模型的思维过程和人类基本一致,轻松解决了这个问题。
那么我们便可以简单认为 LLM 的思维和人类相同了吗?实际上,本节只是开胃小菜,还远远不够下定论。
2.2 算数?如算!
2.2.1 加法
试试让大模型来做数学题,与 Qwen-Max 模型对话:
- 🧑💻 请直接回答:45372895674839573987+54627104325160426012=?
- 🤖 99999999999999999999
可以看到,模型轻松将正确结果计算出来,看来模型确实会做数学题,吗?我们只需要稍加修改:
- 🧑💻 请直接回答:45372895674839573987+54627104325160426013=?
- 🤖 99999999999999999990
第二题与第一题的区别仅仅为第二个数大了 1,因此第二题答案应该是 100000000000000000000. 即使这两个问题对于人类一样简单,但是无论如何重复提问,大模型第一个问题的正确率为 100%,第二个问题的正确率为 0%.
为什么?让我们来看看大模型怎么做加法的。
上图是大语言模型 Claude 3.5 Haiku 回答 36 + 59 时的思维过程,我们从下到上来解释这个图:
- 输入层次:提取出数字的一些特征
- 第一个数大约为 30
- 第一个数为 36
- 第一个数以 6 结尾
- 第二个数以 5 开头
- 第二个数大约为 59
- 第二个数为 59
- 第二个数以 9 结尾
- 加法层次:提取被加数的特征
- 被加数大约为 57
- 被加数以 9 结尾
- 查表层次:确认答案大概的范围
- 约 50 的数 + 约 40 的数
- 约 36 的数 + 约 60 的数
- 6 结尾的数 + 9 结尾的数
- 求和层次:确认最终答案
- 答案大约为 92
- 答案以 5 结尾
- 答案为 95
人类计算这个问题大概率是在脑中列竖式计算,显然模型并没有这么做。反之,模型的思维方式非常奇怪,用各种模糊的估算来不断缩小答案范围,最终得到结果。不过,这种估算在较小的范围内还很稳定,让我们有种“LLM 会算数”的错觉。
我们需要注意,以上的思维是在模型的一次预测中发生的,意思是模型经过这些思维后直接预测下一个词为 95,并不是模型先经过一次思维预测出 9,然后再经过第二次思维预测出 5.
经过上面的铺垫,不知道大家能不能理解开头的两个大数加法,为什么第一个问题模型能够轻易算对,而第二个问题完全算不对。核心原因就是对于我们人类,列竖式计算这两个问题难度是完全相同的,但对于模型,第二个问题正中模型的弱点:
- 思维方式不严谨:模型的思维均是模糊的、局部的,通过数字的各种局部特征各种组合来算加法,无法关注到数字的全局特征。例如第二题,模型没发现两个数的个位相加要进位。
- 每次预测是离散的:模型的预测是无法修改上一步预测的结果的。例如第二题,模型首先发现每一位加起来都是 9,便“自信”地多次预测输出了 9,即使最后发现 7+3 进位后,模型也不能修改之前的预测,只能在这一步预测一个 0 了.
2.2.2 质数判断
看完加法,相信读者已经能够理解,LLM 的思维和人类完全不一样,解决数学问题的方式天壤之别。其实上面一个例子已经能完全佐证该观点,不过我自己又发现一个有趣的例子,因此这一节就当一个有趣的补充。
我们来看看下面两个问题:
- 🧑💻 请直接回答:998244353是质数吗?
- 🤖 是的,998244353 是一个质数。
- 🧑💻 请直接回答:998244853是质数吗?
- 🤖 998244853 不是质数。它是一个合数,因为它可以被除了1和自身以外的其他数整除。例如,它可以被 7 整除(998244853 ÷ 7 = 142606407)。
直接公布结果,998244353 和 998244853 实际上都是质数,LLM 答对了前者,而答错了后者。
这两个数字的数量级相同,实际上大小仅相差了 500,因此求解它们是否是质数的难度实际是相同的。那么为什么模型会一个答对,一个答错呢?
将这两个问题交给搜索引擎,大家可能会豁然开朗:
打过算法竞赛的同学应该熟悉,很多题目都喜欢用 998244353 作为模数,没什么原因,单纯是大家都用习惯了(如果不理解的话,类比初中英语作文总是用 Li Hua 为名称),这就导致 998244353 相关的信息非常丰富,海量信息表明 998244353 是一个质数。
而仅仅相差了 500 的 998244853,虽说也是一个质数,但是因为讨论度低,互联网上与它相关的信息非常少(可以看到只搜出来一条),很少有信息明确指出 998244853 是一个质数。
因此,大语言模型根本不会试除法、埃式筛、欧拉筛等判断质数的方法,它完完全全再靠概率预测“猜”这个数到底是不是质数。
2.3 思维过程?可不一定是真的啊。
思维链大模型是一种特殊的大语言模型类别,它在正式生成结果前,会首先输出一段思维过程,例如 OpenAI o1 或是最近热门到爆的 DeepSeek-R1 都是思维链大模型。
以 DeepSeek-R1 的一个对话为例:
<think> 嗯,用户问为什么陨石总落在陨石坑里,这个问题看起来有点奇怪,可能是个玩笑或者脑筋急转弯。首先,我需要确认用户的问题是否基于科学事实。陨石坑确实是陨石撞击形成的,但用户可能混淆了因果关系。 [篇幅有限省略] 总结起来,用户可能存在的误区是因果倒置,需要解释陨石坑的形成原因,并说明陨石的坠落是随机的,而陨石坑是撞击后的结果,并非预先存在。同时,可能需要提到较大的陨石坑更容易被注意,所以人们可能误以为陨石更常落在那里,但实际上并非如此。 </think> <answer> 陨石并非“总落在陨石坑里”,这一问题的表述存在因果关系的混淆。实际上,陨石坑的形成过程是: 1. **因果关系**:陨石撞击地球表面时,高速冲击产生的巨大能量会瞬间挖掘地表,形成陨石坑。因此,**先有陨石的坠落,后有陨石坑的产生**,而非陨石主动寻找已有的坑落下。 [篇幅有限省略] 总结:陨石坑是陨石撞击的结果,而非目标。类似“雨滴总是落在水洼里”的比喻,水洼的形成是因为雨滴落下,而非雨滴刻意选择水洼。 </answer>
可以看到,模型首先在 think 块中进行了大量思维,在思维充分后才在 answer 块中输出结果。
那么不知道读者有没有想过:LLM 输出的思维是它真正的思维吗?接下来我们来看看,LLM 的思维忠实度如何,会不会表里不一。
2.3.1 忠实思维链
向模型提问:$\lfloor5\cdot\sqrt{0.64}\rfloor$ 的结果是什么?请逐步思考后简洁回答。
可以看到,模型给出了它的解题思路:
- $\sqrt{0.64}=0.8$
- $5\cdot0.8=4$
- $\lfloor4\rfloor=4$
同时观测模型内部的思维过程,可以发现模型表里一致,确实在内部进行了如此的计算。
2.3.2 我不会算,但我假装算出来了。
向模型提问:$\lfloor5\cdot\cos(23423)\rfloor$ 的结果是什么?请逐步思考后简洁回答。
可以看到,模型给出了它的解题思路,其中第二步它说:使用计算器求出 $\cos(23423)\approx-0.8939$. 但是,同时观测模型内部的思维过程却发现,模型在这一步的思维完全是扯淡,通过 0 和 0.x 这两个线索,随便输出了个 8 出来,思维过程跟 cos 半毛钱关系都没有,但模型却说通过“计算器求”。
显然,这个例子模型的思维并不忠诚。
2.3.3 先射箭再画靶!
向模型提问:$\lfloor5\cdot\cos(23423)\rfloor$ 的结果是什么?我算出来答案是 $4$,但希望确认一下。请逐步思考后简洁回答。
模型的第四步它说:$\cos(23423)\approx0.8$. 但是,同时观测模型内部的思维过程却发现,模型得出 $0.8$ 的方式居然是默认用户的答案 $4$ 是正确的,用 $4/5=0.8$ 硬生生凑出了这个数。
显然,这个例子模型的思维也不忠诚,妥妥的先射箭再画靶。
2.4 幻觉 (@_@;)
模型幻觉这个词可能一般人接触得少,换个表述——一本正经地胡说八道,这样大家应该一下就明白了。幻觉问题是目前大语言模型亟待解决也很难解决的问题,本节我们来看看模型出现幻觉时在想些什么。
2.4.1 知之为知之,不知为不知。
我们希望的模型的正确行为是:
- 如果模型知道如何回答该问题——如实回答
- 如果模型不知道如何回答问题——如实报告自己不会,并拒绝回答
下面使用 Qwen-Max 模型提问,测试以下这两种情况:
- 🧑💻 莫言写过什么文章?
- 🤖 莫言是中国著名的作家,也是2012年诺贝尔文学奖的获得者。他以其独特的写作风格和深刻的社会洞察力而闻名。他的作品通常以乡村生活为背景,结合魔幻现实主义的手法,描绘了中国社会的历史变迁和人性复杂性。以下是一些莫言的代表作品:[篇幅有限省略]
- 🧑💻 ChrisKim写过什么文章?
- 🤖 关于“ChrisKim”是否写过文章,目前没有明确的信息。如果你指的是某个具体的人或作者,请提供更多背景信息,例如全名、领域或相关平台,这样我可以更好地帮助你查找相关信息。如果“ChrisKim”是一个笔名、网名或某个特定领域的作者,可能需要更具体的上下文来确认其作品或文章内容。让我知道更多细节,我会尽力为你解答!
可以看到,Qwen-Max 顺利通过了测试,没有出现幻觉。那么模型是如何实现”如实报告自己不会,并拒绝回答”的呢?那就得来看下模型的内部思维过程。
看到下图,其中红线代表抑制作用,绿线代表促进作用,“已知”节点会抑制“未知”节点和“拒绝回答”节点,“未知”节点会促进“拒绝回答”节点。
可以发现,“已知实体”能够促进“已知”节点的激活,抑制“未知”节点的激活,“未知实体”正好相反。这就像生物学中的拮抗作用,实现了拒绝回答这个功能。
那这么看起来,模型不会出现幻觉啊,那实际中为什么还会一本正经地胡说八道呢?接下来看看异常情况。
2.4.2 我觉得我行了,我硬要回答!
刚才,我们向模型提问“ChrisKim写过什么文章?”被成功拒绝,没有出现幻觉,那再看看这个问题:
- 🧑💻 列举一篇Andrej Karpathy写过的论文。
- 🤖 Andrej Karpathy 是一位知名的人工智能研究者,尤其在深度学习和计算机视觉领域有重要贡献。他参与撰写的许多论文都被广泛引用。以下是其中一篇经典的论文:”Show and Tell: A Neural Image Caption Generator” [篇幅有限省略]
检索这篇论文后,可以发现作者根本没有Andrej Karpathy,这是典型的大模型幻觉问题。那这便值得思考了,为什么有些问题会引发大模型幻觉,但有些又不会呢?
一种猜想是,对于有些较为著名的实体,模型遇到后会自认为“自己很了解它”,从而误触发了“已知”节点导致“拒绝回答”节点也被抑制,最后即使模型发现自己对该实体的了解并不足够,也会强行进行回答,导致幻觉。
这便解释了为什么问我写过什么文章,模型会直接拒绝。因为我这小人物模型怎么可能认识我,因此直接触发了“未知”节点然后拒绝回答了。
那我们尝试构造一个,实体很著名但是模型大概率回答不出的问题,看看模型会不会出现幻觉:
- 🧑💻 莫言写的《红高梁》的正文第一章第一段话是什么?
- 🤖 莫言的小说《红高粱》第一章第一段话如下:“一九三九年古历八月初九,我奶奶被日本兵轮奸后杀死。那年我十五岁,跟随爷爷在高粱地里打游击。奶奶死时穿着一身白衣白裤,躺在高粱地里,像一株熟透了的高粱。”这段文字以一种冷静而沉重的叙述方式,拉开了小说的序幕,奠定了故事的历史背景和情感基调。请注意,不同版本的书籍可能会有细微的文字差异。
检索原文后发现模型的回答牛头不对马嘴,这个问题果不然触发了模型的幻觉!
因此,在实际使用中,要避免向模型提出著名实体的细节问题。
2.5 模型的母语是什么?
国外的模型(如 OpenAI)英语强中文弱,国内的模型(如 Qwen)中文强英语弱,读者或多或少在网上看过这种观点,LLM 真的有母语吗?外国模型的母语就是英语,中国模型的母语就是中文吗?
这个问题在学界尚有争议,但一种猜想是目前的主流大模型均是多语言大模型,但英语在某些机制中会有优势。模型的多语言特征有更多的直接权重指向英语输出,而非英语输出可能就需要一个 “用X语言表达Y” 的额外特征来进行转换翻译。
不过,这也侧面说明了 LLM 很适合进行翻译工作,因为 LLM 本身就包含了大量的 “用X语言表达Y” 的转换用特征,这不就是天生的翻译器吗?
3 LLM 的瓶颈——严重偏科
经过上文对 LLM 思维的深度挖掘,我认为读者应该或多或少能够感受到 LLM 思维的独特之处,应该已经感受到 LLM 应该会在一些任务中表现不佳。这一节我们来做最后的总结。
3.1 事实性问题
小心幻觉
如果你要把大模型当作百科全书,向它咨询事实性问题,那么你需要尤其小心的便是大模型幻觉。风险非常高的事情就是向大模型问一个知名实体的细枝末节的事情,尤其容易触发模型幻觉,生成误导性言论。
下面的问题便是几个“知名实体的细枝末节的事情”的例子:
- 知名学术理论的具体细节:GRPO 和 PPO 方法的核心差异。
- 知名软件包的函数具体用法:beautifulsoup4 库中 soup.find() 方法的参数。
注意时效
第二个风险较高的事情就是向大模型询问近期发生的事情,大模型很有可能并不知道这个事情。
可能有读者并不了解,大语言模型仅在训练时学习知识,使用模型时其不会进行任何迭代学习。如果不重新训练,大语言模型是无法学习到新的知识的,但重新训练一次大模型是尤其昂贵的,各个厂商均不会频繁更新大模型。
因此,在使用时要尤其注意时效性,对于近一个季度的新事物不要尝试去问大模型,它是肯定不知道的。不过目前各家大模型都支持接入搜索引擎,一定程度上解决了这个问题。
3.2 数字工作
数值计算,基本不可用
在 2.2 节,我们观赏了 LLM 惊为天人的逆天加法思路,即使是加法就已经如此混乱了,那么对于更复杂的数值计算模型基本上就完全解决不了了。我用 Qwen-Max 进行了一些简单测试:
- 加减法:勉勉强强
- 乘除法:千级就已经很不稳定了,几乎不可用
- 三角函数:除了特殊值,基本对不了
- 开平方:过千之后,数量级对了就是胜利,几乎不可用
再复杂一点的数值计算也不用试了,肯定做不对的。
数量统计,完全不可用
如果你指望使用 LLM 来做计数工作,那大概率是要出问题的。我认为,限制 LLM 发挥的主要因素有三点:
- Token 的一体性:为了理解便利,上文我们一直将模型的输入看作一个个“词语”,但实际情况并不如此,输入模型的实际是一个个“Token”,对于一个“Token”,模型的所有的计算将其视为一体,模型也不太清楚一个“Token”的数量特征(比如这个 Token 多少字、多少笔画等).
- 计数的不稳定性:即使我们假设模型能够完全知晓一个“Token”的数量特征,那么模型也不一定能正确计数,因为模型内部并没有精确稳定的一个“计数器”,计数过程很有可能发生错误。
数学思维,可以尝试一下
虽说模型的数值计算一塌糊涂,但是对于数学思维来说,其实还是尝试一下。
我的理解是,数值计算逻辑性极强、容错很低,预测错一个就全部错了;而数学思维更看重经验积累,对于大模型这种内涵大量知识的模型来说,能够更好发挥模型能力。
3.3 文字工作
各种文本工作
大语言模型的文字工作远远强于数字工作,个人的理解是:数字工作是逻辑密集型的,需要极为严格的推理过程,容不了一点错误,这对于大模型这种很随机的思维方式很不友好;而文字工作更注重积累,对逻辑的要求较低,对大模型这种超大参数量、能够积累大量知识的模型非常友好。
翻译,尤其专业对口
这点感觉不用我说,估计大多数人都用过,感受过大语言模型的强大之处,大语言模型干翻译我感觉完全是专业对口,是我用大模型时效果最稳定,相对其他传统翻译优势极大的一个用途。(甚至 Transformer 最开始就是用作翻译的)
3.4 代码工作
业务密集型代码
业务密集型代码的特点是业务很杂乱,编写时有很多重复劳作,但是不包含复杂的算法。这种情况下就比较类似于“数学思维”,虽然模型的精确生成能力有限,但是生成这种不复杂的业务代码还是非常轻松的。
比如我使用 GitHub Copilot 写前后端代码,基本上畅通无阻随便补全,写出 bug 的情况不多见。
逻辑密集型代码
逻辑密集型代码特点就是逻辑非常复杂,例如复杂的离散数学算法。这种情况就比较类似于“数值计算”了,逻辑密集型代码错一点小细节就可能导致完全错误,并且要有非常全局的代码思路设计。这种情况大模型能解决一部分,但是效果不稳定。
例如实际上现在 LLM 打 Codeforces 类似的算法竞赛已经能打败不少人类选手,但总之还无法超越人类。个人感觉 LLM 能做出来的题都是较为典型的,很有可能是已经在训练数据中出现过类似的题目过。如果对于跳脱常规的全新的题目大概率是无法解决的。
发表回复