苹果🍎的奇幻漂流,当你提问后,ChatGPT在“想”什么?

从"我喜欢吃苹果🍎"说起

某个悠闲的午后,你在键盘上敲下"我喜欢吃苹果",几秒钟后,ChatGPT 就给出了一个回复。

这时,你会不会好奇:屏幕后面发生了什么?这个"语言模型"是怎么"读懂"我的话,然后"想出"答案的?难道计算机真的会"思考"吗?

大语言模型发展的背景从图灵测试到语言模型

早在1950年,计算机科学先驱艾伦·图灵就提出了一个著名的思想实验------图灵测试。它的核心很简单:如果一个人通过文字对话,无法区分屏幕那头是真人还是机器(超过30%的误判率),就认为这台机器通过了测试,展现了智能。

为什么提这个呢?因为图灵测试为衡量机器能否"像人一样聊天"设定了一个重要标杆。我们不必纠结"智能"的哲学定义,就看它能不能进行流畅、自然、有信息量的对话

自然语言处理与人工智能发展历史有着密切而复杂的关系,如今当你使用 ChatGPT 时,是不是偶尔也会因为它某个精妙的回答,产生"屏幕后面是真人吧?"的错觉呢?这正是语言模型几十年发展的成果。看看它们是怎么一步步变聪明的

时期 里程碑 技术特点 对话能力怎么样?
1950-1960s IBM俄英翻译机(1954) 靠词典+语法规则 很死板,一句话说错就懵
1960-1970s ELIZA(1966)SHRDLU(1972) 模式匹配+有限场景推理 像背台词,只能按剧本走
2010s Siri(2011)Watson(2011) 任务型问答+搜索整合 能办事,但聊天容易卡壳,多轮对话弱,依赖预设流程
2013-2017 Transformer(2017) 自注意力机制突破 能理解上下文关联了!但还不太会"创作"
2018-2020 BERT(2018)GPT-3(2020) 预训练大模型崛起,千亿参数 聊天能力大飞跃!知识渊博,但逻辑偶尔抽风
2022至今 ChatGPT(2022)GPT-4(2023) 人类反馈强化学习 (RLHF) + 多模态 聊天真假难辨,轻松通过图灵测试

背景说完了,那这些模型到底是怎么"听懂"我们的话,并"说出"回答的呢?故事得从计算机怎么"认识"文字开始讲起。

第一步:把文字变成"积木块" (Token)

计算机可看不懂"苹果"、"喜欢"这些字。它只认识数字!所以第一步,就是把你的句子拆成一小块的"积木 ",这叫做 Token(分词)。可以是一个字,也可以是两个字的词,或三个字的词(像乐高积木),给定一个句子时,我们有多种获取不同Token的方式,可以分词,也可以分字。

  • 一个常见的英文单词(如 "apple") 通常是一个Token。
  • 一个汉字(如 "我")通常是一个Token。
  • 但复杂的词可能会被拆开:比如 understand可能被拆成 under stand 两个Token。
  • 标点符号(如 ".", "?")也是Token。

好奇你的话会模型被切成什么样?可以试试 OpenAI 的 Tokenizer 可视化工具

以 "我喜欢吃苹果。" 为例子会被切成:["我", "喜欢", "吃", "苹果", "。"]形式(具体切法取决于模型的设计,不同的算法模型切割的方式略有不同)。

这就像把乐高玩具拆成一个个小积木块,是计算机理解人类语言的第一步。

第二步:给积木块编号 (词汇表 Vocabulary)

光分解成"积木块"还不够,计算机需要给每个独特的积木块分配一个唯一的 ID 号码 。这需要一个巨大的 词汇表 (Vocabulary) ,它本质上是个双向电话簿

  • 查号: 知道 Token "苹果" → 对应 ID 是 12345。
  • 反查: 知道 ID 12345 → 对应 Token 是 "苹果"。

它是实现文本到数字转换的桥梁。它主要体现为一个映射表,将人类可读的字符串(token)与机器可识别的ID关联起来。

比如我随便写一个词汇表模拟一下

