Skip to content

上下文压缩与纠错恢复 ​

压缩的目标是减少模型输入,不是删除审计证据。工具调用和工具结果必须成对保留,权限、金额、日期、否定词、来源 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,要求工具调用和结果作为一个整体被舍弃;不能只保留结果。再加入一个权限撤销事件,确认它不会被摘要覆盖。

练习 ​

  1. 为摘要定义 source_ids、created_at、version 和 uncertainty。
  2. 设计压缩失败时的降级:更小模型、异步任务或请求用户缩小范围。
  3. 说明为什么 RAG 证据、用户偏好和任务状态不能使用同一个记忆表。

用心记录每一步成长