1. BEAVER:免训练的长文档压缩新范式
在处理法律合同、技术文档等长文本时,我们常遇到两个棘手问题:一是大模型处理速度随token数量呈平方级增长,128k token的预填充延迟可能高达数十秒;二是直接输入超长上下文会导致模型出现"Lost in the Middle"效应——关键信息被淹没在文本海洋中。传统解决方案如LongLLMLingua需要逐token计算困惑度,既破坏文本结构又效率低下;而LLMLingua-2等有监督方法则需针对每个模型重新训练,缺乏通用性。
BEAVER(全称:BEAVER: A Training-Free Hierarchical Prompt Compression Method via Structure-Aware Page Selection)提出了一种全新的解决思路。它模拟人类阅读长文档的方式——先快速浏览章节标题和段落首句定位关键部分,再精读相关内容。这种方法在128k token的合同文档测试中,仅用1.2秒就完成了压缩(比LongLLMLingua快26.4倍),同时保持了83.7%的关键信息检索准确率。
核心创新点:将传统的"逐token筛选"升级为"结构化页面选择",通过文档的自然段落划分建立二维索引,再结合语义和词法双重特征进行页面级选择,最后通过句子边界平滑保证语法完整性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 整体处理流程
BEAVER的工作流程可分为三个阶段,如图1所示:
code复制[原始文本] → Segmenter → [页面矩阵] → PageEncoder → [页面向量] → QueryPlanner → [压缩文本]
阶段一:结构化分段(Segmenter)
将文档按自然段落切分为固定大小的"页面"。例如处理技术文档时,会以章节标题为界,每个页面包含1-3个自然段(默认64个token)。这种处理保留了文档的层级结构,避免了传统方法随意截断导致的语义断裂。
阶段二:双路编码(PageEncoder)
每个页面通过两条路径编码:
- 加权均值池化:计算段落内词向量的ITF(In-Context Term Frequency)加权平均,捕获全局语义
- 最大池化:提取每个维度上的最大值,保留局部显著特征(如关键数字、专有名词)
阶段三:混合检索(QueryPlanner)
根据用户查询,结合三种策略选择页面:
- Anchor策略:固定保留前4页(通常含目录、摘要等元信息)
- Flow策略:选择查询位置附近的连续窗口(默认4页)
- Flash策略:按语义+词法混合得分选择全局重要页面
2.2 关键算法实现
页面切分算法
python复制def segment_document(text, M=64):
paragraphs = text.split('\n') # 按换行符分段落
pages = []
current_page = []
current_count = 0
for para in paragraphs:
tokens = tokenize(para)
if len(tokens) > M: # 超长段落拆分
chunks = [tokens[i:i+M] for i in range(0, len(tokens), M)]
for chunk in chunks:
pages.append(chunk)
else:
if current_count + len(tokens) <= M:
current_page.extend(tokens)
current_count += len(tokens)
else:
pages.append(current_page)
current_page = tokens
current_count = len(tokens)
if current_page:
pages.append(current_page)
return pages
双路池化公式
-
加权均值池化:
$$
\mu_i = \frac{\sum_{j=1}^M w_{ij}^{itf} \cdot x_{ij}}{\sum w_{ij}^{itf}}, \quad w_{ij}^{itf} = \log(1 + \frac{L}{1+tf(t_{ij})})
$$
其中$L$是文档总长度,$tf(t_{ij})$是词项在当前文档的频率 -
最大池化:
$$
m_i = \max(x_{i1}, x_{i2}, ..., x_{iM})
$$ -
最终融合:
$$
p_i = 0.7\mu_i + 0.3m_i
$$
3. 性能对比与实验分析
3.1 基准测试结果
我们在四个标准数据集上对比了BEAVER与主流方法:
| 方法 | LongBench | ZeroSCROLLS | RULER | L-Eval | 延迟(128k) |
|---|---|---|---|---|---|
| Original | 44.0 | - | - | - | 15.6s |
| LongLLMLingua | 48.0 | 51.5 | 28.8 | 51.5 | 31.7s |
| LLMLingua-2 | 39.1 | 54.6 | 47.9 | 54.6 | 3.7s |
| BEAVER | 42.2 | 57.6 | 83.7 | 57.6 | 1.2s |
关键发现:
- 检索任务优势:在RULER多针检索上达到83.7分,接近原始未压缩性能
- 速度突破:128k token压缩仅1.2秒,比次优方案快3倍
- 领域适应性:在L-Eval跨领域测试中保持稳定表现
3.2 典型应用场景
案例1:合同条款检索
原始问题:"根据第127条,iPhone 15 Pro的促销价是多少?"
- BEAVER准确锁定含价格条款的页面,保留完整计算逻辑:"普通客户需在$899基础价上加价20%"
- 传统方法要么截断关键数字,要么丢失加价规则
案例2:技术文档问答
原始问题:"如何配置Redis集群的故障转移阈值?"
- BEAVER优先保留配置示例段落和参数说明表格
- 对比方法常混入无关的安装步骤或性能指标
案例3:论文摘要生成
原始任务:"用200字概括这篇论文的核心贡献"
- BEAVER稳定选取引言、结论和图表说明等关键部分
- 其他方法容易遗漏方法论或创新点描述
4. 工程实践建议
4.1 参数调优指南
| 参数 | 推荐值 | 调整方向 | 影响说明 |
|---|---|---|---|
| 页面大小M | 64 | 32-128之间 | 过小易碎片化,过大降低分辨率 |
| 融合系数γ | 0.7 | 0.5-0.9之间 | 控制语义与局部特征的平衡 |
| Anchor页数 | 4 | 根据文档类型调整 | 技术文档可减少,法律合同需增加 |
| Flow窗口 | 4 | 2-8之间 | 对话类应用需更大窗口 |
4.2 不同场景下的优化策略
-
法律合同审查:
- 增大Anchor页数(6-8页)
- 调高词法匹配权重(λ=0.4)
- 启用严格句子边界检查
-
技术文档问答:
- 优先保留代码块和配置表格
- 增加Flash策略的页面选择数量
- 放松句子完整性约束
-
学术论文处理:
- 特别关注章节标题和图表说明
- 加强摘要与结论部分的保留
- 禁用FewShot示例压缩
5. 局限性与改进方向
尽管BEAVER表现出色,但在实际应用中仍需注意:
-
FewShot场景局限:
- 当提示中包含多组示例时,页面级选择可能破坏示例完整性
- 临时解决方案:人工标记示例边界作为特殊段落
-
多跳推理挑战:
- 需要关联分散在多页的信息时效果下降
- 正在开发的v2版本将引入跨页面注意力机制
-
非结构化文本:
- 对社交媒体帖子等无段落结构的文本效果一般
- 可尝试结合话题分割算法作为预处理
一个值得关注的现象是:在使用小型语言模型(如Qwen3-0.6B)时,BEAVER压缩后的性能保持率达到98%,这表明适当的压缩可能通过提升信噪比来弥补小模型的能力不足。这为边缘设备部署大语言模型提供了新思路——与其追求更大的模型,不如优化输入信息的质量。
在实际部署中,我们建议将BEAVER与RAG系统结合:先用BEAVER快速过滤文档集,再对候选文档进行精细处理。这种两级架构在保证响应速度的同时,也能维持较高的回答质量。
