小叶整理完一次小组讨论,手里有逐字记录、几份附件,以及一串临时修改意见。第二天,同学要接着完成课程项目。小叶想用 AI 把这些材料整理成一页交接说明。
如果只看篇幅,这个任务很容易验收:原来十页,现在一页,确实短了。但同学读完之后,仍然不知道应该修改哪个版本,不知道预算是否已经确定,也不知道一句“可以使用外部图片”后面还有“需要先确认授权”的条件。这样的交接说明很短,却没有把工作交接出去。
另一种做法是把整个文件打成压缩包。它也可能变小,而且解压后每个字都还在。但同学仍然需要阅读十页材料,理解任务的负担没有随文件体积一起减少。
这两件事都叫压缩,却在解决不同的问题。一个要减少存储和传输的长度,一个要减少阅读和处理的负担。本章从严格可还原的编码开始,再走到允许舍弃细节的压缩,最后回到小叶的一页交接说明。我们要学会判断:变短之后,接收者还能够恢复什么,不能恢复什么,以及这些区别会怎样影响行动。
本章的小叶案例、概率、项目规则和时间数据均为虚构教学设定。压缩文件实验使用程序生成的材料,实测结果会单独标明,不能据此推断某种 AI 产品的能力。
一、先说清楚,要把什么变成什么
1.编码是建立对应关系
小叶要记录资料处理状态,先约定四种互斥状态:A 表示处理完成,B 表示等待补充材料,C 表示需要重新处理,D 表示取消处理。字母只是状态的名称;具体选择这四类,是当前记录任务的约定。
也可以用二进制表示:A 写成 00,B 写成 01,C 写成 10,D 写成 11。这里的二进制就是只使用 0 和 1 的表示方式。一位二进制数叫一个 bit;在本章的计算机存储语境中,一个字节由八个 bit 组成。
把状态变成二进制串,是编码。拿到二进制串,按照同一张对应表恢复状态,是解码。编码不一定减少长度,首先解决的是怎样表示。我们给教室编房间号,给文件设编号,给数据库字段规定格式,都在建立一种可被使用的对应关系。
例如收到 00011011,按照每两位分一组,就得到 00、01、10、11,恢复出 A、B、C、D。接收者需要知道这张表,也需要知道从哪一位开始读。没有规则,二进制串不会自己说明含义。
这件事看起来很基础,却解释了许多 AI 协作问题。小叶把“处理完成”统一简写为 A,自己当然觉得清楚,但新加入的同学或者新开启的 AI 任务,并不必然拥有同一张对应表。“我已经说得很简洁”与“接收方拥有足够的解释条件”,是两个需要共同满足的条件。
2.文件的原样恢复,与工作的正确延续
把原始对象记作 ,编码过程记作 ,解码过程记作 。如果所有允许输入都满足:
就能在这个对象范围内原样恢复。比如原对象是一份字节文件,那么恢复出的每个字节都应相同;原对象是状态序列,那么每个状态及其顺序都应相同。
因此,说一种处理“无损”,要接着说清楚恢复的对象。小叶把一篇文章删掉所有标点,如果只要求保留汉字序列,可能没有损失目标汉字;如果要求恢复原文件,就已经丢失了标点位置。如果原句是“已经完成?没有”,删掉标点甚至会改变读者对完成状态的理解。
同样,把两种不同的原始输入都编码成同一个结果,解码者就无法仅凭这个结果确定原来是哪一种。把“预算已确认”和“预算待确认”都写成“讨论了预算”,就是这种多对一合并。接收者能猜,但猜中与可恢复不同。
我们不需要因此追求所有文字永远原样保留。工作交接可能根本不需要每一次停顿、重复发言和闲聊。关键是先确定恢复目标,再判断删改是否合适。这个顺序让我们既能压缩,又不至于只靠字数来判断成功。
3.字、字节和 token,是不同的计量单位
“A”在 UTF-8 编码中占一个字节;“叶”占三个字节;“小叶”占六个字节。“小叶”有两个汉字,却不是两个字节。UTF-8 根据字符的码点使用不同长度的字节序列,具体规则见 RFC 3629 第三节。
AI 文本处理里还经常使用 token。可以暂时把它理解为特定分词或编码规则切出的处理单位。它可能对应一个词、一个字,也可能只是某个片段。没有指定具体的处理规则,就不能把一千汉字直接等同于一千 token。不同切分方式的例子可见 Hugging Face 分词算法说明。
这个区别的用途很具体。小叶想减少上传文件大小,应比较字节;想减少学生阅读量,可以比较字数和阅读时间;想控制某个模型的输入长度,应按实际使用的分词器计数。把表格压成一行缩写,字符可能变少,阅读难度却可能上升,token 数也需要实测。
先选对尺子,再谈节省。否则,一个指标上的改善很容易被误读成所有方面都变好了。
二、为什么常见内容可以写得更短
1.让高频状态使用短码字
现在给四种状态设定一个概率模型:
| 状态 | 概率 | 两位定长码 | 一组变长码 |
|---|---|---|---|
| A:处理完成 | 0.4 | 00 | 0 |
| B:等待补充材料 | 0.3 | 01 | 10 |
| C:需要重新处理 | 0.2 | 10 | 110 |
| D:取消处理 | 0.1 | 11 | 111 |
定长码每条都用两位。变长码让更常见的 A 只用一位,把较长的位置留给不常见的状态。每个状态对应的完整二进制串叫码字。
变长方案的平均长度为:
平均每条省下 0.1 bit,相当于定长正文的 5%。这个平均数不要求一条记录真的使用 1.9 位。一条记录仍使用一位、两位或者三位;把许多记录的长度加起来再平均,就可能得到小数。
构造四十条记录,其中 A 有十六条,B 有十二条,C 有八条,D 有四条。定长正文共八十位,变长正文共:
四条如果恰好全是 D,变长方案就需要十二位,比定长的八位更长。我们优化的是给定概率下的平均投入,并没有让每一种可能的文件都缩短。
2.不同长度怎样连续读取
接收方收到 0100111,怎样知道在哪里切开?
先读到 0,它就是 A 的完整码字,可以立即输出 A。接着读 1,还没构成完整码字;继续读 0,得到 10,输出 B。然后读到 0,输出 A。最后读到 111,输出 D。
所以这串二进制恢复为 A、B、A、D。我们在讲解时写成“0|10|0|111”,竖线只是帮助观察,真正发送时不需要额外发送这些分隔符。
能够这样读取,是因为这组码字中,任何完整码字都不是另一个码字的开头。0 后面不存在同样从 0 开始的其他码字;10 后面也不存在从 10 开始的更长码字。这样的编码叫前缀码,也常说无前缀歧义的编码。

