メモリ

エージェントに、1回の会話を超えて存続するメモリを与えましょう。セッション状態は この 会話を保持します。一方、メモリはエージェントがターンの開始時に読み取り、学習した内容を書き戻す長期的な保存領域です。これにより、次のセッションではすでにユーザーを把握しています。

このセクションでは、最初から順に説明します。ADK-Rust が提供する2種類のメモリ、コア型、バックエンド、双時間性ナレッジグラフ、そしてそれらすべてをエージェントに組み込む方法を扱います。

ADK-Rust は初めてですか? まず概要セッションと状態をお読みください。メモリは 一時的なセッションに対応する 永続的な仕組みです。

2種類のメモリ

ADK-Rust は、同じMemoryService トレイトの背後で、相補的な2つのメモリモデルを提供します。そのため、エージェントは1つのインターフェースを通じて、どちらでも利用できます。

セマンティックストアナレッジグラフ
形状検索可能なテキストエントリの集合エンティティ、観測結果、型付き関係
想起エントリに対する類似度/キーワード検索プロフィールカード + トークンスコア付きノード検索
最適な用途「X について何を話しましたか?」「このユーザーについて、現在 正しいことは何ですか?」
バックエンドInMemory、SQLite、Postgres、Redis、MongoDB、Neo4jGraphMemoryService(SQLite、双時間)
ページ概念 · バックエンドナレッジグラフ

エージェントごとに、トランスクリプト形式の想起が必要か、ユーザーのクリーンでクエリ可能なモデルが必要かに応じて選択すればよく、グローバルに選ぶ必要はありません。

メンタルモデル

  Agent turn
     │  search_memory(query)         ← recall relevant context at turn start
     ▼
  adk_core::Memory                   ← the interface the agent sees
     │  (MemoryServiceAdapter bridges to…)
     ▼
  MemoryService                      ← add_session / search / delete_user …
     ├─ InMemoryMemoryService        (dev)
     ├─ Sqlite/Postgres/Redis/…      (semantic store)
     └─ GraphMemoryService           (bi-temporal knowledge graph)
  • MemoryService はストレージバックエンドです。エントリ(またはグラフノード)を保存し、search に応答します。
  • MemoryServiceAdapter はそれを adk_core::Memory としてラップし、(app_name, user_id, project_id?) にスコープを限定します。これは、エージェントの search_memory が実際に呼び出すものです。
  • RunnerMemory を保持してエージェントに公開します。メモリツール により、エージェントは意図的にメモリを検索および整理できます。

インストール

# Semantic store — pick the backend you need
adk-memory = { version = "2.1.0", features = ["sqlite-memory"] }

# Bi-temporal knowledge graph
adk-memory = { version = "2.1.0", features = ["graph-memory"] }
機能追加されるもの
(デフォルト)InMemoryMemoryService — セットアップ不要、開発用
sqlite-memorySqliteMemoryService — ファイルベースのセマンティックストア
graph-memoryGraphMemoryService — 双時制ナレッジグラフ(SQLite)
database-memoryPostgresMemoryServicepgvector付き)
redis-memoryRedisMemoryService
mongodb-memoryMongoMemoryService
neo4j-memoryNeo4jMemoryService

60秒クイックスタート

いくつかのメモリを保存して、検索して取得します。

use adk_memory::{InMemoryMemoryService, MemoryService, MemoryEntry, SearchRequest};
use adk_core::Content;
use chrono::Utc;

# async fn run() -> anyhow::Result<()> {
let memory = InMemoryMemoryService::new();

memory.add_session("support", "alice", "s1", vec![
    MemoryEntry { content: Content::new("user").with_text("I prefer email over phone"),
                  author: "user".into(), timestamp: Utc::now() },
]).await?;

let hits = memory.search(SearchRequest {
    app_name: "support".into(), user_id: "alice".into(),
    query: "how should we contact this customer?".into(),
    ..Default::default()
}).await?;

for entry in hits.entries { println!("{:?}", entry.content); }
# Ok(()) }

実際のエージェントでは、search を手動で呼び出すことはありません。サービスを Runner に接続し、エージェント自身にメモリの想起と整理を行わせます

次に読むもの

  1. 概念MemoryEntryMemoryService トレイト、検索、プロジェクトのスコープ設定、GDPR に基づく消去。
  2. バックエンド — 6つのストア、機能フラグ、選択方法。
  3. ナレッジグラフGraphMemoryService と、生物時間が重要である理由。
  4. ツールとエージェント — エージェントへのメモリの組み込み、remember/relate とメモリツール。
メモリ - ADK-Rust ドキュメント | ADK-Rust