ベクトル検索

DynamoDB は値の完全一致ではなく意味でテーブルを検索できます。モデルがテキストから生成した数値のリスト(埋め込み)を各アイテムに保存し、その属性にベクトルインデックスを作成すると、クエリに最も近いアイテムを取得できます。

DynoTable はこの一連の流れをひとつの場所で扱います — インデックスを作成し、どのモデルとどの属性から埋め込みを組み立てるかを指定すれば、あとは保存のたびに埋め込みがテキストと同期し続けます。検索は、文章を入力する、ベクトルを貼り付ける、いま見ている行で類似を検索を選ぶ、のいずれでも行えます。

ベクトル検索には実際の DynamoDB テーブルが必要です — ローカルの DynamoDB プロファイルでは利用できません。

DynoTable のベクトル検索:検索バーに入力した自然文、Top K、そしてスコア列付きのランキング結果。行を右クリックすると類似を検索が表示され、その行自身の埋め込みで再検索できます。
DynoTable のベクトル検索:検索バーに入力した自然文、Top K、そしてスコア列付きのランキング結果。行を右クリックすると類似を検索が表示され、その行自身の埋め込みで再検索できます。

ベクトルインデックスを作成する

ベクトルインデックスは や と並ぶ存在です。テーブルの設定ボタンを開き、テーブルのインデックスを選び、インデックスを作成を押します。最初の項目がインデックスの種類です — グローバルセカンダリインデックスではなくベクトルインデックスを選ぶと、下の項目がその場で切り替わります。

  • インデックス名 — GSI と LSI を含め、そのテーブルのすべてのインデックスの中で一意である必要があります。
  • ベクトル属性 — 埋め込みを保持する属性。数値のリストである必要があり、 DynoTable はそれになり得ると把握している属性を候補として表示します。
  • 次元数 — ひとつの埋め込みが持つ数値の個数で、1 〜 4,096。同梱のどの埋め込みモデルでも生成できる幅である 1024 があらかじめ入っています。
  • 距離関数 — コサイン類似度(2 つのベクトルのなす角。テキストでは通常こちら)、ユークリッド距離(直線距離)、内積(正規化されたベクトルを出力するモデル向け)。
  • 射影 — 結果が持つ属性。GSI とまったく同じで、すべての属性、キーのみ、または含めると列挙した属性です。
  • 検索スキーマ (任意) — 検索を絞り込める属性。インデックスにひとつだけ指定できる必須フィルターにしない限り、各属性は任意フィルターです。
  • 埋め込みソース (任意) — 次のセクションを参照してください。

ベクトルインデックスを作成で送信されます。

ひとつのテーブルが持てるベクトルインデックスは最大 5 個で、のテーブルに限られます。のテーブルではベクトルインデックスの選択肢は表示されますが理由付きで拒否されます — 先に設定セクションからテーブルをオンデマンドへ切り替えてください。

必須フィルターは取り消せない約束

検索スキーマの属性を必須フィルターにすると、インデックスが分割されます。以後そのインデックスへのすべての検索でその属性に値を指定しなければならず、インデックス全体を横断して検索する手段はなくなります。すべての検索が自然にスコープを持つ場合(テナントごと、顧客ごと、言語ごと)には適した選択であり、そうでなければ適していません。あとから取り消せないため、選ぶその場でフォームがそのことを説明します。

ベクトルインデックスを選んだ DynoTable のインデックス作成フォーム:ベクトル属性、次元数、距離関数、検索スキーマ、そしてモデルとソース属性を指定する埋め込みソース。
ベクトルインデックスを選んだ DynoTable のインデックス作成フォーム:ベクトル属性、次元数、距離関数、検索スキーマ、そしてモデルとソース属性を指定する埋め込みソース。

埋め込みの作り方を指定する

ベクトルを保持するインデックスと、それを生成する規則は、ひとつの決定です。そのため両者は一緒に宣言します。作成フォームの埋め込みソースセクションが尋ねるのは 2 つです。

  • 埋め込みモデル — このインデックスの次元数をちょうど出力する Bedrock の埋め込みモデル。入力した幅に合うものがない場合、DynoTable はあとで拒否されるモデルを提示するのではなく、その旨を伝えます。未設定のままにもでき、その場合はベクトルを自分で書き込みます。
  • ソース属性 — どの属性からテキストを組み立てるか。モデルを選ぶと、 DynoTable がそのテーブルについて把握している内容から妥当な組み合わせを提案します。属性はチップとして追加・削除できます。

