ベクトル検索

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 TableSQL Workbench の中では利用できず、 DynamoDB Local はこの機能にまったく対応していません。

更新日