LongCodeZip: Compress Long Context for Code Language Models

Conference: ASE 2025

Paper: https://arxiv.org/abs/2510.00446

Github: https://github.com/YerbaPage/LongCodeZip

Authors: Yuling Shi, Yichun Qian, Hongyu Zhang, Beijun Shen, Xiaodong Gu

Abstract

代码大模型在仓库级补全、模块总结和跨文件问答中,通常需要读取远超单个函数的上下文。直接把整个仓库送入模型不仅带来更高的推理延迟、显存和 API 费用,还可能因为 lost-in-the-middle 现象让真正有用的信息淹没在长上下文中。最直接的检索增强生成(RAG)虽然能够选取与问题相似的代码,却容易漏掉变量名和表面语义都不相似、但在执行逻辑上不可缺少的依赖。

LongCodeZip 是一个 training-free、model-agnostic、plug-and-play 的长代码上下文压缩框架。它把压缩拆成两个层次:

  1. Coarse-grained compression:以函数或类为单位,使用指令条件下的近似互信息 AMI 排序,优先保留能帮助模型理解当前任务的代码实体;
  2. Fine-grained compression:在保留下来的长函数内部,根据逐行困惑度变化切分语义块,再通过自适应预算和 0/1 背包选择最有价值的代码块。

这种设计同时利用了代码的层次结构和任务相关性。论文在 Long Code Completion、Long Module Summarization 与 RepoQA 三类任务上评估 LongCodeZip,在最高 5.6× 有效压缩率下仍能维持甚至提高任务性能,并显著降低生成阶段的时间与额外显存开销。

1. Motivation

1.1 Long Code Context 的实际代价

仓库级任务所需要的信息往往分散在不同文件、类和函数中。随着上下文长度增加,会同时出现四类问题:

  • 计算代价增加:标准全注意力的计算量随序列长度近似二次增长;
  • 部署成本增加:更长的 KV Cache 占用更多显存,闭源 API 也按输入 token 计费;
  • 有效性下降:无关代码会稀释模型注意力,长上下文并不必然优于经过筛选的上下文;
  • 窗口截断:当仓库代码超过上下文窗口时,简单截断可能恰好删除关键依赖。

因此,长代码压缩的目标不是机械地减少 token,而是回答两个问题:哪些函数与当前指令真正相关?一个相关函数内部又应该保留哪些连续代码块?

1.2 Why Similarity-based RAG Is Not Enough

上图给出了论文的核心动机。对于 get_email_by_id 之类的局部补全,目标代码与 get_account_by_id 在函数名和词汇上高度相似,向量检索很容易找对参考函数。但在 train_model 的例子中,真正需要的是负责配置学习率、训练轮数等参数的 Config 类。它与目标函数几乎没有词汇重叠,基于相似度的检索只把它排在第 9 位;基于 AMI 的任务相关性衡量则把它排到第 1 位。

这里揭示了代码检索与普通文本检索的区别:

  • 词汇相似不等于功能依赖;
  • 隐式依赖可能通过数据流、配置对象、继承或调用约定建立;
  • 只看 query 与代码块的嵌入距离,无法直接衡量“把这段代码交给生成模型后,它是否更容易完成任务”。

另一方面,面向自然语言的 prompt compressor 通常以 token 或短句为单位删除内容,容易破坏缩进、控制流、定义—使用关系和代码块边界。因此 LongCodeZip 选择以 函数/类—代码块—代码行三级结构组织压缩。

1.3 Main Contributions

论文的主要贡献可以概括为:

  • 提出面向长代码上下文的两阶段层次化压缩框架;
  • 使用指令条件下的 Approximated Mutual Information(AMI),替代纯词汇或嵌入相似度进行重要性排序;
  • 提出基于逐行困惑度突变的细粒度分块、自适应函数预算和 0/1 背包选择;
  • 在开源与闭源代码模型、三类长代码任务上验证方法的压缩效果、迁移性和效率。

2. Problem Formulation

设长代码上下文为

$$ c=\{c_1,c_2,\ldots,c_n\}, $$

用户指令为

$$ q=\{q_1,q_2,\ldots,q_m\}. $$

