メモリ
エージェントに、1回の会話を超えて存続するメモリを与えましょう。セッション状態は この 会話を保持します。一方、メモリはエージェントがターンの開始時に読み取り、学習した内容を書き戻す長期的な保存領域です。これにより、次のセッションではすでにユーザーを把握しています。
このセクションでは、最初から順に説明します。ADK-Rust が提供する2種類のメモリ、コア型、バックエンド、双時間性ナレッジグラフ、そしてそれらすべてをエージェントに組み込む方法を扱います。
ADK-Rust は初めてですか? まず概要と セッションと状態をお読みください。メモリは 一時的なセッションに対応する 永続的な仕組みです。
2種類のメモリ
ADK-Rust は、同じMemoryService トレイトの背後で、相補的な2つのメモリモデルを提供します。そのため、エージェントは1つのインターフェースを通じて、どちらでも利用できます。
| セマンティックストア | ナレッジグラフ | |
|---|---|---|
| 形状 | 検索可能なテキストエントリの集合 | エンティティ、観測結果、型付き関係 |
| 想起 | エントリに対する類似度/キーワード検索 | プロフィールカード + トークンスコア付きノード検索 |
| 最適な用途 | 「X について何を話しましたか?」 | 「このユーザーについて、現在 正しいことは何ですか?」 |
| バックエンド | InMemory、SQLite、Postgres、Redis、MongoDB、Neo4j | GraphMemoryService(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が実際に呼び出すものです。- Runner は
Memoryを保持してエージェントに公開します。メモリツール により、エージェントは意図的にメモリを検索および整理できます。
インストール
# 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-memory | SqliteMemoryService — ファイルベースのセマンティックストア |
graph-memory | GraphMemoryService — 双時制ナレッジグラフ(SQLite) |
database-memory | PostgresMemoryService(pgvector付き) |
redis-memory | RedisMemoryService |
mongodb-memory | MongoMemoryService |
neo4j-memory | Neo4jMemoryService |
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 に接続し、エージェント自身にメモリの想起と整理を行わせます。
次に読むもの
- 概念 —
MemoryEntry、MemoryServiceトレイト、検索、プロジェクトのスコープ設定、GDPR に基づく消去。 - バックエンド — 6つのストア、機能フラグ、選択方法。
- ナレッジグラフ —
GraphMemoryServiceと、生物時間が重要である理由。 - ツールとエージェント — エージェントへのメモリの組み込み、
remember/relateとメモリツール。