メモリのベストプラクティス
効果的な再取得のためのメモリ構造化 — カテゴリ、キー、タグ、優先度。
メモリのベストプラクティス
メモリの構造化方法が有用性を決定します。本ガイドでは、LLM が適切な時に適切な情報を再取得できるよう、メモリのカテゴリ化、タグ付け、優先度付けのパターンを説明します。
カテゴリ:最も具体的なものを選ぶ
| カテゴリ | 用途 | 例 |
|---|---|---|
identity |
ユーザー名、役割、連絡先情報 | "user_name": "Michael Schäfer" |
preference |
好き嫌い、作業スタイル | "communication": "Prefers concise responses" |
fact |
検証可能な事実 | "office_location": "Berlin, Germany" |
project |
プロジェクトのステータス、決定 | "project_synapse": "v1.5.0 deployed" |
skill |
ユーザーのスキル | "skill_python": "Advanced, 10+ years" |
mistake |
避けるべき過去のエラー | "mistake_npm_version": "Always bump version" |
context |
セッション関連のコンテキスト | "current_focus": "Working on docs system" |
note |
その他のメモ | "note_idea": "Try Redis for caching" |
迷ったら、検証可能な情報には `fact` を、それ以外には `note` を使用してください。カテゴリ化しすぎず — 混乱する `context` より明確な `fact` の方が良いです。
キー:意味のある識別子
key フィールドはメモリの識別子です。意味のある安定したキーを使用してください。
良いキー:
user_nameproject_synapse_statuspreference_communication_stylemistake_npm_version_bump
悪いキー:
mem_001(意味がない)temp(説明的でない)2026-06-27-note(日付は再取得に役立たない)
キーの命名規則
snake_case(小文字とアンダースコア)- カテゴリをプレフィックスに:
preference_*、project_*、mistake_* - 動詞ではなく説明的な名詞を使用
- 50 文字以内に収める
タグ:検索とフィルタリング用
タグにより高速なフィルタリングと検索が可能です。メモリごとに 2〜5 個のタグを追加してください。
{
"category": "project",
"key": "project_synapse_status",
"content": "Synapse v1.5.0 deployed. Next: v1.6.0 with docs system.",
"tags": ["synapse", "deployment", "status", "v1.5.0"]
}タグのパターン
- プロジェクト名:
synapse、synapse-mcp、synapse-chat - トピック:
deployment、ci、database、auth - ステータス:
active、completed、blocked - 優先度指標:
urgent、long-term
タグは大文字小文字を区別しません。一貫性のために小文字を使用してください。
優先度:現実的に
| 優先度 | 用途 | メモリの割合 |
|---|---|---|
critical |
ユーザー ID、法的情報、不可逆な決定 | 約 5% |
high |
進行中のプロジェクト、重要な設定 | 約 20% |
normal |
ほとんどの事実、メモ、コンテキスト | 約 65% |
low |
一時的、知っておくとよいこと | 約 10% |
すべてを `critical` にしないでください。すべてが critical なら、何も critical ではありません。`critical` は忘れた場合に実害が出るものに予約してください。
保存すべきか否か
常に保存
- ユーザー ID(名前、メール、役割)
- 長期的な設定
- プロジェクトの決定と根拠
- 過去の過ちと学んだ教訓
- ユーザーへの約束
保存しない
- 一時的な状態(変数を使用)
- 逐語的な会話履歴(チャットシステムが処理)
- 機密データ(パスワード、API キー)
- 容易に導出できる事実(現在日付、ファイル内容)
- 一時的なコンテキスト(
contextカテゴリ + low 優先度を使用)
メモリの更新
同じ category + key で POST /memory を呼ぶと既存メモリが更新されます。
# Initial store
store("project", "project_synapse_status", "v1.4.0 deployed", priority="high")
# Later: update with same key
store("project", "project_synapse_status", "v1.5.0 deployed. CI green.", priority="high")重複を作らずに更新できるよう、安定したキーを使用してください。LLM は情報が変わるたびに新しいメモリを作るのではなく、同じキーで再 POST すべきです。
メモリのライフサイクル
Create → Active → Stale → Archive → Delete- Create:完全なコンテキスト付きで POST /memory
- Active:頻繁に再取得、必要に応じて更新
- Stale:まだ関連するが活発に使用されていない(優先度を下げる?)
- Archive:優先度を
lowに設定、歴史的参照用に保持 - Delete:関連しなくなったら DELETE /memory/:id
定期的なクリーンアップ
# Find memories not updated in 90 days
old_memories = requests.get(
f"{URL}/memory/search?q=*",
headers={"Authorization": f"Bearer {KEY}"}
)
for mem in old_memories["results"]:
if is_stale(mem, days=90):
# Either delete or lower priority
if is_obsolete(mem):
delete_memory(mem["id"])
else:
update_memory(mem["id"], priority="low")パターン:メモリの継承
階層的コンテキスト(プロジェクト → サブプロジェクト → タスク)向け:
# Parent project
store("project", "project_synapse", "Main Synapse project",
tags=["synapse", "parent"], priority="high")
# Sub-project (tags link to parent)
store("project", "project_synapse_docs", "Docs system for Synapse",
tags=["synapse", "docs", "synapse-parent"], priority="high")
# Specific task (tags link to sub-project)
store("project", "task_docs_loader", "Implement docs-loader.ts",
tags=["synapse", "docs", "task"], priority="normal")LLM は q=synapse+docs で検索し、関連する全メモリを見つけられます。
パターン:決定ログ
LLM が再考しないよう、決定を根拠と共に保存します。
store("fact", "decision_postgres_over_sqlite",
"Chose PostgreSQL over SQLite for production. Reason: concurrent writes, "
"FTS5 native support, better backup story. Date: 2026-06-15. Decided by: Michael.",
tags=["decision", "database", "postgres", "sqlite"],
priority="high")パターン:過ちの回避
具体的な回避指示と共に過ちを保存します。
store("mistake", "mistake_forget_version_bump",
"Forgot to bump package.json version after changes. npm publish failed. "
"FIX: Always run `npm version patch` before pushing. "
"CI fails with 'version already exists' if you forget.",
tags=["npm", "ci", "publish", "version"],
priority="high")