三次元メモリシステム
概要
ワークスペースのメモリシステムは三次元アーキテクチャを採用し、アカウント・企業・セッションの3つの次元で知識を保存・管理します。メモリは対話と深く統合されており、対話のたびに関連メモリを検索してコンテキストに注入し、各ターンの対話が終わるごとに新しいメモリを自動的に抽出します。
技術基盤:mem0 REST API + Neo4j ナレッジグラフ。
三次元アーキテクチャ
| 次元 | スコープ | 書き込み方式 | 管理権限 | 対話への注入 |
|---|---|---|---|---|
| アカウントレベル | userId(組織横断) | 手動追加 + 対話からの自動抽出 | ユーザー自身が管理 | 「ユーザー概況」を system prompt に注入 |
| 企業レベル | orgId(組織隔離) | 管理者が手動でメンテナンス | ワークスペース管理者のみ | 「企業概況」を system prompt に注入 |
| セッションレベル | runId(単一セッション) | 各ターンで自動抽出 | 自動管理 | セッション内のセマンティック検索 |
アカウントレベルメモリ
- 組織横断共有:userId にバインドされ、ユーザーのすべての組織で利用可能
- 書き込み方式:
- 手動:メモリ管理画面または対話内でコマンドにより追加
- 自動:対話中に記憶する価値のある情報を自動検出
- 管理画面:APP 設定 → メモリ
- 詳細ドキュメント:メモリ管理
企業レベルメモリ
- 組織隔離:orgId にバインドされ、現在の組織メンバーのみ閲覧可能
- 管理権限:ワークスペース管理者のみがメンテナンス可能
- 管理画面:スペース管理 → 詳細設定 → 企業メモリ
- 詳細ドキュメント:詳細設定 — 企業メモリ
セッションレベルメモリ
- 単一セッション:runId にバインドされ、現在のセッション内でのみ有効
- 各ターンで抽出:各ターンの対話終了後に自動的に分析してメモリを抽出
- 管理不要:システムが自動的に処理
メモリ抽出メカニズム
明示的コマンド(信頼度 0.99)
ユーザーが Agent に情報を記憶または忘却するよう直接要求します:
| 操作 | トリガーキーワード |
|---|---|
| メモリ追加 | 「記住」「记下」「保存记忆」「保存到记忆」「remember」「store in memory」 |
| メモリ削除 | 「删除记忆」「忘掉」「忘记」「forget this」「remove from memory」 |
暗黙的検出(信頼度 0.5〜0.93)
システムは正規表現パターンにより対話中の永続的な事実を自動検出します:
| シグナルタイプ | 例 | 信頼度 |
|---|---|---|
| 個人プロフィール | 「我叫张三」「我是前端开发」「my name is」 | 0.93 |
| 個人所有 | 「我有一只猫」「我养了」「I own」 | 0.90 |
| 個人の好み | 「我喜欢用 TypeScript」「I prefer」 | 0.88 |
| アシスタントのスタイル | 「以后请用中文回复」「always use」「レスポンス形式の好み」 | 0.86 |
信頼度しきい値
| モード | しきい値 | 説明 |
|---|---|---|
| strict | 0.85 | 保守モード。高信頼度のメモリのみ抽出 |
| standard(デフォルト) | 0.65 | バランスモード |
| relaxed | 0.50 | 積極モード。より多くの内容が記憶される |
自動除外ルール
以下の内容はメモリとして抽出されません:
- 純粋な質問(疑問符で終わる、疑問詞で始まる)
- 雑談・挨拶
- コードブロック内の内容
- 時効性・時間依存の情報(日付、ニュース、一時的な状態)
- 非永続的なトピック(bug レポート、エラーメッセージ)
ナレッジグラフ
バックエンドストレージ(Neo4j)
メモリの関係はトリプルの形式で Neo4j グラフデータベースに保存されます:
(source エンティティ) --[relationship]--> (target エンティティ)
N-hop 近傍クエリ(1〜4 ホップ):
MATCH path = (n {name: $entity})-[*1..depth]-(m)
WHERE ALL(node IN nodes(path) WHERE node.user_id = $user_id)
UNWIND relationships(path) AS rel
RETURN source, relationship, target
Cypher クエリはユーザー境界を決して越えないことを保証します。
フロントエンドの可視化
react-force-graph-2d を使用して力学モデルグラフをレンダリングします:
| ノードタイプ | 色 | 説明 |
|---|---|---|
| Hub | 紫色 #6d28d9 |
ユーザー/組織の中心ノード |
| Fact | 青色 #2563eb |
メモリ項目 |
| Entity | 琥珀色 #f59e0b(デフォルト) |
抽出されたエンティティ。具体的な色は djb2 hash により 10 色のカラーパレットへマッピング |
グラフレンダリングの最適化(2026-04 更新)NEW
新版のグラフでは、ノードが多すぎてラベルが重なるのを防ぐため、2つの密度ゲートしきい値を導入しました:
| しきい値定数 | 値 | 意味 |
|---|---|---|
PILL_READABILITY_MIN_SCALE |
1.5 | 拡大率が 1.5x 未満の場合、文字ラベルをレンダリングしない |
PILL_MIN_SCREEN_AREA_PER_NODE |
3000 | ノードあたりの画面面積が 3000 ピクセル未満の場合、ラベルをレンダリングしない |
2つの条件が同時に満たされた場合のみラベルを表示します。満たされない場合は円点のみをレンダリングします。
Entity Type の色の安定化:
djb2hash によりエンティティタイプ → 色インデックスを計算- 同一タイプのエンティティは、異なるビュー・異なる時間でも同一の色を保持
- 10 色のカラーパレットで無限のタイプを循環利用可能
Bug 修正:グラフの関係マッピング時に sourceTypes / targetTypes フィールドが以前は破棄されており、すべてのノードがグレーの fallback に戻ってしまっていました。この Bug は修正済みです(sidecar/src/mem0Service.ts を参照)。
多段階ドリルダウン
ノードをクリックすると関連エンティティを展開でき、ナレッジネットワークを層ごとに深く辿れます。グラフエンジンは以下をサポートします:
neighborhood()— N-hop 近傍クエリshortestPath()— 2つのエンティティ間の最短経路extractEntitiesFromText()— テキストからエンティティ名を抽出
メモリと対話の連携
メモリクエリのタイミング
| タイミング | アクション |
|---|---|
| 新規対話の作成 | アカウント概況メモリ + 企業概況メモリを検索し、system prompt に連結 |
| ユーザーがメッセージを送信 | memory_query ツールで関連メモリをセマンティック検索 |
| グラフ拡張 | searchWithGraphExpansion — セマンティック検索 + 1-hop グラフ拡張により、関連エンティティとエッジを返す |
メモリの注入位置
system prompt に 2 つのメモリ概況を注入します:
你是 GPTBots AI 助手...
## 用户概况
- 用户是前端开发工程师
- 偏好使用 TypeScript
- ...
## 企业概况
- 公司使用 React 技术栈
- 项目代号 Project Alpha
- ...
メモリツール
Agent は以下のツールを通じて能動的にメモリを検索・管理できます:
| ツール | 操作 | 説明 |
|---|---|---|
| memory_query | list / search / graph_traverse | 一覧、セマンティック検索、グラフ走査 |
| memory_manage | add / update / delete | メモリの追加、変更、削除 |
| conversation_search | search | 過去の対話を検索 |
| recent_chats | list | 最近の対話を一覧表示 |
アカウント横断 Gateway 隔離 NEW
ノードが enterprise スコープでアカウント横断的に呼び出される場合:
- アカウントレベルメモリ(userId バインド):❌ アクセス不可
- 企業レベルメモリ(orgId バインド):✅ アクセス可能
- セッションレベルメモリ(今回のセッション内):✅ アクセス可能
isRemoteSession フラグにより mem0Service のクエリ段階で強制的にフィルタリングします。アカウント横断呼び出しは、対象ノードの所有者の個人メモリを読み取ることができません。
設計目的:個人のプライバシーを保護しつつ、組織レベルの知識の協働共有には影響を与えません。詳細は マルチノードアーキテクチャ を参照してください。
mem0 の能力
メモリバックエンドは mem0 に基づき、以下の自動化能力を提供します:
| 能力 | 説明 |
|---|---|
| 自動更新 | 新しい情報が古い情報を上書き(例:「Python が好き」→「TypeScript が好き」) |
| 自動マージ | 類似したメモリをより完全な項目に統合 |
| 自動忘却 | 矛盾する情報について古いバージョンを自動的にクリーンアップ |
タイムアウト保護
| 操作 | タイムアウト |
|---|---|
| メモリの検索/管理 | 25 秒 |
| セッションレベルメモリ操作 | 5 秒(高速タイムアウト。対話をブロックしない) |
| グラフ関係の取得 | 3 秒(タイムアウト後は優雅にデグレード) |
ユーザーにとっての意味
メモリシステムにより、Agent はあなたを「知る」ことができます。 メモリがなければ、Agent は毎回の対話で初対面の他人のようです。メモリがあれば、Agent はあなたの好み、プロジェクトの背景、仕事の習慣を把握します。
3つの次元の実際の現れ方:
- アカウントメモリ:「TypeScript が好きだと言った」→ Agent はすべての組織の対話で TypeScript を優先的に使用
- 企業メモリ:管理者が「会社は PostgreSQL データベースを使用」を追加 → 組織内のすべてのメンバーが Agent とデータベースについて議論する際、Agent はデフォルトで PostgreSQL のソリューションを推奨
- セッションメモリ:この対話であなたが「現在のプロジェクトは Project Alpha という名前」と言った → この対話では Agent は覚えているが、新しい対話では覚えているとは限らない
メモリは次のように管理できます:
- 個人の好みについて:対話で「dark テーマを使うのが好きだと記憶して」と言うか、APP 設定 → メモリで手動追加
- 企業知識について:管理者に連絡し、スペース管理 → 詳細設定 → 企業メモリで追加してもらう
- メモリに誤りを見つけた場合:対話で「以前の Python に関する好みを忘れて」と言うか、メモリ管理で直接削除
- 既存のメモリを確認する場合:APP 設定 → メモリで、一覧とグラフを閲覧可能
関連ドキュメント
- メモリ管理 — APP 側のメモリ管理画面
- 詳細設定 — 企業メモリ — 企業レベルメモリの管理
- ツール管理 — メモリ関連ツール(memory_query、memory_manage)
- マルチノードアーキテクチャ — アカウント横断 Gateway 隔離メカニズム
