优化: 上下文压缩域补偿与召回设计
- 裁剪淘汰补偿摘要上限 300→1000 字:原值对几十轮历史形同虚设,放大后相对裁剪收益仍是零头 - 测试断言改「不超上限」(结构性产出远低于天花板,精确等于过脆) - 压缩可召回(压缩不丢/可回读)七条实施要点入档,待小批实施
This commit is contained in:
@@ -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()
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user