芋出し画像

🛰開発者向け最新Google AI゚ヌゞェントコヌスを培底解説: コンテクスト・゚ンゞニアリングに必芁なセッションずメモリヌ💟

AI゚ヌゞェントに関するアップデヌトされた新しい技術や知識を孊べば孊ぶほど、れロから新しいコンセプトを習っおいるような感芚に陥りたす。

ツヌルの䜿い方やプランニングロゞックに慣れおきた昚今、Day 3では改新された局ヌヌ「メモリヌ」が登堎したす。人間ず同じように、゚ヌゞェントにも「短期的な意識」ず「長期的な蚘憶」が必芁になっおきたす。

今回のテヌマは「コンテクスト・゚ンゞニアリング」です。

これは、゚ヌゞェントが「今、䜕を知っおいるべきか」を動的に敎理・管理する蚭蚈手法のこずで、゚ヌゞェントがスムヌズに動くためのオヌケストレヌションに欠かせない郚分です。

通垞の簡単なチャットボットは、メッセヌゞを送るたびに党おを忘れおしたいたすが、コンテクスト・゚ンゞニアリングでは「䜕を芚え」「䜕を忘れ」「い぀思い出すか」を蚭蚈し、短期的・長期的なデヌタの保存機胜ではなく、時間をたたいで文脈を぀なぐ仕組みそのものずしお機胜したす。

  • Session は「今この瞬間の䌚話」を扱う――぀たり短期的蚘憶。

  • Memory は「過去に孊んだこずやナヌザヌ情報」を扱う――぀たり長期的蚘憶。

この2぀が組み合わさるこずで、゚ヌゞェントは単なる䞀問䞀答の存圚を超え、時間を越えお「文脈を理解する存圚」に進化したす。


💭短期的蚘憶ずしお機胜するセッション

Sessionセッションは、゚ヌゞェントの䜜業甚メモリにあたりたす。珟圚進行䞭の䌚話を保存し、耇数タヌンにわたるやり取りの敎合性を保぀事を目的ずしおいたす。

モデル自䜓は本来「ステヌトレス無状態」ですが、Sessionを䜿うこずで、過去のやり取りを毎回コンテキストりィンドりに再構築し、擬䌌的に蚘憶を持぀ようにできたす。

ここでは、GoogleのADK゚ヌゞェント・デノェロップメント・キットのセッション管理機胜を䜿っお、最もシンプルな「状態を持぀゚ヌゞェントステヌトフル・゚ヌゞェント」を実装しおみたす。

さらに詳しい内容はKaggleのノヌトブックを参照しおみおください。

🔁ステヌトフル・゚ヌゞェントの簡単実装

ADKには幟぀かのセッション管理方法が甚意されおいたすが、ここではInMemorySessionServiceを䜿っおメモリヌ䞊に䌚話履歎を䞀時保存をするコヌドを玹介したす。

# Step 0: 定数を定矩
APP_NAME = "default"   # アプリケヌション名
USER_ID = "default"    # ナヌザヌID
SESSION = "default"    # セッションID

MODEL_NAME = "gemini-2.5-flash-lite"  # 䜿甚するモデル名


# Step 1: LLM゚ヌゞェントを䜜成
# この゚ヌゞェントが䌚話の䞭心ずなる
root_agent = Agent(
    model=Gemini(model=MODEL_NAME, retry_options=retry_config),
    name="text_chat_bot",
    description="テキストチャット甚の゚ヌゞェント",  # ゚ヌゞェントの目的を説明
)


# Step 2: セッション管理をセットアップ
# InMemorySessionServiceは、䌚話履歎をRAMに䞀時保存する
session_service = InMemorySessionService()


# Step 3: Runnerを䜜成
# Runnerぱヌゞェント・アプリ名・セッション管理を぀なぐ実行環境
runner = Runner(
    agent=root_agent,
    app_name=APP_NAME,
    session_service=session_service
)

print("✅ ステヌトフル・゚ヌゞェントの初期化完了")
print(f"   - アプリケヌション名: {APP_NAME}")
print(f"   - ナヌザヌID: {USER_ID}")
print(f"   - 䜿甚しおいるセッション管理: {session_service.__class__.__name__}")

この状態で゚ヌゞェントを起動するず、InMemorySessionService がナヌザヌからの質問ず゚ヌゞェントの返答をすべおメモリ䞊に蚘録しおいきたす。これにより、゚ヌゞェントは

  • 同じ䌚話内で「前に蚀ったこず」を芚え、

  • 文脈を螏たえた自然な返答を行い、

  • 䌚話の流れを継続的に構築できたす。

ただし、「InMemory」なので、アプリを再起動するず蚘録は消えたす。それでもこの仕組みは、短期的なコンテキスト管理を理解する最初のステップずしお最適です。

次のステヌゞでは、ここに「長期的な蚘憶Memory」を加え、゚ヌゞェントがセッションを超えお孊びを匕き継げるようにしおいきたす。

💟メモリヌ長期的蚘憶の仕組み

セッションが「今亀わされおいる䌚話」を扱う短期的蚘憶だずすれば、メモリヌはセッションを超えお情報を保持する長期的蚘憶です。この機胜を䜿うこずで、゚ヌゞェントは過去の䌚話やナヌザヌ情報を思い出し、よりパヌ゜ナラむズされた察話が可胜になりたす。Google ADKでは、メモリヌの統合は以䞋のステップによっお行えたす。

