详解 ADK Go 的 Context Compression 机制——如何压缩历史消息,保持上下文精简,控制 token 消耗。
Context Compression:上下文压缩,保持对话精简
长对话的另一个问题是:历史消息太长了,占 token,还可能超出 context window。Compression 把历史消息压缩,保持精简。
Compression vs Caching
| 机制 | 原理 | 适用场景 |
|---|---|---|
| Caching | 把不变的部分缓存起来 | 系统提示词、知识库 |
| Compression | 把历史消息压缩精简 | 多轮对话历史 |
两者可以叠加使用,效果更好。
工作原理
原始历史: 压缩后:
[用户] 你好,我想订票 [摘要] 用户想订票
[Agent] 好的,去哪里? [用户] 去哪里?
[用户] 上海 [Agent] 好的,去上海
[Agent] 什么时候? ...
[用户] 明天
[Agent] 好的,明天的票...
压缩不是删除,是把冗长的对话提炼成简短的关键信息。
使用方式
自动压缩
配置压缩策略,让框架自动压缩:
session, _ := sessions.NewSession(ctx,
sessions.WithUserID("user-123"),
sessions.WithAgentID("my-agent"),
sessions.WithCompression(sessions.CompressionConfig{
Enabled: true,
Threshold: 50, // 超过 50 条消息开始压缩
Ratio: 0.5, // 压缩到原来的一半
}),
)
手动触发压缩
session.Compress(ctx)
压缩策略
| 策略 | 说明 |
|---|---|
Summary | 生成摘要,保留关键信息 |
Truncate | 截断,只保留最近 N 条 |
Hybrid | 先摘要,再截断 |
自定义压缩器
type myCompressor struct{}
func (c myCompressor) Compress(ctx context.Context, messages []string) string {
// 自定义压缩逻辑
// 例如:只保留包含关键信息的消息
// 关键信息:数字、时间、名字、意图
}
session, _ := sessions.NewSession(ctx,
sessions.WithCompressor(myCompressor{}),
)
常见问题
Q:压缩会影响 Agent 性能吗 A:压缩不可避免会丢失一些信息。如果压缩质量不好,Agent 表现会下降。建议监控压缩后的效果。
Q:压缩策略怎么选
A:Summary 适合对话内容丰富的场景;Truncate 适合简单对话;Hybrid 是平衡选择。
Q:可以禁用压缩吗
A:可以,Enabled: false。但长对话最终会超出 context window,需要自行处理。
下一步
最后看 Rewind——把 Agent 回溯到历史状态重新执行,适用于 Agent 走错路、需要重新来的场景。
← Context Caching | Rewind Sessions →
想跟着学更多 Go ADK 实战?关注「全栈之巅-梦兽编程」公众号,每周更新 Go / AI 编程实战干货。
