こんにちは、DX開発事業郚の束本です。

早速ですが皆さん、「゚ヌゞェント開発」やっおいたすか
昚幎の゚ンゞニア流行語ず蚀っおも過蚀ではない「゚ヌゞェント開発」。その䞭でよく聞く「Google Agent Development KitADK」を皆さんも觊られたでしょうか
私もADKを䜿甚しお開発をいく぀か行っおきたした。
その䞭で共通しおぶち圓たった壁があったので、今回勉匷も兌ねお蚘事にしたした。
たた、Pythonを䜿甚するこずを前提ずしおいるのでご了承ください🙇‍♂

共通しお出た課題

先ほども話に出たした「共通しお出た課題」ですが、たずはこちらに぀いおお話ししたす。
ADKを䜿甚しお開発を進めるにあたっお䜕床もこの課題にぶ぀かりたした。珟圚進行圢でぶ぀かっおいたす
開発するシステムや゚ヌゞェントは様々ですが、どの開発でも確実に䟋倖なく絶察にぶ぀かっおおりたす。その課題が䜕かず蚀いたすず「コンテキストりィンドりの圧迫問題」です。
ADKを䜿甚するずいうこずは、もちろん行うのは「゚ヌゞェント開発」です。そしおその゚ヌゞェントを開発する際に無くおはならないものは「LLM」ですね。そしおそのLLMに関わる郚分で毎回ぶ぀かっおいたす 🫠

コンテキストりィンドりずは

そもそもコンテキストりィンドりずは䞀䜓䜕ずなっおいる方もいらっしゃるかもしれないので、振り返りも兌ねお「コンテキスト」ず「コンテキストりィンドり」に぀いおたずめたした。

コンテキスト

コンテキストずは、AI゚ヌゞェントがタスクを実行するために必芁な「背景情報」のこずです。具䜓的には䞋蚘のようなものが含たれたす。

・䌚話履歎これたでのナヌザヌず゚ヌゞェントのやり取り
・セッション状態ナヌザヌの蚭定や過去の情報
・゚ヌゞェント情報珟圚実行䞭の゚ヌゞェントの詳现
・サヌビス参照アヌティファクト、メモリ、認蚌などの機胜ぞのアクセス

ずいった感じで、人間が䌚話する時の「これたでのやり取り」や「状況」のようなむメヌゞです。

コンテキストりィンドり

コンテキストりィンドりは、LLMが䞀床に凊理できる情報の「容量制限」のこずです。本棚に眮ける本の数のようなむメヌゞです。もしこの容量を超えおしたうず

・叀い情報が切り捚おられる
・゚ラヌが発生する
・パフォヌマンスが䜎䞋する

ずいうような感じで、LLMの粟床だけでなくシステム党䜓に圱響を䞎えおしたいたす。
このこずからAI゚ヌゞェントのタスクを実行する時には、コンテキストりィンドりに収たるようにプロンプトや凊理を曞き蟌んでいく必芁がありたす。

そしお今回の「コンテキストりィンドりの圧迫」ずは、この「容量」に情報が収たりきっおいない状態のこずです。

コンテキストりィンドりの圧迫問題の解消

䞊蚘でコンテキストりィンドりずは䜕かがわかりたしたね。
そしお毎回私はこの「コンテキストりィンドりの圧迫」に苊しめられおいたす 
プロンプトが長くなっおしたったり凊理を现かくしたりなど様々な芁因で、このコンテキストりィンドりの容量をオヌバヌしおしたいたす。

しかし、そこはADK。この問題を解消するための機胜が備わっおいたす
今回はそのうちの぀ほどをご玹介したす

぀目コンテキストキャッシング

぀目はver1.15.0で登堎した「コンテキストキャッシング」機胜です。
どのような機胜かずいうず、LLMぞのリク゚ストで繰り返し䜿甚される静的なコンテンツプロンプトやツヌルの定矩などをキャッシングし、回目以降の読み蟌み量やトヌクン数を抑え、パフォヌマンスを向䞊させる機胜です。
たた実装方法ずしおもかなり簡単なので、私も普段よく䜿甚しおいたす。

アプリケヌションレベルでの蚭定

app = App( 
    name="cached_app",
    root_agent=agent, 
    context_cache_config=ContextCacheConfig( 
        min_tokens=4096, 
        ttl_seconds=600, 
        cache_intervals=3 
    )
)

゚ヌゞェントレベルでの最適化

agent = LlmAgent( 
    name="optimized_agent", 
    static_instruction="You are a helpful assistant.", # 静的指瀺 
    instruction="Current task: {task}" # 動的指瀺 
)

このようにシンプルな蚘茉でかなりのトヌクン数を抑えるこずができたす。
堎合によっおは、元々の半分以䞊のトヌクンを抑えるこずができるので、その埌の凊理がかなりスムヌズになりたす
しかし気を぀けるべきずころずしお、「static_instruction」の蚭定だけではなく、「context_cache_config」で明瀺的な蚭定を行う必芁があるので、気を぀けおください。

぀目コンテキスト圧瞮

぀目はver1.16.0で登堎した「コンテキスト圧瞮」機胜です。
これは、䌚話履歎が長くなり過ぎおしたった堎合に、叀いむベントを芁玄しおコンテキストりィンドりの制限内に収めるための機胜です
先ほどの「コンテキストキャッシング」ずは異なり、その名前の通り圧瞮凊理を行なっおくれたす。

蚭定方法

「RunConfig」で「context_window_compression」を蚭定したす。

run_config = RunConfig( 
    context_window_compression=types.ContextWindowCompressionConfig( 
        trigger_tokens=1000, 
        sliding_window=types.SlidingWindow(target_tokens=500), 
    ) 
)

適甚箇所

この蚭定はLLMリク゚ストに枡されたす。

llm_request.live_connect_config.context_window_compression = ( 
    invocation_context.run_config.context_window_compression 
)

こちらも比范的簡単に実装ができ、倧きな効力を埗るこずができたす。
履歎が長くなっおしたうような察話型のセッション䞻に長期的なには、ずおも効果的な機胜です。

たずめ

以䞊぀が、今回私がご玹介したかったコンテキストりィンドりの圧迫を解決する機胜でした
いかがでしたでしょうか
もちろんこれ以倖にもコンテキストりィンドりの圧迫のための察策機胜や実装方法などはございたすが、今回は私が実際に䜿甚しおみお、特にトヌクン数を抑えるこずができたものをご玹介したした。

ずはいえ、この機胜を䜿甚しおもトヌクン数がオヌバヌしおコンテキストりィンドりの圧迫問題を匕き起こしおしたうので、より効率の良い凊理・簡朔で的確なプロンプトの実装が求められおきたす。
なのでこれからもいろいろず詊行錯誀し、よりこの機胜を掻かせるように、より良いコヌドが曞けるよう頑匵っおいきたい所存です

今回は以䞊ずなりたす。
ここたで読んでくださっお、ありがずうございたした
では皆さん、良い゚ヌゞェント開発を