神经文本压缩技能 v2 (Neural Text Compression)
把"语言模型预测分布 + 算术编码"这一压缩范式从玩具级升级到逼近 SOTA 的实现:
- 主预测器
GPT2Predictor:冻结的预训练小语言模型 (gpt2/distilgpt2) 逐 token 预测分布,
交给区间算术编码器 —— 即 LLMZip 思路。模型越大、训练越好,概率越准,比特越少。 - 兜底预测器
CharLMPredictor:原版在线字符级 LSTM,零额外依赖,无网络也能跑(但仅演示用,不逼近 SOTA)。 - 两种编码模式:
dist:直接用模型输出的完整概率分布做区间算术编码(LLMZip,信息论最优)。rank:只用模型给出的排名 (rank),配自适应频率表做经典算术编码
(AlphaZip 2024 思路:预测排名 + 经典编码器,对概率校准不敏感、更稳健)。
压缩与解压共用同一套(冻结或在线)轨迹,因此无损、字节级还原。
安全与边界
- 无损:解压后字节级还原(内置
self-test往返校验,dist/rank 两种模式均已验证)。 - 主路径依赖:
torch+transformers(CPU 即可跑gpt2)。 - 模型权重:
gpt2(~500MB) 在首次使用时从 HuggingFace 拉取。若网络受限: - 设置镜像源:
HF_ENDPOINT=https://hf-mirror.com再运行; - 或把已下载的模型目录放到本地,把目录路径直接传给
--model。 - 速度代价:逐 token 前向 + 算术编码是顺序的,1TB 文本用大模型压会非常慢(小时~天量级),这是神经方法的固有成本。
安装与发布
技能为自包含目录 neural-text-compression/,标准安装即整目录复制到 .codebuddy/skills/:
cp -r neural-text-compression /path/to/project/.codebuddy/skills/
或一键安装 Python 依赖并自检:
bash neural-text-compression/install.sh
# 依赖见 requirements.txt: torch / transformers / numpy
- 发布到 skillhub 时,直接打包整个
neural-text-compression/目录即可(含SKILL.md、scripts/、requirements.txt、install.sh)。 - 权重说明:
gpt2/distilgpt2在首次运行bench/compress时按需从 HuggingFace 拉取;无网环境自动退回 LSTM 兜底路径。
何时使用
- 用户要求"用神经网络/AI/大模型压缩文本"、"神经文本压缩技术"、"对比压缩算法"。
- 想演示 / 验证"语言模型即压缩器"这一范式(中文、英文、半结构化文本均可)。
- 压缩有语言规律、有重复模式的文本(散文、文档、日志、协议)——此时逼近甚至优于 gzip。
何时不使用(诚实边界)
- 天花板是香农熵:英文约 0.7–1.5 bits/字符。任何技术(含未来所有"涌现"方法)都压不到这之下。
- 高熵数据(随机字节、已压缩二进制、加密内容):任何压缩器都无法变小,NTC 还有模型头开销。
- 追求极限压缩:本实现默认用
gpt2(124M),是"逼近 SOTA"的入门级;要真正贴下限需更大冻结 LM(如 LLMZip 用的 Chinchilla-7B)。 - 超大文件且要快:优先
xz/gzip。 - LSTM 兜底路径不逼近 SOTA:它对高熵代码会膨胀(实测约 1.7x),仅用于无网络时的功能性演示。
用法
脚本位于 <skill-directory>/scripts/neural_compress.py:
# 压缩 (默认 gpt2 + dist; 也可 --model distilgpt2|lstm, --mode dist|rank)
python3 <skill-directory>/scripts/neural_compress.py compress <in.txt> <out.ntc> [--model gpt2] [--mode dist]
# 解压 (字节级还原)
python3 <skill-directory>/scripts/neural_compress.py decompress <in.ntc> <out.txt>
# 与 gzip / xz 对比压缩率
python3 <skill-directory>/scripts/neural_compress.py bench <in.txt> [--model gpt2] [--mode dist]
# 内置往返正确性自检 (默认走 LSTM 离线; 加 --gpt2 走 LM 路径, 需先拉权重)
python3 <skill-directory>/scripts/neural_compress.py self-test [--gpt2]
v3 路由编排技能(内容感知,超越均匀 LLMZip)
scripts/neural_compress_v3.py 在 v2 之上加了一个段级路由器,是"协作涌现"柱的具体落地:
- 内容感知分段:逐行分类(散文/代码/日志/数字),归并相邻同类行为同质段,按原始字符偏移精确切片(无损,边界换行符逐字节保留)。
- 每段贪心选最优算法:候选为
xz/gzip/gpt2_dist/gpt2_rank(均为无损);对每段挑压缩率最小者,整体存入自描述 NTC3 容器。 - 为什么能"超越均匀 LLMZip":均匀 LLMZip 对全文用同一模型;路由器对散文段用 GPT-2、对代码段用 xz,在混合语料上整体更小。压缩率仍受香农熵下限约束——路由器赢在"编排",不违反信息论。
> 实测教训(已写入代码):曾加入的 delta 数字编码,因"分隔符 R 编码开销"在文本上始终打不过 gzip 的 LZ77(后者对重复前缀更优),已从路由候选移除。v3 仅保留真正无损且互有胜负的方法。
用法:
python3 <skill-dir>/scripts/neural_compress_v3.py compress <in.txt> <out.ntc3> [--model gpt2] [--no-gpt2]
python3 <skill-dir>/scripts/neural_compress_v3.py decompress <in.ntc3> <out.txt>
python3 <skill-dir>/scripts/neural_compress_v3.py bench <in.txt> [--no-gpt2]
python3 <skill-dir>/scripts/neural_compress_v3.py self-test
NTC3 容器:MAGIC "NTC3" | version(1B) | n_segments(4B) | [method(1B)+len(4B)+payload]...,解码端据 method 同构还原。
如何"逼近 SOTA"——原理与证据
神经文本压缩的压缩率 = 语言模型给出的概率估计质量。LLM 预测越准,算术编码所需比特越少。
| 工作 | 时间 | 做法 | 水平 |
|---|---|---|---|
| gzip -9 | — | LZ77 + Huffman | 英文 ~2.5 bits/字符 |
| xz -9 | — | LZMA | 英文 ~2.2 bits/字符 |
| LLMZip | 2023 | Chinchilla-7B 当预测器 + 算术编码 | text8 熵下限估 ~0.709 bits/字符;enwik8 实测 ~1.31 bits/字符,比 gzip(2.18) 省约 40% |
| AlphaZip | 2024.9 | Transformer 预测排名 + 经典编码器压排名 | 报告优于经典信息论基线 |
| 本技能 (gpt2,124M) | — | GPT-2 预测器 + 区间算术编码 | 入门级逼近,弱于 7B 但优于玩具 LSTM |
> 结论:本技能把"玩具 LSTM"升级为"冻结 GPT-2 预测器 + 区间算术编码",实现了 LLMZip 范式;
> 通过 --model 换成更大模型可进一步逼近 SOTA。rank 模式对应 AlphaZip 的"预测排名 + 经典编码"思路,
> 在概率校准不佳时更稳健(实测与 dist 模式往返一致、体积接近)。
实测参考(诚实数据)
- 离线已验证:LSTM 路径(dist+rank)与本地随机小 GPT-2 集成(KV-cache + 头部 + 区间编码)均往返一致 ✅。
- 真实 gpt2 基准:需先拉取权重;在受限网络(拉大模型 blob 被 TLS 重置)的沙箱里无法实时跑,
请用上述命令在你本机/有网络的机器上执行bench,或参考上表 LLMZip/AlphaZip 的公开数字。 - 玩具 LSTM 的历史实测(仅供参考,体现"为何要升级"):
| 文本 | NTC(LSTM) | gzip | xz |
|---|---|---|---|
| 重复散文 29KB | 7.0% | 1.3% | 1.2% |
| 结构化日志 46KB | 5.3% | 8.2% | 3.7% |
| Python 代码 11KB | 57.5%(膨胀) | 39.7% | 38.5% |
输出格式 (.ntc, v2)
MAGIC "NTC2" | version(1B) | predictor(1B:0=lstm,1=gpt2) | mode(1B:0=dist,1=rank)
| total_exp(1B) | n_symbols(4B,uint32)
| [lstm: vocab_len(1B)+vocab字节+embed/hidden/nlayers(各1B)]
| [gpt2: model_name_len(1B)+model_name字节]
| 算术编码比特流
解码端据 predictor/mode/model 重建同构预测器,按相同轨迹逐符号解码还原。