logo
Development
検索
三次元メモリシステム

三次元メモリシステム

概要

ワークスペースのメモリシステムは三次元アーキテクチャを採用し、アカウント・企業・セッションの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 エンティティ)
                      
                      (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
                      
                      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 の色の安定化

  • djb2 hash によりエンティティタイプ → 色インデックスを計算
  • 同一タイプのエンティティは、異なるビュー・異なる時間でも同一の色を保持
  • 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 - ...
                      
                      你是 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 設定 → メモリで、一覧とグラフを閲覧可能

関連ドキュメント