適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
azure_ai
拡張機能を使用すると、Azure AI サービスの機能を統合することにより、Azure Database for PostgreSQL フレキシブル サーバー データベース内で大規模言語モデル (LLM) を使用したり、生成 AI アプリケーションを構築したりすることができるようになります。 生成 AI は、自然言語入力に基づいて元のコンテンツを生成するように LLM がトレーニングされる人工知能の一種です。 azure_ai
拡張機能を使用すると、生成 AI の自然言語クエリ処理機能をデータベースから直接使用できます。
このチュートリアルでは、azure_ai
拡張機能を使用して Azure Database for PostgreSQL フレキシブル サーバー インスタンスに豊富な AI 機能を追加する方法について説明します。 Azure OpenAI と Azure AI Language サービスの両方を、拡張機能を使用してデータベースに統合する方法について説明します。
前提条件
Azure サブスクリプション。無料で作成できます。
目的の Azure サブスクリプション内の Azure OpenAI に付与されたアクセス権。 現時点では、このサービスへのアクセスは申請によって許可されます。 Azure OpenAI へのアクセスを申請するには、https://aka.ms/oai/access のフォームに入力してください。
text-embedding-ada-002
(バージョン 2) モデルがデプロイされた Azure OpenAI リソース。 このモデルは現在、特定のリージョンでのみ使用できます。 リソースがない場合は、Azure OpenAI リソース デプロイ ガイドに記載されているリソース作成プロセスを参照してください。Azure AI Language サービス。 リソースがない場合は、概要ドキュメントのクイックスタートに記載されている手順に従って、Azure portal で Language リソースを作成できます。 Free 価格レベル (
Free F0
) を使用してサービスを試用し、後から運用環境用の有料レベルにアップグレードすることができます。使用している Azure サブスクリプション内の Azure Database for PostgreSQL フレキシブル サーバー インスタンス。 リソースがない場合は、「Azure Database for PostgreSQL - フレキシブル サーバー インスタンスを作成する」を参照してください。
Azure Cloud Shell で psql
を使用してデータベースに接続する
Web ブラウザーで Azure Cloud Shell を開きます。 環境として Bash を選択し、ダイアログが表示されたら、Azure Database for PostgreSQL フレキシブル サーバー データベースに使用したサブスクリプションを選択して、[ストレージの作成] を選択します。
データベース接続の詳細を取得するには:
Azure portal 上で Azure Database for PostgreSQL フレキシブル サーバー リソースに移動してください。
左側のナビゲーション メニューで、[設定] の下の [接続] を選択し、[接続の詳細] ブロックをコピーします。
コピーした環境変数宣言行を、上の手順で開いた Azure Cloud Shell ターミナルに貼り付けます。その際、
{your-password}
トークンを、データベースの作成時に設定したパスワードに置き換えます。export PGHOST={your-server-name}.postgresql.database.azure.com export PGUSER={your-user-name} export PGPORT=5432 export PGDATABASE={your-database-name} export PGPASSWORD="{your-password}"
プロンプトで次のように入力して、psql コマンド ライン ユーティリティを使用してデータベースに接続します。
psql
azure_ai
拡張機能をインストールする
azure_ai
拡張機能を使用すると、Azure OpenAI と Azure Cognitive Services をデータベースに統合できます。 データベースで拡張機能を有効にするには、次の手順に従います。
azure_ai
拡張機能に含まれるオブジェクトを調べる
azure_ai
拡張機能に含まれるオブジェクトを確認すると、提供される機能について理解を深めることができます。 psql
コマンド プロンプトから \dx
メタ コマンド を使用すると、拡張機能に含まれるオブジェクトを一覧表示できます。
\dx+ azure_ai
このメタ コマンド出力は、azure_ai
拡張機能によって、3 つのスキーマ、複数のユーザー定義関数 (UDF)、および複数の複合型がデータベースに作成されることを示しています。 次の表に、拡張機能によって追加されたスキーマの一覧と、それぞれの説明を示します。
[スキーマ] | 説明 |
---|---|
azure_ai |
構成テーブルと、そのテーブルを操作するための UDF が存在するプリンシパル スキーマ。 |
azure_openai |
Azure OpenAI エンドポイントの呼び出しを有効にする UDF が含まれています。 |
azure_cognitive |
データベースと Azure Cognitive Services の統合に関連する UDF と複合型を提供します。 |
関数と型はすべて、いずれかのスキーマに関連付けられています。 azure_ai
スキーマで定義されている関数を確認するには、\df
メタ コマンドを使用して、関数を表示するスキーマを指定します。 \df
コマンドの前の \x auto
コマンドは、展開された表示のオンとオフを自動的に切り替えて、コマンドからの出力を Azure Cloud Shell で表示しやすくします。
\x auto
\df+ azure_ai.*
azure_ai.set_setting()
関数を使用すると、Azure AI サービスのエンドポイントと重要な値を設定できます。 この関数は、キーと、キーに割り当てる値を受け取ります。 azure_ai.get_setting()
関数を使用すると、set_setting()
関数で設定した値を取得できます。 この関数は、表示したい設定のキーを受け取ります。 どちらの方法でも、キーは次のいずれかである必要があります。
Key | 説明 |
---|---|
azure_openai.endpoint |
サポートされている OpenAI エンドポイント (https://example.openai.azure.com など)。 |
azure_openai.subscription_key |
OpenAI リソースのサブスクリプション キー。 |
azure_cognitive.endpoint |
サポートされている Cognitive Services エンドポイント (https://example.cognitiveservices.azure.com など)。 |
azure_cognitive.subscription_key |
Cognitive Services リソースのサブスクリプション キー。 |
重要
API キーを含む Azure AI サービスの接続情報はデータベースの構成テーブルに格納されるため、azure_ai
拡張機能では、azure_ai_settings_manager
というロールを定義して、この情報が確実に保護され、そのロールが割り当てられているユーザーのみがアクセスできるようにします。 このロールを使用すると、拡張機能に関連する設定の読み取りと書き込みを行えるようになります。 azure_ai.get_setting()
関数と azure_ai.set_setting()
関数を呼び出すことができるのは、スーパーユーザーと azure_ai_settings_manager
ロールのメンバーだけです。 Azure Database for PostgreSQL フレキシブル サーバーでは、すべての管理者ユーザーに azure_ai_settings_manager
ロールが割り当てられます。
Azure OpenAI を使用してベクトル埋め込みを生成する
azure_ai
拡張機能の azure_openai
スキーマを使用すると、Azure OpenAI を使用してテキスト値のベクトル埋め込みを作成できます。 このスキーマを使用すると、データベースから直接 Azure OpenAI で埋め込みを生成して、入力テキストのベクター表現を作成できます。作成したベクター表現は、ベクター類似性検索で使用して、機械学習モデルで使用できます。
埋め込みは、機械学習モデルを使用して、情報の関連性を評価する手法です。 この手法では、データ間の関係と類似性を効率的に識別して、アルゴリズムでパターンを識別し、正確な予測を行うことができます。
Azure OpenAI エンドポイントとキーを設定する
azure_openai
関数を使用する前に:
Azure OpenAI サービス エンドポイントとキーを使用して拡張機能を構成します。
Azure portal で Azure OpenAI リソースに移動し、左側のメニューの [リソース管理] の下にある [キーとエンドポイント] を選択します。
エンドポイントとアクセス キーをコピーします。
KEY1
またはKEY2
を使用できます。 常に 2 つのキーを用意しておくと、サービスを中断させることなく、キーのローテーションと再生成を安全に行うことができます。
下のコマンドの {endpoint}
トークンと {api-key}
トークンを、Azure portal から取得した値に置き換えて、psql
コマンド プロンプトからコマンドを実行して、構成テーブルに値を追加します。
SELECT azure_ai.set_setting('azure_openai.endpoint','{endpoint}');
SELECT azure_ai.set_setting('azure_openai.subscription_key', '{api-key}');
構成テーブルに表示されている設定を確認します。
SELECT azure_ai.get_setting('azure_openai.endpoint');
SELECT azure_ai.get_setting('azure_openai.subscription_key');
azure_ai
拡張機能は、Azure OpenAI アカウントに接続されており、ベクトル埋め込みを生成する準備が整っています。
データベースにサンプル データを設定する
このチュートリアルでは、BillSum データセットの小規模なサブセットを使用します。このデータセットは、米国議会およびカリフォルニア州の法案のリストを提供し、ベクトルを生成するためのサンプル テキスト データとして使用できます。 これらのデータを含む bill_sum_data.csv
ファイルは、Azure Samples GitHub リポジトリからダウンロードできます。
データベースでサンプル データをホストするため、bill_summaries
という名前のテーブルを作成します。
CREATE TABLE bill_summaries
(
id bigint PRIMARY KEY,
bill_id text,
bill_text text,
summary text,
title text,
text_len bigint,
sum_len bigint
);
psql
コマンド プロンプトから PostgreSQL COPY コマンドを使用し、CSV ファイルの最初の行をヘッダー行に指定して、CSV から bill_summaries
テーブルにサンプル データを読み込みます。
\COPY bill_summaries (id, bill_id, bill_text, summary, title, text_len, sum_len) FROM PROGRAM 'curl "https://raw.githubusercontent.com/Azure-Samples/Azure-OpenAI-Docs-Samples/main/Samples/Tutorials/Embeddings/data/bill_sum_data.csv"' WITH CSV HEADER ENCODING 'UTF8'
ベクトルのサポートを有効にする
azure_ai
拡張機能を使用すると、入力テキストの埋め込みを生成できます。 生成されたベクトルをデータベース内の他のデータと共に格納できるようにするには、データベースでベクトルのサポートを有効にする方法に関する記事のガイダンスに従って、pgvector
拡張機能をインストールする必要があります。
ベクトルのサポートをデータベースに追加したら、vector
データ型を使用して bill_summaries
テーブルに新しい列を追加し、テーブル内に埋め込みを格納します。 text-embedding-ada-002
モデルでは 1536 ディメンションのベクトルが生成されるため、ベクトル サイズとして 1536
を指定する必要があります。
ALTER TABLE bill_summaries
ADD COLUMN bill_vector vector(1536);
ベクトルを生成して格納する
bill_summaries
テーブルに埋め込みを格納する準備ができました。 azure_openai.create_embeddings()
関数を使用して、bill_text
フィールドのベクトルを作成し、それらのベクトルを bill_summaries
テーブル内に新しく作成した bill_vector
列に挿入します。
create_embeddings()
関数を使用する前に、次のコマンドを実行して検査し、必要な引数を確認します。
\df+ azure_openai.*
\df+ azure_openai.*
コマンドの出力の Argument data types
プロパティを指定すると、関数が想定する引数の一覧が表示されます。
引数 | 型 | Default | 説明 |
---|---|---|---|
deployment_name | text |
text-embeddings-ada-002 モデルを含む Azure OpenAI Studio でのデプロイの名前。 |
|
input | text |
埋め込みの作成に使用する入力テキスト。 | |
timeout_ms | integer |
3600000 | 操作が停止するまでのタイムアウト時間 (ミリ秒単位)。 |
throw_on_error | boolean |
true | エラーが発生したときに関数から例外がスローされ、ラップしていたトランザクションがロールバックされるかどうかを示すフラグ。 |
最初の引数は deployment_name
で、埋め込みモデルが Azure OpenAI アカウントにデプロイされたときに割り当てられます。 この値を取得するには、Azure portal で Azure OpenAI リソースに移動します。 そこから、左側のナビゲーション メニューの [リソース管理] で、[モデル デプロイ] 項目を選んで Azure OpenAI Studio を開きます。 Azure OpenAI Studio の [デプロイ] タブで、text-embedding-ada-002
モデル デプロイに関連付けられている [デプロイ名] の値をコピーしてください。
この情報を使用して、bill_summaries
テーブル内の各レコードを更新するクエリを実行し、azure_openai.create_embeddings()
関数を使用して、bill_text
フィールドの生成されたベクトル埋め込みを bill_vector
列に挿入します。 {your-deployment-name}
を、Azure OpenAI Studio の [デプロイ] タブからコピーした [デプロイ名] の値に置き換えて、次のコマンドを実行してください。
UPDATE bill_summaries b
SET bill_vector = azure_openai.create_embeddings('{your-deployment-name}', b.bill_text);
次のクエリを実行して、テーブル内の最初のレコードに対して生成された埋め込みを表示します。 出力を読み取りにくい場合は、\x
を最初に実行できます。
SELECT bill_vector FROM bill_summaries LIMIT 1;
各埋め込みは浮動小数点数のベクトルであり、ベクトル空間内の 2 つの埋め込み間の距離は、元の形式の 2 つの入力間のセマンティック類似性と相関します。
ベクトル類似性検索を実行する
ベクトルの類似性は、2 つの項目をベクトル (一連の数値) として表すことによってどのように類似しているかを測定するために使用されるメソッドです。 ベクトルは、LLM を使用して検索を実行するためによく使用されます。 ベクトルの類似性は通常、ユークリッド距離やコサイン類似度などの距離メトリックを使用して計算されます。 ユークリッド距離は、n 次元空間内の 2 つのベクトル間の直線距離を測定し、コサイン類似性は 2 つのベクトル間の角度のコサインを測定します。
コサイン距離と HNSW (Hierarchical Navigable Small World の略) を使用して bill_summaries
にインデックスを作成することにより、vector
フィールドを効率的に検索できます。 HNSW を使用すると、pgvector
で、近似ニアレストネイバー クエリにグラフ ベースの最新アルゴリズムを使用できます。
CREATE INDEX ON bill_summaries USING hnsw (bill_vector vector_cosine_ops);
これで、データベースに対してコサイン類似度検索クエリを実行する準備ができました。
次のクエリでは、入力質問に対して埋め込みが生成され、ベクトル配列 (::vector
) にキャストされます。これにより、bill_summaries
テーブルに格納されているベクトルとの比較が可能になります。
SELECT bill_id, title FROM bill_summaries
ORDER BY bill_vector <=> azure_openai.create_embeddings('embeddings', 'Show me bills relating to veterans entrepreneurship.')::vector
LIMIT 3;
このクエリでは、多次元空間内の 2 つのベクトル間の距離計算に使用される "コサイン距離" 演算子である<=>
ベクトル演算子が使用されます。
Azure Cognitive Services を統合する
azure_ai
拡張機能の azure_cognitive
スキーマに含まれる Azure AI サービス統合は、データベースから直接アクセスできる豊富な AI 言語機能のセットを提供します。 この機能には、感情分析、言語検出、キー フレーズ抽出、エンティティ認識、テキスト要約が含まれます。 これらの機能は、Azure AI Language サービスを通じて利用できます。
拡張機能からアクセスできる完全な Azure AI 機能を確認するには、「Azure Database for PostgreSQL - フレキシブル サーバーと Azure Cognitive Services を統合する」を参照してください。
Azure AI Language サービス エンドポイントとキーを設定する
azure_openai
関数と同様に、azure_ai
拡張機能を使用して Azure AI サービスに対する呼び出しを正常に行うには、Azure AI Language サービスのエンドポイントとキーを指定する必要があります。 Azure portal で Language サービスのリソースに移動し、左側のメニューの [リソース管理] の下にある [キーとエンドポイント] を選択してください。 エンドポイントとアクセス キーをコピーします。 KEY1
または KEY2
を使用できます。
下のコマンドの {endpoint}
トークンと {api-key}
トークンを、Azure portal から取得した値に置き換えて、psql
コマンド プロンプトからコマンドを実行して、構成テーブルに値を追加します。
SELECT azure_ai.set_setting('azure_cognitive.endpoint','{endpoint}');
SELECT azure_ai.set_setting('azure_cognitive.subscription_key', '{api-key}');
法案を要約する
azure_ai
拡張機能の azure_cognitive
関数の一部機能をデモンストレーションするため、各法案の概要を生成します。 azure_cognitive
スキーマには、テキスト要約のための関数として、summarize_abstractive
と summarize_extractive
の 2 つが用意されています。 抽象要約では、入力テキストの主な概念をキャプチャする要約が生成されますが、同じ単語を使用しない可能性があります。 抽出要約は、入力テキストから重要な文を抽出することによって要約を組み立てます。
Azure AI Language サービスの新しい元のコンテンツを生成する機能を使用するため、summarize_abstractive
関数を使用してテキスト入力の概要を作成します。 psql
から \df
メタ コマンドをもう一度使用します。今回は、azure_cognitive.summarize_abstractive
関数を具体的に確認します。
\df azure_cognitive.summarize_abstractive
\df azure_cognitive.summarize_abstractive
コマンドの出力の Argument data types
プロパティを指定すると、関数が想定する引数の一覧が表示されます。
引数 | 型 | Default | 説明 |
---|---|---|---|
text | text |
要約する入力テキスト。 | |
言語 | text |
入力テキストの記述言語を ISO 639-1 の 2 文字コードで表したもの。 使用可能な値については、言語サポートを確認してください。 | |
timeout_ms | integer |
3600000 | 操作が停止するまでのタイムアウト時間 (ミリ秒単位)。 |
throw_on_error | boolean |
true | エラーが発生したときに関数から例外がスローされ、ラップしていたトランザクションがロールバックされるかどうかを示すフラグ。 |
sentence_count | integer |
3 | 生成された要約に含める文の最大数。 |
disable_service_logs | boolean |
false | Language サービスでは、問題のトラブルシューティングのために、入力されたテキストを 48 時間ログに記録します。テキストは、この用途にのみ使用されます。 このプロパティを true に設定すると入力のログ記録が無効になるため、問題が発生した際の調査手段が制限される可能性があります。 詳細については、Cognitive Services のコンプライアンスとプライバシーに関する注意事項 (https://aka.ms/cs-compliance) および Microsoft の責任ある AI の原則 (https://www.microsoft.com/ai/responsible-ai) を参照してください。 |
summarize_abstractive
関数には、次の引数が必要です: azure_cognitive.summarize_abstractive(text TEXT, language TEXT)
。
bill_summaries
テーブルに対する次のクエリでは、summarize_abstractive
関数を使用して、法案のテキストの要約を新しい 1 文で生成します。この方法で、生成 AI の能力をクエリに直接組み込むことができます。
SELECT
bill_id,
azure_cognitive.summarize_abstractive(bill_text, 'en', sentence_count => 1) one_sentence_summary
FROM bill_summaries
WHERE bill_id = '112_hr2873';
この関数を使用して、データベース テーブルにデータを書き込むこともできます。 bill_summaries
テーブルを変更して、1 文の要約をデータベースに格納するための新しい列を追加します。
ALTER TABLE bill_summaries
ADD COLUMN one_sentence_summary TEXT;
次に、要約でテーブルを更新します。 summarize_abstractive
関数は、テキストの配列 (text[]
) を返します。 array_to_string
関数は、戻り値をその文字列表記に変換します。 次のクエリでは、throw_on_error
引数が false
に設定されています。 この設定により、エラーが発生した場合でも要約プロセスを続行できます。
UPDATE bill_summaries b
SET one_sentence_summary = array_to_string(azure_cognitive.summarize_abstractive(b.bill_text, 'en', throw_on_error => false, sentence_count => 1), ' ', '')
where one_sentence_summary is NULL;
出力で、適切な要約を生成できなかった無効なドキュメントに関する警告が表示されることがあります。 この警告は、上記のクエリで throw_on_error
を false
に設定した結果です。 そのフラグが既定値の true
のままで、クエリが失敗すると、要約はデータベースに書き込まれません。 警告をスローしたレコードを表示するには、次を実行します。
SELECT bill_id, one_sentence_summary FROM bill_summaries WHERE one_sentence_summary is NULL;
その後、bill_summaries
テーブルに対してクエリを実行して、テーブル内の他のレコードに対して azure_ai
拡張機能で生成された新しい 1 文の概要を表示できます。
SELECT bill_id, one_sentence_summary FROM bill_summaries LIMIT 5;
まとめ
これで、azure_ai
拡張機能を使用して大規模言語モデルと生成 AI の機能をデータベースに統合する方法を学習できました。