AIアシスタントにおけるメモリシステム

アシスタントのためのワーキングメモリ、構造化メモリ、検索メモリ

目次

メモリはアシスタントを反応型のシステムから持続的なシステムへと変えますが、同時に多くのシステムが静かに腐敗していく場所でもあります。最近の調査では、現代的なエージェントのメモリに対して、短期記憶と長期記憶の二元論はもはや十分ではないと指摘されています。OpenAIやLangGraphのSDKは、よりシンプルなスタックを提唱しています。すなわち、ワーキングメモリ、永続状態、そして検索(リトリーバル)です。

アシスタントには、現在の実行処理のためのワーキングメモリ、安定した事実や好みのための永続状態、関連するサポートコンテキストのための検索メモリが必要です。私のはっきりした意見としては、構造化された状態が過小評価され、ベクトル検索が過大評価されている一方で、多くのメモリ失敗の原因はストレージの選択ではなく、プロモーション(昇格)とインジェクション(注入)ポリシーにあるというものです。

もう一つ重要な点は、メモリが単なる長文コンテキストの問題を自動的に解決するわけではないということです。LoCoMoの研究は、非常に長期にわたる会話の想起がいまだに困難であることを示しており、「Lost in the Middle」の研究は、関連情報がプロンプトの真ん中に配置されると、より多くのトークンをモデルに投げ込むだけで性能が低下し得ることを示しています。良いメモリシステムは、選択的であり、多層的であり、優先順位について明示的です。

本ガイドは、AI Systems Memory Hub 内での、AIアシスタントアーキテクチャ の中にあるメモリレイヤーに関するクロスフレームワークのマップとして位置づけられています。

AIアシスタント向けの抽象的なメモリシステムを、多層的なノートブック、ベクトル点、構造化カードとして示す

アシスタントのメモリについてどう考えるか

アシスタントのメモリは、PKM(個人知識管理)、ウィキ、あるいはスタンドアロンのRAGパイプラインと同じ問題ではありません。PKM vs RAG vs Wiki vs Memory Systems は、知識アーキテクチャのレベルでこれらのパラダイムをマッピングしています。本ガイドはその一つ下のレイヤーに留まり、アシスタントが実際に実装するランタイムの契約(コントラクト)について扱います。また、これはメンテナンスの問題としても異なります。メモリはセッションごとにエージェントがどのように動作するかを管理しますが、共有ナレッジベース(例えばLLM Wiki)は、それからの読み取りを行うエージェントが、古い事実や矛盾する事実に基づいて行動しないようにするため、独自のメンテナンス規律 が必要になります。

メモリを考える最もクリアな方法は、「チャット履歴」としてではなく、異なる役割を持つストレージ契約の集合として捉えることです。一つのストアがアクティブなスレッドを保持し、別のストアが永続的なユーザー状態を保持し、さらに別のストアがドキュメントや過去の相互作用に対するセマンティック(意味ベース)の検索をサポートします。OpenAIのパーソナライゼーション向けのメモリガイダンスは、グローバルメモリとセッションメモリを分離することでこれを明示しています。一方、LangGraphはスレッドレベルの永続性と、会話間の長期ストアを分離しています。

メモリが重要なのは、本番環境のアシスタントが繰り返し作業を行い、目標を再訪し、日や週にわたって動作するためです。Generative Agentsは、経験を保存し、それらを振り返り、将来の計画のために動的に検索するパターンを普及させました。MemGPTはこれをさらに推し進め、メモリを階層としてモデル化し、高速ストアと低速ストア間の移動を扱いました。より最近のシステムであるA-MEMやMem0は、想起量だけでなく、リンク付け、統合(コンソリデーション)、デプロイメント効率に焦点を当てています。

メモリの種類

本番環境のアシスタントは通常、協力して動作する3つのレイヤーが必要です。上記のFAQではそれらを名付けていますが、以下のセクションでは、それぞれが実際のシステム内でどのように動作するかを説明します。

短期記憶

短期記憶は、現在の会話や実行処理のワーキングコンテキストです。OpenAI Sessionsは、各実行処理の前に会話履歴を自動的に前置きし、各実行処理の後に新しい項目を追加します。LangGraphは、チェックポインター(checkpointer)を通じたスレッドレベルの永続性として同じアイデアを実装しています。このレイヤーは局所的な整合性を保ちますが、ツール結果、ファイル読み取り、長いチャットが積み重なったときに、最初に破綻しやすい部分でもあります。

