Open Code Review 项目解析知识图谱 / 分组目录 / 审查引擎 / 上下文三区压缩

上下文三区压缩

审查引擎高级方法机制G-B · 审查引擎

What · 是什么

frozen(前 2 条)+ compress(LLM 摘要进 previous_review_summary)+ active(最近 K 轮),60%/80% 双阈值触发
上下文压缩把会话消息划分为三个区:frozen(messages[0:2] 系统/前置固定区)+ compress 区(可压缩区)+ active 区(最近活动区)
compress 区由 LLM 摘要为 previous_review_summary,追加进 user 消息以保留审查连续性
active 区按剩余预算保留最近 K 轮对话,保证当前任务的完整上下文
60% 软阈值:后台异步触发压缩,不阻塞审查;80% 警告阈值:同步立即压缩,防止溢出
压缩失败时保留原消息,不丢内容;每会话独立 compressionState,防止跨文件互踩

Why · 为什么

原理 · Principle

长会话中历史轮次占满上下文窗口,导致当前轮次被截断或模型质量下降

分区设计让『必须保留的协议头』(frozen)与『可压缩的历史审查』(compress)分离,结构清晰可预测

软/硬双阈值平衡成本与质量:60% 后台异步压缩无感,80% 同步兜底防溢出

每会话独立状态避免多文件并行会话共享压缩状态,导致 A 会话压缩污染 B 会话

How · 怎么做

会话消息按三区划分:frozen=前 2 条(系统提示等),compress=中间历史区,active=最近对话区
触发时机由已用上下文占比决定:达到 60% 软阈值时后台异步执行压缩,不阻塞当前审查
达到 80% 警告阈值时同步立即压缩,强制腾出空间防止溢出
压缩时 LLM 将 compress 区内容摘要成 previous_review_summary,追加进 user 消息
active 区按剩余预算保留最近 K 轮消息,其余并入 compress 区
压缩失败时保留原始消息列表,不执行破坏性替换,保证审查连续性不中断
每个文件会话持有独立 compressionState 实例,互不共享

案例 · Cases

代表性案例
单文件 30 轮审查后上下文达 60%,后台异步触发摘要,用户无感继续审查
超大 diff 审查中上下文冲到 80%,同步压缩立即执行,防止当前请求溢出失败
摘要后的 previous_review_summary 让后续轮次仍能引用早期审查结论,保持连续性
并行审查 5 个文件会话,各会话独立压缩互不干扰

反模式 · Anti-patterns

正反实例论证 · Evidence

正例 · Pro
60% 软阈值后台异步压缩+摘要追加 user 消息
if usage >= 60% && !compressing { go compressAsync(state) // 后台异步,不阻塞审查 summary := llmSummarize(compressZone) appendToUserMsg("previous_review_summary", summary)}
达到 60% 软阈值后台异步把 compress 区摘要为 previous_review_summary 追加进 user 消息,审查无感继续,后续轮次仍能引用早期结论。
反例 · Con
压缩失败后仍截断丢弃历史消息
# 错误:压缩失败也执行截断if compressFailed { truncate(compressZone) # 历史被硬砍掉}# 正确:失败保留原消息
违反『失败保留原消息』契约:审查连续性断裂,后续轮次无法引用早期审查结论,甚至导致定位链上下文缺失。
正例 · Pro
80% 警告阈值同步立即压缩
if usage >= 80% { compressSync(compressZone) // 同步兜底,防溢出 keepActive(activeZone, K) // 保留最近 K 轮}
接近溢出时同步立即压缩强制腾出空间,active 区按剩余预算保留最近 K 轮,防止当前请求因上下文溢出而失败。
反例 · Con
全局共享单一 compressionState,多会话互踩
# 错误:包级单例压缩状态var state = &compressionState{} // 所有文件会话共用compress(state, sessionA) // A 的压缩# B 会话的 active 区被误清
多文件会话共享压缩状态会导致 A 会话的压缩清掉 B 会话的 active 区;每会话独立 compressionState 才能防跨文件互踩。

实践资产 · Assets

源码节选
ReAct 主循环节选:RunPerFile / 终止条件 / 工具分派 / 异步评论
internal/llmloop/loop.go · 1778 B
源码节选
三区内存压缩节选:frozen/compress/active + 60%/80% 双阈值
internal/llmloop/compression.go · 2155 B

相关边