跳到主要内容

录音、图片、视频 — 一条「先变成文字」的统一策略

这一章讲三件事: 没有文字可搜的东西怎么进库; 为什么书里给的办法只有一条、而不是每种格式各一套; 以及这一招真正的代价在哪(答案:一次不会报错的信息丢失)。 位置:入库线第一步的最后一块。读完这一章,「读进来」就讲完了,接着是第 05 章「切成小块」。

1. 先看现象:一段两小时的会议录像

你们组每周开会都录像,存了两年。现在你想问: 「上个季度那次关于供应商切换的讨论,最后结论是什么?」

这份资料是有的,但它在一个搜不了的形态里。

  • 录像里有人说话——但那是声音,不是文字;
  • 屏幕上有幻灯片——但那是像素,不是文字;
  • 你能记得大概在第二个小时——但没有任何东西能把「时间点」和「内容」对起来

第 01 章那套办法在这里完全用不上:没有文字,就算不出嵌入,就没法比远近。

这一章讲的就是:怎么把这类东西弄成可搜的。

这段录像不是随手举的例子,它是这一章的主走查。 第 8 节会拿它从头走到尾, 每一步旁边写出具体的时间点、文件名和字串——这一章的每个机制都在那条线上占一步。

2. 顶层全景:一条策略,不是七种技巧

书里第 1 章后半部分的七个配方,分别讲音频、图片、扫描件、表格里的图、多媒体 PDF 和视频。 看起来是七件事,其实是同一条策略的七次应用:

录音 ──语音转文字──┐
视频里的说话声 ────┤
扫描件 ──认字────┤
图片 ──让模型讲一遍──┼──→ 一段文字 ──→ 走第 01 章那条线:切块 → 算嵌入 → 进库
表格 ──让模型提炼──┤
幻灯片截图 ────────┘

图说:漏斗的出口只有一个——文字。所有花招都发生在漏斗口之前。

为什么只能这样? 书里在讲多媒体 PDF 时说了实话。先把它用的一个词说清: 第 01 章那个「把一段文字变成一串数」的模型,原文叫文本嵌入模型。

人类可以轻松理解这些元素,但 RAG 系统靠的是擅长处理文字、 却对付不了图像的文本嵌入模型。要弥合这个鸿沟, 就用能看图的模型把图片和表格分析、总结成文字1

这句话是整章的地基。 记住它,后面每一节都是它的一个实例。

先说清一个词:能同时读图和读字的模型,叫多模态模型 (「模态」指信息的形态——文字是一种,图像是一种,声音是一种)。

书里用的是 OpenAI 的 GPT(这三个字母是 OpenAI 给自家这一系列模型起的名字, ChatGPT 里的 GPT 就是它)家族里的 GPT-4o,并提到 Anthropic 的 Claude 3.5 Sonnet、 Google 的 Gemini 1.5 也是好选择2

3. 声音:先转成字

怎么做

语音转文字(把录音里的话变成文字)的模型。书里对这类模型的描述是: 它们在多种语言、成千上万小时的音频上训练过,近年提升明显, 能自动识别语种,也能应付很吵的背景噪音3

书里用的是 OpenAI 的 Whisper。代码短到只有一次调用:给它文件路径和模型名,拿回一段文字。

这里要先说清一个词:接口(英文 API:你的程序按约定的格式把数据发给别人家的服务、再拿回结果)。 本文后面一律叫「接口」。

作者在这里写了一句我觉得全书最诚实、也最刺的话:

一次接口调用,你的产品就可以打上「AI 驱动」的标签了。4

一个真实的取舍:云上跑,还是自己跑

书里把这个决定说得很清楚,而且判据只有一条:

情况该怎么选书里的理由
要快速搭起来、要能扛量用云服务(AWS、Azure、GCP 之类)省事、扛得住量5
数据敏感把开源(源代码公开、谁都能自己下载来跑)的模型装在自己公司的机器上跑这样只有你自己能碰到这些数据6

第一行那句「扛得住量」在原文里就只有这么一个词,我们把它拆开说清楚 ——以下这层展开是我们补的: 云服务的意思是量一大就自动多派机器、量小了自动撤掉, 你不必自己备一屋子机器,也不必为闲着的机器付钱。

注意第二行的分量。 把会议录音发给第三方服务,等于把会议内容发出去了。 书里没有展开,但这是这一章里唯一一处涉及合规的决定。