長期検索メモリ

長期検索メモリは、毎ターン再生されるのではなく、関連したときに参照される項目を保存します。これはRAG としての検索技術と重なる部分がありますが、それはアシスタントメモリの全体像ではありません。上記のPKM/RAG/ウィキ/メモリ比較が示すように、ウィキやPKMコーパスはインデックスに供給されることが多く、一方構造化状態とセッションメモリは他の場所に存在します。古典的なRAGでは、モデルはパラメトリックメモリと、_denseベクトルインデックスのような_非パラメトリックメモリを組み合わせて使用します。Self-RAGは、すべてのリクエストに対して固定の検索を行うのではなく、オンデマンドで検索を行うことで、素朴な検索を改善しています。実用的なアシスタントシステムでは、これ通常是ベクトルストアまたは検索可能なトランスクリプトレイヤーです。

構造化メモリ

構造化メモリは、永続的な事実、好み、または制約を、優先順位ルールを持つ明示的なフィールドに保存します。OpenAIのパーソナライゼーションクックブックは、この点で異寻常に明確です。グローバルメモリとセッションメモリには異なる役割があり、最新のユーザー指示が優先され、現在のタスクに対してはセッションメモリがグローバルメモリを上書きでき、現在のユーザーの意図と矛盾するメモリは、黙って従うのではなく明確化を求めるべきです。これが、安定した好み、ポリシー、常時制約に対して、検索よりも構造化状態がしばしば優れる理由です。

検索(リトリーバル)の仕組み

典型的な検索フローには5つのステップがあります:捕捉、エンコード、検索、リランキングまたはフィルタリング、そしてインジェクションです。Pinecone、Weaviate、Qdrant、Redis、Milvusはすべてこのパターンのバリエーションを文書化しています。一部のシステムは稠密(dense)ベクトルのみをサポートし、他のシステムはセマンティック検索と列挙型検索を組み合わせるハイブリッド検索をサポートし、さらに一部のシステムはテナント管理とスコープ制御のためのメタデータフィルタや名前空間を公開しています。エンジニアリング上のポイントはシンプルです。検索の品質は、エンベディングモデル自体と同程度に、フィルタリング、チャンキング、ランキング戦略に依存します。

クエリが意味と厳密な用語の両方を含む場合、ハイブリッド検索が通常、賢いデフォルトです。Weaviateはalphaパラメータを使ってベクトル成分とキーワード成分をバランスさせるハイブリッド検索を文書化しており、QdrantはそのQuery APIとスコア融合メソッドを通じてハイブリッドおよび複数ステージのクエリをサポートし、Milvusは同一システム内で稠密、疎(sparse)、ハイブリッド検索を説明しています。これはアシスタントにとって重要であり、ユーザーはしばしば近似的な意味と厳密な識別子、ファイル名、改訂番号、製品コードの両方を尋ねるからです。列挙型検索の側がベクトルデータベース内ではなくPostgresやElasticsearchにある場合、PostgreSQLフルテキスト検索 vs Elasticsearch は、本番環境でキーワード検索をどこで実行すべきかを選ぶ際に役立ちます。

もう一つ、私なりの見解を述べます。検索はポリシーを決定すべきではありません。候補を提供すべきです。アシスタントは依然として、優先順位、プライバシー、新しさ、衝突解決のための構造化ルールを必要としています。OpenAIのステートベースメモリの例示はこれらを明示しており、類似度検索だけで矛盾するユーザー状態を解決できるというふりをするよりも、はるかに健全なパターンです。

共通の問題

最も一般的な失敗は、古いメモリや矛盾するメモリです。OpenAIの長期メモリクックブックは、メモリ統合(コンソリデーション)を最も繊細でエラーが発生しやすい段階と呼び、コンテキストの汚染、メモリ損失、重複メモリ、矛盾の処理を核心的な懸念事項として挙げています。これは正しい指摘であり、多くのアシスタントが静かに失敗する箇所です。彼らは、忘れるためのルールを持たず、あまりに多く、あまりに早く記憶してしまいます。この失敗の、具体的でますます一般的になっている一つの変種は、独自の詳細な検討に値します。モデル自身の推論が永続メモリとして昇格し、後で観察として検索され、さらに強力なその推論の根拠として使用されるのです。この7つの形態と、それらを検出するためのテスト方法については、AIエージェントにおける自己強化メモリループ を参照してください。

