§ 9.1 · Section

什么是多模态

What is Multimodal

你拍一张冰箱内部的照片发给 AI,问"今晚能做什么菜",它会告诉你"番茄和鸡蛋够了,可以做番茄炒蛋,但你没有葱"。这件事在 2022 年之前是不可能的——那时候的模型要么只会读字,要么只会认图,两者互不相通。"多模态"这个词说白了就是:一个模型同时能吃好几种不同形式的信息。这一节先把"模态"这个概念钉死,再讲清楚一件真正关键的事:文字、图片、声音这三样在物理上毫无共同点的东西,凭什么能被同一台机器一起处理。答案只有一句话,但这句话撑起了整个第 9 章。

生活场景
🍎 一个苹果,你用了五种方式认识它

你现在手里拿着一个苹果。请注意,你正在同时用五套完全不同的感官系统处理这一个东西:

眼睛告诉你它是红的、圆的、表皮有反光;告诉你它凉、硬、有点沉;鼻子闻到一点果香;咬一口是脆的、甜的;如果旁边有人说"这苹果不错",你的耳朵还收到了"苹果"这两个音节。

这五路信息的物理形式天差地别——一路是光的波长,一路是皮肤上的压力,一路是空气里的化学分子,一路是舌头上的化学受体,一路是空气的振动。可它们在你脑子里汇成了同一个东西:苹果。你从来不会觉得"看见的苹果"和"听到的苹果"是两个不相干的概念,你甚至能只凭闻到的味道就说出"这是苹果"。

更神的是迁移:你小时候第一次学"苹果"这个词,是妈妈举着一个真苹果告诉你的。之后你看到超市货架上颜色不同、形状略扁的另一个苹果,你照样认得出来。你甚至能看懂简笔画里的苹果、能听懂"苹果手机"里那个苹果是个比喻。

先把"模态"这个词彻底说清

模态(Modality,读作"模达乐提")在中文里是个很吓人的词,因为它既不像"图片"那么具体,也不像"数据"那么熟悉。但它的定义简单到有点无聊:模态就是"信息以什么形式存在"。

换成大白话:同一件事,可以用不同的"载体"表达出来,每一种载体就是一种模态。比如"外面在下雨"这件事,可以有五种模态:

同一个事实,五种模态

  文字模态:  "外面在下雨"           ← 一串字符
  图像模态:  一张窗户上有雨滴的照片   ← 一堆像素的亮度数值
  音频模态:  雨打屋檐的沙沙声         ← 一串声压采样值
  视频模态:  一段雨落下来的画面       ← 一堆图片按时间排队
  结构化模态:{"weather": "rain",     ← 键值对
              "mm_per_hour": 4.2}

它们表达的是同一个事实,但在计算机里的存储形式
完全不一样——形状不一样、数值范围不一样、长度不一样。

所以"多模态 AI"这个词的准确含义是:一个系统能够接收、理解、或者生成不止一种形式的信息。注意这里有三个动词,它们对应三种不同难度的能力,后面会拆开讲。

顺便澄清一个特别常见的用词错误。"多模态"和"多模型"完全是两回事。多模型是"我用三个模型分别干三件事,然后把结果拼起来";多模态是"一个模型本身就能同时理解好几种输入"。打个比方:前者是餐厅里三个厨师各炒一个菜然后端上同一桌,后者是一个厨师一个人做出一整桌配得上的菜。前者只是拼盘,后者才叫融合。两者的区别在实际效果上非常明显——真正融合的模型能回答"图里那个人穿的衣服和文字描述的颜色一致吗",拼盘系统做不到,因为它的图像模块和文字模块之间没有对话渠道。

四大主流模态各自长什么样

要理解"为什么融合很难",你得先亲眼看看这四种东西在计算机里到底是什么形状。这一段有几个具体数字,请务必看一眼——多模态领域所有的工程难题,根子都在这几个数字上。

模态在计算机里的真实形状一个"典型样本"的数据量是离散还是连续
文字一串整数编号(token id)1000 字的文章 ≈ 600 个 token离散(编号只能是整数)
图像三维数组:高 × 宽 × 3 个颜色通道1024×1024 彩照 = 314 万个数值连续(每个亮度是 0~255)
音频一维长数组:每秒若干个采样点CD 音质 1 秒 = 44100 个采样点连续
视频四维数组:帧数 × 高 × 宽 × 31 分钟 30 帧 1080p ≈ 112 亿个数值连续 + 有时间顺序