判断(我们的,不是书里的): 这条取舍比书里写的更不对称。 一旦选了云服务,后面所有多模态的步骤都会跟着上云—— 因为看图、写摘要用的也是同一家厂商的服务。 所以这不是「音频这一步怎么办」的局部决定,它实际上决定了你整条入库线的数据边界。 如果错,会错在: 如果你的厂商提供了明确的「不用于训练、不留存」的合同条款, 并且你的合规要求接受这一点,那这条顾虑就降级成一个采购问题,不是架构问题。

顺带补一句书里没给的背景: Whisper 出自 2022 年 12 月的一篇论文, 它在 68 万小时的多语言、多任务音频上训练——一个人不吃不睡连着听,要听 78 年; 论文的主张是它在没有针对性微调 (拿一个已经训练好的模型,再用你自己的少量数据接着训一小段,让它更贴合你的场景) 的情况下,就能在标准评测上接近「拿人工核对过的数据从头训一遍」的水平7

4. 图片:两条路,老的和新的

路一:认字(OCR)

OCR 就是「光学字符识别」——一种老技术,专门把图片里的字认出来变成文字。 最有名的引擎叫 Tesseract8

处理扫描版 PDF 的流程是:打开 PDF → 把每一页存成一张图 → 用 OCR 引擎从每张图里认字9

路二:让看图模型讲一遍

做法书里写得极简:写一段最基本的提示,让模型详细描述这张图10

两条路怎么选:书里给了判据,而且作者自己给了立场

书里列的取舍:

OCR 引擎看图模型
灵活性固定改一句提示就能换任务11
速度与成本快、便宜慢、贵
能不能自己架能,适合敏感数据通常要调外部服务
适合什么图主要是字的图(扫描文档)什么图都行,包括人物、风景、图表
不适合什么人物、风景、物体的照片——从这类图里抽字没意义12量特别大的时候

作者随后给了一句在技术书里很少见的坦白:

我这些天很少用 OCR 模型了,因为多模态模型让抽字这件事变得太简单。 我唯一还会选 OCR 的场合是:我确知这些文档基本都是文字、结构一致, 而且需要快速、低成本地处理掉13

还有一条量级上的建议:只处理几百张图的时候,推荐用多模态模型14

判断(我们的,不是书里的): 这两句话合起来给了一条很实用的默认值: 先用看图模型,直到量大到疼为止。 理由是:OCR 的每一次改进都要写规则(版面在哪、栏怎么分), 而看图模型的每一次改进只是改一句话——改提示的成本远低于改规则的成本。 如果错,会错在: 如果你的文档格式高度固定(比如全是同一种发票), 那写一次规则就能一劳永逸,OCR 反而更稳、更便宜、更可预测。 判据是:你的文档「长得一不一样」。

一个更大的提醒

作者在讨论里写了一句值得单独记的判断:随着多模态模型崛起,许多更老的技术正在过时15

他指的是这样一类事:过去要专门做一个只会认语言的模型、 或者专门做一个只会看图的模型,才干得了的活儿—— 现在换一句提示,就能让同一个多模态模型顺手做掉。

5. 关键的一跳:不抽字,而是让模型「讲一遍这张图」

这一节是整章最反直觉、也最值得带走的一招。

先看问题

一张幻灯片上画着一张「各区营收对比」的柱状图,上面只有几个数字和几个区域名。 把这些字抽出来,你得到的是「EMEA 12.4 APAC 8.1 AMER 15.9」——毫无用处。

真正有用的是这张图在说什么:「第三季度美洲区营收最高,亚太区最低,EMEA 居中。」 而这句话,图上根本没写。

(EMEA 12.4、APAC 8.1、AMER 15.9 这三个数,以及那句结论,都是为演示编的,不是真实数值。 书里在这一处只说了做法——让模型详细描述这张图——没有给任何示例数字。)

书里给的两条路

给图片做嵌入有两个办法16:

  1. 直接给图片算嵌入,用专门处理图像的嵌入模型;
  2. 先让多模态模型给图片写一段文字摘要,再给这段摘要算嵌入。

书里选第二条,理由是:这个办法通常更实用也更灵活—— 不管是人物照、风景照还是技术图表,它都应付得了17

路一:图片 ─────────→ 图像嵌入模型 ─→ 一串数
└─ 需要一个专门的图像模型,而且它和文字的嵌入未必在同一个空间里

路二:图片 ─→ 多模态模型写一段描述 ─→ 文字嵌入模型 ─→ 一串数
└─ 描述是文字,和其他所有文字块用同一个模型、同一个空间 ← 关键