图中的树把这件事画了出来。每读一位,就沿相应分支走一步;走到叶子,当前状态就确定了,再回到起点读取下一个状态。叶子之后没有继续通往其他状态的分支,所以不必猜“这个符号结束了没有”。
反过来看一组看似更省的安排:A 用 0,B 用 1,C 用 01。三个码字彼此不同,但收到 01 时,可能是一个 C,也可能是 A 后面接 B。单个标签不重复,还不足以保证连续记录可被唯一恢复。
可以通过增加分隔符、额外记录长度等方式解决,但新增内容也会占空间。我们关注的不是表面上能写出多短的标签,而是一整套能被可靠解释的表示方法。前缀码与唯一可解码的关系,可参阅 MIT 信息论讲义第六章第 6.2 节。
3.这棵树怎样设计出来
一种经典方法叫霍夫曼编码。我们不必先学复杂的数据结构,可以先手工完成一次。
把概率最小的 C 和 D 合成一组,概率为 0.3。现在剩下 A 的 0.4、B 的 0.3,以及组合 CD 的 0.3。再把两个 0.3 合并,得到 0.6;最后与 A 的 0.4 合并。
从最后一次合并往下画树:A 在第一层,B 在第二层,C、D 在第三层。给左右分支分别标上 0、1,就能得到表中的码字。等概率时存在选择余地,码字本身未必唯一,但可以取得相同的平均长度。
这里值得理解的动作是合并。两个较少发生的结果,共用前面的一段路径,在更深的位置才区分开。发生频繁的结果尽早被认出来,平均走的步数就能减少。
在已知有限符号分布、逐符号二进制前缀编码的设定下,霍夫曼方法取得最小平均码长。这个最优性限定了比较范围:没有把换一种记录对象、联合编码很多条记录、文件头开销或者运行时间一起包进来。理解这一层,已经足够看懂它的设计思想,不需要把本章变成算法证明课。
三、压缩的收益来自哪里,又在哪里遇到边界
1.熵给平均码长提供参照
上一章讲过,熵是按照概率加权的平均不确定性。当前四种状态的熵为:
我们的平均码长是 1.9 bit,略高于这个数。对于至少两种有正概率的有限符号,最优二进制前缀码的平均长度 满足:
这个结果说明,在这种编码设定下,存在接近熵的表示方法,同时平均码长不能任意降到熵以下。它不是说任何写着“无损”的文件工具,其输出都直接等于原文件的某个熵估计。编码对象、依赖关系和长度边界怎样处理,都需要先约定。上述界限见 MIT 第六章定理 6.6。
直观地说,一位只有两个分支,两位才有四条不同路径。要让某些状态更早结束,就必须为其他状态留下更深的路径。概率让我们知道,应把较短的位置优先留给谁。因为单条码字长度必须是整数,实际安排与理想的负对数长度未必刚好重合。
如果把一批记录当作一个整体编码,比较对象就变成整批的联合分布。批内还有规律时,单条状态频率并没有描述全部可利用结构。
2.相同的频率,可能有不同的压缩空间
小叶有两份由 A、B 组成的记录,都各有五十个 A、五十个 B。第一份严格交替排列;第二份由随机打乱得到。
对于第一份,传达“从 A 开始,重复 AB 五十次”这条规则,就足以恢复全部一百个位置,前提是接收者理解这套描述方式。我们不必逐位置发送。如果只知道第二份是五十个 A 和五十个 B,却不知道具体排列,仍然有很多顺序需要区分。
两份记录的单个字母频率完全一样,但可利用的顺序结构不同。因此,用字母频率算出的熵,并不自动成为整个文件的最终压缩极限。重复片段、前后依赖、固定格式,都可能提供额外的可预测性。
这也解释了为什么模板化文本常有压缩空间。重复出现的固定部分可以被引用,变化部分再单独记录。但“重复 AB 五十次”这句规则本身也要有一种双方理解的表示方式,不能把规则的成本当作凭空消失。
3.没有一种无损方法能让所有文件都变短
我们可以用一个很小的计数看懂这个限制。长度恰好八位的二进制串,共有 种。所有比八位短的串,即使把空串也算进去,总数只有:
如果要把二百五十六种输入都放进二百五十五种较短结果里,至少两种输入必须共用一个结果。解码时就无法区分它们。
所以,不可能存在一个固定规则,在不额外借用携带输入信息的外部存储或信号时,把每一种八位输入都无损缩短。对更长的固定长度输入,同样的计数道理继续成立。
这不是说压缩没有用,而是说它利用了输入的不均匀和结构。让常见材料明显缩短,允许某些材料保持原状或略微变大,仍然可以是一种非常好的方法。若声称任意文件反复压缩都能无限缩小,只需追问完整恢复规则和额外信息存放在哪里,这个问题就容易判断了。
4.附加开销会吃掉小批量的收益
回到四状态模型。假设变长方案相对于定长方案,每批额外需要十六位,用于一个简化的格式说明。十六位是本例人为设定的附加成本,双方共有的其他开销暂不比较。
一批 条记录,按模型计算,定长正文为 位,变长正文的期望长度加额外开销为 位。要让后者更小,需要:
四十条按既定比例构成的记录,变长正文七十六位,加上十六位后变成九十二位,超过定长的八十位。二百条按同比例构成时,变长总长三百九十六位,才略低于定长的四百位。

