第 13 讲:视觉语言模型与历史文献转写——CHURRO

Agentic AI · Lecture 13。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224V Fall 2026 Lecture 15(11/16 VLMs for Transcription)。 关于材料来源:这次课的幻灯片尚未公开。课程表的描述是:“历史手稿和印刷品的转写很难:古老的语言、特殊的版式、数字化的质量。用数据集和视觉语言模型的微调让历史文献变得可读。“本讲依据:CHURRO 论文(Semnani、Zhang、He、Tekgürler、Lam,CHURRO: Making History Readable with an Open-Weight Large Vision-Language Model for High-Accuracy, Low-Cost Historical Text Recognition,EMNLP 2025,arXiv 2509.19768);第一讲幻灯片对 CHURRO 的介绍;课程的项目说明页。 配套代码:code/lecture13/(只用 Python 标准库) 预计阅读时间:2.5 小时左右(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说明为什么历史文献的文字识别特别难:语言、文字、拼写、缩写、版式、阅读顺序、破损。
  2. 用编辑距离计算字符错误率(CER)、词错误率(WER)和 CHURRO 论文用的归一化 Levenshtein 相似度;解释规范化、“按原样转写”、按页平均这些评估上的选择。
  3. 比较两种技术路线:流水线式的 OCR(检测文字框 → 逐框识别 → 排序)和整页转写的视觉语言模型(VLM)。
  4. 描述 CHURRO-DS 是怎样从 155 个来源各异的语料库整理成一个统一的数据集的(选择标准、阅读顺序、纠错、按原样转写、去重、划分),以及 LLM 在数据整理中的作用。
  5. 解读 CHURRO 的结果:一个 30 亿参数的开源模型经过微调,为什么能在准确率上超过最好的商业模型,成本却低一个数量级;它的错误分析说明了什么。

0.2 先修知识

知识点用在哪里最低要求
第 1 讲第 1 节幻觉:模型认不出时会”编”;Agentic OS 的分层(数据接入在最底层)
第 6 讲第 2 节评估:字面匹配、标注约定、人工判断
第 11、12 讲第 5、6 节标注错误;“专门化的小系统”vs”通用的大系统”
基本的动态规划第 2 节不需要;第 2 节从头讲

0.3 本讲地图

第1节  动机:让历史可读;为什么难
第2节  怎样衡量转写的质量                              ← 代码 01
第3节  从 OCR 到视觉语言模型
第4节  阅读顺序与错误的种类                            ← 代码 02
第5节  CHURRO-DS:把 155 个语料库整理成一个数据集
第6节  CHURRO:微调一个小模型;结果、成本、错误分析
第7节  讨论与边界
第8–12节 小结、与项目的关系、练习、延伸阅读、下一讲预告

0.4 本讲的代码

本讲只写了”必要的”代码:训练或运行一个真实的视觉语言模型需要 GPU 和几 GB 的模型权重,玩具模拟也说明不了”微调为什么有效”。代码做两件事:01_measuring_transcription.py 把评估指标拆开来看;02_reading_order_and_errors.py 用一张虚构的两栏报纸和一张竖排页面,演示阅读顺序和各种错误怎样影响分数。读懂这两件事,才能读懂第 6 节论文里的数字。

关于本讲的数字:第 5、6 节的数字都来自 CHURRO 论文;代码演示的数字来自 01、02 号文件的实际输出(用的文字是虚构的)。


1. 动机:让历史可读

1.1 被锁在图像里的知识

书信、日记、政府档案、报纸——历史文献是了解过去的人怎样思考、经历了什么的第一手资料。过去二十年,图书馆和档案馆扫描了大量的历史文献,但扫描得到的是图像:不能搜索、不能被程序处理,很多还要专门训练过的学者才读得懂(古老的字体、手写体、已经不用的语言)。

在第 1 讲的 Agentic OS 架构图里,最底层是”数据接入”(ingestion):文本、表格、PDF、图像、手写、历史语言(CHURRO)。只有先把这些文献变成可靠的文字,上面的 SLIDERS、GRILL、DataSTORM 才能用它们做研究。CHURRO 就是这一层的组件。

1.2 为什么难

CHURRO 论文列出了现有模型读不好历史文献的原因:

难点例子
语言现代语言的历史变体(古高地德语、中古荷兰语)、已经不用的语言(拉丁文、梵文、奥斯曼土耳其语)
文字和书写方向14 种文字;从左往右、从右往左、竖排
拼写不统一同一份文献里同一个词有好几种拼法;长 s(ſ)这类今天不用的字母
缩写抄写员为了写得快大量缩写,中世纪文献里有成千上万种
字体与笔迹各种印刷字体(例如德文的尖角体);每个人的笔迹、每种书法传统都不同
版式页边批注、红字标题(rubrication)、彩饰(illumination)、多栏、竖排、不规则的文章边界
破损和扫描折痕、污渍、装订处的弯曲、扫描时多出来的桌面和尺子

手写文字的识别(HTR)比印刷体更难。

1.3 以往的做法

以往最好的做法是为每一批文献训练一个专门的模型:用逐行(甚至逐字)标注的数据训练,Transkribus、eScriptorium 等平台提供了标注和训练的工具。问题是标注数据是瓶颈:每换一批文献(换一种字体、一个抄写员)就要重新标注、重新训练。

另一方面,最近的视觉语言模型(VLM)有很强的零样本能力,但常用的 OCR 基准(DocVQA、OCRBench 等)都针对现代文档,大多是英文和中文、输出很短。它们在历史文献上表现如何,CHURRO 之前没有人系统地研究过。


2. 怎样衡量转写的质量

2.1 编辑距离

模型输出一长串文字,人工的标准转写也是一长串文字,怎样比较?最基本的度量是 Levenshtein 编辑距离(1965):把一个字符串变成另一个,最少需要多少次”插入一个字符、删除一个字符、替换一个字符”。

它用动态规划计算。设 d[i][j]d[i][j] 是”模型输出的前 ii 个字符”变成”标准答案的前 jj 个字符”的最少编辑次数:

d[i][j]=min⁡( d[i−1][j]+1,    d[i][j−1]+1,    d[i−1][j−1]+[ai≠bj] )d[i][j] = \min\big(\,d[i-1][j] + 1,\;\; d[i][j-1] + 1,\;\; d[i-1][j-1] + [a_i \neq b_j]\,\big)

三项分别是:删掉 aia_i;插入 bjb_j;把 aia_i 换成 bjb_j(相同就不用换,代价 0)。代码 01 演示 1 打印了模型把 receive 读成 recieve 时的整张表:

            r   e   c   e   i   v   e
        0   1   2   3   4   5   6   7
   r    1   0   1   2   3   4   5   6
   e    2   1   0   1   2   3   4   5
   c    3   2   1   0   1   2   3   4
   i    4   3   2   1   1   1   2   3
   e    5   4   3   2   1   2   2   2
   v    6   5   4   3   2   2   2   3
   e    7   6   5   4   3   3   3   2

编辑距离 = 右下角 = 2
一条最优的编辑路径:保留,保留,保留,替换(i→e),替换(e→i),保留,保留

时间是 O(n⋅m)O(n \cdot m)。一页几千个字符,就是几百万到几千万次运算——这也是为什么评估一个大数据集本身就要花不少计算。

2.2 三个指标

指标公式特点
字符错误率 CER编辑距离 / 标准答案的字符数OCR 研究最常用;输出比答案长很多时可以大于 1
词错误率 WER以”词”为单位的编辑距离 / 标准答案的词数一个字母错了整个词就错了,对字符错误更敏感
归一化的 Levenshtein 相似度1−编辑距离max⁡(两个字符串的长度)1 - \dfrac{\text{编辑距离}}{\max(\text{两个字符串的长度})}CHURRO 论文用的指标;总在 0~1 之间

代码 01 演示 2:一行虚构的 18 世纪证明信(126 个字符、22 个词),七种模型输出:

模型输出                         编辑距离     CER     WER   相似度
完全正确                             0     0.00    0.00    1.00
几个字符看错(ſ→f、o→ø)             2     0.02    0.09    0.98
把 ſ 都写成 s(现代化)              6     0.05    0.27    0.95
只转写了前一半                      63     0.50    0.50    0.50
编了一大段                         144     1.14    1.18    0.47
重复循环(退化)                   109     0.87    1.05    0.50
什么也没输出                       126     1.00    1.00    0.00
  • 两个字符看错,CER 只有 0.02,WER 却有 0.09:错的两个字符落在两个词里,这两个词就都错了。
  • “编了一大段”时 CER 是 1.14——比”什么也没输出”还差。CHURRO 论文选择除以较长的那个字符串,让每一页的分数都在 0~1 之间,一页灾难性的输出最多扣到 0,不会把整体平均拉成负数;这个指标约等于 OCR 研究常用的”字符识别率”(1 − CER)。

2.3 规范化:比较之前先统一写法

代码 01 演示 3:

  • Unicode 的写法:“café”里的 é 可以存成一个字符(U+00E9),也可以存成 e 加一个组合的重音符号(U+0301)。屏幕上一模一样,不规范化的话编辑距离是 2;NFC 规范化之后是 0。
  • 连字:印刷品里的”st”是一个字符,标准答案写成”st”。CHURRO 把连字和分数字符(¼ → 1/4)统一拆开。
  • 阿拉伯文:论文对阿拉伯文字额外规范化了元音符号和 hamza(用 PyArabic 工具包)。

这些规范化对所有模型的输出一视同仁,只是消除”同一个东西的不同编码”带来的假差异。

2.4 按原样转写 vs 现代化转写

历史文献的转写有两种传统:

  • 现代化转写:统一拼写、标点、大小写,把缩写展开,便于今天的读者阅读;
  • 按原样转写(diplomatic transcription):看到什么写什么,ſ 就写 ſ,缩写就保留缩写。

不同学术机构的版本遵循不同的规范。CHURRO-DS 统一采用按原样转写:模型只需要”转写它看到的东西”,不需要知道每个数据集各自的编辑规范。代码 01 演示 3 的最后一个例子说明了这个选择对评分的影响:模型把所有的 ſ 都写成了 s,按原样转写的标准,相似度是 0.952;如果评分时把 ſ 也规范化成 s,相似度变成 1.000——看不出模型改了原文。规范化做多少,本身就是评估设计的一部分。

2.5 按页平均

代码 01 演示 4:三页长度差很多的转写:

短信件         126 个字符   相似度 0.476
中等的一页     381 个字符   相似度 0.953
很长的报纸    1905 个字符   相似度 0.992
按页平均:0.807    拼在一起算:0.959

把所有页拼在一起算,长页面的权重大得多——一页报纸几乎决定了总分,读坏了的短信件几乎不起作用。CHURRO 论文按页计算相似度再平均,印刷和手写分开报告,还按语言分别报告——否则样本多的语言(英语、德语)会淹没样本少的语言。


3. 从 OCR 到视觉语言模型

3.1 流水线式的 OCR

传统的 OCR 系统(例如 Azure OCR)是一条流水线:

页面图像 → 检测文字框(每一行 / 每一块文字在哪里)→ 逐框识别文字 → 决定框的阅读顺序 → 拼成一页

优点是每一步都是专门的、可控的;缺点是错误会叠加:漏检了一个框,那一行就没了;排序错了,两栏就交错了(代码 02 演示 4,见第 4 节)。另外,训练这样的系统需要文字框级别的标注。

3.2 视觉语言模型

视觉语言模型(VLM)把图像也变成”词元”,和文字一起交给一个语言模型:

页面图像 → 切成小块(例如 28×28 像素)→ 视觉编码器把每一块变成向量 → 和文字提示词一起输入语言模型
        → 语言模型逐个词元地生成整页的转写

几个关键点:

  • 视觉和语言的对齐:CLIP、SigLIP 等用”图像—文字对”做对比学习,让图像的向量和描述它的文字的向量相近;LLaVA、Qwen-VL、InternVL 等再在此基础上做指令微调,让模型能按指令回答关于图像的问题;
  • 可变的分辨率:一页手稿常常有几千个字,必须用高分辨率才看得清。Qwen 2.5 VL 按图像的分辨率生成不同数量的视觉词元;CHURRO 训练时把图像限制在最多 5,120 个 28×28 的小块,使每个样本的图像词元加文字词元不超过 25,000 个;
  • 整页、端到端:直接输出整页的文字,不需要文字框的标注——这一点对数据很关键(第 5 节);
  • 语言模型的先验是双刃剑:它能根据上下文”猜”出模糊的字(这对破损的文献很有帮助),也可能在认不出字时编出一段通顺但不存在的文字(第 4 节)。

3.3 混合

一个自然的想法是结合两者:用 OCR 系统检测文字框和顺序,再让 VLM 逐框识别——每个框更小、输出更短,VLM 的任务更简单。CHURRO 论文评估了”Azure OCR + Gemini 2.5 Pro”的混合系统,结果不如它的两个组成部分(第 6 节)。


4. 阅读顺序与错误的种类

4.1 阅读顺序

CHURRO 把任务定义为输出整页的文字,按正确的阅读顺序。代码 02 演示 1 用一张虚构的 1853 年两栏报纸(标题横跨两栏,左栏本地新闻,右栏航运消息,底部一行小字启事),每一行有坐标:

按行排序(从上到下、从左到右)的前 160 个字符:
  THE RIVERTON GAZETTE. Saturday, June 4, 1853. LOCAL INTELLIGENCE. The new bridge over SHIPPING NEWS.
  Arrived, the brig Mary the river was opened on Tuesday last...
相似度:按行排序 0.447    先分栏再排序 1.000

按行排序时,每一个字都认对了,只是左右两栏一行一行地交错在一起——读者完全读不懂,相似度也只有 0.447。

演示 2 是一张竖排的页面(虚构的编年体文字),要从最右边一列读起:

正确的顺序(从右往左读列):永和三年春正月大雪三日民多冻死二月河水溢坏田庐数百家……冬十月筑城于北原
按从左往右读列:            冬十月筑城于北原秋八月蝗食禾稼……永和三年春正月大雪三日民多冻死
相似度:0.059(每个字都认对了)

列的顺序颠倒,冬天的事在前、春天的事在后,相似度几乎为零。

4.2 六种错误各扣多少分

代码 02 演示 3,同一页报纸(711 个字符):

完全正确                            输出   711 个字符   相似度 1.000
易混字母的 5% 看错(约 2% 的字符)  输出   711 个字符   相似度 0.982
漏掉底部的小字启事                  输出   639 个字符   相似度 0.899
两栏交错(阅读顺序错)              输出   711 个字符   相似度 0.447
编造了一篇看似合理的文章            输出   271 个字符   相似度 0.274
写到一半开始重复循环                输出   955 个字符   相似度 0.550

几类错误的代价差别很大:

  • 字符级的错误(形状相近的字母:e/c、u/n、o/ø)扣分很少,但常常落在人名、地名上——偏偏是研究者最关心的信息;
  • 漏掉小字(页边批注、启事)扣分不多,但信息丢了;
  • 阅读顺序错误、编造(幻觉)、重复循环(退化)是灾难性的。

4.3 流水线的错误叠加

代码 02 演示 4 模拟了一条流水线(每个框有 3% 的概率被漏检,每个字母有 2% 的概率识别错),只改变排序方法,各模拟 20 页:

流水线:漏检 3% + 识别错 2% + 按行排序        平均相似度 0.449
流水线:漏检 3% + 识别错 2% + 先分栏再排序    平均相似度 0.960
流水线:识别错 2% + 先分栏再排序(不漏检)    平均相似度 0.994

识别做得再好,排序错了就全盘皆输;漏检一个框又会再扣几个点。真实的版面比这复杂得多:跨栏的文章、插图、不规则的文章边界——“先分栏再排序”这样的规则很快就不够用了,这正是整页、端到端的 VLM 的优势所在。


5. CHURRO-DS:把 155 个语料库整理成一个数据集

CHURRO 最大的贡献之一是数据:CHURRO-DS,迄今最大、最多样的历史文献文字识别数据集。(CHURRO 是 Collection of Historical Unified Resources for Robust OCR 的缩写。)

5.1 规模

  • 统一了 155 个历史语料库(作者调查了过去二十年的 NLP、计算机视觉和人文学科文献,找到 153 个包含页面图像和对应转写的语料库,另外自己转写了第一个公开的奥斯曼土耳其语手写数据集,并发布了第一批公开的波斯语和土耳其语历史 OCR 数据集);
  • 99,491 页,分印刷和手写两部分;
  • 46 个语言簇(其中 29 个出现在验证集和测试集里),14 种文字,3 种书写方向;
  • 从公元前 3 世纪到 20 世纪,跨越 22 个世纪:报纸、书籍、手写日记、政府档案等。

(第一讲幻灯片说”45 种语言”,论文和项目说明页说”46 个语言簇”;以论文为准。)

5.2 选择标准

  1. 文献必须早于 20 世纪中叶;
  2. 许可证允许研究使用;
  3. 必须有人工标注的、覆盖整页的标准转写。

排除了远程监督的数据(例如自动对齐得到的转写)。很多数据集只有字、词或行级别的标注——只要能拼回整页的文字,也收进来。

这里有一个关键的洞察:很多数据集原本是人文学者为了研究而转写的,从来没被用来训练 OCR——因为它们没有文字框的标注,而传统 OCR 需要文字框。CHURRO 把任务定义成”整页图像 → 整页文字”,这些以前用不上的资源就都能用了。任务的定义决定了哪些数据可用。

5.3 整理

来源各异的数据集格式、规范都不同。目标是让每一页的输出字符串(1)按正确的阅读顺序,(2)尽可能准确,(3)尽可能忠实于图像(按原样转写)。做法是”LLM 自动处理 + 人工核查”:

问题做法
语言和文字的元数据很多数据集没有标注语言,或者一个数据集里混着多种语言。用 ISO 639-3(7,916 种语言和历史变体)按宏语言归成”语言簇”,用 VLM 根据每个簇的描述和例子判断每一页的语言,再人工抽查;文字按 ISO 15924 分类
阅读顺序把 ALTO XML、PAGE XML、JSON、纯文本等格式统一成一个字符串。版式简单(单栏、双栏)的数据集写专门的启发式规则;复杂的版式让 VLM 决定阅读顺序,再人工抽查——超过 98% 的阅读顺序是对的
准确性发现 16 个数据集有标注问题(例如漏了页面顶部的文字、频繁的转写错误)。用 Gemini 2.5 Pro 根据图像和文字框提出修改建议,作者逐一审核
忠实性统一为按原样转写;排除严重现代化、无法恢复原貌的数据集。用 VLM 根据图像做最小的修改,恢复空格、换行和变音符号——修改前后的字符编辑距离都在 5% 以下,每个数据集都人工抽查
规范化统一分数字符和连字

这和前几讲反复出现的模式一样:LLM 是整理数据的有力工具,但必须有人工核查(第 9 讲 SLIDERS 的对账、第 11 讲 InsightBench 的标注错误)。

5.4 准备与划分

  • 去掉不到 30 个词元的页面(章节分隔页、扉页);
  • 用 MinHash 找出近似重复的页面(数据集本身的错误,或者同一批图像被多个数据集重复使用),去掉了约 15,000 页;
  • 把大图像缩放到 2500×2500 像素以内,保持长宽比;
  • 均衡的验证集和测试集:每个语言簇、每种类型(印刷 / 手写)随机抽 60 页,一半验证、一半测试;其余的做训练集。结果是 97,151 页训练、1,170 页验证、1,170 页测试。只有 29 个语言簇的样本足够进入验证集和测试集。

训练数据极不均衡:印刷的中文只有 6 页训练样本,手写的葡萄牙文只有 12 页。


6. CHURRO:微调一个小模型

6.1 模型和训练

CHURRO 是在 CHURRO-DS 的训练集上微调 Qwen 2.5 VL(30 亿参数)得到的。选它的原因:小、零样本的 OCR 能力强、能处理高分辨率和各种尺寸的图像——这些都是处理多样的版式所必需的。

训练设置:5 个 epoch,32 张 H100 GPU,有效批大小 128,大约 25 小时;学习率 5×10−55\times10^{-5},余弦退火。整篇论文(包括微调和所有开源模型的推理)用了大约 6,000 个 H100 GPU 小时。只用了标准的监督微调(第 14 讲)。

6.2 结果

评估了几乎所有主流的模型:OpenAI 的 GPT-4o 到 GPT-5 系列和 o 系列、Anthropic 的 Claude Sonnet 3.7 到 Opus 4.1、Google 的 Gemini 2.5 Flash 和 Pro;十几个开源的 VLM(包括专门做页面 OCR 的 olmOCR、NuMarkdown 等);两个 OCR 系统(Azure OCR、Mistral OCR);以及上面说的混合系统。所有模型用同一个提示词,贪心解码。

测试集上的平均归一化相似度(%,论文表 1、表 2):

系统印刷手写
CHURRO(3B,微调)82.370.1
Gemini 2.5 Pro(最好的商业模型)80.963.6
Gemini 2.5 Flash73.758.7
GPT-560.730.4
Claude Opus 4.166.640.2
Qwen 2.5 VL(3B,零样本,即 CHURRO 的起点)67.842.9
Qwen 2.5 VL(72B,零样本)66.354.5
NuMarkdown(8B,专门做 OCR 的开源模型)72.751.2
Azure OCR(流水线)71.947.7
Azure OCR + Gemini 2.5 Pro(混合)52.640.4
理想的集成(每页取所有系统里最好的)88.976.3

几个值得注意的地方:

  1. 微调一个小模型,超过了所有的大模型:CHURRO 比它的起点(零样本的 Qwen 2.5 VL 3B)在印刷品上高 14.5 个点、手写上高 27.2 个点。和 Gemini 2.5 Pro 相比,在 18 种印刷语言里的 12 种、21 种手写语言里的 18 种上更好。微调收益最大的是印刷的日文(+37.0)、芬兰文(+32.9)、瑞典文(+22.9),手写的希腊文(+62.6)、日文(+54.7)、土耳其文(+42.3)、希伯来文(+42.1)、波斯文(+36.8)。
  2. 模型越大不一定越好:同一家族里,3B 的 Qwen 2.5 VL 在印刷品上超过了 72B 的版本;GPT-4.1 和 GPT-5 家族里 Mini 版本也比大版本好。通用的大模型并没有为这个任务优化。
  3. 专门做 OCR 的开源模型在开源模型里最好(印刷品上 NuMarkdown 72.7%、olmOCR 69.8%),但离 CHURRO 还很远。
  4. 流水线 OCR 被多个 VLM 超过;混合系统比它的两个组成部分都差,在每种语言上都不如其中之一。
  5. 数据决定上限:印刷的历史中文是最难的——CHURRO 只有 6.2%(训练集只有 6 页),最好的单个系统也不到 10%,连”理想的集成”也只有 14.4%。这些页面有很多是两页的报纸,竖排、文章边界不规则、夹杂着拉丁字母。手写的梵文、高棉文、希伯来文也很难,理想的集成分别只有 26.1%、32.9%、59.1%。
  6. 理想的集成(每页挑所有系统里最好的那个)比 CHURRO 高 6~7 个点,说明不同的系统擅长不同的页面,组合起来还有提升的空间——但你需要知道哪个输出最好,这本身就是一个难题。

6.3 成本

论文估算,CHURRO 在准确率超过 Gemini 2.5 Pro 的同时,成本效益高 15.5 倍。闭源模型的价格按提供商的批处理折扣(五折)计算;开源模型的成本按 olmOCR 论文的方法估算(在自己的 GPU 上用 vLLM 推理)。第一讲幻灯片的说法是”比 Gemini Pro 便宜 15.5 倍、准确率相近”;课程项目说明页的说法是”成本只有最好的商业模型的 0.6%“——这是不同的估算方法得到的数字。成本的估算依赖于假设(GPU 的价格、吞吐量、是否用批处理),读这类数字时要看清它的前提。

为什么便宜?30 亿参数的模型可以在一张 GPU 上高效地推理,而且可以自己部署——这对档案馆和图书馆很重要:数据不用发给外部的服务,几百万页的文献也负担得起。

6.4 错误分析

作者从测试集里抽了 50 个预测,人工比较零样本的 Qwen 2.5 VL(3B)和 CHURRO:

错误零样本 Qwen 2.5 VL(3B)CHURRO
严重的阅读顺序错误(最常见:栏的顺序;东亚文字的书写方向)42%16%
严重的幻觉(认不出字,就写一段”看起来合理”的内容)36%0%

一个典型的幻觉:一封 18 世纪的荷兰文信,零样本的模型正确地认出了”这是一封信”,但读不出内容,于是输出了”Dit is een brief”(“这是一封信”)。

其他发现:

  • 标准答案也有错:50 个样例里有 2 个的标准转写漏掉了页面的一部分(来自原始数据集的错误,清洗时没发现)——和第 11 讲 InsightBench 的教训一样;
  • 小错误:形状相近的字符混淆(ø 读成 o),常常发生在人名上(把 Suso 读成 Süss);
  • 扫描质量:装订在书里的信件,靠近书脊的地方纸面弯曲,错误集中在那里;
  • 重复退化:零样本的模型有时会开始不停地重复同一段文字(论文附录里有 19 世纪德文信件和拉丁文手稿的例子)。

微调的收益很大一部分来自减少灾难性的错误(顺序、幻觉),而不只是把每个字认得更准——回想第 4.2 节的表格,这两类错误的代价最大。


7. 讨论与边界

7.1 专门化的小模型 vs 通用的大模型

CHURRO 是这门课反复出现的一个主题的又一个例子:在一个定义清楚的任务上,有好的数据,一个专门化的小系统可以超过通用的大模型,而且便宜得多。第 4 讲的 VERDICT 用定理证明器、第 9 讲的 SLIDERS 用数据库、第 10 讲的 Genie 用运行时——这些是用结构来专门化;CHURRO 是用数据和训练来专门化。第 14 讲会讨论训练的另一种形式:把一个复杂系统的能力”蒸馏”进一个小模型。

代价是:专门化的模型只擅长它被训练的任务;数据少的语言(印刷中文)仍然很差。数据是真正的护城河——CHURRO-DS 的整理工作可能比微调本身更重要。

7.2 第一稿,而不是最终稿

论文的结论里说:即使不完美的输出,也可以作为学者校对的第一稿,大大减少转写的工作量;也能让没有受过专门训练的读者读到这些文献。这和第 4 讲的”可问责”、第 10 讲的”确认”是同一种思路:在高风险的场合,AI 的输出交给人核查,而 AI 的价值在于让人的工作快得多。

7.3 局限

  • CHURRO-DS 仍然有语言不均衡的问题,没有任何非洲大陆的本土语言——这反映了很多低资源语言缺乏标注好的历史数据;
  • 只尝试了标准的监督微调,更好的训练方法留给未来的工作;
  • 课程项目说明页指出了一个具体的方向:今天没有任何 VLM 能处理 19 世纪到 20 世纪初排版的中文报纸,自动合成训练数据来教 VLM 处理这类报纸是一个特别有吸引力的方向(练习 5)。

7.4 本讲代码的边界

本讲的代码只演示指标和错误的种类,用的文字都是虚构的,没有模拟模型本身。第 6 节的结论(微调为什么有效、成本为什么低)完全来自论文,代码不能验证它们。


8. 本讲小结

  1. 历史文献难读:古老和已经不用的语言、14 种文字和 3 种书写方向、不统一的拼写和大量缩写、多样的字体和笔迹、多栏和竖排的版式、破损和扫描问题。以往为每批文献训练专门的模型,标注是瓶颈。
  2. 怎样评分:编辑距离(动态规划)→ CER、WER、归一化的 Levenshtein 相似度(除以较长的字符串,每页的分数在 0~1 之间);比较前做 Unicode、连字、分数字符的规范化;统一采用按原样转写;按页平均、按语言报告。
  3. 阅读顺序是整页转写的核心难点:每个字都认对了,顺序错了分数也会大跌(两栏交错 0.447,竖排顺序颠倒 0.059)。阅读顺序错误、幻觉、重复退化是代价最大的三类错误。
  4. CHURRO-DS:155 个语料库、99,491 页、46 个语言簇、22 个世纪;把任务定义成”整页图像 → 整页文字”,让人文学者的转写第一次可以用来训练;LLM 整理 + 人工核查(阅读顺序 98% 以上准确)。
  5. CHURRO:微调 30 亿参数的 Qwen 2.5 VL,印刷 82.3%、手写 70.1%,超过最好的商业模型 Gemini 2.5 Pro(80.9%、63.6%),成本效益高 15.5 倍;错误分析中阅读顺序错误从 42% 降到 16%,严重幻觉从 36% 降到 0%。数据少的语言(印刷中文只有 6 页训练数据)仍然很差。

9. 与项目的关系

  • 如果你的项目要处理扫描件、PDF、图像里的文字,先单独评估这一步:转写错了,后面的检索、抽取、推理都建立在错误之上。抽几页人工转写,用本讲的指标算一下。
  • 评估设计要有意识地做选择:规范化做多少、按页还是拼在一起算、是否按类别分别报告。这些选择会改变结论。
  • 如果现成的模型在你的数据上不好,考虑微调一个小模型:先看看有没有可以”变废为宝”的现成标注(像 CHURRO 那样换一种任务定义),再考虑合成数据。
  • 项目方向:19 世纪中文报纸的转写(合成训练数据);把 CHURRO 接到 SLIDERS / GRILL 上,在历史档案上做深度研究。

10. 练习

练习 1(动手:分栏的阈值)。column_aware 用”相邻两行的 x 坐标相差超过 gap 就是新的一栏”来分栏。把 gap 改成 400 和 100,分别是多少?什么样的真实版面会让这种规则失效?

参考答案

实测:gap = 400 时相似度 0.447(和按行排序一样)——两栏的 x 坐标只差 280,被当成了一栏,栏内按 y 排序,左右两栏的行又交错在一起;gap = 100 时 1.000。这个规则依赖于”栏间距”这个参数,而不同的报纸、不同的扫描分辨率,栏间距都不一样。真实的版面还有更多让规则失效的情况:一篇文章跨两栏、栏宽不一致、插图打断了栏、文章边界不是矩形(论文说历史中文报纸就是这样)、页边批注、竖排和横排混排。这正是 CHURRO-DS 对复杂版式改用 VLM 判断阅读顺序(再人工抽查)的原因,也是整页端到端的模型比”检测 + 规则排序”的流水线更有前途的原因。

练习 2(动手:三个指标对错误的敏感度)。把 02 号文件演示 3 里易混字母的错误率从 5% 改成 20%、50%,比较相似度、CER、WER。如果转写的用途是”让人阅读”和”让程序按人名检索”,你更关心哪个指标?

参考答案

实测(711 个字符的报纸页):

易混字母的错误率相似度CERWER
5%0.9820.0180.088
20%0.9420.0580.240
50%0.8400.1600.624

WER 涨得最快:字符错误分散在不同的词里,每个词只要错一个字母就算错。给人阅读时,零星的字符错误人能自动纠正,CER / 相似度更能反映可读性;按人名、地名精确检索时,一个字母错了就搜不到,WER(或者专门统计专有名词的准确率)更能反映可用性。指标要和用途对应——这也是第 5、11 讲反复强调的。

练习 3(动手:按页平均 vs 拼在一起算)。把 01 号文件演示 4 的三页换一下:短信件完全正确,中等的一页不变,很长的报纸只转写了前三分之一。按页平均和拼在一起算分别是多少?和原来的结果比较,你能得出什么结论?

参考答案

实测:三页的相似度分别是 1.000、0.953、0.333;按页平均 0.762,拼在一起算 0.466。原来(短信件很差、长报纸很好)是按页平均 0.807、拼在一起 0.959。

两种算法对”哪一页做得好”的敏感度完全不同:拼在一起算几乎只看长页面。如果你的系统在长页面上容易出问题(例如重复退化、超出上下文),拼在一起算会把它放大;按页平均则让每一页同样重要。CHURRO 选择按页平均,是因为每一页文献对研究者同样重要,而不是”字多的页更重要”。没有绝对正确的选择,但必须说明你用了哪一种。

练习 4(思考:为什么一个 3B 的模型能赢)。CHURRO 只有 30 亿参数,却在平均分上超过了 Gemini 2.5 Pro、GPT-5 这些大得多的模型。结合第 6 节的结果,解释原因;再说说在哪些情况下它没有赢,为什么。

参考思路

赢的原因:(1) 任务匹配的数据:近 10 万页历史文献,覆盖了通用模型训练时很少见到的字体、手写体、语言、版式;(2) 一致的输出规范:训练数据统一为按原样转写、正确的阅读顺序,模型学会了”转写看到的东西”,而通用模型可能会顺手现代化拼写、展开缩写、跳过它认为不重要的部分;(3) 减少灾难性错误:阅读顺序错误从 42% 降到 16%、严重幻觉从 36% 降到 0%,这两类错误代价最大;(4) 通用模型的能力分散在成千上万种任务上,没有为这一个任务优化(同一家族里大模型不一定比小模型好也说明了这一点)。

没赢的地方:印刷的中文(只有 6 页训练数据,6.2% vs Gemini 2.5 Pro 的 6.6%,大家都很差)、手写的阿拉伯文(77.5 vs 87.0)、波斯文(78.0 vs 81.6)、挪威文(79.7 vs 87.7)。数据少或者通用模型本身就很强的语言,微调的优势就小甚至没有。结论:微调的收益来自数据,没有数据的地方,小模型也没有魔法。

练习 5(思考:设计一个合成数据的流水线)。课程项目说明页提到:“今天没有任何 VLM 能处理 19 世纪到 20 世纪初排版的中文报纸。“假设你要用合成数据教一个 VLM 处理这类报纸,你的流水线是什么样的?有哪些风险?怎样评估?

参考思路

一个可能的流水线:(1) 文字来源:收集那个时代的中文文本(已经数字化的古籍、报刊全文库),保证用字、用词符合时代;(2) 版面生成:程序化地生成报纸版面——竖排、从右到左、不规则的文章边界、栏线、标题字号、夹杂的拉丁字母和数字、广告;用接近当时的字体渲染;同时得到标准答案(按阅读顺序的文字);(3) 退化:模拟纸张泛黄、墨迹洇开、折痕、扫描的倾斜和弯曲、低分辨率;(4) 训练:先在合成数据上训练,再用少量真实的人工转写页面微调。

风险:合成和真实之间的差距(合成的版面太规整、退化不像真的,模型学到了合成数据的”捷径”);文字来源的分布和真实报纸不同(新闻用语、广告用语);评估如果也用合成数据,会严重高估效果。评估必须在真实的、人工转写的页面上做,按页报告、单独报告阅读顺序的错误率,并且像 CHURRO 一样做人工的错误分析(顺序、幻觉、字符混淆)。


11. 延伸阅读

课程相关

  • Semnani、Zhang、He、Tekgürler、Lam. CHURRO: Making History Readable with an Open-Weight Large Vision-Language Model for High-Accuracy, Low-Cost Historical Text Recognition. EMNLP 2025. arXiv 2509.19768. 数据集、模型、代码:github.com/stanford-oval/Churro;在线演示:history.genie.stanford.edu

背景

  • Levenshtein. Binary codes capable of correcting deletions, insertions, and reversals. 1965(俄文原文 1965,英译 1966)。
  • Radford 等. Learning Transferable Visual Models From Natural Language Supervision(CLIP). ICML 2021.
  • Liu 等. Visual Instruction Tuning(LLaVA). NeurIPS 2023.
  • Bai 等. Qwen2.5-VL Technical Report. 2025.
  • Poznanski 等. olmOCR: Unlocking Trillions of Tokens in PDFs with Vision Language Models. 2025.
  • Blecher 等. Nougat: Neural Optical Understanding for Academic Documents. 2024(CHURRO 的评估方式沿用了它的做法)。
  • Kahle 等. Transkribus(2017);Kiessling 等. eScriptorium(2019):历史文献转写的平台。

12. 下一讲预告

CHURRO 用的是”监督微调”:拿一个已经训练好的模型,在专门的数据上再训练一下。这只是训练 LLM 的最后一小步。第 14 讲从头讲起:

  • LLM 是怎样训练出来的:预训练(预测下一个词)、指令微调、偏好对齐、推理模型的强化学习;
  • 训练数据:从哪里来、怎样筛选、合成数据;s1 只用 1,000 个精心挑选的样本就训练出一个强推理模型;
  • 蒸馏:把一个大模型、一条复杂流水线的能力,压缩进一个又小又快的模型(例如把 WikiChat 的多阶段流水线蒸馏进一个模型);在线策略的自我蒸馏(OPSD)。
  • 代码:用纯 Python 训练一个迷你的语言模型——看它怎样从”续写”变成”回答问题”,再把一条”慢而准”的流水线蒸馏进它。
← 返回课程目录