上下文压缩与 MoA
源码版本v2026.7.20
职责
两件事:① 当历史消息逼近 provider 上下文上限时,把旧消息摘要/裁剪掉腾出预算(context_compressor);② 可选地用 Mixture-of-Agents 路径聚合多个模型的输出(moa_loop)。两者都在主循环内被调用,是「让长对话跑得下去」和「让回答更稳」的支撑件。
关键文件
context_compressor 模块— 压缩总入口(约 3700 行)预算估算:190-242—_estimate_msg_budget_tokens/_serialized_length_for_budget消息清洗:136-155—_fresh_compaction_message_copy/_strip_persistence_markers工具调用与路径提及提取:337-360—_extract_tool_call_name_and_args/_collect_path_mentions内容裁剪:472-515—_append_text_to_content/_strip_image_parts_from_partsmoa_loop— Mixture-of-Agents 聚合IterationBudget— 压缩 refund 与预算联动
数据流
- 主循环每轮评估是否需要压缩(见
_should_run_preflight_estimate:213)。 - 命中阈值后调用 context_compressor:
- 估算每条消息占用预算(
agent/context_compressor.py:419) - 对旧消息做清洗拷贝(
agent/context_compressor.py:136)、剥除持久化标记(agent/context_compressor.py:155) - 保留工具调用名/参数与路径提及,避免摘要丢失关键操作(
agent/context_compressor.py:337) - 裁剪图片段与超长内容(
agent/context_compressor.py:472)
- 估算每条消息占用预算(
- 压缩产生的「新空间」通过
iteration_budget.refund()(agent/iteration_budget.py)部分退还,允许主循环多跑几轮。 - 若启用 MoA,
moa_loop在本轮并行调用多个 provider 并聚合,作为对主回答的增强或仲裁。
小结
压缩器是长对话的生命线,核心权衡是「丢什么、留什么」——它优先保留工具调用与路径提及,因为丢了这些会让后续轮次「失忆」。MoA 是正交增强,可开关。两者都不改变主循环结构,只在合适时机切入。