エンベディング ワークフローの例を理解する

このページでは、embedding() 関数がテーブルに格納されているデータと pgvector クエリ機能の両方でどのように機能するかを示すワークフローの例を示します。この例では、プレーンテキストの入力を使用して、テキストの意味の解析を大規模言語モデル(LLM)に依存するデータベースから結果を取得します。

エンベディング ワークフローのシナリオの例

Cloud SQL for PostgreSQL で次の条件を満たすデータベースを実行します。

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

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

  • データベースが Vertex AI Model Garden と統合され、textembedding-gecko LLM にアクセスできる。

このデータベースには商品に関する苦情が記録されていますが、苦情はプレーンテキストとして保存されているため、クエリで照会するのは容易ではありません。たとえば、色違いの商品を受け取った顧客からの苦情が最も多い商品を確認したい場合は、テーブルに対して通常の 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 クエリが役立ちます。エンベディングを適用すると、この例のテーブルで、苦情が特定のテキスト プロンプト(「色が間違っていた」など)と意味的に類似している項目をクエリできます。

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

テーブルを準備する

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

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

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

ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

この例では、textembedding-gecko LLM がサポートするディメンション数である 768 を引数として指定しています。詳細については、エンベディングを生成するをご覧ください。

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

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

embedding() 関数を使用して、complaints 列の各行のテキスト値に基づいて、この新しい列にエンベディングを入力します。この例では、Cloud SQL は ID が textembedding-gecko、バージョンが 001 の LLM を使用してエンベディングを生成します。

UPDATE items SET complaint_embedding = embedding('textembedding-gecko@001', complaints);

さらに、embedding()real[] 戻り値を暗黙的に vector 値にキャストし、エンベディングを格納する列を作成するで作成した vector 列に値を格納します。

インデックスを作成する

パフォーマンスを向上させるため、items テーブルにインデックスを追加します。このインデックスでは、最適化された最近傍探索インデックスを作成するで説明されているスカラー量子化の手法を使用します。

CREATE INDEX complaint_embed_idx ON items
  USING ivf (complaint_embedding vector_l2_ops)
  WITH (lists = 20, quantizer = 'SQ8');

近似最近傍インデックスの作成の詳細については、インデックスの作成をご覧ください。

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

items テーブルでセマンティック最近傍クエリを実行できるようになりました。次のクエリでは、pgvector が提供する <-> 演算子を使用して、次のアクションを実行します。

  • It was the wrong color のテキストとの意味的な近さでテーブルの行を並べ替えます。
  • 上位 10 件の苦情を取得します。

このクエリでは、最初に並べ替えられた行の id 値と name 値が表示されます。

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

次のステップ