把最后那个数字换算成可感知的量:一分钟的 1080p 视频原始像素数据是 112 亿个数值。如果每个数值用一个字节存,那是 11 个 GB——一分钟的视频,原始数据比整个中文维基百科的纯文本还大好几倍。这就是为什么视频必须先压缩再处理,也是为什么"多模态"里视频永远是最难的那一块。

再看"离散 vs 连续"这一栏,这个区别比数据量更本质。文字是离散的——第 100 号 token 和第 101 号 token 之间不存在"第 100.5 号",它们的编号只是标签,编号相邻不代表意思相近("苹果"可能是 5000 号,"香蕉"可能是 87000 号)。图像和音频是连续的——亮度从 120 变成 121,画面几乎没变化;采样值稍微抖一下,声音听起来一样。

这个差别导致了一个很实际的后果:文字可以"查表"(编号 → 向量),图像和音频不能查表(数值有无穷多种可能,表列不完),只能用一个神经网络"算"出来。相当于:文字是从通讯录里查号码,一查就到;图像是拿一堆原料现场加工,必须过一遍机器。

为什么纯文字模型必然不够用

你可能会问:GPT 光靠读文字就已经很厉害了,为什么非要看图?这里有三个层次的理由,从最实用的往最深刻的排。

第一层,纯粹的实用性。现实世界里的信息大半不是纯文字的。你手机相册里几千张照片、微信里的语音消息、电脑里那些扫描版 PDF、报错时的截图、超市货架上的价签、体检报告上的图表——这些东西你没法先手打成文字再问 AI,那还不如自己看。多模态能力直接决定了 AI 能不能用在真实场景里。

第二层,有些信息用文字表达不出来。试着用文字精确描述一张脸,让另一个人根据你的描述在一百张照片里找出那张——你会发现这几乎做不到。图像里的信息密度远超语言,"一图胜千言"不是修辞,是事实。同样,一段音乐的旋律、一个人说话时的语气(同一句"你真行"可以是赞叹也可以是嘲讽)、一段视频里动作的连贯性,这些都是文字系统天生丢失的信息。

第三层,也是最深的一层:符号接地问题。这个词的英文是 Symbol Grounding Problem(符号接地问题,"接地"就是接上地面、和真实世界连上)。它问的是:一个只读过文字的系统,真的"懂"它说的词吗?

假设有一个人,从出生起就被关在房间里,唯一的信息来源是一本超厚的中文词典——里面只有汉字互相解释,没有一张图。他查"红",词典说"像血或朱砂的颜色";他再查"血",词典说"人和动物体内的红色液体"。他在两个词之间无限循环,永远碰不到"红"这个感觉本身。他可以把关于红色的诗背得滚瓜烂熟、可以正确使用"红"这个字造句,但他从没见过红。

这就是纯文本 LLM 的处境。它对"红"的全部知识,就是"红"这个 token 在其他 token 中间的统计位置。这套知识足以让它写出漂亮的句子,但当你给它一张图问"这是不是红的",它没有任何依据。多模态的哲学意义就在这里:给语言符号接上感官经验,让"红"这个词第一次和真实的波长挂上钩。

Analogy · 快递分拣中心的通用条码

想象一个巨大的快递分拣中心。每天进来的包裹五花八门:有装衣服的软袋、有装冰箱的大纸箱、有装液体的桶、有装鲜花的异形盒。形状、重量、材质全不一样,传送带怎么可能统一处理?

分拣中心的解法很朴素:在入口处给每个包裹贴一张统一格式的条码。不管你原来是软袋还是大纸箱,贴上条码之后,对整个分拣系统而言你就只是"一串数字"了。传送带、扫码枪、分拣机器人全都只认那串数字——它们从头到尾不需要知道箱子里装的是衣服还是冰箱。

更妙的是,这套条码是有含义的编排:前几位是省份,接着是城市,再接着是区。于是"条码上数字接近"就等价于"目的地地理位置接近"。系统只要按数字排序,就自动把去同一个城市的包裹归到了一起——它压根不用理解地理。

多模态 AI 干的就是这件事。入口处每种模态各有一台"贴条码机"(编码器):图片进图像编码器出来一串数字,文字进文本编码器出来一串数字,声音进音频编码器出来一串数字。贴完之后,所有模态的差异全部消失,下游只剩一件事:处理一串数字。

