次の方法で共有


Azure AI 機能を Azure Database for PostgreSQL に統合する

適用対象: 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 OpenAIAzure 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 データベースに使用したサブスクリプションを選択し、[ ストレージの作成] を選択します。

データベース接続の詳細を取得するには:

  1. Azure portal で、Azure Database for PostgreSQL フレキシブル サーバーに移動します。

  2. 左側のメニューの [設定] で 、[ 接続] を選択します。 [接続の詳細] ブロックをコピーします。

  3. 環境変数のコピーした宣言行を 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}"
    
  4. psql コマンド ライン ツールを使用してデータベースに接続します。 プロンプトで次のコマンドを入力します。

    psql
    

azure_ai拡張機能をインストールする

azure_ai拡張機能を使用して、Azure OpenAI と Azure Cognitive Services をデータベースに統合できます。 詳細については、「 Azure Database for PostgreSQL で Azure OpenAI を使用してベクター埋め込みを生成する」を参照してください。

データベースで拡張機能を有効にするには:

  1. 「拡張機能を許可する」の説明に従って、 拡張機能を許可リストに追加します。

  2. 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 サービス エンドポイントとキーを使用して拡張機能を構成します。

  1. Azure portal で、Azure OpenAI リソースに移動します。 左側のメニューの [ リソース管理] で、[ キーとエンドポイント] を選択します。

  2. エンドポイントとアクセス キーをコピーします。 KEY1 または KEY2 を使用できます。 常に 2 つのキーを用意しておくと、サービスを中断させることなく、キーのローテーションと再生成を安全に行うことができます。

  3. 次のコマンドで、 {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}');
    
  4. 構成テーブルに表示されている設定を確認します。

    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 値です。 この値を取得するには:

  1. Azure portal で、Azure OpenAI リソースに移動します。

  2. 左側のメニューの [ リソース管理] で[ モデル デプロイ ] を選択して、Azure AI Foundry ポータルを開きます。

  3. Azure AI Foundry ポータルで、[デプロイ] を選択 します。 [デプロイ] ウィンドウで、text-embedding-ada-002 モデルのデプロイに関連付けられているデプロイの値をコピーします。

AI を統合するためのデプロイの埋め込みのスクリーンショット。

この情報を使用して、 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 言語サービス リソースのエンドポイントとキーを指定する必要があります。

  1. Azure portal で、言語サービス リソースに移動します。

  2. 左側のメニューの [ リソース管理] で、[ キーとエンドポイント] を選択します。

  3. エンドポイントとアクセス キーをコピーします。 KEY1 または KEY2 を使用できます。

  4. 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_errorfalse に設定した結果です。 そのフラグを既定値の 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 機能をデータベースに統合する方法を学習しました。