图说:路二真正的好处不是「更准」,是「统一」——所有东西最后都变成同一种可比的东西。

书里也提了路一的具体选项:OpenAI 的 CLIP 这类在图像和文字之间搭桥的模型, 但把它指向了一个不存在的章节18

表格也一样:让模型提炼出结论

同样的招数用在表格上。书里点出了问题的根源,那句话值得一字不落地记住:

在 RAG 系统里,我们把内容存成一块块彼此断开的信息。 如果只是把表格里的字抽出来存进去, 嵌入模型在算嵌入的时候很可能抓不到关键结论19

解法:用大模型给表格写一段文字摘要,帮嵌入模型抓住要点20

6. 这一招的必配补丁:摘要和原件一起存

这是全书最重要的一条工程细节,只用了一段带过,但漏了它整套做法就是有损的。

书里的意思用我们自己的话说是:存摘要、给摘要算嵌入的时候, 必须同时存下一条通往原始表格的「链接」;等检索认定这张表跟用户的问题有关, 交给模型的应该是整张表,而不是那段摘要——反正模型有能力自己读原始表格。 作者钉住这件事的那半句是:

把整张表、而不是只把摘要放进最终的提示里。21

他给的收尾理由只有一句:这样整个过程中就不会丢信息。

书里说的这个「链接」,程序里通常叫指针—— 它不是内容本身,而是一张写着「东西在那边,编号 4172」的便条,顺着它就能取到原件。 下文一律叫指针。

入库时:表格 ─→ 摘要 ─→ 嵌入 ─→ 进库
└── 同时存一个指针,指回原始表格 ←── 别漏这一步

检索时:命中摘要 ──→ 但塞进提示的是【原始表格】,不是摘要

图说:摘要只负责「被搜到」,原件负责「被读懂」。两者分工,缺一不可。

判断(我们的,不是书里的): 这条补丁应该被提升为一条通则, 对图片、录音、视频全都适用,而不只是表格: 摘要只用于检索,原件用于回答。 不这么做的后果是一种最难排查的故障——系统答得头头是道,但它答的是摘要,不是事实。 而你不会收到任何报错,因为流程上一切正常。 如果错,会错在: 如果原件本身模型读不了(比如一段两小时的音频没法塞进提示), 那就退而求其次:存原件的精确定位(第几分几秒、第几页), 让人能自己去核对。能核对,是这条补丁的最低底线。

7. 把它们拼起来:一份图文混排的 PDF

书里最后把前面几招串成一条完整的流水线,处理带图和带表的 PDF22:

做什么
1. 分拣把 PDF 拆成三堆:文字、图片、表格
2. 写摘要用多模态模型给图片和表格各写一段文字摘要
3. 算嵌入给文字块、图片摘要、表格摘要统一算嵌入
4. 入库连同时间戳(一个精确到秒的时间标记,记下这块是什么时候被处理的)、文件路径、页码这些元数据一起存进向量库

第 3 步那个「统一」是这条流水线的全部意义: 到这一步为止,图、表、字已经变成了同一种东西,后面所有环节都不必再区分它们。

书里还给了每一堆的后续处理建议:文字和标题去切块(第 05 章); 图片走 OCR 或看图模型;表格优先让模型提炼结论23

8. 视频:拆成「画面」和「声音」两条线

核心思路

书里开门见山:我们不直接把视频变成向量数据, 而是把它拆成一段段,再把每一段变成有意义的文字块24

五步流水线25:

① 定切点:找出屏幕内容发生明显变化的时刻(用图像处理库检测)
② 存画面:在每个时刻把那一帧存成图片,并写一段文字描述(第 5 节那一招)
③ 转语音:把两个时刻之间的声音切出来存成音频,用语音转文字模型转成字
④ 算嵌入:给画面描述和转写文字算嵌入
⑤ 入库:连同元数据一起存

图说:一条视频被劈成两股——看到的和听到的——各自变成文字,最后汇进同一个向量库。

(就是视频里的一张静止画面;视频就是每秒几十帧连着放。)

一个被大多数教程跳过的前置问题

书里问了一串很实在的问题,在动手之前先想清楚这条视频长什么样26:

  • 是一个人讲,还是几个人讨论?
  • 屏幕上是静止的幻灯片,还是动画?
  • 换得多勤?如果是幻灯片,大概多久换一页?

书里的示例视频是一段数据科学入门教程,屏幕内容大约每 30 秒变一次27

