組み込みより追加される機能
- リランキングとクエリ拡張により、再現率を高めます。
- 追加ディレクトリのインデックス化 - プロジェクトドキュメント、チームメモ、ディスク上のあらゆるもの。
- セッショントランスクリプトのインデックス化 - 以前の会話を思い出せます。
- 完全にローカル - 公式の llama.cpp プロバイダー Plugin と連携して動作し、GGUF モデルを自動ダウンロードします。
- 自動フォールバック - QMD が利用できない場合、OpenClaw はシームレスに組み込みエンジンへフォールバックします。
はじめに
前提条件
- QMD をインストールします:
npm install -g @tobilu/qmdまたはbun install -g @tobilu/qmd - 拡張を許可する SQLite ビルド(macOS では
brew install sqlite)。 - QMD はゲートウェイの
PATH上にある必要があります。 - macOS と Linux はそのまま動作します。Windows は WSL2 経由が最もよくサポートされています。
有効化
~/.openclaw/agents/<agentId>/qmd/ の下に自己完結型の QMD ホームを作成し、サイドカーのライフサイクルを自動的に管理します - コレクション、更新、埋め込み実行は自動で処理されます。現在の QMD コレクションと MCP クエリ形状を優先しますが、必要に応じて代替のコレクションパターンフラグや古い MCP ツール名へフォールバックします。起動時の照合では、同じ名前の古い QMD コレクションがまだ存在する場合、古くなった管理対象コレクションを正規パターンに再作成します。
サイドカーの仕組み
- OpenClaw はワークスペースのメモリファイルと設定済みの
memory.qmd.pathsからコレクションを作成し、QMD マネージャーが開いたときとその後定期的にqmd updateを実行します(memory.qmd.update.interval、デフォルトは5m)。更新はインプロセスのファイルシステムクロールではなく、QMD サブプロセス経由で実行されます。セマンティック検索モードではqmd embedも実行されます(memory.qmd.update.embedInterval、デフォルトは60m)。 - デフォルトのワークスペースコレクションは、
MEMORY.mdとmemory/ツリーを追跡します。小文字のmemory.mdはルートメモリファイルとしてインデックス化されません。 - QMD 自身のスキャナーは、隠しパスと、
.git、.cache、node_modules、vendor、dist、buildなどの一般的な依存関係/ビルドディレクトリを無視します。Gateway 起動時はデフォルトで QMD を初期化しません(memory.qmd.update.startupのデフォルトはoff)。そのため、コールドブート時はメモリが最初に使われるまで、メモリランタイムのインポートや長寿命ウォッチャーの作成を避けます。 - それでもゲートウェイ開始時に QMD を初期化するには、
memory.qmd.update.startupをidleまたはimmediateに設定します。memory.qmd.update.onBootのデフォルトはtrueで、起動時に初回更新を実行します。その即時更新をスキップするにはfalseに設定します(更新または埋め込み間隔が設定されている場合、長寿命マネージャーは引き続き開くため、QMD は通常のウォッチャー/タイマーを引き続き所有します)。 - 検索は設定済みの
searchModeを使用します(デフォルト:search。vsearchとqueryもサポート)。searchは BM25 のみのため、OpenClaw はそのモードではセマンティックベクトルの準備状況プローブと埋め込みメンテナンスをスキップします。モードが失敗した場合、OpenClaw はqmd queryで再試行します。 searchModeがqueryの場合、QMD のハイブリッドクエリパスをリランカーなしで使うにはmemory.qmd.rerankをfalseに設定します(QMD 2.1 以降が必要)。OpenClaw は直接 QMD CLI パスに--no-rerankを渡し、QMD の MCP クエリツールにrerank: falseを渡します。- 複数コレクションフィルターを通知する QMD リリースでは、OpenClaw は同一ソースのコレクションを 1 つの QMD 検索呼び出しにまとめます。古い QMD リリースでは、互換性のあるコレクション単位のフォールバックを維持します。
- QMD が完全に失敗した場合、OpenClaw は組み込み SQLite エンジンへフォールバックします。チャットターン内での繰り返し試行は、オープン失敗後に短時間バックオフするため、バイナリの欠落や壊れたサイドカー依存関係による再試行の集中を避けます。
openclaw memory statusとワンショット CLI プローブは引き続き QMD を直接再チェックします。
最初の検索は遅い場合があります - QMD は最初の
qmd query 実行時に、リランキングとクエリ拡張用の GGUF モデル(約 2 GB)を自動ダウンロードします。検索パフォーマンスと互換性
OpenClaw は、現在の QMD と古い QMD インストールの両方に対応するように QMD 検索パスの互換性を保ちます。 起動時に、OpenClaw はインストール済み QMD のヘルプテキストをマネージャーごとに一度確認します。バイナリが複数のコレクションフィルターのサポートを通知している場合、OpenClaw は同一ソースのすべてのコレクションを 1 つのコマンドで検索します。memory + sessions の混在検索でも、結果多様化処理に両方のソースからの入力が渡されます。
古い QMD ビルドは 1 つのコレクションフィルターのみ受け付けます。OpenClaw がそのようなビルドを検出した場合、互換性パスを維持し、各コレクションを個別に検索してから結果をマージし重複排除します。
インストール済みの契約を手動で確認するには、次を実行します。
モデルの上書き
QMD モデル環境変数はゲートウェイプロセスから変更されずに渡されるため、新しい OpenClaw 設定を追加せずに QMD をグローバルに調整できます。追加パスのインデックス化
検索可能にする追加ディレクトリを QMD に指定します。qmd/<collection>/<relative-path> として表示されます。memory_get はこのプレフィックスを理解し、正しいコレクションルートから読み取ります。
セッショントランスクリプトのインデックス化
以前の会話を思い出せるようにするには、セッションのインデックス化を有効にします。QMD には、一般的なmemorySearch セッションソースと QMD トランスクリプトエクスポーターの両方が必要です。
~/.openclaw/agents/<id>/qmd/sessions/ の下の専用 QMD コレクションにエクスポートされます。memorySearch.experimental.sessionMemory だけを設定しても、トランスクリプトは QMD にエクスポートされません。
セッションヒットは引き続き tools.sessions.visibility によってフィルタリングされます。デフォルトの tree 可視性は、同じエージェントの無関係なセッションを公開しません。ゲートウェイからディスパッチされたセッションを別の DM セッションから思い出せるようにする必要がある場合は、意図的に tools.sessions.visibility: "agent" を設定します。
検索スコープ
デフォルトでは、QMD 検索結果は直接セッションでのみ表示されます(グループまたはチャンネルチャットでは表示されません)。これを変更するにはmemory.qmd.scope を設定します。
引用
memory.citations が auto または on の場合、検索スニペットには Source: <path>#L<line>(または #L<start>-L<end>)フッターが追加されます。auto モードでは、フッターは直接チャットセッションの場合にのみ追加されます。エージェント内部にはパスを渡したままフッターを省略するには、memory.citations = "off" を設定します。
使うべき場合
次が必要な場合は QMD を選択します。- より高品質な結果のためのリランキング。
- ワークスペース外のプロジェクトドキュメントやメモの検索。
- 過去のセッション会話の想起。
- API キー不要の完全ローカル検索。
トラブルシューティング
QMD が見つかりませんか? バイナリがゲートウェイのPATH 上にあることを確認してください。OpenClaw をサービスとして実行している場合は、シンボリックリンクを作成します: sudo ln -s ~/.bun/bin/qmd /usr/local/bin/qmd。
シェルでは qmd --version が動作するのに OpenClaw がまだ spawn qmd ENOENT を報告する場合、ゲートウェイプロセスの PATH が対話型シェルと異なる可能性があります。バイナリを明示的に固定します。
command -v qmd を使用し、その後 openclaw memory status --deep で再確認します。
最初の検索が非常に遅いですか? QMD は初回使用時に GGUF モデルをダウンロードします。OpenClaw が使うものと同じ XDG ディレクトリを使って、qmd query "test" で事前にウォームアップしてください。
検索中に多数の QMD サブプロセスが発生しますか? 可能であれば QMD を更新してください。OpenClaw は、インストール済み QMD が複数の -c フィルターのサポートを通知している場合にのみ、同一ソースの複数コレクション検索に 1 つのプロセスを使います。それ以外の場合は、正確性のために古いコレクション単位のフォールバックを維持します。
BM25 のみの QMD がまだ llama.cpp をビルドしようとしていますか? memory.qmd.searchMode = "search" を設定します。OpenClaw はそのモードを語彙検索のみとして扱い、QMD ベクトルステータスプローブと埋め込みメンテナンスをスキップし、セマンティック準備状況チェックは vsearch または query セットアップに任せます。
検索がタイムアウトしますか? memory.qmd.limits.timeoutMs を増やしてください(デフォルト: 4000ms)。遅いハードウェアでは、たとえば 120000 のように高く設定します。
グループまたはチャンネルチャットで結果が空ですか? これは、直接セッションのみを許可するデフォルトの memory.qmd.scope では想定どおりです。そこで QMD 結果を使いたい場合は、group または channel チャットタイプの allow ルールを追加してください。
ルートメモリ検索が突然広くなりすぎましたか? ゲートウェイを再起動するか、次回の起動時照合を待ってください。OpenClaw は同名の競合を検出すると、古くなった管理対象コレクションを正規の MEMORY.md と memory/ パターンに再作成します。
ワークスペースから見える一時リポジトリが ENAMETOOLONG や壊れたインデックス化を引き起こしていますか? QMD の走査は、OpenClaw の組み込みシンボリックリンクルールではなく、基盤となる QMD スキャナーに従います。QMD が循環安全な走査または明示的な除外制御を公開するまでは、一時的なモノレポチェックアウトを .tmp/ のような隠しディレクトリ、またはインデックス対象の QMD ルート外に置いてください。
設定
完全な設定サーフェス(memory.qmd.*)、検索モード、更新間隔、スコープルール、その他すべてのノブについては、メモリ設定リファレンス を参照してください。