🧩 ステップ1: Memory を初期化する

たずはメモリヌサヌビスを䜜成し、゚ヌゞェントずRunnerに接続したす。

from adk.memory import InMemoryMemoryService

# Memoryサヌビスを初期化開発・テスト甚
memory_service = InMemoryMemoryService()

# 定数
APP_NAME = "MemoryDemoApp"  # アプリケヌション名
USER_ID = "demo_user"        # ナヌザヌID

# ゚ヌゞェント䜜成
user_agent = LlmAgent(
    model=Gemini(model="gemini-2.5-flash-lite", retry_options=retry_config),
    name="MemoryDemoAgent",
    instruction="ナヌザヌの質問にわかりやすく答える",  # ゚ヌゞェントの指瀺
)

print("✅ ゚ヌゞェント䜜成完了")

# Sessionサヌビスを䜜成䌚話履歎を扱う
session_service = InMemorySessionService()

# Runnerに䞡方のサヌビスを枡しおセットアップ
runner = Runner(
    agent=user_agent,
    app_name=APP_NAME,
    session_service=session_service,
    memory_service=memory_service,  # Memoryサポヌトを远加
)

print("✅ ゚ヌゞェントずランナヌのセットアップ完了")

⛜ステップ: セッション内容をメモリヌに远加する

ナヌザヌずの䌚話内容セッションをメモリヌに移すこずで、゚ヌゞェントは過去の䌚話情報を保持するこずができたす。

# ナヌザヌが奜きな色を教える
await run_session(
    runner,
    "私の奜きな色は青緑です。この色を題材に俳句を曞いおくれたすか",
    "conversation-01",  # セッションID
)

# セッションを取埗
session = await session_service.get_session(
    app_name=APP_NAME, user_id=USER_ID, session_id="conversation-01"
)

# セッションの内容を確認
print("📝 セッションの内容:")
for event in session.events:
    text = (
        event.content.parts[0].text[:60]
        if event.content and event.content.parts
        else "(空)"
    )
    print(f"  {event.content.role}: {text}...")

# ここが重芁セッションをMemoryに远加
await memory_service.add_session_to_memory(session)

print("✅ セッションをメモリヌに远加完了")

補足:
コヌド䟋には await が登堎したすが、これぱヌゞェントの凊理が非同期asyncで動くためです。
実際のアプリケヌションでは、async def の関数の䞭で呌び出すか、asyncio.run() で同期環境から実行できたす。

🗄メモリヌを䜿った情報の怜玢掻甚方法

保存したメモリヌを゚ヌゞェントが必芁に応じお怜玢できるように蚭定したす。

# ゚ヌゞェント䜜成Memory怜玢ツヌルを远加
user_agent = LlmAgent(
    model=Gemini(model="gemini-2.5-flash-lite", retry_options=retry_config),
    name="MemoryDemoAgent",
    instruction="ナヌザヌの質問にわかりやすく答え、必芁に応じお過去の䌚話を呌び出すツヌルを䜿う",
    tools=[load_memory],  # Google ADK組み蟌みのMemory怜玢ツヌルを远加
)

print("✅ load_memoryツヌル付き゚ヌゞェント䜜成完了")

# 新しいRunnerで再セットアップ
runner = Runner(
    agent=user_agent,
    app_name=APP_NAME,
    session_service=session_service,
    memory_service=memory_service,
)

# 過去の䌚話を呌び出しお質問に答えさせる
await run_session(runner, "私の奜きな色を芚えおいたすか", "color-test")

ポむント:

  • Google ADK 搭茉のload_memory ツヌルを䜿うこずで、゚ヌゞェントは必芁な情報を過去の Memory から怜玢しお回答に掻かせたす

🧠 たずめ

  1. 初期化メモリヌサヌビスを䜜り、゚ヌゞェントに接続する。

  2. 保存䌚話内容セッションをメモリヌに保存する。

  3. 怜玢呌び出し必芁な情報をメモリヌから怜玢しお䌚話に掻甚する。

この流れで、゚ヌゞェントは短期的蚘憶ず長期的蚘憶を組み合わせお、時間をたたいだ文脈理解が可胜になり、単なるチャットボットから継続的に思考を積み重ねる協働者のような振る舞いが可胜になりたす。

🏁 Day 3たずめSession ず Memory が生む “぀ながり”

Day 3で扱った Session短期蚘憶ず Memory長期蚘憶は、どちらも「コンテキストをどう扱うか」ずいうテヌマに぀ながっおいたす。

  • Session はいた進行䞭の䌚話を保持するしくみ

  • Memory は䌚話を越えお残したい情報を取り出すしくみ

この2぀が揃うこずで、゚ヌゞェントは単なる質問応答ではなく、
䌚話の積み重ねを理解し続ける“盞棒”のような存圚になっおいきたす。

次回のDay 4ではこの繋がりをさらに磚いおいきたす。どうたずめるか、同安定させるか、どう䞀貫性を保぀のか——぀たり゚ヌゞェントの品質蚭蚈がテヌマになりたす。



いいなず思ったら応揎しよう

ゆかずneither🪄 いただいたチップはコミュニティヌ蚭眮やプロゞェクト始動・運営などの掻動費に䜿わせおいただきたすそしおNoteにプロセスなどをシェアしおいきたす。よろしくお願いしたす

この蚘事が参加しおいる募集