2番目の失敗はコンテキストオーバーロードです。LangGraphは、長い会話がLLMのコンテキストウィンドウを超え得ると警告し、トリミング、削除、要約、またはチェックポイント管理を推奨しています。OpenClawも同様に、ディスク上の完全なトランスクリプトを保持しながら、メモリ内コンテキストから古いツール出力を剪定します。これらは任意の最適化ではなく、アシスタントが何か平凡ではないものを読み取り、検索、実行する場合に必須です。

3番目の失敗は、長いコンテキストが信頼できる想起に等しいと考えることです。LoCoMoは長期の会話メモリがいまだに困難であることを示し、「Lost in the Middle」は長いプロンプト内の位置敏感性(ポジションセンシティブネス)を示しています。メモリが重要であるなら、蛮力的なプロンプト詰め込みだけに依存しないでください。圧縮(コンパクション)、検索、明示的な状態を使用してください。

トレードオフ

ベクトルデータベースレイヤーは、多くのアシスタントチームが早期にプラットフォーム投資を行う場所です。以下の比較は、アシスタントメモリ設計において重要な、文書化された製品特性に焦点を当てています。

システム 特徴 最適なユースケース
Pinecone 統合エンベディング、リランキング、メタデータフィルタ、名前空間、および単一のスキーマでの稠密、疎、BM25スタイルフルテキスト検索をサポートするマネージドベクトルデータベース インフラを最小限に抑えたマネージド検索を求めるチーム
Weaviate オブジェクトとベクトルを保存するオープンソースのベクトルデータベース。セマンティック検索とハイブリッド検索、強いRAGポジショニングを持つ ハイブリッド検索付きのオープンソースの柔軟性を求めるチーム
Qdrant フィルタリング、ハイブリッドおよび複数ステージのクエリ、および組み込みのオフライン対応Edgeモードを持つAIネイティブのベクトル検索 検索の制御、エッジデプロイメント、強力なフィルタリングを求めるチーム
pgvector Postgres内のベクトル類似度検索。完全一致と近似検索、ACID、JOIN、回復機能付き Postgresおよびリレーショナルデータにすでに標準化しているチーム
Milvus 分散型ストレージとコンピューティング、および稠密、疎、ハイブリッド検索を持つクラウドネイティブのベクトルデータベース 大規模な検索ワークロードと分散デプロイメント

バックエンドを選択した後、それを運用することはデータインフラ の問題になります。Postgresとpgvectorによるセッションメタデータとベクトルの単一スタック、あるいは、検索メモリがフラットなチャンクではなくグラフ構造である場合のNeo4jです。

以下のレイテンシとコストのパターンは、OpenAI Sessionsとコンパクションガイダンス、LangGraphメモリ管理、OpenAIステートベースメモリ、およびRedisとベクトルストアの文書化された検索動作で説明されたオペレーションモデルに基づく設計の総合成です。コーパスサイズ、エンベディングモデル、ネットワーク配置、キャッシュに依存するため、意図的に定性的です。

メモリ戦術 読み取りレイテンシ 書き込みレイテンシ トークンコスト圧力 インフラコスト 価値がある場合
生のセッション履歴 最低 最低 最高 最低 シンプルな多ターンチャットと短い実行
サマリーまたはコンパクションメモリ 低〜中 中(要約自体がモデルステップだから) 中〜低 低〜中 アクティブな実行が継続しなければならない長時間の作業
構造化プロフィールと状態 永続的な好み、ルール、常時制約
ベクトルまたはハイブリッド検索 低〜中 大きなコーパス、検索可能な履歴、ドキュメントグラウンディング
すべての完全再生 高く、不安定になりがち 最高 低インフラ、高モデル支出 ほぼない、小さなコーパスとデバッグを除き

実装例

OpenAIの現在のスタックは、2つの有用な参照パターンを提供します。第一は、実行処理間の短期継続性のためのSessionsです。第二は、ステートベースの長期メモリです。これは、構造化プロフィールフィールドとグローバルメモリノートをセッション開始時に注入し、実行処理中にセッションノートを蒸留し、統合ステップで永続的な項目のみをグローバルメモリに昇格するというものです。その「注入 → 推論 → 蒸留 → 統合」ループは、現在利用可能な最も明確なパブリックメモリパターンの一つです。