詳細設定には同じものが生の形で入っています — ソーステキスト、つまり {attributeName} の参照を含む普通のテキストです。サンプルアイテムに対してモデルへ実際に送られる内容のライブプレビューと、モデルの入力上限に対する文字数が併せて表示されます。埋め込みを属性の単純な連結以上のものにしたいとき(たとえば {title}: {description})に使ってください。チップとソーステキストはひとつの設定を 2 通りに見せたものなので、どちらを編集しても他方に反映されます。属性の羅列にとどまらないテンプレートでは詳細設定が開いたままになります。

ここを入力している間に Bedrock へ送られるものは何もありません。最初の呼び出しはアイテムを最初に保存したときに発生します。

インデックスの行

すべてのベクトルインデックスは、キー・次元数・状態とともにテーブルのインデックスに表示されます。その下の 1 行が、何がインデックスを満たすのかを示します — title, body を Titan Text Embeddings V2 で埋め込みます のように。モデルがまだ紐付いていない場合は埋め込みを設定が表示されます。インデックスの構築中は、行が自身の状態を示します — 作成中、バックフィル中、更新中、削除中。

編集を押すと、その行がそのままフォームになります。モデルピッカーも、ソース属性も、詳細設定のテンプレートも同じで、保存とキャンセルが付きます。ペインの上にダイアログが開かないので、編集しているインデックスが画面から消えることはありません。

削除はインデックスを削除します。実行前に確認があり、そのインデックスに保存された埋め込みモデルとソーステンプレートも一緒に失われること、そのインデックスへの検索はすぐに失敗するようになること、インデックスの形を変えるには作り直すしかないことがはっきり書かれています。テーブル自体のデータは変更されません — 埋め込み属性はすべてのアイテムに残ります。

DynoTable の「テーブルのインデックス」ペインに表示されたベクトルインデックスの行:インデックス名、埋め込みを保持する属性とその次元数、距離関数、そして埋め込む属性と使用するモデルを示す行。
DynoTable の「テーブルのインデックス」ペインに表示されたベクトルインデックスの行:インデックス名、埋め込みを保持する属性とその次元数、距離関数、そして埋め込む属性と使用するモデルを示す行。

検索する

ベクトルインデックスは、テーブルタブのインデックスピッカーで PRIMARY や GSI と並んでクエリパターンのひとつになります。選ぶとキーのピルがベクトルバーに置き換わります。検索を押すまでは何も実行されません — ベクトル検索は 1 回のリクエストで、のようにテーブルをページングしていくことはありません。

意味で検索。 文章を入力すると — 「破損して届いた注文」 のように — DynoTable がインデックスに紐付いたモデルでそれをベクトルに変換し、最も近いアイテムを DynamoDB に問い合わせます。

生のベクトルを貼り付け。 検索オプション(埋め込みモデルが入っているのと同じメニュー)を開き、検索に使うものを生のベクトルを貼り付けに切り替えると、数値を直接渡せます。埋め込みを DynoTable 以外の場所で生成しているときはこちらを使ってください。AI の設定はまったく不要です。

類似を検索。 任意の行を右クリックして類似を検索を選ぶと、その行自身の埋め込みで検索します。クエリを書かずに「これに似たものをもっと」と尋ねる最短の方法です。画面上の行が埋め込みを持っていない場合は — ベクトル検索の結果にはベクトル属性そのものが含まれません — DynoTable が先にアイテムを読み直します。行自身のベクトルはそれ自身との距離がゼロなので、起点にした行はたいてい最上位の一致として返ってきます。必須フィルターはその行から自動で固定され、任意フィルターは入力を委ねられます。

Top K は最も近い一致をいくつ返すかで、既定は 10、指定できるのは 1 〜 100 です。それより先へのページングはありません — 代わりに Top K を上げてください。

フィルターはインデックスの検索スキーマから作られます。スキーマの各属性に値の候補が出る入力欄が用意され、必須フィルターには印が付いていて、入力するまで検索は実行されません。

結果は通常のグリッドに、先頭のスコア列がひとつ増えた形で表示されます。列のツールチップが示すインデックスの距離関数と併せて読んでください。

距離関数一致が近いスコア
コサイン類似度小さいほう
ユークリッド距離小さいほう
内積大きいほう

コサインとユークリッドは距離なので、最も小さい数値が最も近い一致です。内積は類似度なので、最も大きい数値がそれにあたります。行は常に一致の良い順に並んで届くため、実際に計算し直す必要はほとんどありません — ただし数値そのものは、この向きを踏まえてはじめて意味を持ちます。

アイテムと埋め込み

保存すると埋め込みが追随します。 ソース属性が変わったアイテムを保存すると、 DynoTable は新しいテキストをモデルへ送り、同じ保存の中で新しいベクトルを書き込みます。保存 1 回、書き込み 1 回 — 検索はアイテムがいま述べている内容に一致します。

