优化: 上下文压缩域补偿与召回设计

- 裁剪淘汰补偿摘要上限 300→1000 字:原值对几十轮历史形同虚设,放大后相对裁剪收益仍是零头
- 测试断言改「不超上限」(结构性产出远低于天花板,精确等于过脆)
- 压缩可召回(压缩不丢/可回读)七条实施要点入档,待小批实施
This commit is contained in:
lxy
2026-10-11 12:37:22 +08:00
parent f9d3b4c76b
commit fda991cbe1
2 changed files with 12 additions and 9 deletions
+11 -9
View File
@@ -660,8 +660,10 @@ pub const PROTECT_COUNT: usize = 6;
///
/// build_for_request 超预算裁剪时,把被淘汰文本提炼成一短段 system 摘要插回发送视图
/// 头部(补偿无声丢弃的早期主题,对齐压缩路径的"裁剪有补偿"语义)。摘要过长会吃掉
/// 本次裁剪腾出的预算,故硬截断到此上限(≈百 token 量级,相对淘汰收益可忽略)。
pub const EVICTION_SUMMARY_MAX_CHARS: usize = 300;
/// 本次裁剪腾出的预算,故硬截断到此上限。原 300 字(≈百 token)对几十轮历史的
/// 摘要形同虚设,放大到 1000(≈300 token)——相对被裁掉的数千~数万 token 仍是零头,
/// 不侵蚀裁剪收益;PROTECT_COUNT 保持 6 不动(无实证症状,避免无据行为变更)。
pub const EVICTION_SUMMARY_MAX_CHARS: usize = 1000;
/// Anthropic 流式 tool_use 缺 id 时的占位 id 前缀(见 anthropic_compat.rs 170-176)。
/// 此类 id 必然无匹配 tool_result,是历史中毒的标志,sanitize 时据此剔除畸形三元组。
@@ -1068,18 +1070,18 @@ mod tests {
#[test]
fn eviction_summary_hard_capped_at_max_chars() {
// 12 条纯标识符消息(每个标识符 39 字符,freq 均等且无中文干扰)→ top-10 全为长词,
// 总长超 300 → 硬截断到 EVICTION_SUMMARY_MAX_CHARS。
let msgs: Vec<ChatMessage> = (0..12)
// 40 条纯标识符消息(每个标识符 39 字符,freq 均等且无中文干扰)→ top-10 全为长词,
// 总长超上限(上限放大到 1000 后需更多数据才触发截断) → 硬截断。
let msgs: Vec<ChatMessage> = (0..40)
.map(|i| {
ChatMessage::user(&format!("long_identifier_{:02}_for_truncation_probe", i))
})
.collect();
let text = build_eviction_summary_text(&msgs).expect("应产出摘要");
assert_eq!(
text.chars().count(),
EVICTION_SUMMARY_MAX_CHARS,
"超长时应精确截断到硬上限, 实际 {}",
// 上限是防御性天花板(结构性产出 top-10 词表通常远低于它),断言「不超」而非「精确等于」
assert!(
text.chars().count() <= EVICTION_SUMMARY_MAX_CHARS,
"摘要不得超硬上限, 实际 {}",
text.chars().count()
);
}