mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-03 15:53:56 +00:00
fix(lightkernel): 传统上下文落到实处 —— 子不做策略性裁剪(并修掉裁剪估算的字节/rune 单位混用)
用户指出实现不自洽:"子 agent 是传统上下文,没有裁剪"。查证属实:子仍走 `formatMergedTimeline` 的预算裁剪、也可能走 `pruneOnInput`(既裁剪又向 doc 记忆归档)。 即"动态上下文"(父专属能力)漏进了轻量内核。 ## 三处闸门(按 isLightKernel() 判) 1. **拼装预算**:新增 `contextTokenBudget(b)` —— 父用动态上下文的 `ContextTokens`, 子用**整个窗口** `MaxContext`。两个调用点都改(`stepPrepare`、`rebaseFramePrefix`; 漏掉后者时 prepare 之后的重建仍会裁,实测就是这么被抓出来的)。 2. **pruneOnInput**:轻量内核前置返回 —— 不做按相关度裁剪、不向 doc 记忆归档。 3. doc 记忆 / 整理流水线:早已由 `a.memory == nil` 关闭(N2c)。 ## "不裁"的准确含义 不做**策略性**裁剪(不按相关度挑、不归档),只受"模型能收多少"这个硬上限约束; 且在撞到硬上限之前,contextfull(90% 窗口)已按 L4 上报父 agent ⇒ **丢事件的决定权在父**(压缩/回收/销毁),不在内核。文档 §16.0.0 记录三处闸门表。 ## 顺带修掉的既有 bug(单位混用) `formatMergedTimeline` 逐事件估算原来是 `len(e.Source)+len(e.Input)+40` 再 ×2 —— `len()` 是**字节**,而 `EstimateTokens` 是 rune×2 ⇒ 中文事件被高估 3 倍: 实测 2384 字的中文事件被估成 14398 token > 8192,于是窗口还有余量也提前 break、 把更早的事件整段丢掉。改为统一走 `EstimateTokens`(对父同样生效:中文长会话不再被过早裁剪)。 ## 测试 - 新增 `TestLightKernel_TraditionalContextNoTrimming`:用**记录模型实收消息**的 provider 断言"更早的事件仍在"(为什么不看 TaskFrame:`prepareInputTask` 只做前半段, 消息在 `runTaskSteps`/`stepPrepare` 才拼出来 —— 我第一版断言就打在了空帧上); 填充量取"超过动态份额、但仍在窗口内",从而能区分父/子两种行为。 - 新增 `TestFullKernel_StillUsesDynamicContext` 作对照(父仍用动态份额)。 全量 go test ./... 37 包 ok / 0 FAIL;-race 干净。
This commit is contained in:
@ -456,6 +456,25 @@ type GraphMemory interface {
|
||||
- 轻量 profile 另外不接线的装配:doc 记忆 / context 动态上下文(`pruneOnInput` 等)/
|
||||
蒸馏 / 归档 / 关系复审 / 实体合并定时器 / consolidation / 人格门禁。
|
||||
|
||||
### 16.0.0 传统上下文的实现口径(子 vs 父)
|
||||
|
||||
"传统上下文"不是一句口号,它对应三处**代码闸门**(都按 `isLightKernel()` 判):
|
||||
|
||||
| 能力 | 父(完整内核) | 子(轻量内核) | 闸门位置 |
|
||||
|---|---|---|---|
|
||||
| 时间线拼装预算 | `budget.ContextTokens`(动态上下文算出的份额,≈窗口 32%~53%) | **整个窗口** `budget.MaxContext` | `contextTokenBudget()`(`stepPrepare` 与 `rebaseFramePrefix` 两处) |
|
||||
| 按相关度裁剪 + 向 doc 记忆归档 | 通道/注入点声明 `context_policy=prune` 时执行 | **不执行** | `pruneOnInput()` 前置返回 |
|
||||
| doc 记忆 / 记忆整理流水线 | 有 | 无(`a.memory == nil` ⇒ 既有 22 处关卡自动关闭) | `memoryface.go` / `tooldefs.go` |
|
||||
|
||||
**"不裁"的准确含义**:不做**策略性**裁剪(不按相关度挑、不归档),只受"模型能收多少"这个
|
||||
**硬上限**约束;而且在撞到硬上限之前,contextfull(90% 窗口)已按 L4 上报父 agent ——
|
||||
**丢事件的决定权在父,不在内核**(父可压缩/回收/销毁)。
|
||||
|
||||
**顺带修掉的既有 bug**:`formatMergedTimeline` 逐事件估算原用 `len()`(**字节**)再 ×2,
|
||||
而 `EstimateTokens` 是 rune×2 ⇒ 中文事件被高估 3 倍,窗口还有余量也提前 break、
|
||||
把更早事件整段丢掉(实测 2384 字中文事件被估成 14398 token > 8192)。已改为统一的
|
||||
`EstimateTokens`。这条 bug 对父同样有效(中文长会话会被过早裁剪)。
|
||||
|
||||
### 16.0.1 工具面(已实现)
|
||||
|
||||
| 工具 | 谁用 | 作用 |
|
||||
|
||||
Reference in New Issue
Block a user