js 复制代码
    vocab = {
        '[PAD]': 0,    # 填充符
        '[UNK]': 1,    # 未知词
        '[CLS]': 2,    # 句首分类符
        '[SEP]': 3,    # 句子分隔符
        # 英文部分 大模型的多语言也是这么处理的,多种语言都可以建立在词汇表上
        'hello': 4, ',': 5, 'world': 6, '!': 7, 'how': 8, 'are': 9, 'you': 10, '?': 11,
        # 中文
        '我': 12, '喜欢': 13, '吃': 14, 
        '苹果': 15, '。': 16,    
        '香蕉': 17,   
        # ...            
        '水果': 20,    # 相关概念
        # ... 还有成千上万的其他词汇

    }

由此你输入的一段话"我喜欢吃苹果。" 最终进到模型里的其实是一连串id : [12, 13, 14, 15, 16]

GPT-4中 转换的id如下

第三步:计算机怎么"懂"文字的意思?词嵌入(Embeddings)

计算机现在拿到了 [12, 13, 14, 15, 16] 这串数字。但它还是不懂"苹果"是水果,也不知道"苹果"和"香蕉"是同一个种类,更不知道什么是"水果"。因为数字本身其实没意义!

这时,词嵌入 (Embedding) 登场了!它能把冷冰冰的数字 ,变成充满"含义"的向量

在语言模型训练之初,会创建一个巨大的 Embedding 矩阵,例如:假设词汇表有 5 万个 Token,每个 Token 都对应一个高维向量768(GPT-3 甚至高达 12288 维)那么矩阵形状 [50000, 768] 。具体根据模型的不同而不同

其中的规则就是,语义相似性 = 距离相近 ,语义上相似的词,在经过Embedding矩阵转换后,它们的向量在向量空间中的距离会更近。语义相似的词在向量空间中自动聚集成簇(相似的都聚在一起)

我们人脑根本无法想象这个空间,但可以将其类比为三维空间,大概像下图这样。

模型通过"阅读"海量互联网文本,不断调整每个词在这个高维空间里的位置。

我用简单的二维显示下矩阵(实际空间维度超高)

  • "苹果"🍎、"香蕉"🍌、"草莓"🍓 会挤在 水果区
  • "吃"🍽️、"美味"😋、"健康"💪 会围绕在它们附近。
  • "手机"📱、"电脑"💻 则待在遥远的 科技区
  • "汽车"🚗、"足球"⚽ 可能在另一个 无关区
js 复制代码
                             ^  
                              |  
                              |  
                        [植物区]  
                              |  
                      树🌳 •      • 叶子  
                              |  
                              |  
          [科技区]             |              [水果区]  
      • 手机                   |         • 香蕉 🍌  
              • 电脑💻         |      • 草莓 🍓  
                   • 耳机      |   • 橙子 🍊  
                       •      |        • 苹果 🍎 (最终位置)  
                              |            /  \  
                              |           /    \  
                              |     • 吃 🍽️   • 健康 💪  
                              |        \        /  
                              |         • 甜 🍬  
                              |  
    [无关区] • 汽车 🚗 • 足球 ⚽ |
                              |  
                              |  
                              |  
                              |  
                              |------------------------>  

"苹果"这个词的向量位置,是在训练过程中,通过无数包含"苹果"的句子(如"我吃了苹果"、"苹果是健康水果"、"这有一棵棵苹果树)学习调整后确定的。最终,它稳稳落在了 水果区植物区 的交界地带。

阶段 输入示例 "苹果"向量移动方向 靠近的区域或相关词语 描述
初始随机位置 - 随机分布在空间中 可能靠近无关区,如:足球⚽️ 在初始训练时,"苹果"的向量随机分布,可能与无关的词语接近。
阶段 1 "我吃了苹果" 向 吃🍽️ 吃🍽️ 看到"苹果"与"吃"语境关联,模型调整其位置,逐渐靠近这些相关词语。
阶段 2:进一步训练 "苹果是健康水果" 向 健康💪 和 香蕉🍌 靠拢 健康💪、香蕉🍌 当训练数据包含"苹果是健康水果"时,"苹果"向健康和其他水果相关词语的方向偏移。
阶段 3:环境调整 "这有一颗棵苹果树" 向 树🌳 方向偏移 树🌳 在涉及"苹果树"的上下文时,"苹果"的位置会向植物类的词语(如树)靠拢。
阶段x ... ... ... ...
最终位置 停在 水果区 与 植物区 交界处 水果区、植物区 经过多轮训练后,"苹果"的最终位置应位于水果和植物的交界处

还是以 我喜欢吃苹果 为例子,算出向量,大模型就知道了苹果这个词背后的关系

css 复制代码
假设算出来的向量如下
水果区:
🍎 苹果 = [0.8, 0.2, -0.3]
🍌 香蕉 = [0.7, 0.3, -0.2]
🍊 橙子 = [0.9, 0.1, -0.4]

科技区:
🚗 汽车 = [-0.5, 0.9, 0.6]
⚽️ 足球 = [-0.4, 0.8, 0.7]

计算向量距离

  • 🍎→🍌 距离:√[(0.8-0.7)² + (0.2-0.3)² + (-0.3+0.2)²] ≈ 0.1(近!)
  • 🍎→🚗距离:√[(0.8+0.5)² + (0.2-0.9)² + (-0.3-0.6)²] ≈ 2.0(远!)

得出结论

苹果香蕉 靠得近 → 它们是同类(水果)

苹果汽车 离得远 → 它们含义不同(没有直接关系)

计算机会"算出"关系:

  • 算出"苹果"🍎 和 "香蕉"🍌 的向量距离很近 → 哦,它们是同类(水果)!
  • 算出"苹果"🍎 和 "汽车"🚗 的向量距离很远 → 嗯,它们没直接关系!

就这样,通过 Embedding,计算机虽然不懂"苹果"的概念,却能精确"计算"出它和其他词语的关系网,从而"读懂"了你的话!这就像我们学习一门语言,总是先学短语,固定搭配等,再理解长难句一样。

第四步:模型的最强大脑------Transformer(理解上下文的关键)

现在,模型拿到了代表你输入的那串数字(ID),并通过 Embedding 把它们变成了有"含义"的向量。但它怎么理解整句话的意思,尤其是词与词之间的关系呢?

还是举个苹果🍎例子"小明吃苹果,因为他饿了。"

我们通常是怎么思考的?

  • "他" 指代谁?→ 你会自动关联到"小明 "(而不是"苹果")
  • "饿" 解释为什么要"吃"的原因 → 关联"吃"和"饿"

那语言模型是怎么知道" "指代的是"小明"呢?

早期的模型处理长句子时,语言模型很容易"忘记"开头说了啥,或者抓不住远处的词之间的联系,直到Google2017年发的一篇论文:"Attention Is All You Need",提出了 Transformer 架构 ,其核心 自注意力机制 (Self-Attention) 完美解决了这个问题!简单来说就是在语言模型建模过程中,把注意力放在那些重要的Token上。

自注意力机制 (Self-Attention)给每个词"发牌"

Transformer 在处理一个句子时,会为句子里的 每一个词 生成三张特殊的"牌":并且通过权重矩阵(这里不展开了)分别赋值,大概意思如下

Q (问题牌 - Query) K (身份牌 - Key) V (信息牌 - Value)
小明 "我是谁?在干嘛?" (主语) "我是人名/动作发起者" "我叫小明,是人"
"谁吃?吃什么?" (动作) "我是一个动作/行为" "吃这个动作需要对象"
苹果 "被谁吃?是什么?" (对象) "我是食物/被作用对象" "苹果是一种可吃的东西"
因为 "连接什么?原因还是结果?" "我表示原因" "我说明前面动作的原因"
"我指代谁?!" (关键问题) "我是代词,需要找指代对象" "我可能指人或物"
饿 "描述谁?是什么状态?" "我是一种身体状态/原因" "饿会导致人想吃东西"

每个词用自己的 Q 牌去"询问"句子中所有词的 K 牌!

"他" 为例,向句子中的所有其他值发问:

  • 问小明"他"的Q · "小明"的K = ("指代谁?" vs "人名")→ 高分! (0.9)
  • 问苹果"他"的Q · "苹果"的K = ("指代谁?" vs "食物")→ 低分! (0.1)
  • 问饿"他"的Q · "饿"的K = ("指代谁?" vs "状态")→ 无关! (0.0)

Softmax 分配注意力权重

模型会把所有匹配度得分(原始分数),通过一个叫 Softmax 的函数转换成 概率分布(加起来等于 1)。这就像给每个词对"他"的重要程度打分

目标词 关联词 计算过程 Softmax后权重 含义
小明 Q_他· K_小明 = 高相似度 0.85 "他"极可能指代"小明"
苹果 Q_他 · K_苹果 = 低相似度 0.10 "苹果"不是指代对象
饿 Q_他 · K_饿 = 中等相似度 0.05 "饿"是状态,非指代对象

"他"在模型的新理解 = 0.85 * V_小明 + 0.10 * V_苹果 + 0.05 * V_饿

由此模型明确知道 "他≈小明"

多头注意力(Multi-Head)多个视角,更全面的理解

一个 Transformer 通常不会只有一个"分析员",而是有 多个 (比如 12 个)注意力头 (Multi-Head) 同时工作!每个头都独立地玩一遍上面的"发牌提问"游戏,但它们关注的角度可能不同:

头编号 关注点 例子
头1 语法结构 "他"关联"小明"(主谓一致)
头2 因果关系 "吃"关联"饿"(因为饿才吃)
头3 指代消解 "他"明确指"小明"而非"苹果
··· ··· ···
  • 头1 (语法): 确认"他"是主语,指向"小明"和动作"吃"。
  • 头2 (因果): 建立"饿"→"吃"的因果链,且"饿"属于"小明"。
  • 头3 (指代): "苹果" 关联 "吃" → 明确 动作对象

每个头都为"他"输出一个新的理解向量。 然后,这 12 个头向量会被拼接起来,再经过一些处理,最终融合成"他"这个词在这个句子上下文里的最终理解。

多头注意力就像一个专家团队协作: 每个"头"是一个独立的"语言专家",从不同角度(语法、因果、指代...)分析句子中每个词的关系。最后,所有侦探的发现汇总起来,模型就彻底理解了整句话的逻辑: "小明因为饿了,所以吃了苹果" 。这样,它就能避免说出"苹果饿了"这种奇怪的理解,也能流畅地回答后续问题,比如"那小明吃饱了吗?"

Transformer 的自注意力和多头机制,正是 ChatGPT 能如此"聪明"地理解上下文的核心秘密武器!

第五步:生成回答------"词语接龙"大师

现在,模型已经"理解"了你的输入("小明吃了苹果,因为他饿了"),并准备好"回复"了。它是怎么做的呢?

答案就是玩一个超级复杂的"词语接龙"游戏!回答你的过程其实就是"边猜边写"(推理生成)

  1. 基于输入: 它先仔细"读"你输入的所有内容(已转换成向量并理解上下文)。
  2. 猜第一个词: 基于你输入的内容,它运用学到的海量知识,计算 出接下来最可能出现的第一个词是什么(比如,你输入"我喜欢吃苹果",它可能算出"苹果"后面接"很"或"是"的概率很高)。
  3. 猜下一个词: 把你输入的内容 加上 它刚猜出来的那个词,一起作为新的"开头",再去猜下一个最可能的词(比如,输入+"很" → 猜"甜"或"好吃")。
  4. 一直猜到结束: 就这样,它像玩接龙一样,根据前面已有的所有文字,一个字一个字(Token by Token)地预测下一个最可能出现的字/词,直到它觉得一个完整的、有意义的回答已经生成了(或者达到了长度限制)。

而模型在"接龙"时,并不总是选概率最高的那个词,这样会显得很死板。它根据不同的生成策略,模型会选择最合适的词,下面有几种比较常见的参数,当然这些参数都是需要模型训练员去调整以达到最好的效果

  • op-k / Top-p (Nucleus Sampling): 只从概率最高的几个词(Top-k)或者累积概率达到一定比例的词(Top-p)里面随机挑一个。这样回答不会千篇一律。

  • 温度 (Temperature): 控制随机性。温度高,更随机;温度低,更确定。

    • 温度高 (e.g., 0.8-1.0): 更"天马行空",创意足但也可能跑偏。
    • 温度低 (e.g., 0.2-0.5): 更"严谨保守",准确但可能平淡。
  • 贪婪解码 (Greedy Decoding): 每次都选概率最高的词(确定性最高,但可能单调)。

简单模拟一下回答"我喜欢吃苹果"的生成过程:

js 复制代码
    输入:小明吃了苹果,因为他饿了。

    当前输出:[] → 预测下一个词概率:               
       "好": 65%
       "是": 12%
       "嗯": 8%
       ...
    ↓ 采样选择"好"
    输出:["好"]
    ============
    当前输出:["好"] → 预测下一个词概率:
       "的": 58%   ← "好的"是常见搭配
       "吧": 15%
       "呀": 7%
       ...
    ↓ 采样选择"的"
    输出:["好", "的"]
    =============
    时间步 | 已生成文本         | 下一个候选词概率假设取前3           | 选择
    -------|-------------------|----------------------------------|-------
     t=1  | [开始]            | 好(65%) 是(12%) 嗯(8%)          | → 好 
     t=2  | 好                | 的(58%) 吧(15%) 呀(7%)          | → 的
     t=3  | 好的               | 。(82%) !(10%) ?(5%)          | → 。
     t=4  | 好的。             | 你(42%) 我(30%) 请(15%)         | → 你
     t=5  | 好的。你           | 还(38%) 有(32%) 想(12%)         | → 还
     t=6  | 好的。你还          | 有(76%) 在(8%) 要(5%)           | → 有
     ... 继续直到生成结束符...
     
     最终输出【好的。你还有其他关于小明的问题吗?】

或者它也可能生成:"是的,苹果能快速缓解饥饿!" ------ 这取决于模型在那一刻的计算和采样策略。

这就是 ChatGPT 回答你的核心过程! 它的本质就是一个在海量文本(万亿级 Token)上训练出来的、参数规模巨大(千亿级别)、架构极其先进(Transformer)的 大语言模型 (Large Language Model, LLM) ,玩着一个世界上最复杂的"词语接龙"游戏。

ChatGPT 更像"真人"的秘密武器:SFT 与 RLHF

如果你问一个只玩过基础"词语接龙"的模型:"我喜欢吃苹果。" 它可能会干巴巴地回:"苹果是一种水果。" 或者 "...因为它甜。" 虽然没错,但总觉得缺了点"人味"------不够热情、不够有帮助。

怎么让语言模型更像人?成为善解人意的聊天伙伴呢?这就要靠两招"秘术"狠狠调教了

调教秘术一:监督微调SFT(Supervised Fine-Tuning)

训练师提供准备标准答案,让模型直接"背"

用"我喜欢吃苹果"的例子,编写优质问答样本

问题 标准回答 目的
"我喜欢吃苹果。" "很高兴你喜欢苹果!苹果是一种营养丰富的水果,富含维生素C和膳食纤维。" 提供了额外信息,是人类期望的
"请推荐一些健康的水果。" "除了苹果,草莓、香蕉、橙子、蓝莓都是非常健康的选择!" 这个回答直接、清晰地回应了指令
......

模型会学习这些"问题-标准答案"对。它看到问题后,就尝试生成回答,然后和标准答案对比。如果回答错了,就调整自己的参数,直到能对同样的问题给出类似的"标准答案"。

SFT 本质: 训练师写"标准答案" → 模型努力"抄作业" (模仿)。

局限: 如果问题主观性强(比如"我为什么喜欢吃苹果?"),标准答案可能不止一个(营养?方便?好吃?)。模型只会随机模仿一种,无法判断哪个答案人类更喜欢。它也可能学会一些"安全但无用"的回答,比如:"这是个好问题,因为苹果非常好吃。"

调教秘术二:强化学习与人类反馈RLHF(Reinforcement Learning with Human Feedback)

RLHF 被人熟知应该主要是源自OpenAI的《InstructGPT》这篇论文,如果用简单的语言来描述,其实就是用强化学习的算法,根据人类反馈改进语言模型

这次训练师不直接给答案了。他们让模型对同一个问题生成 多个不同回答 ,然后由人来 比较、排序、打分!(根据自己的喜好、常识、安全性、帮助程度等标准,选出他们最喜欢到最不喜欢的回答,并进行打分)

当用户输入:"我喜欢吃苹果" 得到大模型的返回值后大概如下所示

模型给出回答 人类评分 原因
苹果糖分高,小心发胖 👎 2分 扫兴且不友好
"我也喜欢苹果!🍎 它既脆甜又能补充能量。试试加点盐,超赞!" 👍 9 热情、有共鸣、提供了额外信息和小建议
哦,这样 👎 1分 态度冷漠

人类的大量评分数据被用来训练一个 奖励模型 (Reward Model) 。这个奖励模型学会了 判断什么样的回答更受人类青睐(有用、无害、热情、符合价值观等)。

  • RLHF 过程: SFT 模型生成回答 → 奖励模型打分 (高/低奖励) → 模型根据奖励调整参数 (高奖励行为强化,低奖励行为避免)。
  • RLHF 本质: 人类给回答"投票" → 模型学习"人类更喜欢哪种风格"。
阶段 有监督微调(SFT) 强化学习(RLHF)
核心方法 模仿人类标准答案 学习人类偏好排序
人类参与方式 提供标准答案(1问1答) 对多个答案排序(1问多答排序)
模型学什么 "正确答案是什么?" "人类更喜欢哪种回答风格?"
解决什么问题 基础准确性、专业性 有用性、无害性、符合人类价值观

最终,结合 SFT 打下的"知识基础"和 RLHF 注入的"人类偏好",模型就能在"词语接龙"时,优先选择那些我们觉得更自然、更有帮助、更安全的回答路径了。

ChatGPT = 知识渊博的"词语接龙大师" + 经过海量人类偏好"调教"的聊天艺术家。

强大的语言模型,仍有局限

  • 没有真正的理解 ,只是通过统计规律"模仿"人类语言。通过海量文本统计"哪些词常一起出现",而非像人类一样理解语义、拥有意识或常识,虽然不懂题目含义却总能蒙对答案
  • 不会查资料 ,而知识有"保质期",模型训练完成后,知识库即固定 如(GPT-4知识截止2023年10月
  • 可能"一本正经地胡说八道"(Ai幻觉 - Hallucination): 因为它本质是预测下一个词,有时为了"接"下去,会生成看似合理但事实上错误或完全虚构的内容
  • 依赖数据,可能放大偏见: 模型的知识和"偏好"都来源于训练数据。如果数据本身存在偏见、错误或不平衡,模型就可能学会并反映出来。

结语:语言的力量与模型的角色

人类可以对呼气时发出的声音进行各种调控,创造了语言这个无比强大的工具,让我们得以交流思想、传承知识、创造文明。

语言模型的回答,目前其实是统计规律与人类偏好共同作用下的"词语接龙 "杰作,而非真正的思考。认识到这一点,我们就能更清醒地利用这个工具:把它当作一个强大的信息助手、创意伙伴或学习辅导员,而不是全知全能的神。

文章写的比较简单,主要还是简单介绍,我一直认为使用工具,只有了解工具的运行原理才能更好的去使用它,至于如何与这位"词语接龙大师"相处,就取决于你的想象力了!

相关推荐
FLYINGPIG10 分钟前
【RAG+向量数据库】小白从0构建一个rag和向量数据库demo
llm
代码能跑就行管它可读性1 小时前
【论文复现】利用生成式AI进行选股和分配权重
人工智能·chatgpt
前端小盆友2 小时前
从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
react.js·chatgpt·express
大模型开发3 小时前
Cursor 快速入门指南:从安装到核心功能
llm·agent·cursor
聚客AI4 小时前
⚡ 突破LLM三大局限:LangChain架构核心解析与最佳实践
人工智能·langchain·llm
AI大模型7 小时前
大模型炼丹术(二):从离散的token IDs到具有语义信息的embedding
程序员·llm
AI大模型10 小时前
大模型炼丹术(一):从tokenizer说起,为LLM自回归预训练准备数据集
程序员·llm·agent
陈敬雷-充电了么-CEO兼CTO10 小时前
复杂任务攻坚:多模态大模型推理技术从 CoT 数据到 RL 优化的突破之路
人工智能·python·神经网络·自然语言处理·chatgpt·aigc·智能体
董厂长16 小时前
langchain :记忆组件混淆概念澄清 & 创建Conversational ReAct后显示指定 记忆组件
人工智能·深度学习·langchain·llm