这个想法的起点,其实是我最近在看开源的 Codex 和 DeepSeek Harness。看这些 agent harness 怎么组织工具、任务和模型,我一直绕不开一个问题:上下文到底该怎么管理?
现在已经有模型把上下文窗口做到了 100 万 token,但它依然是有限的。一个 agent 工作得越久,读过的文件、对话和中间结果就越多,不可能一直原样塞进去。把窗口做长是一种办法,检索和摘要也是办法。除此之外,语言本身能不能压缩?同样的内容,能不能换一种更省 token 的说法?
中文里正好有一个现成的例子,文言文。
我们今天读文言文会觉得费劲。它省主语,省连接词,很多时候连人物关系都要靠前后文去猜。同一个字放在不同位置,词性也会变。过去看,这些都是缺点。白话文把话说得更完整,读者不必在脑子里补那么多东西。
换个角度看,文言文只是把一部分工作留给了读者。句子里没有明说的主语和关系,要由人根据上下文自动补出来。大语言模型也许可以接手这部分工作:保存上下文时省掉能够推回来的成分,需要使用时再由模型补齐。过去由人承担的阅读负担,到了模型这里,可能正好换来更少的 token。
同样一段意思,假如文言文只用白话文六成或七成的 token,那么一个固定大小的上下文窗口就能多放不少材料。
我想先看看这件事在数字上是不是真的,于是做了一个很小的测试。
先算一遍 token
我比较了四种文本:古代文言原文、对应的现代汉语、普通英文,以及一种人为压缩过但仍然可以直接阅读的现代汉语。最后一种不是编码,也没有另外的码表,只是尽量少说废话。
比如《农桑辑要》里有一句:
楚汉相距于荥阳,米石至万。
现代汉语可以写成:
楚汉两军正在荥阳交战,米价上涨到每石一万钱。
再压缩一点,可以写成:
楚汉两军荥阳交战,米价每石涨至一万钱。
用 Qwen3 的 tokenizer 计算,这三句分别是 13、19 和 18 个 token。对应的英文是 27 个。
一句话可能只是巧合。我又从《论语》《世说新语》《农桑辑要》和《资治通鉴》中取了 3,299 对古文和现代汉语,换了四种 tokenizer 重算。古文比现代汉语少用了 25.2% 到 34.2% 的 token。不同 tokenizer 算出来的幅度不一样,但方向一样。四类文本分开统计,也是一样。
然后我做了 24 组四种文本的直接比较。古文比普通现代汉语少 30.1% 到 39.9%,比英文少 6.0% 到 38.4%,比那种已经压缩过的现代汉语还少 6.3% 到 15.0%。在这四种 tokenizer 里,古文的总 token 数都是最低的。
这里最让我在意的是最后那 6.3% 到 15.0%。现代压缩文已经尽量删掉了白话文里可省的成分,古文居然还能再短一截。这一截到底从哪里来?可能来自单音节词和更大胆的省略,也可能只是 tokenizer 恰好更熟悉某些常见古文片段。现在还分不清。
英文那组的波动也很明显。有的 tokenizer 下古文省得很多,有的只省一点。这说明压缩率不全是语言本身决定的,tokenizer 怎么切词也会直接影响结果。
我想到的不是让人重新写文言文
我感兴趣的是模型内部的上下文。给人看的文章当然应该清楚、顺畅,没有必要为了省几个 token 把它写得像古书。但模型读入的大量材料,未必都要保持原来的表达形式。
可以想象,在信息进入长上下文之前,先把它改写成一种更紧凑的自然语言。人名、数字和关系仍然保留,重复出现的主语和已经明确的背景则尽量省掉。需要回答问题时,模型再从这份紧凑文本里取信息。这样做和普通摘要不太一样,因为目标不是概括大意,而是用更短的句子保存原来的事实。
最后做出来的东西也未必是真正的古文。它可能更像现代汉语和文言之间的一种写法。现代人勉强能读,也不用另附一套码表。古文原文在这里更像一个参照物,它让我们看到自然语言到底能被压到多短。
当然,24 组文本太少,英文和现代压缩文也还需要其他人重新检查,看四种版本是不是确实表达了同样的内容。现在这些数字只能算一个开头。
下一步我想先把样本放大,然后做一件比较笨但可能很有用的事:把文言句里省掉的主语、虚词和关系词一点点加回来,看 token 是在哪一步涨上去的。这样才能知道省下来的部分究竟来自 tokenizer,还是文言本身的表达方式。
至于它最后能不能变成一种真的上下文压缩方法,现在说还太早。先把这条线继续测下去再说。
跳到正文

