OpenClawのメモリ検索
埋め込みとキーワード、ランキングの式、新しさによる減衰、トリガーリコール、プロバイダーがない場合の動作
メモリ検索ツールは、言い回しが元のテキストと異なっていても、エージェントのメモリファイルから関連するノートを見つけます。メモリを小さなチャンクに分割し、埋め込み、キーワード、またはその両方で検索する仕組みです。デフォルトはOpenAIの埋め込みで、APIキー不要のマネージドなローカルプロバイダーを含め、十数種類のプロバイダーに対応しています。ここでは、検索の実行の流れ、ドキュメントが明示するランキング、返信の前に実行されるトリガーリコール、フォールバックのルール、セッションメモリ、そしてトラブルシューティングの一覧を紹介します。
プロバイダーと2つの経路
- providerキーには、OpenAI、Gemini、Voyage、Mistral、Bedrock、DeepInfra、GitHub Copilot、Ollama、LM Studio、汎用のOpenAI互換エンドポイント、またはlocalのいずれかを指定します。localは、検証済みのllama.cppサーバーと約3分の1ギガバイトの小さな埋め込みモデルをインストールします。対応しているAPIの種類を使うものであれば、カスタムプロバイダーのエントリーも使えます。
- 2つの検索経路が並行して実行され、統合されます。ベクトル検索は意味の近さで照合するため、Gatewayホストについてのクエリで、OpenClawを実行しているマシンについてのノートが見つかります。BM25のキーワード検索は、ID、エラー文字列、設定キーなどの正確な語句で照合します。一方の経路しか使えない場合は、その経路だけが単独で実行されます。
- ファイル名検索はパスを本文とは別にインデックス化するため、パス、ベース名、拡張子を除いたファイル名が完全に一致するものは部分一致よりも上位に来ます。スニペットは引き続きノートの内容から取られます。
- 一部のOpenAI互換エンドポイントでは、クエリとドキュメントで非対称な入力タイプが必要で、これは2つの設定キーで指定します。
古いノートはランキングでの重みを徐々に失うため、新しい情報が先に表示されます。
ランキング
組み込みエンジンは、ハイブリッドの関連性×新しさによる減衰×重要度の乗数という決定論的な式を適用します。重要度は、すでにモデルが関与しているメモリのワークフローがエントリーを書き込むときに一度だけスコア付けされ、スコアがない場合は中立として扱われます。日付付きのデイリーノートは30日の半減期で減衰するため、先月のノートは元の重みの半分でスコア付けされます。一方、キュレーションされたメモリファイルとユーザーファイル、そして日付のないファイルは減衰しません。ドキュメントは、関連性・新しさ・重要度という結果をGenerative Agentsの論文によるものとしており、クエリ時のモデル呼び出しは追加していません。その後、多様性パスが、関連性寄りの固定設定と上限のある候補プールを使ってスコア付けされた候補を並べ替え、ほぼ同一のスニペットを減らします。スコアを変えることも、プロバイダーを呼び出すこともありません。ランク付けされた結果がすべて設定された最小スコアを下回る場合でもキーワード一致は保持され、ハイブリッド検索は残りの枠をキーワードのみのヒットで埋めます。
トリガーリコールとフォールバックのルール
- 対象となるインタラクティブなターンでは、エンジンが受信メッセージを、インデックス化されたエントリーに保存された短いトリガーフレーズと比較し、返信の前に最大3件のコンパクトなエントリーを非表示のコンテキストに追加できます。対象になるのは、ルートのメモリファイルとユーザーファイルにある、昇格済みで信頼されたエントリーだけです。デイリーノート、インポートされたトランスクリプト、セッションのトランスクリプトが自動的に挿入されることはありません。
- providerをnoneに設定すると、キーワードのみの検索のために意図的に埋め込みが無効になります。未設定またはautoのままにすると、埋め込みのセットアップやリクエストが失敗したときにキーワードのみのランキングにフォールバックします。localプロバイダーも同様です。また、インデックス作成では、最初の検索の前からキーワード検索用のテキストが記録されます。
- それ以外のプロバイダーを明示的に指定し、それがリクエスト時に失敗すると、ツールは黙って縮退するのではなく、メモリが利用できないと報告します。これにより、壊れた設定が見えるままになります。対処法は、プロバイダーや認証の設定を直すか、意図的にキーワードのみで想起させたい場合はnoneにすることです。
OpenClawのメモリの解説では検索対象のファイルを、OpenClawのdreamingでは、何をそれらのファイルに昇格させるか、つまりトリガーリコールが何を挿入し得るかを決める夜間の一括処理を解説しています。
セッションメモリとトラブルシューティング
トランスクリプトからの正確な全文想起は、セッション検索ツールの役割です。トランスクリプトをメモリ検索にインデックス化するのはオプトインで、実験的なフラグとソースの一覧で有効にします。ノートだけを検索するためのcorpusオプションと、デフォルトがallの可視性設定があり、エージェント間のアクセスはagent-to-agent設定で制御されます。画像と音声は、1つのGemini埋め込みモデルでMarkdownと一緒にインデックス化できますが、デフォルトのメモリルートではなく、追加のパスの下にある場合に限られます。結果が出ないときは、インデックスのステータスを確認して再構築します。キーワード一致しか返らないときは、おそらく埋め込みプロバイダーが設定されておらず、詳細ステータスでそれを確認できます。ローカルの埋め込みがタイムアウトするときは、再構築の前にマネージドサーバーのエンドポイントを調べます。そして見つからないCJKテキストには、インデックスの強制再構築が必要です。OpenClawのローカルモデルでは、ローカルプロバイダーと並んで使われるローカルモデルを、OpenClawのセッションでは、オプトインでインデックス化されるトランスクリプトを解説しています。
Dialiでは
Dialiでは、メモリ検索はお使いのモデルキーで使える埋め込みプロバイダーで動作し、それがない場合はドキュメントに記載されたキーワード経路にフォールバックします。どちらの場合も、ノートはアシスタントの永続ワークスペースに保存されます。アシスタントについてはDialiのマネージドOpenClawホスティングをご覧ください。
- 意味にはベクトル、正確な語句にはBM25を使い、結果を統合します。
- 関連性×新しさ×重要度。デイリーノートの重みは30日ごとに半分になります。
- 明示的に指定したプロバイダーが壊れていれば報告され、決して隠されません。
読むだけでなく、作ってみましょう
エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。
