Agent Skills by ALSEL
汎用LLM・AI開発⭐ リポ 0品質スコア 65/100

openclaw-memory-graph

Neo4jベースのグラフメモリをOpenclawプロバイダー向けに提供します。従来のフラットファイル形式の`memory/`システムを、型付きメモリノード、セマンティックエッジ、ベクトル類似度による検索、既存フラットファイルメモリの自動マイグレーション機能に対応したプロパティグラフに置き換えます。

description の原文を見る

Neo4j-backed graph memory for Openclaw providers. Replaces the flat-file `memory/` system with a property graph that supports typed memory nodes, semantic edges, vector-similarity recall, and automatic migration of existing flat-file memories.

SKILL.md 本文

openclaw-memory-graph

Openclaw プロバイダー向けの Neo4j バックアップ グラフメモリ。

フラットファイルの memory/ システムをプロパティグラフに置き換え、型付きメモリノード、セマンティックエッジ、ベクトル類似度リコール、および既存のフラットファイルメモリの自動マイグレーションをサポートします。


前提条件

1. Neo4j の起動または検出

オプション A — Docker Compose(ローカル開発):

docker compose up -d

bolt://localhost:7687 で Neo4j 5.x を起動し、認証情報は neo4j / openclaw-dev です。

オプション B — Neo4j AuraDB(ホステッド): 無料インスタンスを作成し、接続 URI と認証情報をメモします。

オプション C — 既存の Neo4j インスタンス: 既存のインスタンスを使用し、接続 URI と認証情報を設定します。

2. 環境変数を設定

変数必須デフォルト説明
NEO4J_URIはい例: bolt://localhost:7687
NEO4J_USERはいNeo4j ユーザー名
NEO4J_PASSWORDはいNeo4j パスワード
OPENCLAW_EMBEDDING_PROVIDERいいえsentence-transformersopenaiollama、または sentence-transformers
OPENCLAW_EMBEDDING_MODELいいえall-MiniLM-L6-v2モデル名またはローカルパス
OPENAI_API_KEYOpenAI 使用時OpenAI API キー
OLLAMA_BASE_URLOllama 使用時http://localhost:11434ローカル Ollama URL

3. 依存関係をインストール

pip install -r requirements.txt

Sentence Transformers プロバイダー(オプション — ローカル、API キー不要):

pip install -r requirements-sentence-transformers.txt

その後、以下を設定します:

OPENCLAW_EMBEDDING_PROVIDER=sentence-transformers
# OPENCLAW_EMBEDDING_MODEL のデフォルトは all-MiniLM-L6-v2
# HuggingFace のモデル名またはファイン調整済みモデルへのローカルパスも受け入れられます。

注記: 初回実行時は、モデルをダウンロード(all-MiniLM-L6-v2 の場合は約 90 MB)し、~/.cache/huggingface/hub/ にキャッシュします。

警告: メモリが既に保存されている後で埋め込みプロバイダーまたはモデルを変更した場合は、再埋め込みが必要です。既存の埋め込みは異なるベクトル空間で生成されており、誤った類似度結果が返されます。再埋め込みするには、すべてのメモリノードの embedding プロパティをクリアし、バッチ埋め込みを再実行します。embeddings.pybatch_embed_memories() を参照してください。

カスタムモデルのファイン調整

ドメイン固有のコンテンツでリコール精度を向上させるには、Sentence Transformer をラベル付きデータセットで ファイン調整できます:

python -m openclaw_memory_graph fine-tune \
    --dataset path/to/data.csv \
    --output ./fine-tuned-model \
    --base-model all-MiniLM-L6-v2

データセット形式(sentence1sentence2score 列を持つ CSV または JSONL):

sentence1,sentence2,score
"The user prefers dark mode","Enable dark theme",0.95
"Bug in login flow","Authentication error",0.88

ファイン調整後、保存されたモデルをポイントします:

OPENCLAW_EMBEDDING_PROVIDER=sentence-transformers
OPENCLAW_EMBEDDING_MODEL=./fine-tuned-model

4. スキルを初期化

from skills.openclaw_memory_graph import MemorySkill

skill = MemorySkill(agent_id="my-project")

