エンベディング ワークフローの例

このページでは、embedding() 関数がテーブルに保存されたデータと pgvector 特徴と連携する方法を示したワークフローの例を示します。この例では、プレーンテキストの入力を使用して、テキストの意味の解析を大規模言語モデル(LLM)に依存するデータベースから結果を取得します。

シナリオの例

AlloyDB で次の条件を満たすデータベースを実行します。

  • データベースに items というテーブルが存在する。このテーブルの各行には、販売する商品が記録されています。

  • items テーブルに complaints という列がある。この TEXT 列には、各商品について記録された購入者からの苦情が保存されます。

  • データベースが Vertex AI Model Garden と統合され、text-embedding 英語モデルにアクセスできる。

このデータベースには商品に関する苦情が記録されていますが、苦情はプレーンテキストとして保存されているため、クエリで照会するのは容易ではありません。たとえば、色違いの商品を受け取った顧客からの苦情が最も多い商品を確認したい場合は、テーブルに対して通常の SQL クエリを実行し、さまざまなキーワードで照合を行います。ただし、この方法では、指定したキーワードが含まれている行のみが一致します。

たとえば、SELECT * FROM item WHERE complaints LIKE "%wrong color%" などの基本的な SQL クエリでは、complaints フィールドに The picture shows a blue one, but the one I received was red のみが含まれる行は返されません。

このギャップを埋めるのに、LLM ベースのエンベディングを使用する SQL クエリが役立ちます。エンベディングを適用すると、この例のテーブルで、苦情が特定のテキスト プロンプト(「色が間違っていた」など)と意味的に類似している項目をクエリできます。

以下では、前述の設定例でこの方法を実現する手順について説明します。

始める前に

次の要件を満たしていることを確認してください。

必要なデータベース拡張機能

  • AlloyDB データベースに次の拡張機能がインストールされていることを確認します。

    • google_ml_integration 個の拡張機能

    • vector 拡張機能、バージョン 0.5.0.google-1 以降

拡張機能のインストールと管理の詳細については、データベース拡張機能を構成するをご覧ください。

  • google_ml_integration.enable_model_support データベース フラグを off に設定します。

モデルへのアクセスを設定する

AlloyDB データベースからエンベディングを生成するには、テキスト エンベディング モデルを使用するように AlloyDB を構成する必要があります。

クラウドベースの text-embedding-005 モデルを使用するには、データベースを Vertex AI と統合する必要があります。

テーブルを準備する

items テーブルのコンテンツに対して LLM ベースのクエリを実行する前に、既存のデータに基づいてエンベディングを保存し、インデックスに登録するためのテーブルを用意する必要があります。

エンベディングを格納する列を作成する

エンベディングを格納する列をテーブルに追加します。

ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

この例では、text-embedding-005 英語モデルでサポートされているディメンション数である 768 を引数として指定しています。詳細については、エンベディングを生成するをご覧ください。

この例では、値で pgvector 関数と演算子を簡単に使用できるように、列に vector データ型を適用します。

新しい列にデータを入力する

CSV 形式のエンベディングがすでにある場合は、ベクトル エンベディングを保存するの手順に沿ってエンベディングを保存します。

必要に応じて、complaints 列にテキストが保存されている場合は、embedding() 関数を使用してこの新しい列にエンベディングを入力します。この例の設定では、AlloyDB は text-embedding モデル(バージョン 005)を使用してエンベディングを生成します。

UPDATE items SET complaint_embedding = embedding('text-embedding-005', complaints);

この例では、embedding()real[] 戻り値を暗黙的に vector 値にキャストし、先ほど作成した vector 列に値を格納します。

インデックスを作成する

パフォーマンスを向上させるには、スカラー量子化手法を使用するインデックスを items に追加します。

CREATE INDEX complaint_embed_idx ON items
  USING scann (complaint_embedding l2)
  WITH (num_leaves=20);

ScaNN インデックスの作成の詳細については、インデックスとクエリベクトルを作成するをご覧ください。

テキストを渡して LLM を利用したクエリを実行する

items テーブルでセマンティック最近傍クエリを実行できるようになりました。次のクエリでは、pgvector で提供される <-> 演算子を使用して、テキスト It was the wrong color との意味的な近さに基づいてテーブルの行を並べ替え、上位 10 件の苦情を返します。このクエリでは、最初に並べ替えられた行の id 値と name 値が表示されます。

SELECT id, name FROM items
  ORDER BY complaint_embedding::vector
  <-> embedding('text-embedding-005', 'It was the wrong color') LIMIT 10;

次のステップ