Skip to content

压缩智能体上下文以提高性能

Supported in ADKPython v1.16.0Java v0.2.0TypeScript v0.6.0

当 ADK 智能体运行时,它会收集 上下文 信息,包括用户指令、检索到的数据、工具响应和生成的内容。随着此上下文数据大小的增长,智能体处理时间通常也会增加。越来越多的数据被发送到智能体使用的生成式 AI 模型,增加处理时间并减慢响应速度。ADK 上下文压缩功能旨在通过汇总智能体工作流事件历史的较旧部分来减少智能体运行时的上下文大小。

上下文压缩功能使用滑动窗口方法来收集和汇总会话内的智能体工作流事件数据。当你在智能体中配置此功能时,一旦达到当前会话中特定数量的工作流事件或调用的阈值,它就会汇总来自较旧事件的数据。

配置上下文压缩

通过在 App 对象 (Python/Java) 上添加事件压缩配置设置,或在 LlmAgent (TypeScript) 上配置 contextCompactors,为你的智能体工作流添加上下文压缩。作为配置的一部分,你必须指定压缩间隔和重叠大小 (Python/Java) 或令牌阈值和事件保留大小 (TypeScript),如下面的示例代码所示:

from google.adk.apps.app import App
from google.adk.apps.app import EventsCompactionConfig

app = App(
    name='my-agent',
    root_agent=root_agent,
    events_compaction_config=EventsCompactionConfig(
        compaction_interval=3,  # 每 3 次新调用触发一次压缩。
        overlap_size=1          # 包含来自上一个窗口的最后一次调用。
    ),
)
import com.google.adk.apps.App;
import com.google.adk.summarizer.EventsCompactionConfig;

App app = App.builder()
    .name("my-agent")
    .rootAgent(rootAgent)
    .eventsCompactionConfig(EventsCompactionConfig.builder()
        .compactionInterval(3)  // 每 3 次新调用触发一次压缩。
        .overlapSize(1)         // 包含来自上一个窗口的最后一次调用。
        .build())
    .build();
import {Gemini, LlmAgent, LlmSummarizer, TokenBasedContextCompactor} from '@google/adk';

const agent = new LlmAgent({
  name: 'my-agent',
  model: 'gemini-flash-latest',
  contextCompactors: [
    new TokenBasedContextCompactor({
      tokenThreshold: 1000, // Trigger compaction when session exceeds 1000 tokens.
      eventRetentionSize: 1, // Keep at least 1 raw event (overlap).
      summarizer: new LlmSummarizer({
        llm: new Gemini({model: 'gemini-flash-latest'}),
      }),
    }),
  ],
});

一旦配置完成,ADK Runner 会在每次会话达到间隔时在后台处理压缩过程。

上下文压缩示例

如果你将 compaction_interval 设置为 3,将 overlap_size 设置为 1,则事件数据会在完成第 3、6、9 次等事件时被压缩。重叠设置会增加第二次汇总压缩的大小,以及之后的每次汇总,如图 1 所示。

上下文压缩示例图示 图 1. 间隔为 3 且重叠为 1 的事件压缩配置图示。

使用此示例配置,上下文压缩任务按以下方式发生:

  1. 事件 3 完成:所有 3 个事件都被压缩成一个汇总。
  2. 事件 6 完成:事件 3 到 6 被压缩,包括 1 个先前事件的重叠。
  3. 事件 9 完成:事件 6 到 9 被压缩,包括 1 个先前事件的重叠。

配置设置

此功能的配置设置控制事件数据压缩的频率以及智能体工作流运行时保留多少数据。你可以选择配置压缩器对象:

  • compaction_interval: 设置触发先前事件数据压缩的已完成事件数量。
  • overlap_size: 设置在新压缩的上下文集中包含多少先前压缩的事件。
  • compactor: (可选) 定义压缩器对象,包括用于汇总的特定 AI 模型。 有关更多信息,请参阅定义汇总器

定义汇总器

你可以通过定义汇总器来自定义上下文压缩的过程。LlmEventSummarizer (Python/Java) 或 LlmSummarizer (TypeScript) 类允许你指定用于汇总的特定模型。以下代码示例演示了如何定义和配置自定义汇总器:

from google.adk.apps.app import App, EventsCompactionConfig
from google.adk.apps.llm_event_summarizer import LlmEventSummarizer
from google.adk.models import Gemini

# 定义用于汇总的 AI 模型:
summarization_llm = Gemini(model="gemini-flash-latest")

# 使用自定义模型创建汇总器:
my_summarizer = LlmEventSummarizer(llm=summarization_llm)

# 为 App 配置自定义汇总器和压缩设置:
app = App(
    name='my-agent',
    root_agent=root_agent,
    events_compaction_config=EventsCompactionConfig(
        compaction_interval=3,
        overlap_size=1,
        summarizer=my_summarizer,
    ),
)
import com.google.adk.apps.App;
import com.google.adk.models.Gemini;
import com.google.adk.summarizer.EventsCompactionConfig;
import com.google.adk.summarizer.LlmEventSummarizer;

// 定义用于汇总的 AI 模型:
Gemini summarizationLlm = Gemini.builder()
    .model("gemini-flash-latest")
    .build();

// 使用自定义模型创建汇总器:
LlmEventSummarizer mySummarizer = new LlmEventSummarizer(summarizationLlm);

// 为 App 配置自定义汇总器和压缩设置:
App app = App.builder()
    .name("my-agent")
    .rootAgent(rootAgent)
    .eventsCompactionConfig(EventsCompactionConfig.builder()
        .compactionInterval(3)
        .overlapSize(1)
        .summarizer(mySummarizer)
        .build())
    .build();
import {Gemini, LlmAgent, LlmSummarizer, TokenBasedContextCompactor} from '@google/adk';

// Define the AI model to be used for summarization:
const summarizationLlm = new Gemini({model: 'gemini-flash-latest'});

// Create the summarizer with the custom model:
const mySummarizer = new LlmSummarizer({llm: summarizationLlm});

// Configure the agent with the custom summarizer and compaction settings:
const agent = new LlmAgent({
  name: 'my-agent',
  model: 'gemini-flash-latest',
  contextCompactors: [
    new TokenBasedContextCompactor({
      tokenThreshold: 1000,
      eventRetentionSize: 1,
      summarizer: mySummarizer,
    }),
  ],
});

你可以通过修改其汇总器来进一步优化压缩器。在 Python 和 Java 中,自定义 LlmEventSummarizer 上的 prompt_template。在 TypeScript 中,自定义 LlmSummarizer 上的 prompt。有关更多详情,请参阅 LlmEventSummarizer 代码LlmSummarizer 代码