压缩器需要在 token 预算 \(B\) 下构造子上下文 \(c'\):

$$ c'\subseteq c,\qquad \lvert c'\rvert\le B, $$

并尽可能保持下游模型在任务 \(q\) 上的生成能力。困难在于:压缩器没有真实答案,也不能为每个目标模型重新训练,因此必须从语言模型对“指令可预测性”的变化中估计代码价值。

2.1 Conditional Perplexity

给定上下文 \(c\) 后,指令 \(q\) 的条件困惑度为:

$$ \operatorname{PPL}(q\mid c)= \exp\left( -\frac{1}{N}\sum_{i=1}^{N} \log P(q_i\mid q_{\lt i},c) \right). $$

不提供上下文时,指令自身的困惑度为:

$$ \operatorname{PPL}(q)= \exp\left( -\frac{1}{N}\sum_{i=1}^{N} \log P(q_i\mid q_{\lt i}) \right). $$

如果一段代码包含完成指令所需要的信息,那么把它放到指令前面后,模型应该更容易预测指令中的 token,即 \(\operatorname{PPL}(q\mid c)\) 更低。

2.2 Approximated Mutual Information

LongCodeZip 将代码块 \(c\) 对任务 \(q\) 的相关性定义为:

$$ \operatorname{AMI}(c,q)= \operatorname{PPL}(q)- \operatorname{PPL}(q\mid c). $$

AMI 越大,说明加入该代码后,指令的困惑度下降越明显,也就越值得保留。这个度量有三个特点:

  1. Instruction-aware:同一段代码面对不同任务会获得不同分数;
  2. 超越词面相似度:只要代码能够解释指令,即使没有共同关键词也可能获得高分;
  3. 不依赖下游答案:评分时只需要代码和指令,适合实际推理阶段。

需要注意,论文中的 AMI 是一种定向、任务条件化的启发式量。它用“加入代码前后的指令困惑度差”近似信息增益,并不是严格意义上对称的互信息估计。

3. Overall Framework

LongCodeZip 的整体流程如下:

  1. 使用语法解析或代码结构信息,把长上下文拆成函数、方法和类等代码实体;
  2. 计算每个实体相对于用户指令的 AMI;
  3. 按 AMI 从高到低执行函数级粗筛,未被保留的实体用占位符表示;
  4. 对粗筛后仍然较长的函数逐行计算困惑度,并在局部突变处切分代码块;
  5. 根据函数级 AMI 分配细粒度预算;
  6. 将块级 AMI 视为价值、token 数视为重量,用 0/1 背包选取代码块;
  7. 按原始顺序重组代码,得到最终压缩上下文,再交给任意目标代码模型。

两阶段设计的意义是:粗粒度阶段快速删除整个无关实体,负责主要压缩收益;细粒度阶段只处理已被判定为相关的长函数,避免把预算浪费在函数内部的样板代码、错误处理或与当前任务无关的分支上。

4. Stage I: Coarse-grained Compression

4.1 Structure-aware Entity Splitting

LongCodeZip 首先按照函数和类边界切分上下文。相比固定 token 窗口,这样做能保留:

  • 完整函数签名与局部作用域;
  • 类成员之间的层次关系;
  • 控制流和缩进结构;
  • 便于回填的原始位置。

每个实体 \(f_i\) 都计算一个 \(\operatorname{AMI}(f_i,q)\)。随后按照分数降序排列,在粗粒度预算内贪心选取实体。

4.2 Budget Coupling Between Two Stages

最终预算为 \(B\),细粒度阶段的预期保留比例为 \(R_{\mathrm{fine}}\)。为了让第二阶段压缩后恰好接近最终预算,粗粒度预算设置为:

$$ B_{\mathrm{coarse}}=\frac{B}{R_{\mathrm{fine}}}. $$

例如最终只允许 2,000 token,细粒度阶段预计保留粗筛结果的 80%,那么粗粒度阶段可以先保留约 2,500 token。这样细筛有足够候选内容可比较,而不是在第一阶段过早删除潜在有用代码。

4.3 Preserving the Global Skeleton

没有入选的函数并非简单地从文本中完全消失,而是被注释或省略标记替代。这样做虽然不保留实现细节,但仍让下游模型知道:

  • 原文件在这个位置存在某个实体;
  • 上下文的整体顺序和层级没有被打乱;
  • 入选代码之间原本可能隔着其他定义。

最终所有保留实体仍按原始顺序拼接,避免按相关性重新排序造成跨函数语义和文件结构失真。

5. Stage II: Fine-grained Compression

5.1 Perplexity-guided Block Segmentation

固定行数或固定 token 分块会把一个 if 分支、循环或异常处理从中间切断。LongCodeZip 因此把代码行作为最小原子,并观察模型逐行读取函数时的困惑度变化。

在语义连贯的代码块中,前文不断提供变量和控制流信息,后续行通常越来越容易预测,困惑度整体下降;当进入新的逻辑单元时,新变量、分支或调用会引起局部困惑度上升。论文把满足“当前行困惑度相对相邻位置形成显著局部峰值,且提升至少达到全局行困惑度标准差的 \(\alpha\) 倍”的位置视为块边界。

这种分法有两个优点:

  • 不要求为不同编程语言手工定义所有语法块规则;
  • 边界由代码模型感受到的语义变化决定,比等长切块更贴合实际逻辑。

对于少于 5 行的小函数,切分和筛选带来的收益有限,论文直接完整保留。

5.2 Adaptive Budget Allocation

假设小函数集合为 \(\mathcal{F}_{\mathrm{small}}\),长函数集合为 \(\mathcal{F}_{\mathrm{large}}\),函数 \(j\) 的 token 数为 \(T_j\)。先扣除必须完整保留的小函数,长函数的基础保留比例为:

$$ R_{\mathrm{base}}= \frac{ B-\sum_{j\in\mathcal{F}_{\mathrm{small}}}T_j }{ \sum_{k\in\mathcal{F}_{\mathrm{large}}}T_k }. $$

如果所有长函数都使用同一比例,会让高相关函数与边缘函数获得相同待遇。LongCodeZip 将函数级 AMI 归一化为 \(\operatorname{AMI}_{\mathrm{norm},i}\in[0,1]\),再引入偏置系数 \(\beta\):

$$ R_{\mathrm{biased},i}= R_{\mathrm{base}} \left[ 1+\beta\left(2\operatorname{AMI}_{\mathrm{norm},i}-1\right) \right]. $$

高 AMI 函数的保留比例被上调,低 AMI 函数则下调。各比例先截断到 \([0,1]\),再进行全局缩放以满足总预算:

$$ R_i= R_{\mathrm{biased},i} \frac{ B_{\mathrm{large}} }{ \sum_jR_{\mathrm{biased},j}T_j }. $$

最终函数 \(i\) 的预算约为 \(B_i=R_iT_i\)。这一步把“重要函数多保留、次要函数少保留”从直觉转化为可控的预算分配。

5.3 Code Block Selection as 0/1 Knapsack

一个函数被切成 \(M\) 个候选块后,LongCodeZip 计算每块相对于指令的 AMI,并将其归一化为价值 \(v_j\),token 数记为重量 \(T_j\)。选择问题写成:

$$ \max_{z_1,\ldots,z_M} \sum_{j=1}^{M}z_jv_j, $$$$ \text{subject to}\qquad \sum_{j=1}^{M}z_jT_j\le B_i, \qquad z_j\in\{0,1\}. $$

这正是 0/1 背包:每个完整代码块只能保留或删除,不能像 token compressor 那样从中间切碎。动态规划能够在预算内找到总 AMI 最大的块集合,而简单按 \(v_j/T_j\) 贪心并不保证最优。

框架还允许用户指定必须保留的块集合 \(\mathcal{P}\)。这些块先无条件加入,剩余预算为:

$$ B_{\mathrm{remain}}= \max\left( 0, B_i-\sum_{j\in\mathcal{P}}T_j \right), $$

背包算法只在剩余候选中运行。这为保留函数签名、安全检查、接口约束或用户关注区域提供了硬保证。

6. End-to-end Algorithm

把整个方法压缩成一条执行链,可以写成:

Input: long code context c, instruction q, final budget B

1. Parse c into functions/classes F.
2. Score every entity f in F with AMI(f, q).
3. Rank entities and keep them under B_coarse = B / R_fine.
4. Preserve placeholders for removed entities and the original order.
5. For each retained function:
   a. keep it directly if it has fewer than 5 lines;
   b. otherwise, locate block boundaries from line-PPL peaks;
   c. compute block-level AMI;
   d. assign a function budget according to normalized function AMI;
   e. solve a 0/1 knapsack to select whole blocks.
6. Reassemble selected blocks in their original positions.
Output: compressed context c' with |c'| <= B.

压缩器与最终生成模型是解耦的:评分可以使用较小的开源代码模型,压缩结果则可以交给更大的开源模型或 GPT-4o、Claude 等闭源 API。

7. Experimental Setup

7.1 Benchmarks

Task Samples Avg. Context Tokens Avg. Ground-truth Tokens Languages
Long Code Completion 500 9,328.2 12.4 Python
Long Module Summarization 139 10,809.6 1,758.1 Python
RepoQA 600 11,524.6 156.0 Python, Java, JavaScript, Rust, Go, C++
  • Long Code Completion:从长文件中预测被隐藏的目标代码,过滤后每个样本上下文超过 5,000 token;
  • Long Module Summarization:根据完整长模块生成模块级总结,原始数据来自 216 个样本、43 个仓库,实验保留上下文超过 2,000 token 的 139 个样本;
  • RepoQA:根据自然语言描述在仓库上下文中定位目标函数,共覆盖 60 个仓库和 6 种语言。

7.2 Models and Baselines

开源目标模型包括:

  • DeepSeek-Coder-6.7B;
  • Qwen2.5-Coder-7B;
  • Seed-Coder-8B。

闭源模型包括 GPT-4o 与 Claude-3.7-Sonnet。基线覆盖五类方法:

  1. No Compression / No Context:完整输入和完全不输入代码;
  2. Random Token / Random Line:随机删除 token 或代码行;
  3. RAG:滑动窗口检索、函数级检索,编码器为 UniXCoder-base;
  4. Code-specific Compression:DietCode、SlimCode;
  5. General Prompt Compression:LLMLingua、LongLLMLingua、LLMLingua-2;
  6. Advanced Code RAG:A3-CodGen、cAST、RepoGenix、RLCoder。

7.3 Metrics

  • Compression Ratio:原始 token 数除以压缩后 token 数,因此数值越大表示压缩越强;
  • Completion:Edit Similarity(ES)与 Exact Match(EM);
  • Summarization:使用 GPT-4o-mini 比较压缩上下文总结 \(\hat{s}\) 与完整上下文总结 \(s_o\),交换候选顺序执行两次判断,以减轻位置偏差:
$$ \operatorname{CompScore}= \frac{1}{2} \left[ \mathcal{P}(s_o\succ\hat{s}) +1-\mathcal{P}(\hat{s}\succ s_o) \right]. $$
  • RepoQA:生成函数与目标函数的 BLEU 高于 0.8 时判为正确。

7.4 Hyperparameters and Hardware

Task Final Budget \(B\) \(R_{\mathrm{fine}}\) \(\beta\)
Code Completion 2K 0.8 0.5
Module Summarization 5K 0.3 0.5
RepoQA 2K 1.0

RepoQA 设置 \(R_{\mathrm{fine}}=1.0\),即保留检索到的完整函数,只使用粗粒度选择。实验运行在 Intel Xeon Gold 6254 CPU 和 NVIDIA A100 80GB GPU 上。

8. Main Results

8.1 Long Code Completion

Model Method ES EM Ratio
DeepSeek-Coder-6.7B No Compression 57.14 34.40 1.0×
DeepSeek-Coder-6.7B LongCodeZip 60.58 35.40 5.3×
Qwen2.5-Coder-7B No Compression 56.36 31.80 1.0×
Qwen2.5-Coder-7B RAG Function 52.79 26.00 3.1×
Qwen2.5-Coder-7B LongCodeZip 57.55 32.40 4.3×
Seed-Coder-8B No Compression 64.04 40.20 1.0×
Seed-Coder-8B LongCodeZip 63.11 37.40 5.6×

LongCodeZip 在 DeepSeek 与 Qwen 上压缩后反而超过完整上下文,说明删除无关代码能够缓解注意力稀释。Seed-Coder 上存在小幅下降,但在 5.6× 压缩率下仍保持接近完整上下文的表现。相比函数级 RAG,LongCodeZip 在 Qwen 上同时获得更高压缩率和更高 ES/EM,表明 AMI 与函数内筛选都在发挥作用。

8.2 Long Module Summarization

Model No Compression LongCodeZip Ratio
DeepSeek-Coder-6.7B 19.09 28.01 2.5×
Qwen2.5-Coder-7B 56.00 56.47 1.7×
Seed-Coder-8B 44.95 55.07 3.5×

三个模型的 CompScore 都没有因压缩下降。尤其是 DeepSeek 与 Seed-Coder,压缩上下文的总结明显优于完整上下文。这说明模块总结不需要逐字保留所有实现细节;突出核心接口与主路径,反而更利于模型概括模块职责。

8.3 RepoQA

Model No Compression Avg. LongCodeZip Avg. Ratio
DeepSeek-Coder-6.7B 38.3 75.3 5.3×
Qwen2.5-Coder-7B 86.0 87.2 4.5×
Seed-Coder-8B 69.0 80.7 5.3×

RepoQA 的提升最明显。因为任务要求根据描述定位一个目标函数,完整仓库上下文中的干扰函数很多;AMI 粗筛能把与描述最相关、但不一定词面相似的函数集中到有限窗口中。DeepSeek 的平均正确率从 38.3 提升到 75.3,几乎翻倍。

8.4 Closed-source Models

Task Model No Compression LongCodeZip Ratio
Completion ES / EM Claude-3.7-Sonnet 66.24 / 41.20 66.27 / 40.20 4.3×
Completion ES / EM GPT-4o 65.13 / 40.80 64.72 / 38.80 4.3×
Summarization Claude-3.7-Sonnet 60.72 61.47 1.7×
Summarization GPT-4o 58.42 59.04 1.7×
RepoQA Claude-3.7-Sonnet 89.7 88.9 5.1×
RepoQA GPT-4o 87.8 88.9 5.1×

总体上,LongCodeZip 对闭源模型也能直接迁移。需要指出,论文正文在讨论 Claude RepoQA 时写成 90.7,但 Table V 中 LongCodeZip 的数值是 88.9;这里采用表格中的结果,并将正文数值视为可能的笔误。

8.5 Comparison with Advanced RAG

在 Seed-Coder 补全任务中,LongCodeZip 达到 63.11 ES / 37.40 EM / 5.6×,而 RepoGenix 为 60.28 / 34.70 / 3.5×。在 Claude 上,LongCodeZip 为 66.27 / 40.20 / 4.3×,RLCoder 为 62.76 / 37.90 / 4.0×

这组结果说明,高级 RAG 即使引入 AST 或仓库结构,仍主要解决“选择哪些候选片段”;LongCodeZip 进一步在候选函数内部做任务感知压缩,因此能在更短上下文中保留更密集的有效信息。

9. Ablation Study

论文在 Qwen2.5-Coder-7B 的长代码补全任务上逐项替换或移除组件:

Variant ES EM ES Drop
Full LongCodeZip 57.55 32.40
Similarity Ranking 49.66 25.20 -7.89
Random Ranking 39.76 11.50 -17.79
Without Fine-grained Stage 56.10 31.20 -1.45
Without Adaptive Allocation 55.21 29.40 -2.34
Fixed Line Chunking 55.98 31.20 -1.57
Random Line Selection 55.07 29.00 -2.48

可以得到四个清晰结论:

  1. AMI 粗粒度排序是最关键组件。改成相似度排序损失 7.89 ES,随机排序损失 17.79 ES;
  2. 细粒度阶段提供稳定增益。完全移除后下降 1.45 ES,说明粗筛已经很强,但函数内部仍存在冗余;
  3. 预算必须按任务相关性分配。统一比例压缩会浪费高价值函数的预算;
  4. 语义块优于随机行或固定行块。保持完整逻辑单元能减少结构破坏。

10. Transferability and Efficiency

10.1 Small Compressor, Large Target Model

论文比较了不同规模的压缩器。使用 0.5B 模型计算相关性时,平均 ES 为 60.13;使用 7B 压缩器时为 60.58,差距很小。这说明 AMI 排序不要求压缩器与目标模型同等规模,可以采用“小模型负责压缩、大模型负责生成”的部署方式。

10.2 Runtime and GPU Memory

Method Compression Time Compression Memory Generation Time Generation Extra Memory Ratio ES
No Compression 15.70 s 3.48 GB 1.0× 56.36
RAG Function 0.53 s 1.07 GB 7.57 s 1.13 GB 3.1× 52.79
LongCodeZip 2.58 s 0.69 GB 6.59 s 0.81 GB 4.3× 57.55

LongCodeZip 将输入 token 减少约 77%,生成时间从 15.70 秒下降到 6.59 秒,生成阶段缩短约 58%。若把 2.58 秒压缩开销也算入端到端时间,总时间为 9.17 秒,仍比 15.70 秒低约 41.6%。

论文报告的显存是模型基础参数之外的额外占用,基础模型参数本身约占 28.37 GB。压缩过程比普通 RAG 慢,但换来了更高任务性能、更强压缩率,以及更低的生成阶段显存。对于按 token 收费的闭源 API,2.58 秒的本地预处理通常也比长期支付冗余输入费用更划算。

11. Compression–Performance Trade-off

随着保留比例降低,大多数方法都会逐渐退化,但 LongCodeZip 在极端压缩区域的优势更加明显,尤其是在只保留原上下文不到 10% 时。原因是它并非均匀缩短每个函数,而是先跨函数集中预算,再在关键函数内部集中预算。

这一现象也说明,评估压缩器不能只比较某一个固定 token 预算。更公平的比较应同时观察完整的 performance–compression curve:如果一种方法只在宽松预算下有效,而预算稍紧就快速崩溃,就很难适用于真正超出上下文窗口的仓库。

12. Case Study

细粒度案例展示了 LongCodeZip 如何删除一个函数中的非关键行,同时保留与任务相关的初始化、核心计算和返回路径。与随机行删除相比,它尽量让保留区域对应连续的逻辑块,而不是留下语法正确但语义残缺的碎片。

案例也体现了两类评分的分工:

  • 函数级 AMI 回答“这个函数是否值得进入候选集”;
  • 块级 AMI 回答“在已经相关的函数里,哪部分最能解释当前指令”。

如果只做第一层,长函数会整体占用大量预算;如果只做第二层,则需要为仓库中的每个函数执行昂贵的逐行分析。层次化处理因此同时控制了压缩质量和计算成本。

13. Limitations and Threats to Validity

13.1 Failure Cases

论文总结了两类主要失败场景:

  1. 上下文本身不包含答案:压缩器只能筛选已有信息,无法补回仓库中缺失的依赖;
  2. 指令含糊或与代码难以对齐:AMI 依赖指令条件化评分,如果任务描述过于宽泛,重要性排序也会不稳定。

此外,AMI 计算需要额外的语言模型前向过程,细粒度逐行困惑度与块级背包也带来预处理开销。因此论文建议:高价闭源模型或极长上下文采用完整两阶段流程;便宜模型、延迟极敏感或预算较宽松时,可以只启用粗粒度阶段。

13.2 Evaluation Threats

  • LLM-as-a-Judge 偏差:模块总结使用 GPT-4o-mini 比较结果,论文通过交换候选顺序并取组合分数降低位置偏差,但不能完全消除模型偏好;
  • 任务覆盖范围:虽然包括补全、总结、问答和 6 种语言,但仍不能代表所有仓库级软件工程任务;
  • 模型覆盖范围:实验模型以 6.7B–8B 开源模型及两个闭源模型为主,更大或更新架构上的效果仍需验证;
  • 数据泄漏风险:论文使用训练时间较早的 DeepSeek-Coder,并选择时间更晚的基准来降低泄漏可能,但闭源模型的训练数据不可知;
  • 代理相关性偏差:AMI 衡量的是代码对“预测指令”的帮助,不是对“生成正确答案”的直接贡献,两者高度相关但并不等价。

14. Practical Deployment

官方仓库提供了 LongCodeZipCompressor 接口,典型调用方式如下:

from longcodezip import LongCodeZipCompressor

compressor = LongCodeZipCompressor(
    model_name="your-compressor-model",
    device="cuda",
)

compressed_code = compressor.compress(
    code=long_code_context,
    instruction=user_instruction,
    target_token=2000,
)

在实际系统中,可以按以下方式接入:

  1. 在 Agent 的文件搜索、仓库索引之后执行 LongCodeZip,而不是替代所有检索;
  2. 对安全检查、接口定义、用户明确指定的行设置强制保留;
  3. 根据任务调整预算:补全需要精确局部实现,总结需要覆盖更多模块结构,RepoQA 则优先保留完整候选函数;
  4. 缓存函数级 AMI 或代码解析结果,避免多轮 Agent 反复处理未变化文件;
  5. 同时记录压缩耗时和生成耗时,不要只报告生成阶段加速;
  6. 在进入目标模型前执行语法解析、名称引用或最小编译检查,及时发现压缩造成的结构缺口。

15. Conclusion

LongCodeZip 的核心并不是“把代码变短”,而是把有限上下文预算分配给最能帮助当前任务的代码结构。它用 AMI 替代单纯相似度,用函数级选择解决跨实体冗余,再用困惑度分块、自适应预算和 0/1 背包解决实体内部冗余。

实验表明,这套无训练、模型无关的流程在 1.7×–5.6× 的压缩范围内能够保持或改善补全、总结与仓库问答效果。消融实验进一步说明,函数级 AMI 排序贡献最大,细粒度阶段则在严格预算下提供额外收益。对于长上下文 Coding Agent,LongCodeZip 展示了一条实用路线:先用轻量模型完成任务感知的信息筛选,再让昂贵的大模型只处理高密度、结构完整的代码证据。