KV Cache 缩小,能直接回答“同一份状态需要多少字节”。它不能直接回答“模型是否还能准确找回长文里的细节”。把省下的显存百分比当成质量结论,中间缺了一整套实验。
DeepSeek-V2 在 2024 年论文中提出 MLA,并报告其模型配置下的状态压缩与评测结果。这是具体架构和训练结果;不能把论文里的比例套到任意模型,再顺手继承论文的质量分数。DeepSeek-V2 论文
同一个模型身份,三种测量对象
容量测量要说明层数、缓存张量、精度、并行切分和实际分配。PPL 衡量给定语料上真实后续 Token 的平均负对数似然;检索题则检查模型能否从特定位置取回目标内容。前者较好,也不意味着所有长距离检索题都能答对。
图中的条形不代表实测高低。比较时需要固定模型权重、分词器、上下文设置和数据处理,否则你可能同时换了模型与测量口径。
下面使用人为指定的真实词元概率,以及三条教学检索结果,展示两个指标怎样计算。没有调用模型,也没有生成任何实际质量分数。
import math # 每个值是假设模型赋给“正确后续词元”的概率。 def perplexity(probabilities): if not probabilities or any(not 0 < p <= 1 for p in probabilities): raise ValueError("probabilities must be in (0, 1]") nll = -sum(math.log(p) for p in probabilities) / len(probabilities) return math.exp(nll) probs = [0.5, 0.25, 0.5, 0.25] assert math.isclose(perplexity(probs), math.sqrt(8)) retrieval = [ {"position": "early", "answer": "red", "expected": "red"}, {"position": "middle", "answer": "blue", "expected": "green"}, {"position": "late", "answer": "gold", "expected": "gold"}, ] correct = sum(r["answer"] == r["expected"] for r in retrieval) assert correct == 2 print("toy PPL:", round(perplexity(probs), 6)) print("toy retrieval:", correct, "/", len(retrieval))这里的检索采用严格字符串匹配。如果任务允许同义答案,需要预先确定评分规则,不能见到输出以后为某个模型放宽。题目里也应避免目标词在问题中泄漏,或者全文重复多次,让检索变成猜测。
长文本比较最容易漏掉的变量
同样的字数经过不同分词器会形成不同 Token 数。PPL 也受 Token 划分影响,直接比较不同分词器的 per-token PPL,通常无法得到公平的模型质量排序。长序列还可能被评测脚本截断,模型实际没有看到声称的全文。
检索至少要横跨多个长度、目标位置和干扰强度,并留下每条输入和输出。报告总准确率时,也应给出中间位置的失败情况。单次成功展示只能说明那一道题成功;小题集出现零失败,不等于真实业务没有风险。YaRN 论文也应作为具体长上下文方法的研究证据阅读,而非任意位置配置的通用质量保证。
容量、语言建模指标与任务结果最好并列保存。只有容量下降且目标质量门槛未被破坏,工程方案才完成了这部分论证。本文的离线示例只校验指标公式,没有测量 MLA 模型、GPU 内存或长文生成质量。