LangGraphは、類似ですがフレームワーク非依存の分離を提供します。チェックポインターが短期スレッドメモリを処理し、ストアが会話間の長期検索を処理します。ストアはランタイム中にノード内で検索できるため、隠されたフレームワークの魔法ではなく明示的なオーケストレーションを必要とするアシスタントにとっての良い参照設計になります。

Hermesは、実環境における多層メモリの実用的なパブリック例です。その組み込みメモリはMEMORY.mdUSER.md、およびSQLite FTS5セッション検索を使用し、外部プロバイダープラグインがグラフメモリ、セマンティック検索、自動事実抽出、ユーザーモデリングを追加します。完全な仕組みはHermes Agent Memory System に文書化されており、8つのプラグイン可能なバックエンドはエージェントメモリプロバイダー比較 で比較されています。

OpenClawは異なるアプローチを提供します。セッション剪定、メイン返信前に実行される任意のアクティブメモリ、バックグラウンドメモリ統合のためのオプトイン型Dreamingシステムです。これらの例は、メモリを検索のトリックではなく、オペレーションサブシステムとして扱うため、注目する価値があります。OpenClawがより広い5層アシスタントスタックにどうマッピングされるかについては、OpenClawシステム概要 を参照してください。

研究プロトタイプも同じ方向を指しています。MemGPTはコンテキスト管理のための階層型メモリ階層と制御フローを使用し、A-MEMはZettelkastenに触発された動的インデクシングとリンクを使用し、Mem0はLoCoMoにおいて完全コンテキストベースラインと比較して、はるかに低いp95レイテンシとトークンコストでより良い精度を報告しています。これらのシステムをそのままコピーする必要はありませんが、彼らの共通した教訓は明確です。メモリの品質は、すべてを永遠に保存することからではなく、選択と組織から生まれます。

メモリが役立つときと、害をなすとき

メモリが役立つのは、アシスタントが安定した好み、永続的な制約、再利用可能なワークフローの教訓、プロンプトに収まらない大きな外部コーパスを繰り返し遭遇する場合です。OpenAIの信頼できるエージェントガイドは、この区別を適切に説明しています。コンパクションは現在の長時間実行の継続を助ける一方、メモリは将来の実行がワークフローの教訓を再利用するのを助けます。これは大多数のビジネスアシスタントにとって正しいメンタルモデルです。

メモリが害をなすのは、タスクがワンショットである場合、ユーザー状態が頻繁に変更される場合、検索インデックスがノイズだらけの場合、システムが衝突を調整できない場合です。OpenAIの旅行メモリ例は、セッションメモリが自動的にグローバルメモリになってはならないと警告し、メモリはセキュリティ境界ではないと明示しています。あなたのアシスタントが想起されたすべての文字列を真実として扱うなら、あなたはメモリシステムではなく、混乱エンジンを作ったことになります。

選択的なメモリループ

最もシンプルで堅牢なメモリループは、選択的であり、段階的です。永続状態を読み込み、サポートコンテキストを検索し、回答し、候補メモリのみを捕捉し、後で統合します。OpenAIのステートベースパターンと最近のメモリ論文はこの方向に向かっています。

agent-memory-sequence-diagram

トレーシングと評価(evals)がないと、メモリの变化はデバッグが困難です。新しい事実を昇格させたり検索ポリシーを変更したりする場合は、LLMシステム向けオブザーバビリティ のオブザーバビリティパターンとそれらを組み合わせ、どのレイヤーが何を注入したかを見えるようにしてください。

まとめ

アシスタント向けの実用的なメモリスタックは、「単にベクトルDBを使え」ではありません。ライブ実行のためのワーキングメモリ、永続的な真実のための構造化状態、サポートエビデンスのための検索メモリ、そして記憶するように意識して忘れられる保守的な統合ポリシーです。最近の研究と現在のSDKガイダンスの両方がこの方向を指しています。

このレイヤーを囲む完全なアシスタントスタックについては、まずAIアシスタントアーキテクチャ から始めてください。Hermes固有の限界付きメモリとプロバイダープラグインについては、Hermes Agent Memory Systemエージェントメモリプロバイダー比較 を追ってください。アシスタントがユーザーのプロンプトを待つのではなく、ソースを監視して能動的に行動する必要がある場合、ポーリングのためのオペレーションステートモデル(カーソル、クレーム、重複排除レコード、実行ログ)は、AIアシスタントにおけるポーリングエージェント: 11の実装パターン でカバーされています。

購読する

システム、インフラ、AIエンジニアリングの新記事をお届けします。