問題を黙って素通りすることはありません。紐付いたモデルの次元数が違う場合や、埋め込みの呼び出しが失敗した場合、保存は埋め込みを更新できませんでしたダイアログで止まり、理由が示されます。テキストの変更だけを反映させたいときは埋め込みを更新せずに保存を選べます。埋め込みの生成を単に妨げているだけのもの — AI がオフ、プランがない、プロバイダーが未設定 — は保存を止めません。エディターのフッターが埋め込みは更新されませんと表示し、対処方法を示します。いずれの場合も、埋め込みが使える状態でアイテムを保存し直すまで、ベクトルは古いテキストを表し続けます。

生の数値は表に出てきません。 1,024 個の数値からなる埋め込みは、JSON にすると数万文字になります。アイテムエディターでは、インデックス対象の埋め込みは短いプレースホルダーに置き換えられるので、アイテムは読みやすいまま、エディターは軽いままです。プレースホルダー(またはガター内のベクトルのマーク)をクリックすると埋め込みのオプションが開きます — 対象となるターゲットインデックス、送信されるソーステキストとその文字数、いますぐベクトルを生成する生成ボタン、そして本当に数値を読みたいときの値を表示です。値を表示することは編集ではなく、値を非表示にするとプレースホルダーに戻ります。

ドキュメントビューはアイテムをフォームとして描画します — 属性ごとに値に合ったコントロールがひとつずつ並ぶので、埋め込みの元になる長い文章を扱うには JSON の羅列よりはるかに適しています。そこでは埋め込み自体は読み取り専用です。ビューはエディター上部のボタンで切り替えます。

埋め込みのオプションを開いた DynoTable のアイテム:インデックスが埋め込みを組み立てるソーステキスト、紐付いたモデル、そして生成と値を表示のアクション。
埋め込みのオプションを開いた DynoTable のアイテム:インデックスが埋め込みを組み立てるソーステキスト、紐付いたモデル、そして生成と値を表示のアクション。

インポートする

インポートは、行を書き込みながら埋め込みを生成できます。テーブルにモデルとソース属性が紐付いたベクトルインデックスがある場合、インポートダイアログにインポート時に埋め込みを生成が表示され、どのインデックスとモデルを使うのか、1 行あたりのテキスト上限がいくつなのかが示されます。

実行ごとのオプトインで、インポートを止めることはありません。テキストが長すぎる行やモデルが拒否した行は、ベクトルなしで書き込まれてカウントされ、サマリーが埋め込みなしで届いた行数とその理由を伝えます。それらの行はテーブルに存在しますが、埋め込みを持つまではベクトル検索では見つかりません — アイテムエディターから保存すれば解決します。

すでに埋め込みを含むファイル(たとえば DynamoDB-JSON のエクスポート)では、その値が保たれます。ファイルが与えた内容が上書きされることはありません。

アシスタントに尋ねる

AI アシスタントは、ベクトルインデックスを意味で検索してくれます。「この記事に最も近い 5 件を探して」 や「この苦情に似ているサポートチケットはどれ?」 は検索バーと同じように動き、見つけたアイテムを挙げて答えます。

渡したベクトルや既存のアイテムによる検索は、AI が使えるプランであれば行えます。 Bedrock のトークンを消費するのは入力した言葉をベクトルに変換する部分なので、ほかの AI 機能と同じくアクティブなプランが必要です。

ベクトルインデックスを検索して最も近いアイテムを挙げ、自然文の質問に答える DynoTable の AI アシスタント。
ベクトルインデックスを検索して最も近いアイテムを挙げ、自然文の質問に答える DynoTable の AI アシスタント。

制限とコスト

ベクトル検索は DynamoDB が書き込み・検索・保存のバイト数で課金し、埋め込みの呼び出しは Bedrock がトークン単位で課金します。試すこと自体は安く済みますが、大きなテーブルにインデックスを付ける前に計測する価値があります。

DynamoDB ベクトル検索ガイドに実測値があります — レイテンシ、書き込みが検索可能になるまでの速さ、埋め込みをインデックスすることがアイテムの書き込みコストに与える影響、そして専用のベクトルストアのほうが適するのはどんなときか。

始める前に知っておきたいこと:

  • オンデマンドのテーブルのみ、4,096 次元まで、1 テーブルあたり 5 個までのベクトルインデックス。
  • インデックスは作成時点で固定されます — 次元数と検索スキーマは前もって計画してください。
  • インデックスの属性に値を持たないアイテムは、単にインデックスに入りません。 DynamoDB は書き込みを受け付けたうえでインデックスを黙ってスキップするため、編集中のアイテムがそうなる場合には DynoTable が警告します。
  • ベクトル検索は Smart Table や SQL Workbench の中では利用できず、 DynamoDB Local はこの機能にまったく対応していません。

更新日