跑长任务 agent 最怕上下文爆掉,试了 3 种方案:
方案 1:全量保留
最简单,但跑到 20 轮就开始丢信息。
方案 2:滑动窗口
只保留最近 10 轮,但早期的重要信息全丢了。
方案 3:滚动摘要
每 10 步压缩一次历史,保留关键信息。
核心实现:
def rolling_summary(messages, step):
if step % 10 == 0:
# 压缩历史
summary = compress(messages[:-10])
messages = [summary] + messages[-10:]
return messages
def compress(messages):
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "压缩对话历史,保留关键信息"},
{"role": "user", "content": str(messages)}
]
)
return {"role": "system", "content": response.choices[0].message.content}
跑了个 50 轮的长任务,滚动摘要方案最稳,信息丢失最少。