上下文压缩与纠错恢复
压缩的目标是减少模型输入,不是删除审计证据。工具调用和工具结果必须成对保留,权限、金额、日期、否定词、来源 ID 和未解决问题不能只剩模糊摘要。摘要应带来源范围和版本;发现错误时用新版本替换旧摘要,不能静默改写历史。
第一个可运行实验:按完整回合裁剪
保存为 compress.py,用 Python 3.12 运行。
python
turns = [
{'id': 'u1', 'kind': 'user', 'tokens': 10},
{'id': 'c1', 'kind': 'tool_call', 'pair': 'r1', 'tokens': 8},
{'id': 'r1', 'kind': 'tool_result', 'pair': 'c1', 'tokens': 12},
{'id': 'u2', 'kind': 'user', 'tokens': 15},
]
def pack(turns, budget):
chosen = []
used = 0
for item in reversed(turns):
group = [item]
if item.get('pair'):
mate = next(x for x in turns if x['id'] == item['pair'])
group = [mate, item] if mate not in chosen else [item]
cost = sum(x['tokens'] for x in group)
if used + cost > budget:
continue
chosen[0:0] = [x for x in group if x not in chosen]
used += cost
return chosen
picked = pack(turns, 35)
assert [x['id'] for x in picked] == ['c1', 'r1', 'u2']
assert {x['id'] for x in picked} >= {'c1', 'r1'}
print('paired compression passed')真实系统可以先保留系统指令和当前问题,再选择最近完整回合;不能按字符串长度估算 token。压缩后的摘要要能追溯到原始消息,模型纠正事实时应生成新记录并保留旧记录的撤销关系。
变体实验
把预算改为 20,要求工具调用和结果作为一个整体被舍弃;不能只保留结果。再加入一个权限撤销事件,确认它不会被摘要覆盖。
练习
- 为摘要定义
source_ids、created_at、version和uncertainty。 - 设计压缩失败时的降级:更小模型、异步任务或请求用户缩小范围。
- 说明为什么 RAG 证据、用户偏好和任务状态不能使用同一个记忆表。