摘要:大模型不是一个装满答案的仓库,也不是一个更会聊天的搜索引擎。它更像一套从海量文本中学会规律的生成系统:根据你给出的上下文,一步一步生成最可能出现的下一个
token。理解这一点,很多困惑都会变清楚:为什么它看起来什么都懂,为什么它会一本正经地胡说,为什么 prompt 有用但不是魔法,为什么真正用好 AI 不能只靠“相信模型”。
如果你已经用过一段时间 AI,大概率会有一种很矛盾的体验。
有时候,它聪明得让人惊讶。你问一个概念,它能讲得条理清楚;你贴一段代码,它能指出可能的问题;你让它改文案、写总结、拆方案,它都能很快给出一个像样的版本。
但再用久一点,另一面也会出现。
它可能会引用一篇不存在的论文,写出一个文档里没有的 API,编一个听起来非常合理的历史细节,或者把你没有提供过的业务背景讲得斩钉截铁。
更让人困惑的是,它出错时往往并不心虚。语气很完整,结构很专业,甚至比正确答案还像正确答案。
于是,一个问题就绕不开了:
为什么同一个大模型,既能表现得这么聪明,又会一本正经地胡说?
要回答这个问题,先要把一个常见误会放下。
大语言模型,也就是 LLM,不是一个会说话的知识库。 它不是先在脑子里查到某条答案,再把答案读出来。更准确地说,它是一个从海量文本中学习规律,并根据当前上下文概率生成内容的系统。
这句话是理解 LLM 的起点。
先说结论:它不是答案仓库,而是规律生成器
我们很容易把大模型想象成一个巨大的图书馆。
你问一个问题,它进去翻书,找到答案,然后告诉你。
这个想象很自然,因为模型回答问题时太像“知道”。它能解释概念,能写代码,能总结报告,能模仿语气,能把一个陌生话题讲得像教材。
但大模型不是一本活字典,更像一个读过海量文字、很会接话的人。
它不是每次都在查百科,但它见过太多说法、结构和表达方式,所以常见问题能接得很顺。你问它一个普通概念,它能讲得像老师;你让它改一段文案,它知道很多常见写法;你让它解释一段代码,它能顺着代码习惯推断下一步。
但如果你问的是特别新、特别小众,或者只写在某个内部文档里的事,而你又没有把材料给它,它也可能顺着话头编出一个听起来很合理的回答。
更精确地说,它真正做的事情,并不是查询一条条知识记录。
它更接近这样一件事:
读取当前上下文
判断接下来哪些 `token` 更可能出现
选出一个 `token`
把它接回上下文
继续判断下一个 `token`
你看到的是一段完整回答。模型内部经历的是很多次“下一个 token 应该是什么”的计算。
这里的 token,可以先粗略理解成模型处理文字的基本单位。它可能是一个字、一个词、一个词的一部分,也可能是标点、空格、代码片段。
所以,当你问:
请解释一下 JavaScript 的 Promise。
模型看到的不是一个像人类一样完整理解的句子,而是一串被切分后的信号。这些信号进入模型后,会激活和 JavaScript、异步、then、catch、async/await、错误处理、代码示例、教学解释相关的一大片规律。
它不是从某个抽屉里拿出“Promise 标准答案”。它是在当前上下文里,生成一段最像好答案的内容。
这也是为什么它既强大,又危险。
强大在于,规律可以组合。哪怕它没见过你一模一样的问题,也可以把“技术概念”“生活类比”“面向初学者解释”这些规律拼起来,生成一个新的回答。
危险在于,生成得像,不等于事实一定真。
你输入的不是咒语,而是条件
很多人会说 prompt 像咒语。
这句话有一点好玩,但容易误导。prompt 不是神秘咒语,它更像模型生成时的条件。
同样让模型解释 Promise,你可以给出不同条件:
用小学生能听懂的方式解释 Promise。
用面试官追问的方式解释 Promise。
用一个真实项目里的异步请求例子解释 Promise。
模型不是被咒语“控制”了,而是生成分布变了。
当你说“给小学生听”,它会倾向于选择更简单的词、更短的句子、更生活化的类比。当你说“面试官追问”,它会倾向于补充状态、错误处理、链式调用、async/await 等细节。当你给它真实代码,它会把代码里的变量、调用关系、报错信息纳入当前上下文。
所以 prompt 的本质不是“把模型催眠成你想要的样子”,而是给它足够清楚的上下文和约束,让它少猜一点。
这句话对使用 AI 很重要:
你给的信息越清楚,模型越不需要补空白;你给的信息越模糊,模型就越会用自己学到的常见模式去猜。
它学到的不是每条知识,而是文本背后的规律
大模型当然会表现出很多知识。
它知道巴黎通常是法国首都,HTTP 404 通常表示 Not Found,Promise 有 pending、fulfilled、rejected 三种状态,简历应该怎么写,商业计划书大概长什么样。
但这些知识不是像数据库记录一样,一条一条整齐存放在某个位置。
更准确的说法是:模型从海量文本中学到了大量稳定的关联和规律。
这些规律包括:
-
• 语言通常怎么组织;
-
• 代码通常怎么写;
-
• 概念之间通常怎么关联;
-
• 用户这样提问时,通常期待什么粒度的回答;
-
• 一篇教程、邮件、报告、短视频脚本分别应该长什么样;
-
• 某类问题后面,常见的分析路径和解决步骤是什么。
比如,模型不只是记住了“Promise 有 then 和 catch”。它还学到了更多周边结构:
异步任务通常怎么解释,错误处理通常怎么出现,代码示例通常怎么组织,初学者听到 Promise 时最容易卡在哪里,一个好的解释通常先给定义、再给例子、最后给使用边界。
这就是它看起来“会举一反三”的原因。
它不需要见过你问的每一个问题。只要你的问题落在它学过的规律附近,它就能把相关模式组合起来,生成一个像样的答案。
问题也在这里。
如果你的问题落在低频区域,或者你问的是最新事实、私有信息、冷门 API、公司内部规则、某份合同里的细节,模型仍然会试着生成。它不会天然停下来查证。
它擅长补全,不擅长保证。
“预测下一个 token”为什么能长出复杂能力
看到这里,很多人会有一个疑问:
如果大模型的基础任务只是预测下一个 token,那它是不是本质上就是一个超级输入法?
这个类比有帮助,但只对了一小半。
输入法预测的是常见短语。大模型训练时面对的是整个人类文本世界:网页、书籍、论文、代码、问答、论坛、说明书、教程、对话、故事、数学推导、产品文档。
如果只是预测“今天天气真”的下一个字,确实很简单。
但如果要预测这些内容的下一步,就完全不是一回事:
-
• 一段代码的下一行应该怎么写;
-
• 一个 bug 报错后,开发者会怎样排查;
-
• 一篇论文的下一段如何展开;
-
• 一个产品需求背后可能有什么约束;
-
• 一个用户提问后,怎样的回答更清楚、更有帮助。
要在这么复杂的数据里预测得足够好,模型不能只学词语接龙。它必须学到更深的结构:语法、事实关联、代码结构、常识、因果、文体、任务意图、人类偏好。
可以用一个类比理解。
假设你训练一个系统,目标只有一个:预测优秀程序员下一行会写什么代码。
一开始,它可能只学到括号、缩进、变量名。可如果要预测得越来越准,它就必须学会函数意图、数据结构、框架习惯、错误处理、边界条件和工程规范。
表面任务是“预测下一行”。做到足够好以后,它就会表现得像懂编程。
大模型也是这样。
“预测下一个 token”是一个简单的入口。 但当训练对象足够大、模型容量足够高、训练过程足够充分时,简单目标会逼出复杂能力。
参数不是知识卡片,而是模型的形状
我们经常听到模型有多少参数:70B、175B、1T。
很多人会自然理解为:参数越多,里面装的知识越多。
这句话有一部分直觉是对的,但不够准确。
参数不是知识卡片。
参数更像模型内部大量可以调节的旋钮。训练过程就是不断调整这些旋钮,让模型在看到上下文时,更容易预测出合理的下一个 token。
换一个尺度看:如果一个模型有 N 个参数,每个参数用 b bit 来保存,那么它的权重文件大约有:
N × b bit
这叫信息容量。
但这些参数可能组成的状态数量是:
2^(N × b)
这叫可表示状态空间。
信息容量是线性增长的,可表示状态空间则是指数级增长的。 参数一多,模型理论上可能呈现出的形状,就会多到接近不可想象。
用一个小例子就能感受到差别。3 个只能取 0 或 1 的参数,只需要 3 bit 来保存,但它们可以表示 8 种状态:
000 001 010 011 100 101 110 111
如果参数数量变成几千亿、几万亿,再乘上每个参数可取的精度,那个可能性空间就已经不是“很多”可以形容。
它更像一片恒河沙数般的空间。
训练前,模型只是落在这个空间里的一个随机位置。训练中,它不断看到文本,预测下一个 token,预测错了就调整参数。一次次调整之后,模型不是把知识一张张贴进仓库,而是在这片几乎无边的可能性中,慢慢找到一个更适合描述人类文本世界的形状。
参数不是存放答案的抽屉,而是一个巨大函数被训练后的姿态。 这个姿态决定了模型在不同上下文里,会倾向于生成什么。
所以,参数里确实沉淀了知识,但不是以“卡片”的形式沉淀。
它沉淀的是压缩后的规律,是模型在恒河沙数的可能形状中,被训练推向的那一个相对更接近真实文本分布的形状。
这件事有一种朴素的浪漫感:我们没有手写“世界应该如何被理解”,只是给了模型海量文本和一个简单目标。然后训练就在近乎无穷的可能性里,一点点寻找更低的误差、更好的解释、更贴近人类语言和知识结构的形状。
它没有握住真理本身,但在无数可能的形状中,找到了一个暂时更接近真理投影的位置。
这也是为什么大模型看起来什么都知道。人类文本本身高度重复、结构化、可压缩。我们不需要记住世界上每一只猫,仍然能理解“猫”这个概念;模型也不需要逐字记住所有 JavaScript 教程,仍然能学到 Promise、异步、回调、错误处理之间的稳定结构。
但压缩也带来边界。
压缩后的规律可以帮助模型泛化,也可能在细节上失真。它知道“某类 API 通常会怎么命名”,不代表它知道你正在使用的这个库当前版本里是否真的有这个 API。
所以,参数规模越大,通常意味着模型有更强的表达能力和规律承载能力;但它不等于一个更完整、更准确、随时可查的事实数据库。
它为什么越来越像助手
如果基础模型只是预测下一个 token,为什么我们现在用到的 AI 会这么像一个助手?
因为多数聊天产品和 API 里的模型,并不是未经处理的基础模型。
基础语言模型更像一个强大的续写器。它可以续写网页、小说、代码、论坛、论文,但不一定稳定地听指令,也不一定知道什么时候该拒绝。
后来还会有一系列后训练,把它塑造成更像助手的样子。
可以简单理解为三类训练:
-
• 给它看大量“用户问题 -> 理想回答”的例子,让它学会按指令回答;
-
• 让人类或系统比较多个回答哪个好,让它更偏向清楚、有帮助、安全的回答;
-
• 训练它在某些场景下拒绝、追问、调用工具、遵守格式。
所以,我们今天看到的“AI 助手感”,不是单纯来自预训练。
它来自两层能力叠加:
预训练:学语言、代码、知识、模式和世界描述;
后训练:学听指令、按格式回答、表现得像助手。
这也带来一个副作用。
助手应该尽量有帮助,回答应该完整,语气应该稳定。于是,当上下文不足时,模型有时也会给出一个完整而稳定的错误答案。
它不是故意骗人。它是在“做一个有帮助的助手”和“承认不知道”之间,没有总能选对。
每次回答都带着概率
但后训练并没有改变一个底层事实:
模型仍然是在一步步生成 token。
既然模型做的是“预测下一个 token”,它的输出天然就是概率性的。
同一句话后面可以有很多合理续写。
今天天气很好,我们去
后面可以是公园、散步、爬山、海边、吃饭。
没有唯一正确答案。
写代码、写方案、做总结也一样。你说“帮我写一个登录接口”,合理实现可能有很多种:JWT、Session、OAuth、不同框架、不同数据库、不同安全策略。
模型每一步都在计算:
在当前上下文下,哪个 `token` 更可能成为下一步?
然后,解码策略会决定怎么选。
temperature 低,回答通常更稳定、更保守;temperature 高,回答通常更多样、更发散。top-p、top-k 这类策略,则会限制模型从哪些候选里采样。
这就是为什么同一个问题有时会得到不同回答。
这也解释了另一个关键点:
高概率不等于真实。
一个说法在语言上很顺、在模式上很常见、在语气上很专业,只能说明它“像一个合理回答”。它是否真实,还需要证据。
这就是幻觉问题的伏笔。
幻觉从哪里来:高概率补全走错了方向
现在,我们终于可以回到最开始的问题:
为什么大模型会一本正经地胡说?
因为它的核心能力是根据参数沉淀的规律,生成高概率内容,但这内容不保证是客观事实。
当问题常见、上下文清楚、训练中模式稳定时,它通常表现很好。
比如:
法国的首都是?
模型生成“巴黎”的概率非常高,而且这个答案也是真的。
但当问题涉及冷门信息、最新信息、私有信息、错误前提或上下文不足时,模型仍然可能继续补全。
你问:
为什么某某库的 useSuperCache API 会导致内存泄漏?
如果这个 API 根本不存在,模型也可能顺着问题继续解释。因为这个问题的形式很像真实技术问题:某个库、某个 API、某个性能问题、原因分析、解决方案。
它会生成一个看起来像真的解释。
这就是幻觉。
幻觉不是单一原因造成的,至少有几类来源:
-
• 训练数据不完整;
-
• 训练数据有噪声和冲突;
-
• 训练目标是预测
token,不是验证事实; -
• 参数知识是压缩表示,不是数据库;
-
• 后训练让模型更倾向于给出完整、流畅、有帮助的回答。
所以,幻觉不是“模型不够聪明”这么简单。
它是概率生成系统在证据不足时继续补全的自然风险。
理解这一点后,我们对 AI 的态度会更稳。不是因为它会幻觉,所以它不能用;而是因为它会幻觉,所以我们必须知道哪些任务需要验证机制。
真正用好大模型:生成、验证、约束、判断分开
理解 LLM 的真实工作方式后,使用原则其实可以压缩成一句话:
让模型负责生成,让工具负责验证,让系统负责约束,让人负责判断。
对个人使用者来说,可以把 AI 的知识来源分成三类。
第一类,是参数知识。
这适合常识、概念解释、写作改写、代码模式、方案发散、初步分析。比如让模型解释一个概念、改一段文案、整理一个框架,它通常很擅长。
第二类,是上下文知识。
这是你当前给它的材料:代码、报错、会议记录、需求文档、业务规则、合同片段、研究资料。你给得越清楚,它越不需要猜。
第三类,是工具知识。
这是模型通过外部工具获得或验证的信息,比如搜索、数据库、文档检索、代码执行、日志查询、测试结果。
这个分工也能解释另一个常见问题:模型到底有没有记忆?
参数知识,是模型训练后留下的长期规律。普通 API 调用不会改变这些参数,你今天和模型聊了一次,通常不会让模型“学会”你的项目。
上下文知识,是本次请求里模型能看到的信息。一次对话里它看起来记得前文,本质上是因为前文仍在上下文里。
产品层记忆,则是应用保存了历史、摘要、用户偏好或长期记忆,再在后续对话中重新提供给模型。这个记忆通常由产品系统管理,不等于模型参数被你实时改写。
所以,如果你希望模型知道订单状态、合同条款、内部流程、权限范围或用户历史,就必须由系统显式提供,不能假设模型天然知道。
最好的分工是:
常识和模式交给参数;
当前任务背景交给上下文;
事实和验证交给工具;
最终判断交给人。
如果你在工作里使用 AI,可以用下面这张小清单提醒自己:
-
• 这个任务是在让模型生成候选,还是要求它验证事实?
-
• 我是否给了足够上下文,还是在让模型猜?
-
• 结果是否依赖最新信息、私有信息、低频事实或精确引用?
-
• 有没有外部工具可以验证:搜索、数据库、文档、测试、编译器、日志、人工审核?
-
• 模型建议是否会触发真实动作:发消息、改数据、付款、删库、改配置、影响用户权益?
-
• 哪些动作可以自动执行,哪些必须二次确认,哪些永远不能交给模型?
这张清单看起来朴素,但它比“再写一个更好的 prompt”更重要。
prompt 能改善生成。验证、权限和责任边界,必须由系统和人来补上。
你也可以用一个小练习,快速体会这三类能力的边界。
第一句,问它一个通用概念:
用生活例子解释一下 Promise。
这时它主要调用的是参数知识。因为 Promise、异步、生活类比,都是训练数据中很常见的模式。
第二句,给它一段你自己的文档,再问:
根据上面的文档,帮我总结三个关键风险。
这时它主要依赖上下文知识。你给的材料越完整,它越能贴近你的真实任务。
第三句,问它一个需要验证的问题:
这个库最新版本是否支持某个 API?请给出官方来源。
这时就不能只靠参数。它需要工具、文档、搜索或你提供的官方材料。
这三个问题背后,是三种不同用法。
很多 AI 使用上的误会,都是把第三类任务当成第一类任务来做:明明需要验证,却只让模型生成。
最后:别把它当神,也别把它当玩具
大模型不是往脑子里装答案,而是把海量文本的规律压进参数,再根据你给的上下文,生成下一个最像样的 token。
因为它追求的是“最像样”,不是“客观事实”,所以它既能回答没见过的问题,也会编出没存在过的论文。
所以,我们既不需要神化它,也不应该低估它。
理解大模型,不是为了判断它够不够聪明,而是为了知道什么时候该信它,什么时候不该信它。