这里没有出现矛盾。正文确实压缩了,但完整方案是否节省,要看一次性投入分摊在多少记录上。你在经济学里见过的固定投入,在数据表示里又出现了。
同一个道理适用于小叶建立缩写表。为两句交接说明先写一大张术语表,可能更麻烦;同一张表在整个项目中反复使用,就可能值得。决定效果的既有压缩比例,也有复用次数,以及接收者能否稳定取得和理解这张表。
四、做一次真正的无损压缩实验
1.同样大小的输入,结果可以差很多
下面用 Python 自带的 zlib 模块压缩三份合成数据。没有学过编程也没关系,先看材料怎样构成,再看结果即可。
第一份只有两个英文字母 AI。第二份把“status=done”和换行重复一千次,每一行都是十二个字节,共一万二千字节。第三份用固定种子的伪随机生成器生成一万二千字节,使实验可以复现。第三份不是数学意义上的不可压缩证明,它只是供这个压缩器处理的一份合成输入。
Python 3.13.13、zlib 1.3.1、压缩级别为 6 时,本次实际运行得到:
| 合成材料 | 原始字节数 | 压缩后字节数 | 压缩后÷压缩前 |
|---|---|---|---|
| 两个字母 AI | 2 | 10 | 5 |
| 重复一千次的固定记录 | 12,000 | 61 | 约 0.00508 |
| 固定种子生成的字节串 | 12,000 | 12,011 | 约 1.00092 |
每一份都解压,并与原始字节逐一比较,三次比较均完全相同。可见无损压缩允许输出变大;决定无损的是能否原样恢复,不是每次都能缩小。
只含两个字母的材料太短,格式开销超过了可节省部分。高度重复的材料存在大量可以复用的模式,压缩非常明显。第三份没有被这个方法找到足够的节省空间,最终略微变大。
不同库版本、参数或输入会影响具体结果。这里值得记住的是比较方法:把完整输出算进去,实际解压检查,并把数据结构作为解释的一部分。
2.十行代码就能观察这件事
下面是核心实验。第二份材料里的“\n”表示换行,不是反斜杠和字母 n 两个普通字符。
import random
import zlib
rng = random.Random(20260907)
samples = [b"AI", b"status=done\n" * 1000, rng.randbytes(12000)]
for original in samples:
packed = zlib.compress(original, level=6)
restored = zlib.decompress(packed)
print(len(original), len(packed), restored == original)
其中 len 读取字节串的长度,compress 压缩,decompress 解压,最后一个比较检查恢复结果。压缩与解压接口、默认格式的头尾信息,可以查 Python zlib 官方文档。
这段实验也给我们一个很实用的评价原则:当目标是精确恢复,直接比较恢复结果,比只看“文件可以打开”更接近目标。一个文字文件可以打开,不代表其中每个日期、小数点和标点都没有改变。
对于 AI 摘要,逐字相同就不合适了,因为摘要本来就要改写和删减。此时需要换一把评价尺子,这正是下一部分的任务。
五、有损压缩:主动把若干种原样合并起来
1.量化就是只保留有限的档位
小叶测量六次材料处理所需的时间,记录为:
他想做一个很粗的耗时展示,预先约定所有输入都在零秒到一百秒之间,不含一百秒。把这个范围每十秒分成一档:零到不足十秒是一档,十到不足二十秒是一档,依次类推。边界十秒归入第二档。
发送时只发送所属档位,接收时用该档中点作为重建值。于是六条记录变成:
| 原始记录(秒) | 所属区间(秒) | 重建值(秒) | 重建值−原值(秒) |
|---|---|---|---|
| 9.8 | [0, 10) | 5 | −4.8 |
| 10.2 | [10, 20) | 15 | 4.8 |
| 14.7 | [10, 20) | 15 | 0.3 |
| 15.3 | [10, 20) | 15 | −0.3 |
| 24.9 | [20, 30) | 25 | 0.1 |
| 25.1 | [20, 30) | 25 | −0.1 |
这叫量化。接收者知道某个数落在什么区间,但无法从重建值十五秒中确定,原来究竟是十点二秒、十四点七秒,还是十五点三秒。
如果原来的存储对象就是这些精确到十分之一秒的记录,那么量化后已经丢失了一部分信息。重建值不是重新测量,也不是证明真实时间刚好等于区间中点;它只是协议选定的代表值。
2.少用多少位,允许多大误差
在这个预先约定的范围内,十秒一档共有十档。用固定长度二进制表示档号,需要四位,因为三位只能区分八种结果,四位可以区分十六种。
如果改为一秒一档,就有一百档,需要七位。接收时仍用区间中点,六个重建值为:
一秒方案每条档号比十秒方案多用三位,但单条误差的绝对值上限从五秒降到零点五秒。这里算的是档号正文,范围、步长、单位、条数等共享说明仍需另外约定或保存。
均方误差是一种常用的整体失真指标。记原值为 ,重建值为 ,共有 条,则:
误差先平方,再平均。较大的误差受到更重的影响;因为原单位是秒,均方误差的单位就是秒的平方。对本例,十秒量化的结果为:
一秒量化则为:

图中一秒方案更接近原记录。但请留意最后两条:十秒方案把门槛两侧的二十四点九秒和二十五点一秒,合并成相同的二十五秒。它们的数值误差都只有零点一秒,却可能改变接下来的分类。
3.什么叫损失,要由用途回答
假设小叶规定,耗时达到二十五秒就安排一次额外测试。原记录只有最后一条达到门槛;用十秒量化的重建值直接判断,最后两条都会触发。
如果用途只是给同学看“大概需要十几秒还是几十秒”,这点误差可能可以接受。如果用途是执行明确门槛,保留哪个区间就值得重新设计。
例如,只需要决定是否加测,可以直接保存“是否达到二十五秒”这个二元结果,一位就能精确记录本次规则下的决定。它比保存耗时档位更短,也不会混淆这个门槛,但不再保留具体耗时。以后若改用二十秒或三十秒的门槛,仅凭这一位就未必能作出判断。
所以,有损压缩不是简单地“准确率下降一点”。它选择保留某些区别,合并另一些区别。选择是否合适,要看下游需要区分什么。
数学中用失真函数 表达这种评价。平方误差是一个选择;是否把门槛两侧分错,是另一个选择。讨论在给定失真容忍度下,需要多少表示长度,就是率失真理论关心的问题。这里的“率”可以理解为每个样本平均占用多少 bit,而非错误率。量化、失真函数与表示长度的正式框架,见 MIT 信息论讲义第二十三章。
这套理论给我们的日常启发是:先确定重要误差,再考虑长度预算。它没有直接给出一个适用于所有 AI 摘要的统一公式,也不保证某个具体工具能够达到理论最优点。
4.精细表示也需要选择合适的位置
十秒方案的问题,还能从分档方式理解。九点八秒和十点二秒非常接近,却分到两个档,重建成五秒和十五秒;十四点七秒与十五点三秒也很接近,却被合并为十五秒。
分档边界会改变局部误差。缩小步长可以降低最大误差上限,但不能由此断言每一个具体样本的误差都严格变小。
比如把十秒一档改成五秒一档,本例六个重建值是七点五、十二点五、十二点五、十七点五、二十二点五、二十七点五秒。最大误差降到了二点四秒,均方误差也降到约五点二九六七秒的平方;但原来接近十五和二十五的四条记录,反而离新的代表值更远。六条的平均绝对误差从约一点七三三三秒升到二点三秒。
这个例子不是说细分没有用,而是帮助我们把“更多可用档位”与“当前这套具体重建规则”分开。允许更多表示选择时,最优方案总可以沿用旧方案;但我们手动换了一套中点规则,未必对每个评价指标、每条记录都更好。
将来看到低精度数值、模型量化等术语时,你已经有了一个可用的入口:更少的数值表示级别、不同的重建误差,以及这些误差怎样影响最终输出。具体模型还要处理数值分布和运算误差的传播,不能从这六个时间数据直接推断某个模型会损失多少能力。
六、压缩摘要时,我们究竟要保留什么
1.一份短摘要可能删掉了整个决定
回到开头的小组讨论。假设原材料明确记载了以下内容:
项目原计划制作十张海报。小叶提出把数量改成十二张,讨论后已确定采用十二张。预算上限三百元,按整批计算。交付时间为十月十八日十八点。学校标志使用附件中的第二版文件;海报排版使用第三版模板。外部图片可以列入候选,但正式使用前需要确认授权。印刷尺寸尚未确定,由小叶的同学向印刷方确认后补充。
这些日期与规则只属于本教学案例。
一份压缩后的摘要写道:“团队讨论并确定海报方案,小叶负责推进,近期完成交付。”
它与原材料主题相符,读起来也顺畅。但“近期”替代了确切截止时间,“海报方案”合并了数量、预算和版本,候选图片的条件与尺寸待定状态也被删掉了。接收者知道大家讨论了什么,却不知道下一步应该怎样执行。
此时失败的关键不是摘要缺少华丽细节,而是它把不同执行方案压成了同一种说法。十张和十二张都能被概括成“海报方案”;第二版标志和第三版标志也一样。接收者无法仅从这个结果恢复原来已确定的选择。
2.保留关系,比堆满关键词更有用
另一份摘要试图保留关键词:“海报、十二、三百、十八日、十八点、二版、三版、授权、尺寸。”
这些词出现了,但对应关系不清楚。三百是每张预算还是整批预算?二版属于标志还是排版?十八日是讨论日期还是交付日期?出现“授权”是已经取得授权,还是等待确认?
真正可执行的紧凑表示,应保留字段与关系:
| 内容 | 当前明确状态 |
|---|---|
| 制作数量 | 12 张,已确定;原 10 张方案已替代 |
| 预算 | 整批上限 300 元 |
| 交付 | 10 月 18 日 18:00 |
| 标志文件 | 附件第二版 |
| 排版模板 | 第三版 |
| 外部图片 | 可列候选;正式使用前确认授权 |
| 印刷尺寸 | 待同学向印刷方确认 |
表格没有保留每个发言,但保留了数量对应对象、金额单位、约束方向、版本归属,以及确定与待定的区别。对继续制作海报而言,这些关系比“讨论热烈、方案完善”更有帮助。
假设读者只想写活动回顾,则可能更关心为什么从十张改为十二张,讨论中考虑了哪些受众。刚才这张执行表未必满足那个用途。同一份原材料可以形成多种合适摘要,没有必要追求一份最短文本解决所有后续任务。
3.区分当前状态、历史理由与原始证据
小叶可以把材料分成三层。第一层是当前继续工作所需的说明;第二层保存关键决定及改变理由;第三层保留原记录和附件。
这三层不必都放进每次 AI 输入,但应当能按需要连接起来。比如执行说明写“数量十二张,已替代十张旧方案;决定见会议记录第三段”,接手者既能立即继续,也能在需要解释变化时找到来源。
这里使用编号和定位,是把部分信息留在外部,通过引用按需取得。它不等于一行文字神奇地容纳了完整原稿。要成立,来源必须实际保存,接收者必须能够访问,定位也需要对应正确版本。
如果原附件随后被覆盖,或者“第二版”在不同目录中指向不同文件,引用就失去了稳定含义。因此需要保留的未必是更长的正文,而可能是明确文件名、版本标记和定位。我们在编码部分说过的“双方使用同一张解释表”,在这里变成了共享材料与版本的一致性。
4.把语义损失变成可以检查的问题
评价摘要时,可以从后续工作倒推一组问题:制作多少张?预算按什么对象计算?何时交?使用哪个标志文件?哪些事项尚未决定?读原文和读摘要的人,能否在这些问题上得到相同答案?
如果原文对尺寸没有答案,合格摘要应保留“待确认”,而不是为了填满表格给出一个看似合理的尺寸。这里的正确恢复包括恢复不知道,而非只恢复已知事实。
为了教学,我们还可以做一个简单评分。假设当前只比较五个字段,其中截止时间、预算口径、版本各权重五分,另外两个普通描述字段各一分,总权重十七分。漏掉一个关键字段,损失五分;漏掉两个普通字段,损失两分。按字段数量看,后一份漏得更多;按当前项目重要性看,前一份更差。
这些权重是人为设定,不是自然规律。它的作用是把“我觉得这份摘要不行”具体化:究竟缺少什么,以及为什么这项缺失对本任务更重要。若某个条件一旦遗漏就会使成果无法使用,也可以直接将它列为必须通过的条件,不必把所有差异都平均成一个总分。
只评价保留率还不够,还要查有没有新增原文没有的决定、有没有把提议写成已确定、有没有把条件句改成无条件许可。这些错误可能在关键词都出现时仍然发生。摘要质量首先是关系和状态的质量,随后才是措辞与篇幅。
七、什么时候可以舍弃原始细节
1.对于特定问题,短表示可能已经足够
假设小叶检查了四份同类材料,分别记为通过或者未通过。只在这个小模型中,假设四次观察相互独立,通过概率都是同一个未知的 ,检查标准没有变化。
如果记录是“通过、未通过、通过、未通过”,出现这串结果的概率为:
如果记录改为“通过、通过、未通过、未通过”,概率仍然相同。对于“共有两次通过”的六种排列,每一种都具有相同的表达式。
当我们只想在这个模型下推断 时,四次中通过多少次,已经保留了与该参数有关的全部样本信息。记通过次数为 ,这个 就是一个充分统计量。样本量四也必须已知或保存。
“充分”是相对于参数和模型说的。它不表示从次数能还原原始顺序。知道 ,仍无法分辨六种排列;只是这些排列之间的区别,对当前模型中的 推断不再提供额外信息。独立同分布二元观察的次数统计,是教材中的标准例子,见 MIT 信息论讲义第三章第 3.1 节。
如果问题改成“后半段是否突然变差”,顺序立刻重要。“通过、通过、未通过、未通过”与交替出现就值得不同分析。这时不能一边研究时序变化,一边仍把固定同概率模型下的压缩结论照搬过来。
因此,信息损失不必然意味着当前任务受损。有时原材料中的许多区别,本来就与当前问题无关。我们需要的能力,是说明哪些区别不再需要,以及这个判断依赖哪些条件。
2.保留问题所需的区别
可以把这个思想写得更直观。假设我们最后只要从原材料 得到一个目标答案 。压缩后只留下 。如果存在一个读取方法 ,对所有允许材料都能满足:
那么短表示虽然未必能还原 ,却可以完整回答这个既定问题。
例如,只问一段记录里有多少条通过,保存总数就足够;只问是否达到二十五秒,保存门槛判断就足够。但若以后还要计算方差、定位最慢记录,或者检查最后几次是否退步,之前的表示可能不够。
这给摘要设计带来一个很好用的思考动作:列出后来可能提出的问题,再看压缩会不会把答案不同的材料合并起来。只要两份材料需要不同处理,却会形成完全相同的交接说明,这份说明就缺少区分它们的信息。
比如“预算三百元”与“预算上限三百元”不是同一条约束;“每张三百元”与“整批三百元”更会导致不同安排。删去这些短词节省不了多少篇幅,却把不同任务合并了。相反,一段重复三次的客套话可能占很多字,却不改变任何待办项。两类删减的价值相差很大。
3.整理可以更易用,但不能凭空恢复已丢失的事实
假设原记录 中有我们关心的事实 ,摘要 完全由原记录产生,过程中没有再获得关于 的额外线索。用上一章介绍的互信息,可以把这一限制写成数据处理不等式:
这说的是关于目标事实的可获得信息,不是说读摘要的人一定比读原文表现差。人在时间有限时,可能没有耐心从十页杂乱文字中找出三条决定;AI 在某个具体工作流程中,也可能因材料组织清楚而更容易完成任务。重新表示可以让已有信息更容易被使用。
因此,“摘要提高了完成效果”与“摘要没有从外部带来新事实”,可以同时成立。组织、提取和显化关系本身就有价值,无须声称它创造了原材料中不存在的证据。互信息的数据处理关系参见 MIT 信息论讲义第二章第 2.4 节。
但是,如果摘要已经删掉确切截止时间,后来仅凭这份摘要生成一个具体日期,那个日期可能只是依据常见安排作出的推测。增加解释和细节,可以让文本更完整,却不自动把推测变回原会议事实。
要补回事实,可以重新访问原记录,询问当事人,或者查阅另一个可靠的记录。那是引入了额外信息。外部资料和已有知识确实可能帮助理解,但应当知道结果来自哪里,而不是把“写得很像原稿”当成“恢复了原稿”。
4.连续摘要需要知道每一层放弃了什么
设想第一次摘要保留“外部图片需要确认授权”,第二次只保留“图片使用事项”,第三次只写“视觉方案已确定”。每一层都可能读起来通顺,但条件逐步被合并,最后连事项是否确定都发生了改变。
我们不必据此断言,做摘要的次数越多,质量就一定单调下降。一个已经压缩好的表示,再次使用同样规则,可能完全不变;第二次整理也可能纠正第一次的措辞问题。需要关注的是,每一步的输入还保有哪些信息,当前输出是否忠实于它,以及需要时能否回查原材料。
所以,长任务中的阶段总结可以保留当前目标、已确定条件、未解决问题、关键来源和接续位置。后续需要细节时再取回相应原文。这比把全部历史不断改写成越来越含糊的一段叙述,更容易检验,也更容易恢复工作。
这种做法同样不要求每一步都携带所有历史。重点是让压缩结果承担明确的工作,把细节放在可以找到的位置,并避免把“当前摘要未提到”误读成“这件事从未发生”。
八、练习与参考分析
练习一:试着当一次解码器
沿用 A→0、B→10、C→110、D→111。请恢复 0100111,并比较它与两位定长编码的正文长度。若改成 A→0、B→1、C→01,为什么码字各不相同仍然不够?
参考分析:
从左到右读,得到 0、10、0、111,所以是 A、B、A、D。这四个状态使用七位;定长编码每个状态两位,需要八位。本次省一位,不能把单次节省比例直接当作给定分布下的长期平均节省比例。
第二组收到 01,既可以解为 C,也可以解为 A、B。问题出在连续码字的边界。如果额外告诉接收者“这里只有一个状态”,可以确定为 C;但这个条数信息是额外条件,也应说明来源。若要编码任意长度的连续状态序列,仅靠这三个不同码字就不够。
这个练习迁移到文件命名也很直接。单个缩写不重名,不代表把许多缩写连在一起仍能无歧义识别。清晰边界、字段格式和共同约定,都是表示的一部分。
练习二:数据变了,旧编码还是好选择吗
状态概率改变为 A:0.1,B:0.2,C:0.3,D:0.4。小叶继续沿用旧码。请计算旧码的平均长度,并与定长码比较。如果重新把短码分配给高概率状态,能得到怎样的方案?
参考分析:
旧码平均长度为:
它比两位定长码还长。原来频繁的 A 变少了,原来不常见的 D 变多了,原先的资源安排不再匹配数据。
可以改成 D→0、C→10、B→110、A→111。新平均长度为:
这是对称变化后的相同优化问题。新码必须与接收者同步,不能一边使用新表发送,一边让对方沿用旧表解码。若需要发送更新说明,还应计算这项成本,以及新分布会持续多久。
如果数据只是短暂波动,频繁更换方案未必合算;若变化持续,大批量继续使用旧方案就会不断付出额外成本。这里既有概率估计问题,也有经济学中的调整成本,并不是“永远采用最短码”一句话就能决定。
练习三:只差零点一秒,还算重要吗
原始时间为二十四点九秒和二十五点一秒,两条都被重建为二十五秒。任务甲只判断是否位于二十到不足三十秒这一档;任务乙规定达到二十五秒要加测。分别分析信息损失对任务的影响,并提出一种更短但更有针对性的表示。
参考分析:
两条记录都属于二十到不足三十秒,任务甲的答案保留下来了。虽然原小数无法恢复,但当前分档问题没有因此答错。
任务乙原来应分别得到“不加测”和“加测”,压缩后的相同重建值却都触发加测。第一条被误分类。零点一秒的绝对误差很小,但分类规则恰好在这里切开,局部影响仍然显著。
若未来永远只需要这项判断,可以用一个 bit 保存“原记录是否达到门槛”。此时两条记录分别存 0 和 1。若未来还需要重新设门槛,这一个 bit 就不够。更灵活的办法可以是保留精确时间,或在重要门槛附近使用更细的分档,并评估额外表示成本。
不能只回答“多留小数位更好”,因为预算和用途都可能限制表示方式。需要回答的是,哪些差别必须被保留,以及通过什么表示能够保留。
练习四:把一段任务记录整理成可接续的短说明
另一个独立案例中,小叶的记录如下:
课程展示准备先做八页幻灯片。讨论后决定正文六页,另外保留两页备选,只在被问到时使用。数据来自资料包第二版第三张表,第三版资料包尚未核对。平均值的单位是每组,不是每人。展示暂定下周,具体日期等待课程通知。小叶先完成图表,文字部分由同学补充。
一份摘要写道:“小叶使用最新资料制作八页展示,下周交付。”请指出哪些区别消失了,写出更合适的短说明。
参考分析:
“八页展示”合并了六页正文与两页条件性备用;“最新资料”把已选用的第二版改成了可能指向第三版的模糊说法;“下周交付”把展示暂定时间和未确定日期写成了明确交付安排。单位与分工也没有保留。
可以写成:“正文六页,备选两页,仅在提问时使用;图表用资料包第二版第三表,第三版未核对;平均值按每组计。展示暂定下周,具体日期待通知。小叶完成图表,同学补文字。”
这份说明稍长,却能让接手者正确选择数据、解释单位和安排分工。它没有自行决定具体日期,也没有把未核对的新版本当作已确认来源。
如果用途只是给目录写一句主题介绍,更短的概述可以成立。但当前要求是继续完成展示,因此应该按接续工作所需信息验收。
练习五:两次压缩与直接压缩,结果会一样吗
采用十进制“最近值、恰好一半时向上”的舍入规则。原数为 14.9,先舍入到整数,再舍入到整十数,与直接舍入到整十数,分别得到多少?如果把摘要再进行无损文件压缩,能否恢复最初全文?
参考分析:
先到整数,14.9 变为 15;再到整十数,15 恰好在 10 和 20 中间,按约定向上,得到 20。直接到整十数,14.9 离 10 更近,得到 10。原数相同,处理路径不同,最终结果不同。
这说明连续有损处理可能受到上一层重建结果的影响。第二步接到的是 15,而不是 14.9,它已经不知道原数在中点的哪一侧。
但也不能推导出每重复一次一定继续损失。15 再按同样规则舍入到整数,仍是 15。这一操作在已有整数上不会继续改变数值。
摘要再做无损压缩,可以原样恢复压缩前的摘要文件。它不会补回摘要之前已删掉的全文信息。“最后一步无损”不等于“整条处理链对最初材料无损”。如果原稿单独保存在可访问位置,则可以另行取回;那是依赖原稿的保存,不是压缩包从摘要中恢复出了原稿。
练习六:平均数足够回答哪些问题
小叶只保留一组两次处理时间的平均数二十秒。原数据可能是二十秒、二十秒,也可能是十秒、三十秒。哪些问题还能准确回答,哪些不能?怎样设计一个小实验检查 AI 摘要的类似问题?
参考分析:
如果已知恰好两条记录,且平均数是精确保留的,那么总耗时四十秒可以确定。若还要回答是否有一条达到二十五秒,则两组数据答案不同,只知道均值不能判断。最大值和波动也不能确定。
这与前面充分统计量的讨论相通:短表示对某个问题足够,并不意味着对所有问题都足够。不能因为平均数很常用,就把它当成数据的完整替代。
可以自己写几段小型任务记录,每段包含一个明确决定、一个条件、一个待定项和一个来源定位。先依据原文写出参考答案,再让 AI 在规定长度内生成摘要,只根据摘要回答同一组问题。比较决定是否改变、条件是否丢失、未知是否被编成已知,以及来源还能否找到。
进一步改变压缩长度,观察错误怎样变化。某些信息可能在很短的摘要中仍被保留,某些容易在第一次改写时就被误解。这个实验能帮助你找到当前材料和工具的实际薄弱位置,而不是先假设字数越多一定越好。
由于参考答案来自你事先核对的原文,评价不会完全依赖同一次生成的自我判断。小实验得到的是这批材料上的观察,扩大到其他文体、其他任务时,需要重新检查是否仍适用。
九、把表示方式与任务目标一起设计
现在再看小叶最初的一页交接说明,选择已经不只是“压缩多少字”。
如果目的是完整归档,他需要保存原文件,并用能够原样恢复的方法减少体积。如果目的是让同学继续工作,他需要紧凑地保留目标、约束、状态、关系和下一步。如果目的是快速浏览,他可以先呈现主题与重点,再提供通往细节的入口。
这几种表示可以同时存在,各自承担一部分工作。一份短说明不必假装包含所有细节,一份原始档案也不必承担最容易阅读的职责。通过明确对应关系与来源,接收者可以在不同层次之间移动。
编码让我们看到,表示能否被理解,依赖规则与共同条件;概率让我们看到,压缩收益依赖实际数据结构;失真让我们看到,被合并的区别是否重要,取决于用途。这些认识最后汇集成一个很具体的问题:在有限的表示和处理预算下,怎样让后续真正需要的区别仍然清楚?
下一门课从向量与矩阵开始讨论另一类表示:怎样把对象的多个属性放进有结构的数学形式中,再进行比较和运算。它同样不是简单地把世界变成一串数字,而是要理解每个位置表示什么、哪些关系被保留,以及这种表示允许我们做什么。
资料与计算说明
本章用原创案例说明编码与任务表示,没有摘录来源中的长篇论述。前缀码与平均长度界限依据文中链接的 MIT 第六章,量化与失真框架依据第二十三章,充分统计量和数据处理关系分别依据第三章与第二章。UTF-8 的字节规则、zlib 接口与 token 切分依据对应官方资料。相关材料查阅日期为 2026 年 9 月 7 日。
计算脚本为 P12_check_and_plot.py,结果保存在 P12-results.json。实际核验包括一至七个状态的全部 21,844 种序列的编解码、概率改变后的平均长度、批量开销、字节与压缩结果、三种量化、门槛判断、连续舍入和二元观察的六种排列。三张图由同一组核验数据生成,PNG 与 SVG 均保存在本章图像目录。