適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
azure_ai
拡張機能では、Azure AI サービスの機能を統合することで、大規模な言語モデル (LLM) を使用し、Azure Database for PostgreSQL データベース内に生成型AI アプリケーションを構築する機能が追加されます。
生成 AI は、自然言語入力に基づいて元のコンテンツを生成するように LLM がトレーニングされる人工知能の一種です。 azure_ai
拡張機能を使用すると、ジェネレーティブ AI の機能を使用して、データベースから直接自然言語クエリを処理できます。
この記事では、 azure_ai
拡張機能を使用して Azure Database for PostgreSQL フレキシブル サーバーに豊富な AI 機能を追加する方法について説明します。 この拡張機能を使用して 、Azure OpenAI と Azure AI 言語サービス の両方をデータベースに統合する方法を示します。
前提条件
Azure サブスクリプション。 無料で作成できます。
目的の Azure サブスクリプション内の Azure OpenAI に付与されたアクセス権。 現在、アプリケーションはこのサービスへのアクセスを許可します。 Azure OpenAI サービスの制限付きアクセスのフォームに入力することで、 Azure OpenAI へのアクセスを申請できます。
text-embedding-ada-002
(バージョン 2) モデルがデプロイされた Azure OpenAI リソース。 このモデルは現在、特定の リージョンでのみ使用できます。 リソースがない場合は、Azure OpenAI リソース デプロイ ガイドに記載されているリソース作成プロセスを参照してください。Azure AI Language リソース。 言語リソースがない場合は、概要作成のクイック スタートに記載されている手順に従って、Azure portal で言語リソースを作成できます。 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 Database for PostgreSQL で Azure OpenAI を使用してベクター埋め込みを生成する」を参照してください。
データベースで拡張機能を有効にするには:
「拡張機能を許可する」の説明に従って、 拡張機能を許可リストに追加します。
azure_ai
拡張機能を使用するデータベースで、「拡張機能の作成」の説明に従って拡張機能をインストールします。
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()
関数で設定した値を取得する方法を提供します。 表示したい設定キーを受け入れます。 どちらの方法でも、キーは次のいずれかである必要があります。
鍵 | 説明 |
---|---|
azure_openai.endpoint |
サポートされている Azure OpenAI エンドポイント (たとえば、 https://example.openai.azure.com )。 |
azure_openai.subscription_key |
Azure 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 サンプル用の 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 ファイルから bill_summaries
テーブルにサンプル データを読み込みます。 CSV ファイルの最初の行がヘッダー行であることを指定します。
\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
モデルでは、1,536 次元のベクトルが生成されるため、ベクトル サイズとして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
プロパティは、関数が想定する引数の一覧を表示します。
引数 | Type | 既定値 | 説明 |
---|---|---|---|
deployment_name |
text |
text-embeddings-ada-002 モデルを含む Azure AI Foundry ポータルのデプロイの名前。 |
|
input |
text |
埋め込みの作成に使用する入力テキスト。 | |
timeout_ms |
integer |
3600000 |
タイムアウト (ミリ秒単位)。その後、操作が停止されます。 |
throw_on_error |
boolean |
true |
関数がエラー時に例外をスローし、トランザクションの折り返しをロールバックするかどうかを示すフラグ。 |
最初の引数は、埋め込みモデルが Azure OpenAI アカウントにデプロイされたときに割り当てられた deployment_name
値です。 この値を取得するには:
Azure portal で、Azure OpenAI リソースに移動します。
左側のメニューの [ リソース管理] で[ モデル デプロイ ] を選択して、Azure AI Foundry ポータルを開きます。
Azure AI Foundry ポータルで、[デプロイ] を選択 します。 [デプロイ] ウィンドウで、
text-embedding-ada-002
モデルのデプロイに関連付けられているデプロイ名の値をコピーします。
この情報を使用して、 bill_summaries
テーブル内の各レコードを更新するクエリを実行します。 azure_openai.create_embeddings()
関数を使用して、bill_text
フィールドの生成されたベクター埋め込みをbill_vector
列に挿入します。 {your-deployment-name}
を、Azure AI Foundry ポータルの [デプロイ] ウィンドウからコピーしたデプロイ名の値に置き換えます。 次に、次のコマンドを実行します。
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 つのベクトル間の角度のコサインを測定します。
コサイン距離と階層ナビゲーション可能 Small World (HNSW) を使用して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 言語サービス リソースのエンドポイントとキーを指定する必要があります。
Azure portal で、言語サービス リソースに移動します。
左側のメニューの [ リソース管理] で、[ キーとエンドポイント] を選択します。
エンドポイントとアクセス キーをコピーします。
KEY1
またはKEY2
を使用できます。psql
コマンド プロンプトで、次のコマンドを実行して、構成テーブルに値を追加します。{endpoint}
トークンと{api-key}
トークンを、Azure portal から取得した値に置き換えます。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
スキーマには、テキストを要約するための 2 つの関数が用意されています。
summarize_abstractive
: 抽象要約では、入力テキストから主な概念をキャプチャする要約が生成されますが、同じ単語を使用しない可能性があります。summarize_extractive
:抽出要約は、入力テキストから重要な文を抽出することによって要約を組み立てます。
Azure AI Language サービスの新しい元のコンテンツを生成する機能を使用するため、summarize_abstractive
関数を使用してテキスト入力の概要を作成します。 psql
の\df
メタ コマンドをもう一度使用します。今回は、azure_cognitive.summarize_abstractive
関数を具体的に確認します。
\df azure_cognitive.summarize_abstractive
\df azure_cognitive.summarize_abstractive
コマンドの出力の Argument data types
プロパティは、関数が想定する引数の一覧を表示します。
引数 | Type | 既定値 | 説明 |
---|---|---|---|
text |
text |
集計するテキストを入力します。 | |
language |
text |
入力テキストが書き込まれる言語の 2 文字の ISO 639-1 表現。 使用できる値については、 言語機能の言語サポートを確認してください。 | |
timeout_ms |
integer |
3600000 |
タイムアウト (ミリ秒単位)。その後、操作が停止されます。 |
throw_on_error |
boolean |
true |
関数がエラー時に例外をスローし、トランザクションの折り返しをロールバックするかどうかを示すフラグ。 |
sentence_count |
integer |
3 |
生成された要約に含める文の最大数。 |
disable_service_logs |
boolean |
false |
言語サービス ログを無効にする設定。 Language サービスでは、問題のトラブルシューティングのために、入力されたテキストを 48 時間ログに記録します。テキストは、この用途にのみ使用されます。 このプロパティを true に設定すると入力のログ記録が無効になるため、問題が発生した際の調査手段が制限される可能性があります。 詳細については、 Cognitive Services のコンプライアンスとプライバシー に関する注意事項と 、Microsoft の責任ある 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 機能をデータベースに統合する方法を学習しました。