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 编程实战干货。