このページでは、embedding() 関数がテーブルに格納されているデータと pgvector クエリ機能とでどのように機能するかを示すワークフローの例を示します。この例では、プレーンテキストの入力を使用して、テキストの意味の解析を大規模言語モデル(LLM)に依存するデータベースから結果を取得します。
エンベディング ワークフローのシナリオの例
Cloud SQL for PostgreSQL で次の条件を満たすデータベースを実行します。
データベースに
itemsというテーブルが存在する。このテーブルの各行には、販売する商品が記録されています。itemsテーブルにcomplaintsという列がある。この列には、各商品について記録された購入者からの苦情がプレーンテキストで保存されます。データベースが Vertex AI Model Garden と統合され、
textembedding-geckoLLM にアクセスできる。
このデータベースには商品に関する苦情が記録されていますが、苦情はプレーンテキストとして保存されているため、クエリで照会するのは容易ではありません。たとえば、色違いの商品を受け取った顧客からの苦情が最も多い商品を確認したい場合は、テーブルに対して通常の 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 ベースのクエリを実行する前に、既存のデータに基づいてエンベディングを保存し、インデックスに登録するためのテーブルを用意する必要があります。
エンベディングを格納する列を作成する
テーブルに列を追加して、エンベディングを格納します。
sql
ALTER TABLE items ADD COLUMN complaint_embedding vector(768);
この例では、textembedding-gecko LLM がサポートするディメンション数である 768 を引数として指定しています。詳細については、エンベディングを生成するをご覧ください。
この例では、列の値で pgvector 関数と演算子を簡単に使用できるように、列に vector データ型を適用します。
新しい列にデータを入力する
embedding() 関数を使用して、complaints 列の各行のテキスト値に基づいて、この新しい列にエンベディングを入力します。この例では、Cloud SQL は ID が textembedding-gecko、バージョンが 004 の LLM を使用してエンベディングを生成します。
UPDATE items SET complaint_embedding = embedding('text-embedding-005', complaints);
embedding() の real[] 戻り値を暗黙的に vector 値にキャストし、エンベディングを格納する列を作成するで作成した vector 列に値を格納します。
インデックスの作成
パフォーマンスを向上させるため、items テーブルにインデックスを追加します。
CREATE INDEX complaint_embed_idx ON items
USING hnsw (complaint_embedding vector_cosine_ops);
このタイプのインデックスを作成する方法の詳細については、最近傍インデックスを作成するをご覧ください。また、パラメータを設定してインデックスを調整する方法の詳細については、pgvector を使用してエンベディングをクエリしてインデックスに登録するをご覧ください。
テキストを渡して LLM を利用したクエリを実行する
items テーブルでセマンティック最近傍クエリを実行できるようになりました。次のクエリでは、pgvector が提供する <-> 演算子を使用して、次のアクションを実行します。
It was the wrong colorのテキストとの意味的な近さでテーブルの行を並べ替えます。- 上位 10 件の苦情を取得します。
このクエリでは、最初に並べ替えられた行の id 値と name 値が表示されます。
SELECT id, name FROM items
ORDER BY complaint_embedding
<-> embedding('text-embedding-005', 'It was the wrong color')::vector LIMIT 10;