検索/グラフ検索とベクトル検索で、AIエージェントの長期メモリを作る

グラフ検索とベクトル検索で、AIエージェントの長期メモリを作る

AIエージェントに会話をまたいで知識を覚えさせる仕組みを作る時に使う。ファイル・URL・テキストを検索できるグラフとベクトルのデータに変え、ユーザーごとにデータを分けて認証で守り、中心のコードを変えずに保存先やモデルのプロバイダーを入れ替えられるようにする。

このAIルールを使うには
## メモリを、データの取り込みから検索までの段階に分ける 永続的な知識に対して、1つの明確なライフサイクルを定義する。生のファイル、URL、またはテキストをデータセットへ取り込み、素材をエンティティ、関係、チャンク、要約へ変換し、選択した戦略で関連知識を取得し、保存済みグラフを追加の文脈や規則で強化する。 各段階を個別に呼び出せるようにしつつ、組み合わせた時の一貫性を保つ。取り込みでは、変換前に永続的なデータセットレコードとデータレコードを作成しなければならない。変換では内容を分類してチャンク化し、構造化された関係を抽出し、必要に応じて要約し、互換性のあるグラフ表現とベクトル表現を書き込む。取得では、結果を返す前に認可を適用しなければならない。強化では、来歴とバージョンメタデータを維持しなければならない。 ## 中心のコードがプロバイダーを直接呼ばないよう、階層に分ける バージョン付きのAPIまたはSDKの入口、ライフサイクル関数、パイプラインの統括、タスク実行、ドメインモジュール、基盤アダプター、外部サービスを分離する。ドメインの処理がプロバイダー固有のクライアントを直接取り込まないよう、依存関係はこれらの階層を下向きにたどるようにする。 グラフを構成する最小概念を明示する。ノードまたはデータポイントは安定した識別子、型、説明、バージョン、メタデータを持ち、エッジは接続元、接続先、関係の種類を持つ。三つ組は主語・述語・目的語からなる事実を表す。知識グラフのコンテナを使い、整合したノードとエッジの集合を抽出、保存、取得の間で受け渡す。 ## 小さなタスクでパイプラインを組み、検索のやり方をはっきり選ぶ 処理段階を組み合わせ可能なタスクとして表し、データ依存関係が許す場合は順次または並列で実行できるようにする。パイプラインでは、分類、チャンク抽出、構造化グラフの抽出、要約、保存を別々の単位として見えるようにし、失敗と再試行を局所化する。 検索は明示的な戦略の種類を通じて振り分ける。生成補完を伴うグラフ探索、要約で支えられたグラフ文脈、三つ組の取得、ベクトル検索と語彙検索によるチャンク取得、文書要約、時間を考慮した取得、自然言語から構造化クエリへの変換、グラフへの直接クエリ、根拠がある場合の戦略自動選択を扱えるようにする。すべての戦略で、認可フィルターと安定した結果契約を共有しなければならない。 ## 保存先とモデルを、インターフェース越しに入れ替えられるようにする グラフ、ベクトル、リレーショナルストレージにそれぞれ別のインターフェースを定義する。ファクトリーを通じて具体的なエンジンを選択し、ドメインタスクを変更せずにローカル既定値、リモートサービス、本番データベースを切り替えられるようにする。プロバイダー固有の接続処理、機能確認、未対応操作のエラーはアダプター内に閉じ込める。 言語モデル、埋め込みエンジン、構造化応答の枠組み、ファイルローダー、オブジェクトストレージにも同じ境界を使う。構成が実装を選び、ドメインコードはインターフェースを利用する。バックエンドにグラフへの直接クエリや特定の取得方式などの機能がない場合、異なる意味へ黙って劣化させず、その操作を明示的に拒否する。 ## ユーザーごとにデータを分ける時は、認証を必ずセットにする アクセスを「ユーザー → データセット → データ」としてモデル化し、グラフまたはベクトルから取得する前に、読み取り、書き込み、消去、共有の権限を適用する。対応するバックエンドでは、ユーザーとデータセットごとにストレージを分離し、フィルターの誤りで別テナントの知識が露出しないようにする。 バックエンドのアクセス制御とAPI認証を1つのセキュリティ方針として扱う。テナント分離を有効にする場合は認証を必須とし、認証を無効にする明示設定が有効なアクセス制御を上書きしてはならない。単一ユーザーでストレージを共有する構成は、意図して選ぶ別モードとする。アクセスできないレコードの存在を明かさないよう空の結果を返しつつ、認可された運用担当者に必要な内部診断情報は残す。 ## 言語モデルと埋め込みを対で設定し、本番の設定をまとめて見直す 言語モデルと埋め込みプロバイダーを対として構成する。片方だけを設定すると、もう片方の暗黙の既定値によって、認証情報の不足、互換性のない分かち書き方式、意図しない外部呼び出しが生じる可能性がある。起動時に両方のプロバイダー、エンドポイント、モデル、構造化応答モード、レート制限を検証する。 秘密情報は環境に基づく構成へ保持し、任意の連携は追加インストール項目または機能グループとして提供する。ローカルの既定構成ではファイルベースのリレーショナル、ベクトル、グラフストアを利用できるが、本番配置では保存先、リモート要求の許可、ローカルファイルへのアクセス、未加工クエリの許可、認証、テナント分離、永続的なオブジェクトストレージを一体として見直さなければならない。 ## 新しい保存先や検索のやり方は、決まった登録場所から足す 機能は最も狭く安定した拡張地点へ追加する。タスクを実装してパイプラインへ登録する、新しいバックエンド向けにストレージインターフェースを実装する、モデルゲートウェイの背後へプロバイダー構成を追加する、新形式に対応する文書ローダーを拡張する、取得戦略を登録する、または共通データポイント契約を拡張するグラフモデルを定義する。 オントロジーに基づく抽出では、リゾルバー、オントロジーの参照元、照合戦略を構成可能に保つ。保存前に、抽出したエンティティ型と関係が選択した意味体系へ適合することを検証する。新しい拡張では、必要な依存関係、対応機能、構成項目、失敗時の挙動を明示しなければならない。 ## コンポーネントごとのテストと、取り込みから検索まで通すテストを書く テストを単体動作、連携境界、コマンドラインまたはAPIの入口、タスク固有の動作に分けて整理する。すべての機能に対象を絞ったテストを用意し、ストレージアダプター、モデルゲートウェイ、その他の連携には現実的な構成と失敗応答を使った境界テストを用意する。 取り込みから変換、取得までを通す全ライフサイクルの連携経路を少なくとも1つ維持し、非同期実行と認可フィルターも含める。公開された各非同期関数は、直接`await`するかイベントループランナーを使ってテストする。カバレッジ、lint、整形、型検査はプロジェクトの方針に従って実行し、テスト構造をソースの階層構造と揃える。 ## まず設定を確かめ、空の検索結果と失敗を見分ける パイプラインの処理を変更する前に、構成上の失敗を診断する。対になったモデルと埋め込みの設定、構造化応答モード、分かち書き方式の互換性、データベースのURLと認証情報、サービスの稼働状況、レート制限の設定を確認する。プロバイダーの代替選択を見えるようにし、不完全な構成が意図しないリモートサービスを黙って選ばないようにする。 認可判定後の空結果と、通信または解析の失敗を区別する。権限で絞り込んだ検索はレコードの存在を漏らしてはならない。接続失敗ではアダプターと満たせなかった前提条件を示し、レート制限の失敗では再試行の時期を示し、構造化応答の失敗では設定された抽出モードを示す。構造化ログと任意のデバッグ計測は利用できるが、認証情報や取得した機密内容を記録してはならない。