新しい agent_id の初回実行時に、スキルが自動的に以下を実行します:

  • Neo4j で (:Agent) ルートノードを作成
  • memory/*.md をスキャンしてフラットファイルメモリをグラフにマイグレーション
  • 非同期で埋め込みを生成

マイグレーションはべき等です — 再実行してもノードが重複することはありません。


メモリタイプ

タイプNeo4j ラベル用途
short-termShortTermセッションスコープのコンテキスト;TTL 有効期限をサポート
long-termLongTerm永続的な事実、設定、ユーザープロファイル
workingWorkingMemoryタスク中のアクティブなスクラッチパッド

リレーションシップタイプ

タイプ意味
RELATED_TO一般的なセマンティック関連付け
PRECEDES時間的順序付け(A は B の前に発生)
SUPPORTSA が B の証拠またはコンテキストを提供
CONTRADICTSA が B と矛盾

オペレーション

save — 新しいメモリを保存

memory_id = skill.save(
    name="User role",
    content="The user is a senior backend engineer with Go expertise.",
    memory_type="long-term",          # 必須: 'short-term'、'long-term'、または 'working'
    description="User background",    # オプション:ワンライン要約
    ttl=3600,                          # オプション:TTL(秒)(short-term のみ)
)
# 戻り値: UUID 文字列(新しいメモリの id)

埋め込み生成は保存後に非同期で実行されます。埋め込みプロバイダーが設定されていない場合、リコールはテキストマッチにフォールバックします。


recall — 関連するメモリを取得

result = skill.recall(
    query="Go programming background",
    top_k=5,               # オプション、デフォルト 5
    type_filter="long-term",  # オプション:1 つのメモリタイプに限定
)
# 戻り値:
# {
#   "results": [ { "id": ..., "name": ..., "content": ..., "score": ... }, ... ],
#   "method": "vector"   # または埋め込みが利用できない場合は "text"
# }

埋め込みが利用できない場合、スキルは namecontent に対する大文字小文字を区別しない部分文字列マッチにフォールバックし、レスポンスに "warning" キーを含めます。


update — 既存のメモリを修正

updated = skill.update(
    memory_id,
    content="Updated content here.",
    name="New name",          # 書き込み可能なフィールド
    description="Updated description",
)
# 戻り値: 更新されたメモリノードプロパティ辞書
# 発生例外: memory_id がこのエージェント下に存在しない場合の NotFoundError

content が変更された場合、埋め込み再生成が自動的にトリガーされます。


forget — メモリを永続的に削除

result = skill.forget(memory_id)
# 戻り値: {"deleted": True, "message": "Memory '<id>' deleted."}
# または:  {"deleted": False, "message": "Memory '<id>' not found."}

ノードとすべてのリレーションシップを削除します。これは不可逆的です。


connect — 2 つのメモリ間にエッジを作成

result = skill.connect(
    from_id=memory_id_a,
    to_id=memory_id_b,
    relationship="SUPPORTS",   # RELATED_TO | PRECEDES | SUPPORTS | CONTRADICTS
)
# 戻り値: {"connected": True, "from": ..., "to": ..., "relationship": "SUPPORTS"}
# 発生例外: 未知のリレーションシップタイプの ValidationError

traverse — 開始ノードからグラフを巡回

subgraph = skill.traverse(
    start_id=memory_id,
    depth=2,                            # オプション、デフォルト 1
    relationship_types=["SUPPORTS"],    # オプション フィルター
)
# 戻り値: {"nodes": [...], "edges": [...]}

list — このエージェントのすべてのメモリを返す

memories = skill.list(type_filter="long-term")  # type_filter はオプション
# 戻り値: メモリノード辞書のリスト、updated_at DESC でソート

prune_expired — TTL 期限切れの短期メモリを削除

deleted_count = skill.prune_expired()
# 戻り値: int — 削除されたノード数

定期的に呼び出す(例:セッション開始時)と、古い ShortTerm ノードを削除します。


完全な例

from skills.openclaw_memory_graph import MemorySkill

skill = MemorySkill(agent_id="my-project")

# 長期的な事実を保存
user_mid = skill.save(
    name="User role",
    content="The user is a senior backend engineer with Go expertise.",
    memory_type="long-term",
)
ctx_mid = skill.save(
    name="Frontend context",
    content="User is new to React — frame explanations in Go analogues.",
    memory_type="long-term",
)

# 関連するメモリをリンク
skill.connect(user_mid, ctx_mid, "RELATED_TO")

# セッションスコープのコンテキストを保存(1 時間で有効期限切れ)
skill.save(
    name="Current task",
    content="Reviewing the auth middleware PR.",
    memory_type="short-term",
    ttl=3600,
)

# 応答する前に関連するメモリをリコール
result = skill.recall("user's programming background", top_k=3)
for mem in result["results"]:
    print(mem["name"], "—", mem["content"])

# 接続されたコンテキストを探索
subgraph = skill.traverse(user_mid, depth=2)

# 有効期限切れの短期メモリをクリーンアップ
skill.prune_expired()

エラーハンドリング

例外発生条件
ConfigurationErrorNEO4J_URINEO4J_USER、または NEO4J_PASSWORD が不足している
AuthorizationErrorNeo4j 認証情報が拒否された
NotFoundErrorupdate が存在しない id で呼び出された
ValidationError無効な memory_type または relationship

すべての例外は skills.openclaw_memory_graph.exceptions からインポート可能です。


グラフ構造リファレンス

(:Agent {id}) -[:HAS_MEMORY]-> (:Memory:ShortTerm | :LongTerm | :WorkingMemory)
(:Memory) -[:RELATED_TO | :PRECEDES | :SUPPORTS | :CONTRADICTS]-> (:Memory)

メモリノードは、Neo4j ベクトルインデックスを介したコサイン類似度リコール用の embedding ベクトルを保持します(Neo4j 5.0+ が必要)。

ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
michaeldowling
リポジトリ
michaeldowling/openclaw-memory-graph
ライセンス
Apache-2.0
最終更新
2026/3/28

Source: https://github.com/michaeldowling/openclaw-memory-graph / ライセンス: Apache-2.0

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: michaeldowling · michaeldowling/openclaw-memory-graph · ライセンス: Apache-2.0