为什么这决定一切: 切点定得太密,你会为几乎一样的画面反复付钱; 定得太疏,一页幻灯片讲的内容会和下一页混在一块儿。

注意书里在这里偷了懒: 示例代码为了简化,直接定了一串固定间隔的时刻, 而不是真的去检测画面变化28这是概念演示,不是可用实现。

从头走一遍:第 1 节那段会议录像

上面五步全是动作名。这一小节把第 1 节立的那个输入拿回来,每一步旁边写出具体的字串和数。 这一章的五个机制——语音转文字、认字、看图模型写描述、摘要配指针、视频拆两股—— 在这条走查上各占一步。

先声明:下面这些时间点、文件名、字串和坐标都是为演示编的,不是真实数值。 书里在这一节只给了一个真数:它那段示例视频的屏幕内容大约每 30 秒变一次。 其余全是我们为了让每一步看得见而编的,不许引用

输入: 文件 会议录像_20250612.mp4,时长两小时; 用户要问的是第 1 节那句「上个季度那次关于供应商切换的讨论,最后结论是什么?

① 定切点(离线跑)
用图像处理库扫一遍画面,在屏幕内容明显变化的地方记下时刻:
01:47:10 ← 有人切到了一张对比表
01:47:40 ← 换成了下一页
01:48:20 ← 又换了一页

② 存画面 + 让看图模型讲一遍(第 4、5 节那一招)
01:47:10 那一帧存成 frame_0512.png,交给看图模型,它写回来一段字:
「一张对比表。左列是现供应商 A,右列是备选供应商 B;
交期一栏,A 是 14 天,B 是 9 天。」
← 注意:「14 天 vs 9 天」这个对比,画面上是两个格子,不是一句话。
走第 4 节路一(认字)只抠得出「A 14 B 9」四个符号,谁也看不懂;
是这段描述把它说成了人话。

③ 转语音(第 3 节那一招)
把 01:47:10 到 01:47:40 之间那 30 秒的声音切出来,交给语音转文字模型,转出:
「……所以我们决定 Q3 先切一半量给 B,交期是主要考虑……」

④ 算嵌入
②那段画面描述、③那段转写,各自算出一串 1536 个数,用的是同一个嵌入模型。

⑤ 入库 —— 每一串数都拴着一张便条(第 6 节那条补丁)
便条上写的是:「会议录像_20250612.mp4 / 01:47:10」
← 这就是指针。存进去的是描述和转写,原件还在原处。

图说:一条录像在这里被劈成两股——看到的(②)和听到的(③)——各自变成文字,
再汇进同一个向量库。⑤那张便条是整条走查上最容易漏、漏了就补不回来的一步。

用户提问那一刻发生了什么: 「供应商切换最后结论是什么」这句话算出嵌入,跟库里比距离, 命中的是③那块转写——因为「决定」「切一半量」跟「最后结论」意思最近, 而②那块讲的是交期数字,离得稍远。 顺着③那张便条,系统交给模型的是转写全文加那个时间点, 最后答案里能写出「见 会议录像_20250612.mp4 第 1 小时 47 分」。

这就是第 6 节那条补丁在视频上的样子: 两小时的原件塞不进提示, 所以底线是存下精确定位,让人能自己跳回去核对。

作者为什么在意这件事

讨论里那段话很有人味,也点出了真正的价值:

我今天懂的东西有一半是从 YouTube 视频上学的,每天还要开好几小时视频会,很多都录了下来。 但说实话,除非有明确理由,我几乎不会回头去看旧的会议录像或视频。29

而 RAG 能改变这一点的原因是:它可以直接链回原始内容、给出精确的时间点30

这正好是第 6 节那条补丁的又一个实例: 视频的价值不在于把它变成文字, 而在于让你能跳回第 1 小时 47 分那一刻。

9. 作者的判断与证据

说法属于哪一类
语音转文字模型这些年提升明显、能抗噪可验证的事实,但书里没给数据或引用
「我很少再用 OCR 了」作者自述的个人习惯,明确标了是「我」
「几百张图的量,用多模态模型」作者凭经验拍的一个量级门槛,没有依据
摘要路线比直接给图片算嵌入「更实用更灵活」作者的判断,没有对比实验
多模态模型正在让老技术过时作者的趋势判断
摘要要连着原件一起存机制上必然,不需要证据——这是全章唯一一条硬结论