而"条码编排得有含义"这一点,对应的就是本章最核心的要求:语义相近的东西,数字必须也相近。一张猫的照片和"一只猫"这四个字,贴出来的条码必须挨得很近;和"一台推土机"贴出来的条码必须离得很远。这件事怎么做到,就是 §9.2 和 §9.3 的全部内容。

核心答案:所有模态都往同一个空间里塞

现在可以正面回答开篇那个问题了。文字、图片、声音凭什么能一起处理?因为它们在进入模型主体之前,都被各自的编码器转换成了同样格式的向量。

向量这个词我们在 §9.2 会详细讲,这里先给一句最粗糙的解释:向量说白了就是一串固定长度的小数,比如 512 个小数、或者 1536 个小数排成一排。你可以把它想成一个"超长的身份证号",只不过每一位不是 0~9 的整数,而是一个可以有小数点的数。

多模态模型的通用骨架(几乎所有模型都是这个结构)

  ┌─────────┐
  │  文字   │──→ 文本编码器 ──┐
  └─────────┘                 │
  ┌─────────┐                 │      ┌────────────────┐
  │  图片   │──→ 图像编码器 ──┼──→   │  共享向量空间   │
  └─────────┘                 │      │  (都是 512 或  │
  ┌─────────┐                 │      │   1536 个小数) │
  │  声音   │──→ 音频编码器 ──┤      └────────────────┘
  └─────────┘                 │              │
  ┌─────────┐                 │              ↓
  │  视频   │──→ 视频编码器 ──┘      下游任意任务:
  └─────────┘                        · 算相似度 → 跨模态检索
                                     · 送进 LLM → 图文对话
       各模态"贴条码"                · 算距离 → 聚类去重
       专用编码器各不相同             · 分类头 → 打标签

关键:编码器出口的向量长度必须一样,否则拼不起来。

这个"共享向量空间"有个正式名字:共享嵌入空间(Shared Embedding Space),也叫联合嵌入空间换成大白话:就是让不同来源的东西住进同一个小区,用同一套门牌号系统。

为什么这一招这么有用?因为一旦所有东西都在同一个空间里了,"跨模态"这件听起来很玄的事,就退化成了小学生都会的"比大小"。用文字搜图片:把文字编成向量,把图库里每张图也编成向量,然后看谁的向量离文字向量最近。就这样。没有任何额外机制。

但请注意一个非常容易被跳过的前提:光"长度一样"是不够的,还必须"对齐"。你可以随便训两个编码器,让它们都输出 512 维向量,但如果它们是各自独立训练的,那猫的照片和"猫"这个字的向量之间没有任何关系——就像两个人各自发明了一套 512 位密码,长度一样,含义完全不通。让两套编码器的输出真正"对上号",需要专门的训练过程,这就是 §9.3 讲的 CLIP 干的事。

三种能力:理解、生成、和真正的融合

"多模态"是个被滥用的营销词。同一个标签下,实际能力差距巨大。这里按难度分成三档,你以后看产品宣传时就知道对方在说哪一档。

档次能力描述典型代表你能做什么
一档 · 多模态理解输入可以是图 + 文,输出只有文字LLaVA、BLIP-2、各家的"上传图片提问"拍照问作业、截图问报错、给图写说明
二档 · 多模态生成输入文字,输出图 / 音 / 视频文生图、文生视频、语音合成画插图、配音、生成短片
三档 · 任意到任意输入输出都可以是任意模态组合实时语音对话、边看边说的助手打断式对话、指着屏幕问"这个按钮干什么"

为什么三档比一档难那么多?因为方向不同。第一档只需要"把别的模态翻译成文字世界的东西"——文字是终点,而文字模型已经很成熟了,所以只要在前面接一个翻译官就行,这也是为什么 2023 年一年之内涌现出几十个视觉语言模型。第二档要"从文字造出别的模态",需要一个能生成连续数值的解码器(第 5 章讲的扩散模型就是干这个的)。第三档最难,因为它要求同一个模型在同一次前向里既读得懂又造得出,而且还得实时——延迟一旦超过几百毫秒,对话的自然感就崩了。

