Graphiti - エージェント向けの時間的ナレッジグラフ チートシート
Graphiti (Zep による) は AI エージェント向けに 時間的ナレッジグラフ を構築とクエリするためのオープンソースフレームワークです。静的グラフとは異なり、Graphiti は事実が時間とともにどう変わるかを追跡します。各エッジは有効期間を担持するため、グラフは何が真実であるだけでなく いつ それが真実であったかを知っています。出所と歴史を保存します。また、全グラフを再計算することなく増分的にデータを取り込むため — エピソードは追加されます — メモリが進化する事実について推論する必要があるメモリに適しています。
要件
- グラフデータベース: Neo4j または FalkorDB
- LLM プロバイダー (OpenAI, Anthropic など) エンティティ/リレーションシップ抽出用
- Python 3.10+
インストール
| 方法 | コマンド |
|---|
| pip | pip install graphiti-core |
| FalkorDB 付き | pip install "graphiti-core[falkordb]" |
| キーを設定 | export OPENAI_API_KEY=... とグラフ DB 環境変数 |
| 確認 | python -c "import graphiti_core; print('ok')" |
コア概念
| 用語 | 意味 |
|---|
| エピソード | 取り込まれたデータの単位 (メッセージ、テキスト、JSON) |
| ノード | エピソードから抽出されたエンティティ |
| エッジ (事実) | 有効期間 (valid_at/invalid_at) を持つリレーションシップ |
| バイテンポラル | イベント時刻と取り込み時刻の両方を追跡 |
| コミュニティ | 関連エンティティのクラスター |
初期化とエピソード追加
from graphiti_core import Graphiti
from graphiti_core.nodes import EpisodeType
import asyncio
async def main():
graphiti = Graphiti("bolt://localhost:7687", "neo4j", "password")
await graphiti.build_indices_and_constraints()
await graphiti.add_episode(
name="msg1",
episode_body="Nick joined Acme as CTO in 2024.",
source=EpisodeType.text,
reference_time=datetime.now(),
source_description="chat",
)
asyncio.run(main())
| 呼び出し | 説明 |
|---|
Graphiti(uri, user, pass) | グラフ DB に接続 |
build_indices_and_constraints() | ワンタイム スキーマセットアップ |
add_episode(...) | データを取り込み; エンティティ/エッジを自動的に抽出 |
add_episode_bulk(...) | バッチ取り込み |
メモリを検索
# ハイブリッド検索: セマンティック + BM25 + グラフ、再ランク
results = await graphiti.search("Where does Nick work?")
for r in results:
print(r.fact, r.valid_at)
| 検索 | 動作 |
|---|
search(query) | ハイブリッド (セマンティック + キーワード + グラフ) エッジ検索 |
| ノード検索 | エンティティを取得 |
| 再ランキング | RRF / グラフ距離 / クロスエンコーダーオプション |
| セフト ノード | 特定のエンティティ周辺に結果をバイアス |
時間的推論
差別化: 事実が変わるとき、Graphiti は古いものを削除しません — 前のエッジを無効にマークして新しいものを追加するため、履歴が保存されます。
| 機能 | 用途 |
|---|
| 事実の無効化 | 古い事実は矛盾するとき invalid_at をセット |
| 時点クエリ | 「日付 X の時点で何が真実だったか?」 |
| 出所 | 事実をそのソースエピソードにトレース |
| カスタムエンティティタイプ | 型付き抽出用に Pydantic モデルを定義 |
統合
| ターゲット | 方法 |
|---|
| Zep | Graphiti は Zep のメモリサービスの下のエンジン |
| エージェントフレームワーク | メモリ/取得ツールとして使用 |
| MCP | Graphiti MCP サーバーがメモリをエージェントに公開 |
| カスタム | コンテキスト用にグラフを直接クエリ |
一般的なワークフロー
# 変わる事実を生き残るエージェントメモリ
await graphiti.add_episode(name="e1", episode_body="Nick uses Postgres.", ...)
# 後で、事実は変わります:
await graphiti.add_episode(name="e2", episode_body="Nick migrated to SQLite.", ...)
# Graphiti は Postgres 事実を無効化し、時刻付きで SQLite 事実を記録
ctx = await graphiti.search("What database does Nick use now?")
Graphiti vs その他のメモリフレームワーク
| アスペクト | Graphiti | Cognee | Mem0 |
|---|
| コア強み | 時間的/バイテンポラル事実 | グラフネイティブ ECL | パーソナライゼーション |
| 履歴 | 有効期間付きで保存 | グラフスナップショット | 最近フォーカス |
| バックエンド | Neo4j / FalkorDB | マルチストア | ベクトル/グラフ/KV |
| 最適な用途 | 時間とともに変わる事実 | ローカルグラフ推論 | 会話メモリ |
リソース