这一章通篇没有一个数字是来自评测的。 唯一带数字的说法是「几百张图」那个门槛, 而它明确写着「我推荐」。

10. 边界与局限

代码上的过时与错误

这一章涉及的示例代码有六处问题,归成三类:

  • 视频那个库整个变了样: moviepy.editor 这个入口在 MoviePy 2.0 里被删掉了 (官方文档说这个命名空间——就是「这个功能挂在哪个名字底下」的那个名字——已经不存在, 好比人还在、门牌变了),截片段的方法也从 subclip 改名叫 subclipped31;
  • OCR 那两段各有一处写错: 一处把「打开图片」要认的第一项写错了名字,叫成了 file_path32, 一处把一个 .png 路径交给了「把 PDF 转成图片」的代码33;
  • 还有两处是没改干净的旧稿: 讲多媒体 PDF 时冒出一个 GPT-4V,而全书别处一律写 GPT-4o34; 讲音频时把「语音转文字」写反成了「文字转语音」35

这里只点名。 逐条写清「错在哪、会不会当场报错」的完整清单在第 07 章第 5 节, 「今天该换成什么」的完整清单在第 07 章第 6 节——那两张表是正本。

内容上没覆盖的

  1. 没有讲怎么评估摘要的质量。 模型给一张图写的描述漏没漏关键信息?书里没有任何检查手段;
  2. 没有讲成本。 「给几万张图各写一段摘要」是这条流水线上最贵的一步,书里连量级都没给;
  3. 没有讲重跑。 换了个更好的多模态模型,要不要把所有摘要重写一遍?这是真实会遇到的问题;
  4. 书里点名的三个模型今天都不是最新的。 GPT-4o、Claude 3.5 Sonnet、Gemini 1.5—— 看思路,别看型号。

11. 可带走的

  1. 没有文字可搜的东西,只有一条出路:先变成文字,再走跟普通文档一样的线;
  2. 这条策略把一个难问题换成了一个已解决的问题,代价是一次信息丢失;
  3. 声音靠语音转文字模型;取舍只有一条——数据敏不敏感,敏感就自己架;
  4. 这条取舍不是局部的:选了云,整条入库线的数据边界就定了;
  5. 图片有两条路:OCR 认字(快、便宜、能自己架)vs 看图模型讲一遍(灵活、贵);
  6. 默认选看图模型,直到量大到疼——改提示比改规则便宜; 文档格式高度固定的话反过来选 OCR;
  7. 最反直觉的一招:存的不是图,是模型给图写的一段话; 因为它和其他所有文字块用的是同一个嵌入模型、同一个空间;
  8. 图上真正有用的信息(「哪个区最高」)往往图上根本没写,只有描述才有;
  9. 必配补丁:摘要只用于被搜到,原件用于被读懂——两者都要存,而且要有指针互相连; 漏了这条,系统会答得头头是道却答的是摘要;
  10. 原件塞不进提示的话,底线是存下精确定位(第几页、第几分几秒),让人能自己核对;
  11. 视频拆成「画面」和「声音」两股,各自变成文字; 切点怎么定取决于这条视频长什么样,书里的示例代码在这一步偷了懒;
  12. 书里这一章的模型名和视频库用法都已过时——看思路,别抄字符。

12. 原文地图

