{"title":"メモリのベストプラクティス","slug":"memory-best-practices","category":"guides","summary":"効果的な再取得のためのメモリ構造化 — カテゴリ、キー、タグ、優先度。","audience":["human","llm"],"tags":["guide","memory","best-practices","patterns"],"difficulty":"intermediate","updated":"2026-06-27","word_count":290,"read_minutes":1,"lang":"ja","translated":true,"requested_lang":"ja","content_markdown":"\n# メモリのベストプラクティス\n\nメモリの構造化方法が有用性を決定します。本ガイドでは、LLM が適切な時に適切な情報を再取得できるよう、メモリのカテゴリ化、タグ付け、優先度付けのパターンを説明します。\n\n## カテゴリ：最も具体的なものを選ぶ\n\n| カテゴリ | 用途 | 例 |\n|----------|---------|---------|\n| `identity` | ユーザー名、役割、連絡先情報 | `\"user_name\": \"Michael Schäfer\"` |\n| `preference` | 好き嫌い、作業スタイル | `\"communication\": \"Prefers concise responses\"` |\n| `fact` | 検証可能な事実 | `\"office_location\": \"Berlin, Germany\"` |\n| `project` | プロジェクトのステータス、決定 | `\"project_synapse\": \"v1.5.0 deployed\"` |\n| `skill` | ユーザーのスキル | `\"skill_python\": \"Advanced, 10+ years\"` |\n| `mistake` | 避けるべき過去のエラー | `\"mistake_npm_version\": \"Always bump version\"` |\n| `context` | セッション関連のコンテキスト | `\"current_focus\": \"Working on docs system\"` |\n| `note` | その他のメモ | `\"note_idea\": \"Try Redis for caching\"` |\n\n> [!TIP]\n> 迷ったら、検証可能な情報には `fact` を、それ以外には `note` を使用してください。カテゴリ化しすぎず — 混乱する `context` より明確な `fact` の方が良いです。\n\n## キー：意味のある識別子\n\n`key` フィールドはメモリの識別子です。意味のある安定したキーを使用してください。\n\n**良いキー：**\n- `user_name`\n- `project_synapse_status`\n- `preference_communication_style`\n- `mistake_npm_version_bump`\n\n**悪いキー：**\n- `mem_001`（意味がない）\n- `temp`（説明的でない）\n- `2026-06-27-note`（日付は再取得に役立たない）\n\n### キーの命名規則\n\n- `snake_case`（小文字とアンダースコア）\n- カテゴリをプレフィックスに：`preference_*`、`project_*`、`mistake_*`\n- 動詞ではなく説明的な名詞を使用\n- 50 文字以内に収める\n\n## タグ：検索とフィルタリング用\n\nタグにより高速なフィルタリングと検索が可能です。メモリごとに 2〜5 個のタグを追加してください。\n\n```json\n{\n  \"category\": \"project\",\n  \"key\": \"project_synapse_status\",\n  \"content\": \"Synapse v1.5.0 deployed. Next: v1.6.0 with docs system.\",\n  \"tags\": [\"synapse\", \"deployment\", \"status\", \"v1.5.0\"]\n}\n```\n\n### タグのパターン\n\n- **プロジェクト名**：`synapse`、`synapse-mcp`、`synapse-chat`\n- **トピック**：`deployment`、`ci`、`database`、`auth`\n- **ステータス**：`active`、`completed`、`blocked`\n- **優先度指標**：`urgent`、`long-term`\n\n> [!NOTE]\n> タグは大文字小文字を区別しません。一貫性のために小文字を使用してください。\n\n## 優先度：現実的に\n\n| 優先度 | 用途 | メモリの割合 |\n|----------|---------|---------------|\n| `critical` | ユーザー ID、法的情報、不可逆な決定 | 約 5% |\n| `high` | 進行中のプロジェクト、重要な設定 | 約 20% |\n| `normal` | ほとんどの事実、メモ、コンテキスト | 約 65% |\n| `low` | 一時的、知っておくとよいこと | 約 10% |\n\n> [!WARNING]\n> すべてを `critical` にしないでください。すべてが critical なら、何も critical ではありません。`critical` は忘れた場合に実害が出るものに予約してください。\n\n## 保存すべきか否か\n\n### 常に保存\n\n- ユーザー ID（名前、メール、役割）\n- 長期的な設定\n- プロジェクトの決定と根拠\n- 過去の過ちと学んだ教訓\n- ユーザーへの約束\n\n### 保存しない\n\n- 一時的な状態（変数を使用）\n- 逐語的な会話履歴（チャットシステムが処理）\n- 機密データ（パスワード、API キー）\n- 容易に導出できる事実（現在日付、ファイル内容）\n- 一時的なコンテキスト（`context` カテゴリ + low 優先度を使用）\n\n## メモリの更新\n\n同じ `category` + `key` で `POST /memory` を呼ぶと既存メモリが更新されます。\n\n```python\n# Initial store\nstore(\"project\", \"project_synapse_status\", \"v1.4.0 deployed\", priority=\"high\")\n\n# Later: update with same key\nstore(\"project\", \"project_synapse_status\", \"v1.5.0 deployed. CI green.\", priority=\"high\")\n```\n\n> [!TIP]\n> 重複を作らずに更新できるよう、安定したキーを使用してください。LLM は情報が変わるたびに新しいメモリを作るのではなく、同じキーで再 POST すべきです。\n\n## メモリのライフサイクル\n\n```\nCreate → Active → Stale → Archive → Delete\n```\n\n- **Create**：完全なコンテキスト付きで POST /memory\n- **Active**：頻繁に再取得、必要に応じて更新\n- **Stale**：まだ関連するが活発に使用されていない（優先度を下げる？）\n- **Archive**：優先度を `low` に設定、歴史的参照用に保持\n- **Delete**：関連しなくなったら DELETE /memory/:id\n\n### 定期的なクリーンアップ\n\n```python\n# Find memories not updated in 90 days\nold_memories = requests.get(\n    f\"{URL}/memory/search?q=*\",\n    headers={\"Authorization\": f\"Bearer {KEY}\"}\n)\n\nfor mem in old_memories[\"results\"]:\n    if is_stale(mem, days=90):\n        # Either delete or lower priority\n        if is_obsolete(mem):\n            delete_memory(mem[\"id\"])\n        else:\n            update_memory(mem[\"id\"], priority=\"low\")\n```\n\n## パターン：メモリの継承\n\n階層的コンテキスト（プロジェクト → サブプロジェクト → タスク）向け：\n\n```python\n# Parent project\nstore(\"project\", \"project_synapse\", \"Main Synapse project\", \n      tags=[\"synapse\", \"parent\"], priority=\"high\")\n\n# Sub-project (tags link to parent)\nstore(\"project\", \"project_synapse_docs\", \"Docs system for Synapse\",\n      tags=[\"synapse\", \"docs\", \"synapse-parent\"], priority=\"high\")\n\n# Specific task (tags link to sub-project)\nstore(\"project\", \"task_docs_loader\", \"Implement docs-loader.ts\",\n      tags=[\"synapse\", \"docs\", \"task\"], priority=\"normal\")\n```\n\nLLM は `q=synapse+docs` で検索し、関連する全メモリを見つけられます。\n\n## パターン：決定ログ\n\nLLM が再考しないよう、決定を根拠と共に保存します。\n\n```python\nstore(\"fact\", \"decision_postgres_over_sqlite\",\n      \"Chose PostgreSQL over SQLite for production. Reason: concurrent writes, \"\n      \"FTS5 native support, better backup story. Date: 2026-06-15. Decided by: Michael.\",\n      tags=[\"decision\", \"database\", \"postgres\", \"sqlite\"],\n      priority=\"high\")\n```\n\n## パターン：過ちの回避\n\n具体的な回避指示と共に過ちを保存します。\n\n```python\nstore(\"mistake\", \"mistake_forget_version_bump\",\n      \"Forgot to bump package.json version after changes. npm publish failed. \"\n      \"FIX: Always run `npm version patch` before pushing. \"\n      \"CI fails with 'version already exists' if you forget.\",\n      tags=[\"npm\", \"ci\", \"publish\", \"version\"],\n      priority=\"high\")\n```\n\n## 避けるべきアンチパターン\n\n> [!WARNING]\n> - **会話ログの保存** — チャットシステムが処理\n> - **ファイル全体の保存** — スクリプトストアや外部ストレージを使用\n> - **一時的な状態の保存** — 変数を使用\n> - **シークレットの保存** — 環境変数を使用\n> - **メモリの重複** — 安定したキーを使用\n> - **タグの過剰使用** — メモリごとに 2〜5 個が理想\n> - **すべてが critical** — 優先度は現実的に\n\n## 次のステップ\n\n- [Memory API](/docs/api/memory)\n- [Persistent LLM Agent](/docs/guides/persistent-llm-agent)\n- [Memory Tagging Strategy](/docs/llm-cookbook/memory-tagging-strategy)\n","content_html":"<h1>メモリのベストプラクティス</h1>\n<p>メモリの構造化方法が有用性を決定します。本ガイドでは、LLM が適切な時に適切な情報を再取得できるよう、メモリのカテゴリ化、タグ付け、優先度付けのパターンを説明します。</p>\n<h2>カテゴリ：最も具体的なものを選ぶ</h2>\n<table>\n<thead>\n<tr>\n<th>カテゴリ</th>\n<th>用途</th>\n<th>例</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>identity</code></td>\n<td>ユーザー名、役割、連絡先情報</td>\n<td><code>&quot;user_name&quot;: &quot;Michael Schäfer&quot;</code></td>\n</tr>\n<tr>\n<td><code>preference</code></td>\n<td>好き嫌い、作業スタイル</td>\n<td><code>&quot;communication&quot;: &quot;Prefers concise responses&quot;</code></td>\n</tr>\n<tr>\n<td><code>fact</code></td>\n<td>検証可能な事実</td>\n<td><code>&quot;office_location&quot;: &quot;Berlin, Germany&quot;</code></td>\n</tr>\n<tr>\n<td><code>project</code></td>\n<td>プロジェクトのステータス、決定</td>\n<td><code>&quot;project_synapse&quot;: &quot;v1.5.0 deployed&quot;</code></td>\n</tr>\n<tr>\n<td><code>skill</code></td>\n<td>ユーザーのスキル</td>\n<td><code>&quot;skill_python&quot;: &quot;Advanced, 10+ years&quot;</code></td>\n</tr>\n<tr>\n<td><code>mistake</code></td>\n<td>避けるべき過去のエラー</td>\n<td><code>&quot;mistake_npm_version&quot;: &quot;Always bump version&quot;</code></td>\n</tr>\n<tr>\n<td><code>context</code></td>\n<td>セッション関連のコンテキスト</td>\n<td><code>&quot;current_focus&quot;: &quot;Working on docs system&quot;</code></td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>その他のメモ</td>\n<td><code>&quot;note_idea&quot;: &quot;Try Redis for caching&quot;</code></td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-ok\">迷ったら、検証可能な情報には `fact` を、それ以外には `note` を使用してください。カテゴリ化しすぎず — 混乱する `context` より明確な `fact` の方が良いです。</div><h2>キー：意味のある識別子</h2>\n<p><code>key</code> フィールドはメモリの識別子です。意味のある安定したキーを使用してください。</p>\n<p><strong>良いキー：</strong></p>\n<ul>\n<li><code>user_name</code></li>\n<li><code>project_synapse_status</code></li>\n<li><code>preference_communication_style</code></li>\n<li><code>mistake_npm_version_bump</code></li>\n</ul>\n<p><strong>悪いキー：</strong></p>\n<ul>\n<li><code>mem_001</code>（意味がない）</li>\n<li><code>temp</code>（説明的でない）</li>\n<li><code>2026-06-27-note</code>（日付は再取得に役立たない）</li>\n</ul>\n<h3>キーの命名規則</h3>\n<ul>\n<li><code>snake_case</code>（小文字とアンダースコア）</li>\n<li>カテゴリをプレフィックスに：<code>preference_*</code>、<code>project_*</code>、<code>mistake_*</code></li>\n<li>動詞ではなく説明的な名詞を使用</li>\n<li>50 文字以内に収める</li>\n</ul>\n<h2>タグ：検索とフィルタリング用</h2>\n<p>タグにより高速なフィルタリングと検索が可能です。メモリごとに 2〜5 個のタグを追加してください。</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;category&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;project&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;key&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;project_synapse_status&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;content&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Synapse v1.5.0 deployed. Next: v1.6.0 with docs system.&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;tags&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;synapse&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;deployment&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;status&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;v1.5.0&quot;</span><span class=\"hljs-punctuation\">]</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><h3>タグのパターン</h3>\n<ul>\n<li><strong>プロジェクト名</strong>：<code>synapse</code>、<code>synapse-mcp</code>、<code>synapse-chat</code></li>\n<li><strong>トピック</strong>：<code>deployment</code>、<code>ci</code>、<code>database</code>、<code>auth</code></li>\n<li><strong>ステータス</strong>：<code>active</code>、<code>completed</code>、<code>blocked</code></li>\n<li><strong>優先度指標</strong>：<code>urgent</code>、<code>long-term</code></li>\n</ul>\n<div class=\"callout callout-note\">タグは大文字小文字を区別しません。一貫性のために小文字を使用してください。</div><h2>優先度：現実的に</h2>\n<table>\n<thead>\n<tr>\n<th>優先度</th>\n<th>用途</th>\n<th>メモリの割合</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>critical</code></td>\n<td>ユーザー ID、法的情報、不可逆な決定</td>\n<td>約 5%</td>\n</tr>\n<tr>\n<td><code>high</code></td>\n<td>進行中のプロジェクト、重要な設定</td>\n<td>約 20%</td>\n</tr>\n<tr>\n<td><code>normal</code></td>\n<td>ほとんどの事実、メモ、コンテキスト</td>\n<td>約 65%</td>\n</tr>\n<tr>\n<td><code>low</code></td>\n<td>一時的、知っておくとよいこと</td>\n<td>約 10%</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-warn\">すべてを `critical` にしないでください。すべてが critical なら、何も critical ではありません。`critical` は忘れた場合に実害が出るものに予約してください。</div><h2>保存すべきか否か</h2>\n<h3>常に保存</h3>\n<ul>\n<li>ユーザー ID（名前、メール、役割）</li>\n<li>長期的な設定</li>\n<li>プロジェクトの決定と根拠</li>\n<li>過去の過ちと学んだ教訓</li>\n<li>ユーザーへの約束</li>\n</ul>\n<h3>保存しない</h3>\n<ul>\n<li>一時的な状態（変数を使用）</li>\n<li>逐語的な会話履歴（チャットシステムが処理）</li>\n<li>機密データ（パスワード、API キー）</li>\n<li>容易に導出できる事実（現在日付、ファイル内容）</li>\n<li>一時的なコンテキスト（<code>context</code> カテゴリ + low 優先度を使用）</li>\n</ul>\n<h2>メモリの更新</h2>\n<p>同じ <code>category</code> + <code>key</code> で <code>POST /memory</code> を呼ぶと既存メモリが更新されます。</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Initial store</span>\nstore(<span class=\"hljs-string\">&quot;project&quot;</span>, <span class=\"hljs-string\">&quot;project_synapse_status&quot;</span>, <span class=\"hljs-string\">&quot;v1.4.0 deployed&quot;</span>, priority=<span class=\"hljs-string\">&quot;high&quot;</span>)\n\n<span class=\"hljs-comment\"># Later: update with same key</span>\nstore(<span class=\"hljs-string\">&quot;project&quot;</span>, <span class=\"hljs-string\">&quot;project_synapse_status&quot;</span>, <span class=\"hljs-string\">&quot;v1.5.0 deployed. CI green.&quot;</span>, priority=<span class=\"hljs-string\">&quot;high&quot;</span>)</code></pre><div class=\"callout callout-ok\">重複を作らずに更新できるよう、安定したキーを使用してください。LLM は情報が変わるたびに新しいメモリを作るのではなく、同じキーで再 POST すべきです。</div><h2>メモリのライフサイクル</h2>\n<pre><code class=\"hljs language-plaintext\">Create → Active → Stale → Archive → Delete</code></pre><ul>\n<li><strong>Create</strong>：完全なコンテキスト付きで POST /memory</li>\n<li><strong>Active</strong>：頻繁に再取得、必要に応じて更新</li>\n<li><strong>Stale</strong>：まだ関連するが活発に使用されていない（優先度を下げる？）</li>\n<li><strong>Archive</strong>：優先度を <code>low</code> に設定、歴史的参照用に保持</li>\n<li><strong>Delete</strong>：関連しなくなったら DELETE /memory/:id</li>\n</ul>\n<h3>定期的なクリーンアップ</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Find memories not updated in 90 days</span>\nold_memories = requests.get(\n    <span class=\"hljs-string\">f&quot;<span class=\"hljs-subst\">{URL}</span>/memory/search?q=*&quot;</span>,\n    headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{KEY}</span>&quot;</span>}\n)\n\n<span class=\"hljs-keyword\">for</span> mem <span class=\"hljs-keyword\">in</span> old_memories[<span class=\"hljs-string\">&quot;results&quot;</span>]:\n    <span class=\"hljs-keyword\">if</span> is_stale(mem, days=<span class=\"hljs-number\">90</span>):\n        <span class=\"hljs-comment\"># Either delete or lower priority</span>\n        <span class=\"hljs-keyword\">if</span> is_obsolete(mem):\n            delete_memory(mem[<span class=\"hljs-string\">&quot;id&quot;</span>])\n        <span class=\"hljs-keyword\">else</span>:\n            update_memory(mem[<span class=\"hljs-string\">&quot;id&quot;</span>], priority=<span class=\"hljs-string\">&quot;low&quot;</span>)</code></pre><h2>パターン：メモリの継承</h2>\n<p>階層的コンテキスト（プロジェクト → サブプロジェクト → タスク）向け：</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Parent project</span>\nstore(<span class=\"hljs-string\">&quot;project&quot;</span>, <span class=\"hljs-string\">&quot;project_synapse&quot;</span>, <span class=\"hljs-string\">&quot;Main Synapse project&quot;</span>, \n      tags=[<span class=\"hljs-string\">&quot;synapse&quot;</span>, <span class=\"hljs-string\">&quot;parent&quot;</span>], priority=<span class=\"hljs-string\">&quot;high&quot;</span>)\n\n<span class=\"hljs-comment\"># Sub-project (tags link to parent)</span>\nstore(<span class=\"hljs-string\">&quot;project&quot;</span>, <span class=\"hljs-string\">&quot;project_synapse_docs&quot;</span>, <span class=\"hljs-string\">&quot;Docs system for Synapse&quot;</span>,\n      tags=[<span class=\"hljs-string\">&quot;synapse&quot;</span>, <span class=\"hljs-string\">&quot;docs&quot;</span>, <span class=\"hljs-string\">&quot;synapse-parent&quot;</span>], priority=<span class=\"hljs-string\">&quot;high&quot;</span>)\n\n<span class=\"hljs-comment\"># Specific task (tags link to sub-project)</span>\nstore(<span class=\"hljs-string\">&quot;project&quot;</span>, <span class=\"hljs-string\">&quot;task_docs_loader&quot;</span>, <span class=\"hljs-string\">&quot;Implement docs-loader.ts&quot;</span>,\n      tags=[<span class=\"hljs-string\">&quot;synapse&quot;</span>, <span class=\"hljs-string\">&quot;docs&quot;</span>, <span class=\"hljs-string\">&quot;task&quot;</span>], priority=<span class=\"hljs-string\">&quot;normal&quot;</span>)</code></pre><p>LLM は <code>q=synapse+docs</code> で検索し、関連する全メモリを見つけられます。</p>\n<h2>パターン：決定ログ</h2>\n<p>LLM が再考しないよう、決定を根拠と共に保存します。</p>\n<pre><code class=\"hljs language-python\">store(<span class=\"hljs-string\">&quot;fact&quot;</span>, <span class=\"hljs-string\">&quot;decision_postgres_over_sqlite&quot;</span>,\n      <span class=\"hljs-string\">&quot;Chose PostgreSQL over SQLite for production. Reason: concurrent writes, &quot;</span>\n      <span class=\"hljs-string\">&quot;FTS5 native support, better backup story. Date: 2026-06-15. Decided by: Michael.&quot;</span>,\n      tags=[<span class=\"hljs-string\">&quot;decision&quot;</span>, <span class=\"hljs-string\">&quot;database&quot;</span>, <span class=\"hljs-string\">&quot;postgres&quot;</span>, <span class=\"hljs-string\">&quot;sqlite&quot;</span>],\n      priority=<span class=\"hljs-string\">&quot;high&quot;</span>)</code></pre><h2>パターン：過ちの回避</h2>\n<p>具体的な回避指示と共に過ちを保存します。</p>\n<pre><code class=\"hljs language-python\">store(<span class=\"hljs-string\">&quot;mistake&quot;</span>, <span class=\"hljs-string\">&quot;mistake_forget_version_bump&quot;</span>,\n      <span class=\"hljs-string\">&quot;Forgot to bump package.json version after changes. npm publish failed. &quot;</span>\n      <span class=\"hljs-string\">&quot;FIX: Always run `npm version patch` before pushing. &quot;</span>\n      <span class=\"hljs-string\">&quot;CI fails with &#x27;version already exists&#x27; if you forget.&quot;</span>,\n      tags=[<span class=\"hljs-string\">&quot;npm&quot;</span>, <span class=\"hljs-string\">&quot;ci&quot;</span>, <span class=\"hljs-string\">&quot;publish&quot;</span>, <span class=\"hljs-string\">&quot;version&quot;</span>],\n      priority=<span class=\"hljs-string\">&quot;high&quot;</span>)</code></pre><h2>避けるべきアンチパターン</h2>\n<div class=\"callout callout-warn\"></div><h2>次のステップ</h2>\n<ul>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/guides/persistent-llm-agent\">Persistent LLM Agent</a></li>\n<li><a href=\"/docs/llm-cookbook/memory-tagging-strategy\">Memory Tagging Strategy</a></li>\n</ul>\n","urls":{"html":"/docs/guides/memory-best-practices","text":"/docs/guides/memory-best-practices?format=text","json":"/docs/guides/memory-best-practices?format=json","llm":"/docs/guides/memory-best-practices?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}