把"实时"这个要求换算成可感知的量:人正常对话中,一方说完到另一方开口的间隔大约是 200 毫秒——比你眨一次眼(约 100 毫秒)的两倍还短。要在 200 毫秒内完成"听清、理解、想好、说出"这一整套,中间任何一个环节走弯路都来不及。所以真正的实时语音对话模型不能走"语音转文字 → LLM → 文字转语音"这条老路(三段串起来动辄两三秒),必须让声音直接进出同一个模型。这是 §9.5 的主题。

两条历史路线:先分家,后合并

多模态不是 2023 年才有的想法,它的历史几乎和 AI 一样长。但有意思的是,这个领域走过一个明显的"分久必合"的过程,值得完整讲一遍——因为理解了它为什么分家,你才明白今天的合并有多不容易。

分家阶段(1980 年代到 2017 年前后)。计算机视觉和自然语言处理是两个几乎不来往的学科。它们开不同的会(视觉的人去 CVPR、语言的人去 ACL)、用不同的数据集、发明不同的模型结构,甚至连"什么算好结果"的标准都不一样。视觉那边的主力工具是卷积神经网络(CNN,第 5 章讲过——说白了就是一个个小窗口在图上滑动找花纹),语言那边的主力是循环神经网络(RNN,一个字一个字往后传话)。两套工具的形状完全不同,没法互换零件。

转折点(2017 年,Transformer 出世)。第 7 章讲过的 Transformer 本来是为翻译设计的,但它有一个谁都没预料到的性质:它不在乎输入到底是什么。它只要求输入是"一串东西",然后让这串东西互相看一眼算注意力。一句话是一串词,那一张图能不能也切成一串小方块?这个念头直接催生了 2020 年的 ViT(Vision Transformer),把图片切成 16×16 的小方块当"词"来读——效果居然不输 CNN。

合并阶段(2021 年之后)。一旦视觉和语言用的是同一套骨架,融合的技术障碍就消失了。2021 年 CLIP 把图文对齐做通;2023 年 BLIP-2 和 LLaVA 演示了怎么把视觉编码器直接接到 LLM 上;之后各家旗舰模型全部标配多模态。这场合并的根本原因不是有人特别聪明,而是"两边终于用上了同一种积木"。

年份关键事件意义
2013 年 1 月word2vec(arXiv 1301.3781)证明"用一串数字表示词义"可行——一切嵌入的起点
2017 年Transformer提供了一个不挑输入类型的通用骨架
2018 年 7 月CPC 论文提出 InfoNCE(arXiv 1807.03748)对比学习的损失函数定型,是 CLIP 与 SimCLR 的共同祖先
2020 年 2 月SimCLR(arXiv 2002.05709)对比学习在纯视觉上打平监督学习,证明这条路走得通
2021 年 1 月 / 2 月CLIP(官方博客 1 月 5 日,arXiv 2103.00020 于 2 月 26 日)图文正式住进同一个空间,零样本分类成为现实
2023 年 1 月BLIP-2(arXiv 2301.12597)冻结的视觉编码器 + 冻结的 LLM,中间只训一个轻量连接器
2023 年 4 月LLaVA(arXiv 2304.08485)用纯语言版 GPT-4 造多模态指令数据,把视觉指令微调带火

注意 CLIP 那一行的日期写法。OpenAI 的官方博客是 2021 年 1 月 5 日发布的,arXiv 论文是同年 2 月 26 日才挂上去的——博客比论文早了一个半月。很多科普文章会把这两个日期搞混,写成"CLIP 发布于 2021 年 3 月"或"论文早于博客"。在写技术时间线时,"发布"和"论文上传"是两个不同的事件,最好分开标。

三种融合策略:早、中、晚

知道了"都变成向量"这个大方向,接下来的问题是:在哪一步把不同模态的向量掺到一起?答案有三种,教科书上叫早期融合、中期融合、晚期融合。这个分类很实用,因为它直接决定了系统能干什么、不能干什么。

策略在哪一步掺生活类比优点 / 缺点
晚期融合
Late Fusion
各模态各自算到最后,只把结论合并三个医生各自看片、各自出诊断,最后投票简单、模块可替换;但模态之间无法互相参考细节
中期融合
Intermediate Fusion
各模态编码成向量后,在向量层面交互三个医生各写一份摘要,然后坐在一起讨论摘要当今主流;保留了各模态的专用编码器,又能真正交互
早期融合
Early Fusion
在最原始的数据层面就拼在一起把三张片子叠在一张灯箱上一起看理论上信息损失最小;但数据形状差异大,工程上很难