主题原书章原文位置
为什么必须先变成文字Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:795(搜「text embedding models that excel at processing text but struggle with visual content」) · text/04-ch01-chapter-1-loading-data.txt:795(搜「we can use multimodal models to analyze and summarize images and tables into text」)
语音转文字模型的能力Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:353(搜「trained on thousands of hours of audio in multiple languages」) · text/04-ch01-chapter-1-loading-data.txt:353(搜「They can automatically detect languages and handle loud background noise」)
云上跑还是自己跑Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:359(搜「For quick setup and scalability, use a cloud service」) · text/04-ch01-chapter-1-loading-data.txt:361(搜「If you need to handle sensitive data, you can host an open-source model like Whisper on your own servers」)
「一次接口调用就能叫 AI 驱动」Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:369(搜「One API call and your product can be labeled as AI-powered」)
OCR 的定位与流程Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:400(搜「OCR engines are fast, cost-effective, and can be run on your own servers」) · text/04-ch01-chapter-1-loading-data.txt:402(搜「loading the PDF, saving each page as an image」) · text/04-ch01-chapter-1-loading-data.txt:408(搜「The most popular OCR engine is Tesseract」)
OCR 不适合什么、作者的坦白Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:452(搜「OCR engines aren」) · text/04-ch01-chapter-1-loading-data.txt:454(搜「effective for images that primarily contain text」) · text/04-ch01-chapter-1-loading-data.txt:456(搜「I rarely use OCR models these days」)
让模型详细描述图片Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:472(搜「We create a basic prompt and ask the model to describe the image in detail」)
给图片做嵌入的两条路Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:539(搜「There are two ways to create embeddings for images」) · text/04-ch01-chapter-1-loading-data.txt:545(搜「This method is generally more practical and flexible」) · text/04-ch01-chapter-1-loading-data.txt:627(搜「models that bridge the gap between image and text content」)
多模态模型的取舍、几百张图的阈值Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:597(搜「many older technologies are becoming outdated」) · text/04-ch01-chapter-1-loading-data.txt:601(搜「Smaller, specialized models like OCR engines are fast and cost-effective」) · text/04-ch01-chapter-1-loading-data.txt:607(搜「I recommend using a multimodal model when handling only a few hundred images」)
内容被存成断开的碎片、给表格写摘要Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:637(搜「we store content as disconnected pieces of information」) · text/04-ch01-chapter-1-loading-data.txt:637(搜「the embedding models might miss the key insights」) · text/04-ch01-chapter-1-loading-data.txt:639(搜「we can use LLMs to generate text summaries of the tables」)
摘要要连着原件一起存Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:705(搜「interpretable as a standalone piece of information」) · text/04-ch01-chapter-1-loading-data.txt:707(搜「it makes sense to include the whole table instead of just the summary」)
多媒体 PDF 的四步Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:733(搜「Partition Data: Load raw data and partition it into text, images, and tables」) · text/04-ch01-chapter-1-loading-data.txt:735(搜「Generate Summaries: Use a multimodal model」) · text/04-ch01-chapter-1-loading-data.txt:739(搜「Store Embeddings: Add the embeddings to the vector store」)
视频拆成段、五步流水线Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:815(搜「break it down into parts and turn each part into meaningful text chunks」) · text/04-ch01-chapter-1-loading-data.txt:821(搜「Define timestamps for when the screen content changes significantly」) · text/04-ch01-chapter-1-loading-data.txt:825(搜「Transcribe audio using Speech-to-Text models」)
动手前先看视频长什么样Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:845(搜「we need to consider its style」) · text/04-ch01-chapter-1-loading-data.txt:849(搜「about once every 30 seconds」) · text/04-ch01-chapter-1-loading-data.txt:853(搜「we simplify the pipeline by defining a random list of timestamps」)
为什么值得做视频、精确时间点Chapter 1. Loading Datatext/04-ch01-chapter-1-loading-data.txt:911(搜「learned half of what I know today from YouTube videos」) · text/04-ch01-chapter-1-loading-data.txt:913(搜「link directly to the original content and provide exact timestamps」)

