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

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

目次

メモリはアシスタントを反応型から永続型へと変えますが、同時に多くのシステムが静かに劣化してしまう箇所でもあります。調査では、短期的メモリと長期的メモリの二分法是では現代のエージェントメモリには不十分であると指摘されています。OpenAIやLangGraphのSDKは、よりシンプルな構成、つまりワーキングメモリ、永続的な状態、および検索による取得(リトリーブ)へと焦点を移しています。

アシスタントには、現在の実行のためのワーキングメモリ、安定した事実や設定を保持するための永続状態、関連する支援コンテキストのための検索メモリが必要です。私のやや主観的な見解では、構造化された状態(ステート)は過小評価され、ベクトル検索は過大評価されており、メモリ失敗の大半は記憶の選択や注入ポリシーに起因するものであり、ストレージの選択そのものではないと考えることができます。

もう1つの重要な点は、メモリが単独で長文コンテキストの問題を解決しないという点です。LoCoMoの研究は、非常に長期的な会話の記憶が依然として困難であることを示しており、「Lost in the Middle(真ん中で迷子)」という現象は、関連情報がプロンプトの真ん中に配置されると、モデルに単純に多くのトークンを投入してもパフォーマンスが低下することを示しています。優れたメモリシステムは、選択的であり、階層化されており、優先順位を明確にしています。

このガイドは、AI Assistant Architecture におけるメモリレイヤーのクロスフレームワークマップとして、AI Systems Memory hub に位置しています。

Abstract memory system for an AI assistant as layered notebooks, vector points, and structured cards

アシスタントメモリを考える方法

アシスタントメモリは、PKM(パーソナル・ナレッジ・マネジメント)、ウィキ、またはスタンドアロンのRAGパイプラインと同じ問題ではありません。PKM vs RAG vs Wiki vs Memory Systems は、知識アーキテクチャのレベルでこれらのパラダイムを比較しています。このガイドは、それらより1層下の、アシスタントが実際に実装するランタイム契約(コントラクト)に焦点を当てています。

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

メモリが重要なのは、本番環境のアシスタントが作業を繰り返し、目標を再訪し、数日または数週にわたって動作するためです。Generative Agentsは、経験の保存、それに対する省察、そして将来の計画のための動的な検索というパターンを普及させました。MemGPTは、メモリを階層としてモデル化し、高速ストアと低速ストア間の移動をさらに推進しました。A-MEMやMem0などの最近のシステムは、単なる記憶量ではなく、リンク、統合、および配備効率に焦点を当てています。

メモリの種類

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

短期的メモリ

短期的メモリは、現在の会話または実行のワーキングコンテキストです。OpenAI Sessionsは、各実行の前に会話履歴を自動的に先頭に追加し、各実行の後に新しい項目を末尾に追加します。LangGraphは、チェックポインターを通じたスレッドレベルの永続性として同じ概念を実装しています。このレイヤーはローカルな一貫性を保ちますが、ツール結果、ファイル読み取り、または長文チャットが積み重なると、最初に破綻する箇所でもあります。

長期的検索メモリ

長期的検索メモリは、毎回再生されるのではなく、関連する際に検索されるアイテムを保存します。これは RAG を検索技術として重複しますが、アシスタントメモリの全体像ではありません。上記のPKM/RAG/ウィキ/メモリ比較が明確に示すように、ウィキやPKMコーパスはしばしばインデックスに供給されますが、構造化された状態やセッションメモリは別箇に存在します。古典的なRAGでは、モデルはパラメトリックメモリと、密集ベクトルインデックスなどの非パラメトリックメモリを組み合わせます。Self-RAGは、すべてのリクエストに対して固定的ではなく、オンデマンドで検索を行うことで、単純な検索よりも改善されています。実用的なアシスタントシステムでは、これは通常ベクトルストアまたは検索可能なトランスクリプトレイヤーです。

構造化メモリ

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

検索メカニクス

典型的な検索フローには5つのステップがあります:キャプチャ、エンコード、検索、リランキングまたはフィルタリング、そして注入です。Pinecone、Weaviate、Qdrant、Redis、Milvusはすべて、このパターンのバリエーションを文書化しています。一部のシステムは密集ベクトルのみをサポートし、他のシステムはセマンティック検索とレキシカル検索を組み合わせたハイブリッド検索をサポートし、さらに一部のシステムはテナンシーやスコープ制御のためにメタデータフィルタや名前空間を公開しています。エンジニアリングの要点は単純です。検索の品質は、埋め込みモデル自体と同じくらい、フィルタリング、チャンキング、およびランキング戦略に依存します。

ハイブリッド検索は、クエリが意味と正確な用語の両方を混在させる場合に、通常、理にかなったデフォルトです。Weaviateは、ベクトルとキーワードの成分をバランスさせる alpha パラメータでハイブリッド検索を文書化しており、QdrantはQuery APIとスコア融合メソッドを通じてハイブリッドおよびマルチステージクエリをサポートし、Milvusは同じシステム内で密集、スパース、およびハイブリッド検索を説明しています。これはアシスタントにとって重要であり、ユーザーはしばしば近似的な意味と、正確な識別子、ファイル名、リビジョン番号、または製品コードの両方を要求します。レキシカル検索側がベクトルデータベース内ではなく、PostgresやElasticsearchにある場合、PostgreSQL full text search vs Elasticsearch は、本番環境でキーワード検索をどこで実行すべきかを選択するのに役立ちます。

もう1つの主観的な点として:検索はポリシーを決定すべきではありません。候補を提供するだけです。アシスタントは依然として、優先順位、プライバシー、新規性、および競合解決のための構造化されたルールが必要です。OpenAIの状態ベースメモリ例はこれを明確に示しており、類似性検索のみで矛盾するユーザー状態を解決できるふりをするよりも、はるかに健全なパターンです。

一般的な問題

最も一般的な失敗は、古いまたは矛盾するメモリです。OpenAIの長期的メモリクックブックは、メモリ統合を最も敏感でエラー prone な段階と呼び、コンテキスト汚染、メモリ喪失、重複メモリ、および矛盾処理を主要な懸念事項として挙げています。これは正しいことであり、多くのアシスタントが静かに失敗する箇所でもあります。彼らは、忘れ方のルールなしに、あまりにも多く、あまりにも早く記憶してしまいます。

2番目の失敗はコンテキスト過負荷です。LangGraphは、長文の会話がLLMのコンテキストウィンドウを超えうることを警告し、トリミング、削除、要約、またはチェックポイント管理を推奨しています。OpenClawも同様に、ディスク上の完全なトランスクリプトを保持しつつ、メモリ内のコンテキストから古いツール出力を刈り取る(プルーニング)ことで対応しています。これらはオプションの最適化ではありません。アシスタントが読書、検索、または何らかの重要な実行を行う場合、これらは必須です。

3番目の失敗は、長文コンテキストが信頼できる記憶に等しいと仮定することです。LoCoMoは、長期的な会話メモリが依然として困難であることを示しており、「Lost in the Middle」は長文プロンプト内での位置敏感性を示しています。メモリが重要である場合、ブルートフォースなプロンプト詰め(stuffing)に依存しないでください。圧縮、検索、および明示的な状態を使用してください。

トレードオフ

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

システム 特長 最適な用途
Pinecone 埋め込み、リランキング、メタデータフィルタ、名前空間を統合し、1つのスキーマで密集、スパース、およびBM25スタイルの全文検索をサポートするマネージドベクトルデータベース 最小限のインフラでマネージド検索を求むチーム
Weaviate オブジェクトとベクトルを保存するオープンソースベクトルデータベース。セマンティックおよびハイブリッド検索、および強いRAGポジショニングを備える ハイブリッド検索によるオープンソースの柔軟性を求むチーム
Qdrant フィルタリング、ハイブリッドおよびマルチステージクエリを備えたAIネイティブベクトル検索。さらに、オフライン対応のエッジモードを埋め込み可能 検索制御、エッジ配備、または強力なフィルタリングを求むチーム
pgvector Postgres内のベクトル類似性検索。正確および近似検索に加え、ACID、JOIN、および復元機能を備える Postgresおよび関係型データに標準化しているチーム
Milvus 分散型ストレージとコンピューティングを備えたクラウドネイティブベクトルデータベース。密集、スパース、およびハイブリッド検索をサポート 大規模な検索ワークロードおよび分散配備

バックエンドを選んだ後、その運用は data infrastructure の問題となります。Postgresとpgvectorを組み合わせてセッションメタデータとベクトルを1つのスタックで扱うか、検索メモリがフラットなチャンクではなくグラフ形状である場合は Neo4j を使用するかです。

以下のレイテンシーとコストのパターンは、OpenAI Sessionsのオペレーショナルモデルと圧縮ガイダンス、LangGraphのメモリ管理、OpenAIの状態ベースメモリ、およびRedisやベクトルストアの文書化された検索動作に基づいた設計上の統合です。実際の数値はコーパスのサイズ、埋め込みモデル、ネットワーク配置、およびキャッシュに依存するため、意図的に定性的なものです。

メモリ戦略 読み取りレイテンシー 書き込みレイテンシー トークンコスト圧力 インフラコスト 価値がある場合
生セッション履歴 最低 最低 最高 最低 シンプルなマルチターンチャットおよび短い実行
要約または圧縮メモリ 低〜中 中(要約自体がモデルステップであるため) 中〜低 低〜中 アクティブな実行が続く必要がある長期的なワーク
構造化プロフィールと状態 永続的な設定、ルール、および常設の制約
ベクトルまたはハイブリッド検索 低〜中 大規模なコーパス、検索可能な履歴、ドキュメントグラウンディング
すべてを完全に再生 高く、かつ不安定さが増す 最高 インフラは低、モデル支出は高 微小なコーパスとデバッグ以外ではほぼない

実装例

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

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

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

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

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

メモリが役立つ場合と害をなす場合

メモリは、アシスタントが安定した設定、永続的な制約、再利用可能なワークフローの教訓、またはプロンプトに収まらない大規模な外部コーパスを繰り返し遭遇する場合に役立ちます。OpenAIの信頼できるエージェントガイドは、この区別をよく説明しています。圧縮は現在の長期的な実行の継続を助け、メモリは将来の実行がワークフローの教訓を再利用するのに役立ちます。これがほとんどのビジネスアシスタントにとって正しいメンタルモデルです。

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

選択的メモリループ

最もシンプルで堅牢なメモリループは、選択的で段階的です。永続的な状態を読み込み、支援コンテキストを検索し、回答し、候補メモリのみをキャプチャし、後で統合します。OpenAIの状態ベースパターンと最近のメモリ論文の両方が、この方向へ進んでいます。

agent-memory-sequence-diagram

トレーシングと評価(evals)なしでは、メモリ変更はデバッグが困難です。新しい事実を昇格させたり検索ポリシーを変更したりする際には、Observability for LLM Systems の可観測性パターンとそれらの変更をペアリングし、どのレイヤーが何を注入したかを視覚化できるようにしてください。

主なポイント

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

このレイヤーを取り囲む完全なアシスタントスタックについては、AI Assistant Architecture から始めます。Hermes固有の有界メモリとプロバイダープラグインについては、Hermes Agent Memory System および Agent memory providers compared を参照してください。

購読する

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