エージェントアプリケーションが実験的な機能から本番ユースケースへと移行するにつれ、システム全体に完全に統合され、ユーザーに強くパーソナライズされ、継続的に学習して改善できることが重要であることが明らかになりました。これらのエージェントには、アドホックな後付けではなく、堅牢で予測可能なインフラストラクチャとして設計されたメモリーが必要です。そこで Weaviate は Engram を構築しました。これは Weaviate 上で動作するマネージドメモリーサービスで、簡単に始められる一方、あらゆるユースケースに適応できる柔軟性に焦点を当てています。
メモリーの重要性
チャットボットがユーザーの好みを忘れるのは大きな不便ですが、長期にわたる複雑なタスクを実行するエージェントにとっては問題はさらに深刻です。メモリーの連続性がなければ、エージェントは過去の経験から学習できず、同じ中間問題を繰り返し解決するサイクルに陥り、時間とトークンを浪費します。フロンティアモデルの長いコンテキストウィンドウは解決策に見えるかもしれませんが、コンテキストを詰め込むのは最善のアプローチではありません。LLM は「中間で迷子」になることがよく知られており、効果的なコンテキスト長はまだ 100% には程遠いです。さらに、コンテキストが長すぎると精度が低下し、応答レイテンシが増加し、コストが膨らみます。
各メッセージを単純に保存する方法はレイテンシとコストの問題を解決しますが、他の欠点があります。実際のユーザーとの生の会話はノイズが多く、矛盾しており、時間とともに変化する事実を含んでいます。これらの矛盾を LLM に一度に解決させるのは、段階的に行うよりも困難です。すべてのメモリーを単一の会話として扱うと、マルチエージェントシステムのような高度なユースケースに適応できません。
最善の解決策は、メモリーを増え続けるコンテキストの山として扱うのではなく、積極的に維持することです。
Engram の仕組み
Engram は Weaviate ベクトルデータベース上に構築されたマネージドメモリーサービスで、非同期パイプラインを中心に設計されています。生データを追加すると、パイプラインがメモリーを抽出し、新しい情報と既存の情報を調整し、Weaviate に永続化してクエリ可能にします。一般的なメモリーユースケース向けのスターターテンプレートを提供し、簡単に始められますが、その基盤となるシステムは非常に柔軟で構成可能です。カスタマイズは、関心のあるトピックを説明する簡単な自然言語記述から、パイプライン内の個々のステップの完全な制御まで及びます。
始めるのは簡単です。プロジェクトの API キーを作成したら、REST API または Python クライアントを使用してデータを追加できます。Engram はパイプライン実行を開始し、構成されたトピックに一致するメモリーを抽出して既存のメモリーに統合します。たとえば、ユーザーがベクトルへの愛情を共有した場合、Engram は新しいメモリーを作成します。以前の会話ですでに共有されていた場合は、重複を避けるために無視します。パイプラインは非同期で実行されるため、API のレイテンシは非常に低く、データを「ファイア・アンド・フォーゲット」して、Engram が必要なものを記憶するのに任せることができます。
後で、セマンティック検索を使用して関連メモリーを取得できます。シンプルな API に加えて、Engram は豊富な組織化機能を提供します。
メモリーの整理とスコープ
Engram は生データからメモリーを抽出すると、自動的に事前構成されたトピックのいずれかに整理します。トピックは、LLM がどの情報を抽出し、どのように分類するかを指示する自然言語の説明です。各トピックには「スコープ」があり、どの生データがそのメモリーに影響を与えるかを制御します。スコープはハード分離とソフト分離を組み合わせます。プロジェクト全体のメモリーはすべてのユーザー間で共有され、ユーザースコープのメモリーは特定のユーザーにのみ属し、Weaviate のマルチテナンシー機能によって厳密に分離されます。プロパティスコープのメモリーは追加のキー・バリューデータを持ち、クエリ時にフィルタリングするかどうかを選択できます。
トピックは「有界」としてマークでき、スコープごとに最大 1 つのメモリーオブジェクトのみを許可します。これは、ユーザープロファイルなどの機能を実装するために使用できます。
パイプラインとステップ
Engram はパイプラインを使用して、生データがメモリーに加工される方法を正確に制御します。パイプラインは非同期で実行されるステップのグラフであり、生データを徐々にメモリーのバッチに変換し、Weaviate に永続化します。パイプラインは Temporal ワークフロー上に構築されており、永続的な実行を提供します。ステップには以下が含まれます。
抽出ステップ:LLM を使用して、構成されたトピックに一致するメモリーを生データから抽出します。会話データ、文字列データ、事前抽出メモリーの 3 つの入力タイプをサポートします。
変換ステップ:LLM を使用して、新しいメモリーを既存のメモリーに統合する方法を決定するか、ユースケース固有の処理を適用します。たとえば、重複排除や偏好の変化を処理する場合、既存のメモリーを検索し、アクション(保持、書き換え、削除)を決定します。
バッファ:パイプラインが中間メモリーを保持し、トリガー条件(データ量、時間間隔など)が満たされるまで処理を延期できます。バッファは、デバウンス、完全な情報の待機、日次ロールアップなどのシナリオをサポートします。
実際の使用例
例 1:ユーザーとの会話――ユーザーが CEO に昇進したと伝えます。Engram はメモリーを抽出し、既存の「機械学習エンジニア」メモリーを見つけ、「ユーザーは以前機械学習エンジニアだったが、現在 CEO に昇進した」と書き換え、新しいメモリーを削除します。
例 2:マルチエージェントによる継続学習――マルチエージェント RAG システムで、ユーザーがコメディ映画を検索する際にフィルターを使うべきだと提案します。Engram はタスク目標、実行済みアクション、フィードバックを個別に抽出し、バッファを介してこれらを結合し、1 つの経験メモリー「コメディなどのジャンルを検索する際は、near-text クエリではなく genres プロパティでフィルターする」を作成します。この経験はプロジェクト全体で共有することも、ユーザーごとに限定することもできます。
アプリケーションへの統合
標準的なチャットボットでは、新しいメッセージごとに client.memories.add を呼び出します。会話形式でないデータには文字列データを使用し、抽出を完全に制御したい場合は事前抽出データを使用します。メモリーの検索には、ユーザーメッセージをクエリとして使用するか、検索メソッドをツール呼び出しとして公開します。特定のメモリーがわかっている場合は、フェッチ取得モードを使用できます。
Engram は柔軟性が高く、しかも簡単に始められるように設計されています。パーソナライゼーションと継続学習のための事前構築済みテンプレートを提供し、Claude Code などのコーディングエージェントとの統合も計画されています。詳細に興味があれば、今すぐプレビューにサインアップしてください。