Footnotes

  1. 出处:「Chapter 1. Loading Data」第 795 段(text/04-ch01-chapter-1-loading-data.txt:795,搜「text embedding models that excel at processing text but struggle with visual content」)与同段(text/04-ch01-chapter-1-loading-data.txt:795,搜「we can use multimodal models to analyze and summarize images and tables into text」)。

  2. 出处:「Chapter 1. Loading Data」第 551 段(text/04-ch01-chapter-1-loading-data.txt:551,搜「Other good options include Anthropic」)。这三个型号在今天都不是各家的最新版本,引用时只看角色不看版本号。

  3. 出处:「Chapter 1. Loading Data」第 353 段(text/04-ch01-chapter-1-loading-data.txt:353,搜「trained on thousands of hours of audio in multiple languages」)与同段(text/04-ch01-chapter-1-loading-data.txt:353,搜「They can automatically detect languages and handle loud background noise」)。

  4. 出处:「Chapter 1. Loading Data」第 369 段(text/04-ch01-chapter-1-loading-data.txt:369,搜「One API call and your product can be labeled as AI-powered」)。这句话在原书里紧跟着示例代码,语气是自嘲。

  5. 出处:「Chapter 1. Loading Data」第 359 段(text/04-ch01-chapter-1-loading-data.txt:359,搜「For quick setup and scalability, use a cloud service」)。原文这一句只说了「为了快速搭建和扛得住量,用云服务」,「量一大就自动多派机器、量小了自动撤掉」这层展开是我们补的,书里没有。同一句还把「语音转文字」误写成了「文字转语音」,是抢先版的手误。

  6. 出处:「Chapter 1. Loading Data」第 361 段(text/04-ch01-chapter-1-loading-data.txt:361,搜「If you need to handle sensitive data, you can host an open-source model like Whisper on your own servers」)。原文的结论句是「这样能确保只有你自己能接触到这些数据」。

  7. 补充(不在书里):Whisper 出自 2022 年 12 月 6 日提交的论文,作者为 Alec Radford、Jong Wook Kim、Tao Xu 等;训练数据为 68 万小时的多语言、多任务弱监督音频——弱监督的意思是:配套的文字稿是从网上直接扒来的,没有人逐句校对过,所以又多又脏;摘要称它在「零样本迁移、无需任何微调」的设定下(就是拿来直接用、不给它看这个任务的任何样例),就能与此前那些拿人工逐句核对过的数据从头训出来的结果相竞争。来源:《Robust Speech Recognition via Large-Scale Weak Supervision》https://arxiv.org/abs/2212.04356(查阅于 2026-08-25)。

  8. 出处:「Chapter 1. Loading Data」第 408 段(text/04-ch01-chapter-1-loading-data.txt:408,搜「The most popular OCR engine is Tesseract」)。原文也提到可以改用 Google Cloud Vision、Amazon Textract、Microsoft Azure AI Vision 这类云服务。

  9. 出处:「Chapter 1. Loading Data」第 402 段(text/04-ch01-chapter-1-loading-data.txt:402,搜「loading the PDF, saving each page as an image」)。

  10. 出处:「Chapter 1. Loading Data」第 472 段(text/04-ch01-chapter-1-loading-data.txt:472,搜「We create a basic prompt and ask the model to describe the image in detail」)。

  11. 出处:「Chapter 1. Loading Data」第 400 段(text/04-ch01-chapter-1-loading-data.txt:400,搜「OCR engines are fast, cost-effective, and can be run on your own servers」)。原文的对照是:多模态模型灵活、改提示就能调整;OCR 引擎快、便宜、能自己架。

  12. 出处:「Chapter 1. Loading Data」第 452 段(text/04-ch01-chapter-1-loading-data.txt:452,搜「OCR engines aren」)与第 454 段(text/04-ch01-chapter-1-loading-data.txt:454,搜「effective for images that primarily contain text」)。原文还提醒:把 PDF 页面转成图片时,要把 PDF 和图片两边的文件路径以及页码都存下来。

  13. 出处:「Chapter 1. Loading Data」第 456 段(text/04-ch01-chapter-1-loading-data.txt:456,搜「I rarely use OCR models these days」)。这是作者第一人称的自述,不是普遍建议。

  14. 出处:「Chapter 1. Loading Data」第 607 段(text/04-ch01-chapter-1-loading-data.txt:607,搜「I recommend using a multimodal model when handling only a few hundred images」)。

  15. 出处:「Chapter 1. Loading Data」第 597 段(text/04-ch01-chapter-1-loading-data.txt:597,搜「many older technologies are becoming outdated」)与第 601 段(text/04-ch01-chapter-1-loading-data.txt:601,搜「Smaller, specialized models like OCR engines are fast and cost-effective」)。

  16. 出处:「Chapter 1. Loading Data」第 539 段(text/04-ch01-chapter-1-loading-data.txt:539,搜「There are two ways to create embeddings for images」)。

  17. 出处:「Chapter 1. Loading Data」第 545 段(text/04-ch01-chapter-1-loading-data.txt:545,搜「This method is generally more practical and flexible」)。

  18. 出处:「Chapter 1. Loading Data」第 627 段(text/04-ch01-chapter-1-loading-data.txt:627,搜「models that bridge the gap between image and text content」)。CLIP 的全称在原文里写作 Contrastive Language-Image Pre-training,后面紧跟着一个指向不存在章节的占位符。

  19. 出处:「Chapter 1. Loading Data」第 637 段(text/04-ch01-chapter-1-loading-data.txt:637,搜「we store content as disconnected pieces of information」)与同段(text/04-ch01-chapter-1-loading-data.txt:637,搜「the embedding models might miss the key insights」)。

  20. 出处:「Chapter 1. Loading Data」第 639 段(text/04-ch01-chapter-1-loading-data.txt:639,搜「we can use LLMs to generate text summaries of the tables」)。

  21. 出处:「Chapter 1. Loading Data」第 705 段(text/04-ch01-chapter-1-loading-data.txt:705,搜「interpretable as a standalone piece of information」)与第 707 段(text/04-ch01-chapter-1-loading-data.txt:707,搜「it makes sense to include the whole table instead of just the summary」)。原文的收尾句是「这样我们就不会在过程中丢失任何信息」。

  22. 出处:「Chapter 1. Loading Data」第 733 段(text/04-ch01-chapter-1-loading-data.txt:733,搜「Partition Data: Load raw data and partition it into text, images, and tables」)、第 735 段(text/04-ch01-chapter-1-loading-data.txt:735,搜「Generate Summaries: Use a multimodal model」)与第 739 段(text/04-ch01-chapter-1-loading-data.txt:739,搜「Store Embeddings: Add the embeddings to the vector store」)。这一节的开场句见第 727 段(text/04-ch01-chapter-1-loading-data.txt:727,搜「Multimodal models open new doors」)。

  23. 出处:「Chapter 1. Loading Data」第 787 段(text/04-ch01-chapter-1-loading-data.txt:787,搜「Text and Titles: Split them into smaller text chunks」)。原文把递归切分、语义切分、代理式切分都指向了第 2 章,也就是我们的第 05 章。

  24. 出处:「Chapter 1. Loading Data」第 815 段(text/04-ch01-chapter-1-loading-data.txt:815,搜「break it down into parts and turn each part into meaningful text chunks」)。

  25. 出处:「Chapter 1. Loading Data」第 821 段(text/04-ch01-chapter-1-loading-data.txt:821,搜「Define timestamps for when the screen content changes significantly」)与第 825 段(text/04-ch01-chapter-1-loading-data.txt:825,搜「Transcribe audio using Speech-to-Text models」)。

  26. 出处:「Chapter 1. Loading Data」第 845 段(text/04-ch01-chapter-1-loading-data.txt:845,搜「we need to consider its style」)。

  27. 出处:「Chapter 1. Loading Data」第 849 段(text/04-ch01-chapter-1-loading-data.txt:849,搜「about once every 30 seconds」)。

  28. 出处:「Chapter 1. Loading Data」第 853 段(text/04-ch01-chapter-1-loading-data.txt:853,搜「we simplify the pipeline by defining a random list of timestamps」)。示例代码实际上是按固定 10 秒间隔取帧,和上一段说的「检测画面变化」不是一回事。

  29. 出处:「Chapter 1. Loading Data」第 911 段(text/04-ch01-chapter-1-loading-data.txt:911,搜「learned half of what I know today from YouTube videos」)。

  30. 出处:「Chapter 1. Loading Data」第 913 段(text/04-ch01-chapter-1-loading-data.txt:913,搜「link directly to the original content and provide exact timestamps」)。

  31. 出处:书里的用法见「Chapter 1. Loading Data」第 860 段(text/04-ch01-chapter-1-loading-data.txt:860,搜「from moviepy.editor import VideoFileClip」)与第 899 段(text/04-ch01-chapter-1-loading-data.txt:899,搜「clip.subclip」)。补充(不在书里):MoviePy 官方的升级说明写明「到了 2.0 版本,moviepy.editor 这个命名空间已经不复存在」,改为直接从 moviepy 导入。来源:MoviePy「Updating from v1.X to v2.X」https://zulko.github.io/moviepy/getting_started/updating_to_v2.html(查阅于 2026-08-25);截取片段的方法在新版文档里叫 subclipped,来源:MoviePy「MoviePy in 10 Minutes」https://zulko.github.io/moviepy/getting_started/moviepy_10_minutes.html(查阅于 2026-08-25)。

  32. 出处:「Chapter 1. Loading Data」第 426 段(text/04-ch01-chapter-1-loading-data.txt:426,搜「Image.open(file_path」)。Pillow 里这个「打开图片」的动作,要它认的第一项不叫 file_path

  33. 出处:「Chapter 1. Loading Data」第 440 段(text/04-ch01-chapter-1-loading-data.txt:440,搜「images/Most_Used_Feature_Engineering_Techniques.png」)。紧接着这个变量被交给了「把 PDF 转成图片」的那段代码。

  34. 出处:「Chapter 1. Loading Data」第 735 段(text/04-ch01-chapter-1-loading-data.txt:735,搜「GPT-4V」)。同一本书其他地方一律写 GPT-4o

  35. 出处:「Chapter 1. Loading Data」第 359 段(text/04-ch01-chapter-1-loading-data.txt:359,搜「text-to-speech models」)。上下文明确在讲把音频转成文字,这里写反了。