Skip to content

feat(acp): 模型驱动上下文压缩机制(双机制并存 + 可恢复) - #228

Open
aurevian-biz wants to merge 9 commits into
OpenBMB:mainfrom
aurevian-biz:feat/acp-context-compression
Open

feat(acp): 模型驱动上下文压缩机制(双机制并存 + 可恢复)#228
aurevian-biz wants to merge 9 commits into
OpenBMB:mainfrom
aurevian-biz:feat/acp-context-compression

Conversation

@aurevian-biz

Copy link
Copy Markdown

Summary

引入 ACP(主动上下文压缩,模型驱动)作为可选压缩机制,与现有固定阈值压缩双机制并存。此前会话层固定 32k token 阈值 + 二次 LLM 摘要、任务层 6 条+40 上限+receipt 降级,均为「固定阈值 + 破坏性丢弃」;ACP 让模型自主决定压缩时机与内容,压缩结果可 checkpoint 恢复、可分层层蒸馏、可词法检索。

参考实现 billion-context-dsh(DeepSeek Harness 插件)深度绑定 DSH 无法直接移植,故将框架无关的 acp-kernel 内核以 Python 重写接入 Harness v2。

主要变更

  • 框架无关 ACP 内核backend/app/core/acp/,纯标准库):blocks/checkpoint/tiers/nudge/search/status/pricing/engine 10 模块,4 个操作(compress/decompress/search_context/status),AcpLedger 记账防负数(上游 issue feat(general-skills): 通用技能对齐 Agent Skills 官方规范(frontmatter 校验/标准导出/allowed-tools 门控) #54 教训),词干化+CJK bigram 字符 n-gram 检索
  • 全局压缩机制偏好:运行设置页新增「标准压缩 / 智能可恢复压缩」选择 + 4 个 ACP 阈值设定项(默认 128000/0.70/0.85/0.45),按租户存 UIConfig,驱动会话层与任务层路由
  • 双机制并存(默认 legacy 零行为变化):会话层 ACP 路由(acp_ops 经 HarnessAction→loop_checkpoint→下轮执行,checkpoint 上限 5 防膨胀);任务层 4 个 internal 能力(acp_compress/acp_decompress/acp_search_context/acp_status)仅 ACP 模式注入 manifest
  • 真实 token 计价:模块级 usage 观察按 session 作用域 + TTL(client.py),RealUsageMeter 用 LLM 回传真实 input_tokens 校准,估算永不写账本;nudge 仅提示不强令
  • 迁移兼容:老 context_state 4 键平滑迁入 ACP 状态;ACP_ENABLED feature flag 默认关闭(flag 关闭强制 legacy);legacy 压缩跳过摘要前缀消息与 ACP 已压缩消息,切换往返不丢失 checkpoint

设计决策

  1. 双机制并存而非替换:legacy 已生产验证,并存保留零回归锚点与回退路径
  2. 摘要消息前缀复用既有常量,_is_history_summary_message 请求层保护不破坏
  3. 任务层 ops 与会话层 ops 通道隔离(frame_kind 区分),防 seq 错位跨层执行
  4. 计价经 LLM 回传真实 usage(无显式估算 credit),压缩后上下文变小、真实成本自然下降即回收

测试

  • 后端:2120 passed(19 个失败为存量环境依赖,与基线 008fff3 单独验证一致);ACP 相关 140+ 全绿(内核 63 + 会话层 31 + 任务层 12 + nudge/计价 35 + 迁移 6 + 评审修复 16)
  • 前端:vitest 222 tests / 42 files passed(含 RuntimeSettingsPage 11 用例);npm build + i18n:check + config:check 通过
  • 评审:14 reviewers Tier 2 代码评审 + 15/15 独立 validators 验证 + 14 项 findings 全部修复(commit b46a2ba

Post-Deploy Monitoring

No additional operational monitoring required — ACP_ENABLED feature flag 默认关闭,legacy 路径零行为变化;启用 ACP 的租户按现有 execution record 观测,nudge/压缩事件在日志与 context_state 中可见。上线后建议观察启用租户的压缩触发率与 decompress/search 找回命中率(go/no-go 验收项)。

Known Residuals

  • 会话层 acp_status/acp_search 结果仅写状态不注入模型可见上下文(last_search/last_status 只写不读)
  • nudge_min 阈值与 tiers 分层蒸馏为预留能力,当前无外部消费者
  • 模式切换后残留 acp_ops 可能在下轮执行(legacy 期间不收集)
  • acp_status 结果受 12k 字符截断(大会话 block 索引可能截断)

Compound Engineering

- 会话层与任务层按租户阈值注入 advisory nudge(非强制,紧急升级文案)
- RealUsageMeter 读取 LLM 真实 input_tokens,缺失时回退估算并标记 estimated
- 估算永不参与记账,账本防负数(上游 issue OpenBMB#54 回归防护)
- 会话层 acp_ops 参数安全解析(int/top_k 校验、缺参拒绝、异常防滞留崩溃循环)
- 内核新增 to_state/from_state 官方序列化 API,消除会话层/任务层重复实现
- checkpoint 驱逐后 decompress 返回结构化错误而非静默删除摘要块
- usage 观察按 session 作用域 + TTL,消除跨会话污染与陈旧滞留
- 任务层 originals 上限(CAP=5)与帧隔离(任务层 acp_ops 不流入会话层)
- ACP→legacy 切换排除已压缩消息,避免二次摘要
- 阈值跨字段校验(min≤max≤emergency)+ 前端空值/范围/顺序校验
- 会话层 acp_ops 通道可见性(prompt 指引 + session nudge 注入任务 payload)
- 补 16 个测试(全链路、错误路径、迁移回归)
合并 OpenBMB/StaffDeck main 侧 6 个 commits(b472ac4 Codex/team taskframe orchestration、9cc1840 feat(runtime): configure conversation compaction 等)。
9cc1840 将 legacy 压缩全部参数(context_token_budget/context_compaction_trigger_ratio/context_recent_round_limit/context_long_summary_token_budget/context_medium_summary_token_budget/context_allowed_roles/context_long_summary_prefix/context_medium_summary_prefix)做成 UIConfig 可配置字段,与 ACP 机制选择+阈值字段不撞名,设计共存:
- agent_loop.py:保留 _get_context_compression_mode(ACP)与 _get_conversation_context_settings(legacy 参数)双方法;_conversation_context 按 mode 路由,legacy 分支传入 settings
- conversation_context.py:build_conversation_context 兼容 settings + compression_mode 双参数(自动合并)
- 测试/前端冲突语义合并,双方功能全部保留

验证:test_conversation_context+test_ui_config 47 passed、RuntimeSettingsPage.test.tsx 14 passed、npm build 通过
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant