このページでは、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;