今天绝大多数模型走的是中期融合。CLIP 是一种极简的中期融合——两个编码器各出一个向量,然后只做一次点积。LLaVA 和 BLIP-2 那类视觉语言模型也是中期融合——图像编码器出一串向量,经过一个连接器变成 LLM 认得的形式,然后和文字 token 拼在一起送进 LLM。

为什么早期融合这么难?还是回到那张形状表。文字是一串整数、图片是三百万个小数,你要在"原始数据层面拼起来",等于要求把一句话和一张照片首尾相连成一个数组——这个数组既有整数又有小数、既有长度 600 的部分又有长度 314 万的部分,模型压根不知道该怎么处理。相当于要把一份菜谱和一堆生菜直接搅在一起下锅——两样东西不在同一个抽象层次上。

多模态解锁了哪些具体本领

抽象讲完了,来看清单。下面每一条你大概都用过,但可能没意识到它们背后是同一套机制。

把这个清单和纯文本模型的能力清单对照一下你会发现,多模态不是给 LLM 加了一个功能,而是把它能接触的世界扩大了一个数量级。

多模态模型笨在哪:三类真实短板

科普文章总爱吹能力,很少讲短板。但短板往往更能说明机制。这里给三条有确凿出处的。

短板一:训练数据里没有的,它就是不会。CLIP 在 MNIST 手写数字(一个 1998 年就有的最基础的数据集,就是手写的 0~9)上,零样本准确率只有 88%,而人类是 99.75%。这个反差很刺眼——一个能认出上千种物体、能理解复杂场景的模型,认手写数字居然不如小学生。原因很朴素:它的四亿张训练图是从互联网抓的自然照片,里面几乎没有"白底黑字的手写数字"这种东西。这件事说明所谓"通用视觉能力"是有边界的,边界就是训练数据的分布。

短板二:细粒度识别不行。CLIP 论文报告了一个名人识别实验:在 100 个候选人里选,top-1 准确率 59.2%;候选扩大到 1000 人,掉到 43.3%候选数量翻十倍,准确率掉了十六个百分点。这是所有"靠相似度检索"的方法的通病——候选一多,向量空间里就挤,稍微一偏就选错。

短板三:它不理解"没有"和"数量"。这条不像前两条有确凿的论文数字支撑,但是多模态领域公认的通行观察:基于图文对训练的模型对否定("一只没有戴帽子的猫")和精确计数("恰好三个苹果")都很弱。原因也好理解:网上的图片说明文字很少写"这张图里没有大象",所以模型从没学过"没有"该对应什么视觉特征。相当于一个人只从菜市场的吆喝里学中文,他会听懂"新鲜的西红柿",但没人会吆喝"这里没有榴莲",所以他学不会"没有"。

常见误解一次澄清

常听到的说法实际情况
"多模态就是把几个模型拼起来"那叫多模型拼盘。真正的多模态是在同一个向量空间里融合,能回答跨模态的问题
"模型看图是一个像素一个像素扫"不是。它先把图切成小方块(patch),再像读句子一样读这串方块(§9.4 详述)
"零样本就是模型自己无师自通了"不是。它只是在候选类名的向量里挑最近的那个——本质是检索,前提是这些概念在四亿图文对里出现过
"能看图就说明它真的理解了"不一定。它在 MNIST 手写数字上零样本只有 88%,比人类 99.75% 差远了。能力边界就是数据分布边界
"多模态是 2023 年才有的新方向"不是。图文联合的研究可追到十几年前,2021 年 CLIP 才是转折点,2023 年只是产品化爆发
"CLIP 那篇论文用了 InfoNCE"严格说:CLIP 原文并没有用"InfoNCE"这个词,它写的是"对称交叉熵损失"。InfoNCE 这个名字出自 2018 年的 CPC 论文(§9.3 会讲清这条谱系)
"视频就是很多张图,处理起来差不多"差得远。一分钟 1080p 30 帧的原始像素是 112 亿个数值,而且时间顺序不能丢——所有视频模型都得先抽帧压缩

动手感受一下:向量长什么样

光说"变成一串数字"太抽象。下面这段代码不需要任何 AI 库,只用 numpy,就能让你亲眼看见"图片和文字变成同样形状的数组"这件事:

# 安装: pip install numpy
import numpy as np

# ---- 模拟:三种模态各自的原始数据形状 ----
text_ids  = np.array([9906, 1917, 0])              # 3 个 token 编号(整数)
image_raw = np.random.randint(0, 256, (224, 224, 3))  # 一张 224x224 彩图
audio_raw = np.random.randn(16000)                 # 1 秒 16kHz 音频

print("文字原始形状:", text_ids.shape,  text_ids.dtype)
print("图片原始形状:", image_raw.shape, "共", image_raw.size, "个数值")
print("音频原始形状:", audio_raw.shape, "共", audio_raw.size, "个采样点")

# 三个形状完全不一样,没法拼在一起。这就是多模态的核心难题。

# ---- 模拟:各配一个"编码器",统一压成 512 维向量 ----
D = 512   # 共享空间的维度,三个编码器必须一致

def fake_encoder(x, out_dim=D, seed=0):
    """假编码器:真实编码器是训练出来的神经网络,
    这里只演示"输入形状随便、输出形状固定"这个性质。"""
    rng = np.random.default_rng(seed)
    flat = np.asarray(x, dtype=np.float64).ravel()
    W = rng.standard_normal((len(flat), out_dim)) / np.sqrt(len(flat))
    v = flat @ W
    return v / np.linalg.norm(v)      # 归一化成单位长度

v_text  = fake_encoder(text_ids,             seed=1)
v_image = fake_encoder(image_raw / 255.0,    seed=2)
v_audio = fake_encoder(audio_raw,            seed=3)

for name, v in [("文字", v_text), ("图片", v_image), ("音频", v_audio)]:
    print(f"{name}向量:形状 {v.shape},长度 {np.linalg.norm(v):.4f},"
          f"前 4 个数 {np.round(v[:4], 3)}")

# ---- 现在它们形状一样了,可以放进同一个矩阵一起算 ----
bank = np.stack([v_text, v_image, v_audio])   # (3, 512)
print("三种模态叠成一个矩阵:", bank.shape)
print("两两相似度矩阵:\n", np.round(bank @ bank.T, 3))

跑完你会看到关键的一幕:三种形状完全不同的原始数据,出口全是 (512,)最后那个相似度矩阵对角线上全是 1(自己和自己完全一样),其他位置接近 0。

但请特别注意:这里的编码器是随机的假货,所以非对角线上那些数字毫无意义。真实模型和这段代码唯一的区别,就是那些随机矩阵 W 是从海量数据里训练出来的,训练目标就是让"猫的图"和"猫这个字"的相似度尽量高。形状统一是工程问题,一行代码解决;语义对齐才是真问题,需要四亿组数据和几百张显卡——这就是 §9.3 的主题。

写给要动手的人:入门路径建议

Recap · 收束

模态就是"信息以什么形式存在":文字、图片、声音、视频各是一种。人天生是多模态的——你看见、听见、摸到的苹果在脑子里是同一个概念;而纯文本模型像一个只有词典没有窗户的人,他能把"红"用得很漂亮,却从没见过红。这就是符号接地问题

四种模态在计算机里的形状天差地别:文字是一串离散整数,一张 1024×1024 的照片是 314 万个连续数值,一分钟 1080p 视频是 112 亿个数值。它们能被一起处理的唯一原因是:每种模态各配一个编码器,先统统翻译成同样长度的向量,之后下游只面对向量。那个向量落脚的地方叫共享嵌入空间。

但"长度一样"只是形状统一,不等于语义对齐——两套各自独立训练的编码器就像两套互不相通的密码。真正让"猫的照片"和"猫这个字"靠在一起,需要专门的对齐训练。融合的位置分早、中、晚三种,今天主流是中期融合:各模态先编码,再在向量层面交互。

也别把多模态神化。CLIP 在最简单的 MNIST 手写数字上零样本只有 88%(人类 99.75%),名人识别候选从 100 扩到 1000 时准确率从 59.2% 掉到 43.3%。能力边界就是训练数据的分布边界。

下一节我们钻进那个"共享空间"里面,看清 Embedding 到底是什么——它是本章的地基,也是整章里唯一一个你今天下午就能动手用上的东西。

☰ 主页
学海无涯 · 智能篇 · § 9.1