Azure AI 拡張機能を使用して埋め込みを作成する
セマンティック検索を実行するには、クエリの埋め込みを検索された項目の埋め込みと比較する必要があります。 Azure Database for PostgreSQL - フレキシブル サーバーの azure_ai 拡張機能は、埋め込みベクターを生成するために Azure OpenAI と統合されます。
azure_aiと Azure OpenAI の概要
Azure AI 用の Azure Database for PostgreSQL 柔軟な拡張機能は、Azure OpenAI や Azure AI Search を含む Microsoft Foundry と統合するためのユーザー定義関数を提供します。
Azure OpenAI Embeddings API は、入力テキストの埋め込みベクターを生成します。 この API を使用して、検索するすべての項目の埋め込みを設定します。
azure_ai拡張機能のazure_openai スキーマを使用すると、項目の埋め込みを初期化するか、その場でクエリ埋め込みを作成するかに関係なく、SQL から API を簡単に呼び出して埋め込みを生成できます。 これらの埋め込みを使用して、ベクトルの類似性検索、つまりセマンティック検索を実行できます。
Azure OpenAI で azure_ai 拡張機能を使用する
PostgreSQL から Azure OpenAI Embeddings API を呼び出すには、 azure_ai 拡張機能を有効にして構成し、Azure OpenAI へのアクセスを許可し、Azure OpenAI モデルをデプロイする必要があります。 詳細については、 Azure Database for PostgreSQL フレキシブル サーバーの Azure OpenAI のドキュメントを参照してください。
環境の準備が整い、拡張機能が許可リストに表示されたら、次の SQL を実行します。
/* Enable the extension. */
CREATE EXTENSION azure_ai;
また、OpenAI サービス リソースの エンドポイントとアクセス キーを構成する必要もあります。
SELECT azure_ai.set_setting('azure_openai.endpoint', '{your-endpoint-url}');
SELECT azure_ai.set_setting('azure_openai.subscription_key', '{your-api-key}}');
azure_aiと Azure OpenAI が構成されたら、埋め込みのフェッチと格納は、SQL クエリで関数を呼び出す単純な問題です。 テーブルlistingsdescription列とlisting_vector列がある場合、次のクエリを使用して、すべての一覧の埋め込みを生成して格納できます。
{your-deployment-name}を、作成したモデルの Azure OpenAI Studio のデプロイ名に置き換えます。
UPDATE listings
SET listing_vector = azure_openai.create_embeddings('{your-deployment-name}', description, max_attempts => 5, retry_delay_ms => 500)
WHERE listing_vector IS NULL;
listing_vector ベクター列には、言語モデルで生成される次元と同じ数のディメンションが必要です。
ドキュメントの埋め込みを表示するには、次のクエリを実行します。
SELECT listing_vector FROM listings LIMIT 1;
結果は浮動小数点数のベクトルです。 最初に \x を実行して、出力を読みやすくすることができます。
クエリ埋め込みを動的に生成する
検索するドキュメントの埋め込みを作成したら、セマンティック検索クエリを実行できます。 そのためには、クエリ テキストの埋め込みも生成する必要があります。
azure_openai拡張機能のazure_ai スキーマを使用すると、SQL 内に埋め込みを生成できます。 たとえば、"ウォーク可能な近隣の場所を検索する" というクエリに最も意味的に似たテキストを持つ上位 3 つの一覧を見つけるには、次の SQL を実行します。
SELECT id, description FROM listings
ORDER BY listing_vector <=> azure_openai.create_embeddings('{your-deployment-name}', 'Find me places in a walkable neighborhood.')::vector
LIMIT 3;
<=>演算子は、セマンティック類似性メトリックである 2 つのベクトル間のコサイン距離を計算します。 ベクトルが近いほど、意味的に似ています。ベクトルが増えるほど、意味的に異なります。
::vector演算子は、生成された埋め込みを PostgreSQL ベクター配列に変換します。
このクエリは、一覧 ID と説明の中で、より異なるものからより類似するものへとランク付けされた上位3つを返します。