このクイックスタートでは、Azure OpenAI モデルで独自のデータを使用できます。 データに Azure OpenAI のモデルを使用すると、より高速で正確なコミュニケーションを可能にする強力な会話型 AI プラットフォームが使用できます。
前提条件
次のリソース:
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
チャット プレイグラウンド
チャット プレイグラウンドを使用すると、コードなしのアプローチで Azure OpenAI 機能の探索を開始できます。 これは単に、入力候補を生成するためのプロンプトを送信できるテキスト ボックスです。 このページから、機能をすばやく反復して実験することができます。
プレイグラウンドは、チャットエクスペリエンスを調整するためのオプションを提供します。 上部のメニューで、[ デプロイ ] を選択して、インデックスの検索結果を使用して応答を生成するモデルを決定できます。 今後の応答生成のために会話履歴として含める、過去のメッセージの数を選択します。 会話履歴 は、関連する応答を生成するためのコンテキストを提供しますが、 トークンの使用も使用します。 入力トークンの進行状況インジケーターは、送信した質問のトークン数を追跡します。
左側の 詳細設定 は ランタイム パラメーターであり、データからの関連情報の取得と検索を制御できます。 この適切なユース ケースとしては、確実にデータのみに基づいて応答が生成されるようにしたい場合、またはデータ上の既存の情報に基づいた応答を、モデルが生成できていないという場合が挙げられます。
厳密性 は、類似性スコアに基づいて検索ドキュメントをフィルター処理するシステムのアグレッシブさを決定します。 厳密性を 5 に設定することは、システムが類似性について非常に高いしきい値を適用し、ドキュメントを積極的に除外することを表します。 セマンティック検索は、ランク付けモデルがクエリの意図を推論するより優れた処理を行うため、このシナリオで役立ちます。 厳密度のレベルを低くするほど、より詳細な回答が生成されますが、インデックスにない情報が含まれる可能性もあります。 これは、既定で 3 に設定されています。
取得されるドキュメント は、3、5、10、または 20 に設定できる整数であり、最終的な応答を作成するために大きな言語モデルに提供されるドキュメント チャンクの数を制御します。 既定では、5 に設定されます。
[データへの応答を制限する] が有効になっている場合、モデルはドキュメントへの応答のみに依存しようとします。 これは既定で true に設定されます。
最初のクエリを送信します。 チャット モデルは、質問と回答の演習で最も優れたパフォーマンスを発揮します。 たとえば、"利用可能な健康プランは何ですか?" や "ヘルスプラスオプションとは何ですか?" などです。
"どの健康保険プランが最も人気か" など、データ分析を必要とするクエリは失敗する可能性があります。 "アップロードしたドキュメントの数" など、すべてのデータに関する情報を必要とするクエリも失敗する可能性があります。 検索エンジンは、クエリに対して完全または類似の用語、語句、または構築を持つチャンクを検索することに注意してください。 また、モデルは質問を理解しているかもしれませんが、検索結果がデータセットからのチャンクである場合、この情報は、前のような種類の質問に答えるのに適切とは言えません。
チャットは、応答で返されるドキュメント (チャンク) の数によって制限されます (Azure AI Foundry ポータル プレイグラウンドでは 3 から 20 に制限されます)。 ご想像のとおり、"すべてのタイトル" に関する質問をするには、ベクター ストア全体をフル スキャンする必要があります。
モデルをデプロイする
エクスペリエンスに問題がなければ、[デプロイ] ボタンを選択して、ポータルから直接 Web アプリ をデプロイ できます。
これにより、スタンドアロンの Web アプリケーションにデプロイするか、モデルで 独自のデータを使用 している場合は Copilot Studio (プレビュー) で副操縦をデプロイするかを選択できます。
たとえば、Web アプリをデプロイすることを選択した場合は、次のようになります:
初めて Web アプリをデプロイするときは、[ 新しい Web アプリの作成] を選択する必要があります。 アプリの URL の一部となるアプリ名を決めます。 たとえば、「 https://<appname>.azurewebsites.net
」のように入力します。
発行されたアプリのサブスクリプション、リソース グループ、場所、価格プランを選びます。 既存のアプリを更新するには、[ 既存の Web アプリに発行 ] を選択し、ドロップダウン メニューから前のアプリの名前を選択します。
Web アプリをデプロイする場合は、それを使用するための 重要な考慮事項 を参照してください。
前提条件
次のリソース:
- Azure サブスクリプション - 無料で作成します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
- .NET 8 SDK
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
プロジェクト ディレクトリから 、Program.cs ファイルを開き、その内容を次のコードに置き換えます。
using System;
using Azure.AI.OpenAI;
using System.ClientModel;
using Azure.AI.OpenAI.Chat;
using OpenAI.Chat;
using static System.Environment;
string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");
AzureOpenAIClient openAIClient = new(
new Uri(azureOpenAIEndpoint),
new ApiKeyCredential(azureOpenAIKey));
ChatClient chatClient = openAIClient.GetChatClient(deploymentName);
// Extension methods to use data sources with options are subject to SDK surface changes. Suppress the
// warning to acknowledge and this and use the subject-to-change AddDataSource method.
#pragma warning disable AOAI001
ChatCompletionOptions options = new();
options.AddDataSource(new AzureSearchChatDataSource()
{
Endpoint = new Uri(searchEndpoint),
IndexName = searchIndex,
Authentication = DataSourceAuthentication.FromApiKey(searchKey),
});
ChatCompletion completion = chatClient.CompleteChat(
[
new UserChatMessage("What health plans are available?"),
],
options);
ChatMessageContext onYourDataContext = completion.GetMessageContext();
if (onYourDataContext?.Intent is not null)
{
Console.WriteLine($"Intent: {onYourDataContext.Intent}");
}
foreach (ChatCitation citation in onYourDataContext?.Citations ?? [])
{
Console.WriteLine($"Citation: {citation.Content}");
}
重要
運用環境では、 Azure Key Vault などの資格情報を安全に格納してアクセスする方法を使用します。 資格情報のセキュリティの詳細については、この セキュリティ に関する記事を参照してください。
dotnet run Program.cs
出力
Contoso Electronics offers two health plans: Northwind Health Plus and Northwind Standard [doc1]. Northwind Health Plus is a comprehensive plan that provides coverage for medical, vision, and dental services, prescription drug coverage, mental health and substance abuse coverage, and coverage for preventive care services. It also offers coverage for emergency services, both in-network and out-of-network. On the other hand, Northwind Standard is a basic plan that provides coverage for medical, vision, and dental services, prescription drug coverage, and coverage for preventive care services. However, it does not offer coverage for emergency services, mental health and substance abuse coverage, or out-of-network services [doc1].
Intent: ["What are the available health plans?", "List of health plans available", "Health insurance options", "Types of health plans offered"]
Citation:
Contoso Electronics plan and benefit packages
Thank you for your interest in the Contoso electronics plan and benefit packages. Use this document to
learn more about the various options available to you...// Omitted for brevity
これは、結果を出力する前に、モデルが応答全体を生成するまで待機します。
前提条件
次のリソース:
- Azure OpenAI
- Azure Blob Storage
- Azure AI 検索
- サポートされているリージョンにデプロイされ、サポートされているモデルを持つAzure OpenAI リソース。
- 少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
必要な変数を取得する
Azure OpenAI の呼び出しを正しく行うには、次の変数が必要です。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 詳細については、「 Azure AI Foundry を使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、[ キーとエンドポイント] セクションで確認できます。 または、 Azure AI Foundry>Chat プレイグラウンド>Code ビューで値を見つけることができます。 エンドポイントの例: https://my-resource.openai.azure.com 。 |
AZURE_OPENAI_API_KEY |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、[ リソース管理>キーとエンドポイント ] セクションで確認できます。 KEY1 または KEY2 を使用できます。 常に 2 つのキーを用意しておくと、サービスを中断させることなく、キーのローテーションと再生成を安全に行うことができます。 |
AZURE_OPEN_AI_DEPLOYMENT_ID |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] で、または Azure AI Foundry ポータルの [ 管理>デプロイ ] で確認できます。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションで確認できます。 |
AZURE_AI_SEARCH_API_KEY |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、Settings>Keys セクションで確認できます。 プライマリ管理者キーまたはセカンダリ管理者キーのいずれかを使用できます。 常に 2 つのキーを用意しておくと、サービスを中断させることなく、キーのローテーションと再生成を安全に行うことができます。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
環境変数
キーとエンドポイントの永続的な環境変数を作成して割り当てます。
重要
API キーは慎重に使用してください。 API キーは、コード内に直接含めないようにし、絶対に公開しないでください。 API キーを使用する場合は、Azure Key Vault に安全に保存します。 アプリで API キーを安全に使用する方法の詳細については、 Azure Key Vault での API キーに関するページを参照してください。
AI サービスのセキュリティの詳細については、「 Azure AI サービスへの要求を認証する」を参照してください。
注
Spring AI の既定のモデル名は gpt-35-turbo
です。 別の名前でモデルをデプロイした場合にのみ、SPRING_AI_AZURE_OPENAI_MODEL
値を指定する必要があります。
export SPRING_AI_AZURE_OPENAI_ENDPOINT=REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
export SPRING_AI_AZURE_OPENAI_API_KEY=REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_ENDPOINT=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_API_KEY=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_INDEX=REPLACE_WITH_YOUR_INDEX_NAME_HERE
export SPRING_AI_AZURE_OPENAI_MODEL=REPLACE_WITH_YOUR_MODEL_NAME_HERE
新しい Spring アプリケーションを作成する
Spring AI では現在、Azure AI クエリでAzureCognitiveSearchChatExtensionConfiguration
メソッドをカプセル化し、ユーザーに詳細を非表示にする オプションはサポートされていません。 代わりに、アプリケーションで RAG メソッドを直接呼び出して、Azure AI 検索インデックス内のデータにクエリを実行し、取得したドキュメントを使ってクエリを強化することもできます。
Spring AI は VectorStore 抽象化をサポートしており、カスタム データのクエリを実行するために Azure AI 検索を Spring AI VectorStore 実装でラップできます。 次のプロジェクトでは、Azure AI 検索によってサポートされるカスタム VectorStore を実装し、RAG 操作を直接実行します。
Bash ウィンドウで、アプリの新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir ai-custom-data-demo && cd ai-custom-data-demo
作業ディレクトリから spring init
コマンドを実行します。 このコマンドは、メインの Java クラス ソース ファイルや Maven ベースのプロジェクトの管理に使用される pom.xml ファイルなど、Spring プロジェクトの標準ディレクトリ構造を作成します。
spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x
生成されるファイルとフォルダーは次のような構造になります。
ai-custom-data-demo/
|-- pom.xml
|-- mvn
|-- mvn.cmd
|-- HELP.md
|-- src/
|-- main/
| |-- resources/
| | |-- application.properties
| |-- java/
| |-- com/
| |-- example/
| |-- aicustomdatademo/
| |-- AiCustomDataApplication.java
|-- test/
|-- java/
|-- com/
|-- example/
|-- aicustomdatademo/
|-- AiCustomDataApplicationTests.java
Spring アプリケーションを編集する
pom.xml ファイルを編集します。
プロジェクト ディレクトリのルートから、任意のエディターまたは IDE で pom.xml ファイルを開き、次の内容でファイルを上書きします。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>ai-custom-data-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>AICustomData</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> <version>0.7.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-search-documents</artifactId> <version>11.6.0-beta.10</version> <exclusions> <!-- exclude this to avoid changing the default serializer and the null-value behavior --> <exclusion> <groupId>com.azure</groupId> <artifactId>azure-core-serializer-json-jackson</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> </repositories> </project>
src/main/java/com/example/aicustomdatademo フォルダーから、任意のエディターまたは IDE でAiCustomDataApplication.javaを開き、次のコードを貼り付けます。
package com.example.aicustomdatademo; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import org.springframework.ai.client.AiClient; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.prompt.Prompt; import org.springframework.ai.prompt.SystemPromptTemplate; import org.springframework.ai.prompt.messages.MessageType; import org.springframework.ai.prompt.messages.UserMessage; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.Context; import com.azure.search.documents.SearchClient; import com.azure.search.documents.SearchClientBuilder; import com.azure.search.documents.models.IndexingResult; import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.RawVectorQuery; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.extern.jackson.Jacksonized; @SpringBootApplication public class AiCustomDataApplication implements CommandLineRunner { private static final String ROLE_INFO_KEY = "role"; private static final String template = """ You are a helpful assistant. Use the information from the DOCUMENTS section to augment answers. DOCUMENTS: {documents} """; @Value("${spring.ai.azure.cognitive-search.endpoint}") private String acsEndpoint; @Value("${spring.ai.azure.cognitive-search.api-key}") private String acsApiKey; @Value("${spring.ai.azure.cognitive-search.index}") private String acsIndexName; @Autowired private AiClient aiClient; @Autowired private EmbeddingClient embeddingClient; public static void main(String[] args) { SpringApplication.run(AiCustomDataApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println(String.format("Sending custom data prompt to AI service. One moment please...\r\n")); final var store = vectorStore(embeddingClient); final String question = "What are my available health plans?"; final var candidateDocs = store.similaritySearch(question); final var userMessage = new UserMessage(question); final String docPrompts = candidateDocs.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n")); final SystemPromptTemplate promptTemplate = new SystemPromptTemplate(template); final var systemMessage = promptTemplate.createMessage(Map.of("documents", docPrompts)); final var prompt = new Prompt(List.of(systemMessage, userMessage)); final var resps = aiClient.generate(prompt); System.out.println(String.format("Prompt created %d generated response(s).", resps.getGenerations().size())); resps.getGenerations().stream() .forEach(gen -> { final var role = gen.getInfo().getOrDefault(ROLE_INFO_KEY, MessageType.ASSISTANT.getValue()); System.out.println(String.format("Generated respose from \"%s\": %s", role, gen.getText())); }); } @Bean public VectorStore vectorStore(EmbeddingClient embeddingClient) { final SearchClient searchClient = new SearchClientBuilder() .endpoint(acsEndpoint) .credential(new AzureKeyCredential(acsApiKey)) .indexName(acsIndexName) .buildClient(); return new AzureCognitiveSearchVectorStore(searchClient, embeddingClient); } public static class AzureCognitiveSearchVectorStore implements VectorStore { private static final int DEFAULT_TOP_K = 4; private static final Double DEFAULT_SIMILARITY_THRESHOLD = 0.0; private SearchClient searchClient; private final EmbeddingClient embeddingClient; public AzureCognitiveSearchVectorStore(SearchClient searchClient, EmbeddingClient embeddingClient) { this.searchClient = searchClient; this.embeddingClient = embeddingClient; } @Override public void add(List<Document> documents) { final var docs = documents.stream().map(document -> { final var embeddings = embeddingClient.embed(document); return new DocEntry(document.getId(), "", document.getContent(), embeddings); }).toList(); searchClient.uploadDocuments(docs); } @Override public Optional<Boolean> delete(List<String> idList) { final List<DocEntry> docIds = idList.stream().map(id -> DocEntry.builder().id(id).build()) .toList(); var results = searchClient.deleteDocuments(docIds); boolean resSuccess = true; for (IndexingResult result : results.getResults()) if (!result.isSucceeded()) { resSuccess = false; break; } return Optional.of(resSuccess); } @Override public List<Document> similaritySearch(String query) { return similaritySearch(query, DEFAULT_TOP_K); } @Override public List<Document> similaritySearch(String query, int k) { return similaritySearch(query, k, DEFAULT_SIMILARITY_THRESHOLD); } @Override public List<Document> similaritySearch(String query, int k, double threshold) { final var searchQueryVector = new RawVectorQuery() .setVector(toFloatList(embeddingClient.embed(query))) .setKNearestNeighborsCount(k) .setFields("contentVector"); final var searchResults = searchClient.search(null, new SearchOptions().setVectorQueries(searchQueryVector), Context.NONE); return searchResults.stream() .filter(r -> r.getScore() >= threshold) .map(r -> { final DocEntry entry = r.getDocument(DocEntry.class); final Document doc = new Document(entry.getId(), entry.getContent(), Collections.emptyMap()); doc.setEmbedding(entry.getContentVector()); return doc; }) .collect(Collectors.toList()); } private List<Float> toFloatList(List<Double> doubleList) { return doubleList.stream().map(Double::floatValue).toList(); } } @Data @Builder @Jacksonized @AllArgsConstructor @NoArgsConstructor static class DocEntry { private String id; private String hash; private String content; private List<Double> contentVector; } }
重要
運用環境では、 Azure Key Vault などの資格情報を安全に格納してアクセスする方法を使用します。 資格情報のセキュリティの詳細については、この セキュリティ に関する記事を参照してください。
プロジェクトのルート フォルダーに戻り、次のコマンドを使ってアプリを実行します:
./mvnw spring-boot:run
出力
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.1.5)
2023-11-07T14:40:45.250-06:00 INFO 18557 --- [ main] c.e.a.AiCustomDataApplication : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00 INFO 18557 --- [ main] c.e.a.AiCustomDataApplication : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...
Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.
リファレンス ドキュメント | ソース コード | Package (npm) | サンプル
前提条件
Azure サブスクリプション - 無料で作成します。
ローカル開発環境でパスワードレス認証に使用される Azure CLI は、Azure CLI でサインインして必要なコンテキストを作成します。
サポートされているリージョンにデプロイされ、 サポートされているモデルを持つ Azure OpenAI リソース。
少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Microsoft Entra ID の前提条件
Microsoft Entra ID で推奨されるキーレス認証の場合、次のことを行う必要があります。
- Microsoft Entra ID を使用したキーレス認証に使用される Azure CLI をインストールします。
- ユーザー アカウントに
Cognitive Services User
ロールを割り当てます。 Azure portal の [アクセス制御 (IAM)]>[ロールの割り当ての追加] で、ロールを割り当てることができます。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
セットアップ
use-data-quickstart
新しいフォルダーを作成し、次のコマンドを使用してクイック スタート フォルダーに移動します。mkdir use-data-quickstart && cd use-data-quickstart
次のコマンドで
package.json
を作成します。npm init -y
次を使用して JavaScript 用の OpenAI クライアント ライブラリをインストールします。
npm install openai
推奨されるパスワードレス認証の場合:
npm install @azure/identity
JavaScript コードを追加する
次のコードを使用して
index.js
ファイルを作成します。const { DefaultAzureCredential, getBearerTokenProvider } = require("@azure/identity"); const { AzureOpenAI } = require("openai"); // Set the Azure and AI Search values from environment variables const endpoint = process.env.AZURE_OPENAI_ENDPOINT || "Your endpoint"; const searchEndpoint = process.env.AZURE_AI_SEARCH_ENDPOINT || "Your search endpoint"; const searchIndex = process.env.AZURE_AI_SEARCH_INDEX || "Your search index"; // keyless authentication const credential = new DefaultAzureCredential(); const scope = "https://cognitiveservices.azure.com/.default"; const azureADTokenProvider = getBearerTokenProvider(credential, scope); // Required Azure OpenAI deployment name and API version const deploymentName = process.env.AZURE_OPENAI_DEPLOYMENT_NAME || "gpt-4"; const apiVersion = process.env.OPENAI_API_VERSION || "2024-10-21"; function getClient() { return new AzureOpenAI({ endpoint, azureADTokenProvider, deployment: deploymentName, apiVersion, }); } async function main() { const client = getClient(); const messages = [ { role: "user", content: "What are my available health plans?" }, ]; console.log(`Message: ${messages.map((m) => m.content).join("\n")}`); const events = await client.chat.completions.create({ stream: true, messages: [ { role: "user", content: "What's the most common feedback we received from our customers about the product?", }, ], max_tokens: 128, model: "", data_sources: [ { type: "azure_search", parameters: { endpoint: searchEndpoint, index_name: searchIndex, authentication: { type: "api_key", key: searchKey, }, }, }, ], }); let response = ""; for await (const event of events) { for (const choice of event.choices) { const newText = choice.delta?.content; if (newText) { response += newText; // To see streaming results as they arrive, uncomment line below // console.log(newText); } } } console.log(response); } main().catch((err) => { console.error("The sample encountered an error:", err); });
次のコマンドを使用して Azure にサインインします。
az login
JavaScript ファイルを実行します。
node index.js
出力
Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.
リファレンス ドキュメント | ソース コード | Package (npm) | サンプル
前提条件
Azure サブスクリプション - 無料で作成します。
ローカル開発環境でパスワードレス認証に使用される Azure CLI は、Azure CLI でサインインして必要なコンテキストを作成します。
サポートされているリージョンにデプロイされ、 サポートされているモデルを持つ Azure OpenAI リソース。
少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Microsoft Entra ID の前提条件
Microsoft Entra ID で推奨されるキーレス認証の場合、次のことを行う必要があります。
- Microsoft Entra ID を使用したキーレス認証に使用される Azure CLI をインストールします。
- ユーザー アカウントに
Cognitive Services User
ロールを割り当てます。 Azure portal の [アクセス制御 (IAM)]>[ロールの割り当ての追加] で、ロールを割り当てることができます。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
セットアップ
use-data-quickstart
新しいフォルダーを作成し、次のコマンドを使用してクイック スタート フォルダーに移動します。mkdir use-data-quickstart && cd use-data-quickstart
次のコマンドで
package.json
を作成します。npm init -y
次のコマンドを使用して、
package.json
を ECMAScript に更新します。npm pkg set type=module
次を使用して JavaScript 用の OpenAI クライアント ライブラリをインストールします。
npm install openai
推奨されるパスワードレス認証の場合:
npm install @azure/identity
TypeScript コードを追加する
次のコードを使用して
index.ts
ファイルを作成します。import { AzureOpenAI } from "openai"; import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity"; import "@azure/openai/types"; // Set the Azure and AI Search values from environment variables const endpoint = process.env.AZURE_OPENAI_ENDPOINT || "Your endpoint"; const searchEndpoint = process.env.AZURE_AI_SEARCH_ENDPOINT || "Your search endpoint"; const searchIndex = process.env.AZURE_AI_SEARCH_INDEX || "Your search index"; // keyless authentication const credential = new DefaultAzureCredential(); const scope = "https://cognitiveservices.azure.com/.default"; const azureADTokenProvider = getBearerTokenProvider(credential, scope); // Required Azure OpenAI deployment name and API version const deploymentName = process.env.AZURE_OPENAI_DEPLOYMENT_NAME || "gpt-4"; const apiVersion = process.env.OPENAI_API_VERSION || "2024-07-01-preview"; function getClient(): AzureOpenAI { return new AzureOpenAI({ endpoint, azureADTokenProvider, deployment: deploymentName, apiVersion, }); } async function main() { const client = getClient(); const messages = [ { role: "user", content: "What are my available health plans?" }, ]; console.log(`Message: ${messages.map((m) => m.content).join("\n")}`); const events = await client.chat.completions.create({ stream: true, messages: [ { role: "user", content: "What's the most common feedback we received from our customers about the product?", }, ], max_tokens: 128, model: "", data_sources: [ { type: "azure_search", parameters: { endpoint: searchEndpoint, index_name: searchIndex, authentication: { type: "api_key", key: searchKey, }, }, }, ], }); let response = ""; for await (const event of events) { for (const choice of event.choices) { const newText = choice.delta?.content; if (newText) { response += newText; // To see streaming results as they arrive, uncomment line below // console.log(newText); } } } console.log(response); } main().catch((err) => { console.error("The sample encountered an error:", err); });
TypeScript コードをトランスパイルするために
tsconfig.json
ファイルを作成して、ECMAScript 向けの次のコードをコピーします。{ "compilerOptions": { "module": "NodeNext", "target": "ES2022", // Supports top-level await "moduleResolution": "NodeNext", "skipLibCheck": true, // Avoid type errors from node_modules "strict": true // Enable strict type-checking options }, "include": ["*.ts"] }
TypeScript から JavaScript にトランスパイルします。
tsc
次のコマンドを使用して Azure にサインインします。
az login
次のコマンドを使用して、コードを実行します。
node index.js
重要
運用環境では、 Azure Key Vault などの資格情報を安全に格納してアクセスする方法を使用します。 資格情報のセキュリティの詳細については、この セキュリティ に関する記事を参照してください。
出力
Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.
前提条件
次のリソース:
- Azure OpenAI
- Azure Blob Storage
- Azure AI 検索
- サポートされているリージョンにデプロイされ、サポートされているモデルを持つAzure OpenAI リソース。
- 少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
これらのリンクは、OpenAI API for Python を参照しています。 Azure 固有の OpenAI Python SDK はありません。 OpenAI サービスと Azure OpenA を切り替える方法について説明します。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
Python 環境の作成
- プロジェクトの openai-python という名前の新しいフォルダーと、 main.py という名前の新しい Python コード ファイルを作成します。 そのディレクトリに変更します。
mkdir openai-python
cd openai-python
- 次の Python ライブラリをインストールします。
pip install openai
pip install python-dotenv
Python アプリを作成する
- プロジェクト ディレクトリから 、main.py ファイルを開き、次のコードを追加します。
import os
import openai
import dotenv
dotenv.load_dotenv()
endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_NAME")
client = openai.AzureOpenAI(
azure_endpoint=endpoint,
api_key=api_key,
api_version="2024-10-21",
)
completion = client.chat.completions.create(
model=deployment,
messages=[
{
"role": "user",
"content": "What are my available health plans?",
},
],
extra_body={
"data_sources":[
{
"type": "azure_search",
"parameters": {
"endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
"index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
"authentication": {
"type": "api_key",
"key": os.environ["AZURE_AI_SEARCH_API_KEY"],
}
}
}
],
}
)
print(f"{completion.choices[0].message.role}: {completion.choices[0].message.content}")
重要
運用環境では、 Azure Key Vault などの資格情報を安全に格納してアクセスする方法を使用します。 資格情報のセキュリティの詳細については、この セキュリティ に関する記事を参照してください。
- 次のコマンドを実行します。
python main.py
このアプリケーションは、多くのシナリオで使用するのに適した JSON 形式で応答を出力します。 これには、クエリに対する回答とアップロードされたファイルからの引用の両方が含まれます。
前提条件
次のリソース:
- Azure OpenAI
- Azure Blob Storage
- Azure AI 検索
- サポートされているリージョンにデプロイされ、サポートされているモデルを持つAzure OpenAI リソース。
- 少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
PowerShell コマンドの例
Azure OpenAI チャット モデルは、会話形式の入力を処理するように最適化されています。 messages
変数は、システム、ユーザー、ツール、アシスタントによって示された会話内のさまざまなロールを持つディクショナリの配列を渡します。 dataSources
変数は Azure Cognitive Search インデックスに接続し、Azure OpenAI モデルがデータを使用して応答できるようにします。
モデルからの応答をトリガーするには、アシスタントが応答する番であることを示すユーザー メッセージで終了する必要があります。
ヒント
temperature
や top_p
など、モデルの応答を変更するために使用できるパラメーターがいくつかあります。 詳細については、 リファレンス ドキュメント を参照してください。
# Azure OpenAI metadata variables
$openai = @{
api_key = $Env:AZURE_OPENAI_API_KEY
api_base = $Env:AZURE_OPENAI_ENDPOINT # your endpoint should look like the following https://YOUR_RESOURCE_NAME.openai.azure.com/
api_version = '2023-07-01-preview' # this may change in the future
name = 'YOUR-DEPLOYMENT-NAME-HERE' #This will correspond to the custom name you chose for your deployment when you deployed a model.
}
$acs = @{
search_endpoint = 'YOUR ACS ENDPOINT' # your endpoint should look like the following https://YOUR_RESOURCE_NAME.search.windows.net/
search_key = 'YOUR-ACS-KEY-HERE' # or use the Get-Secret cmdlet to retrieve the value
search_index = 'YOUR-INDEX-NAME-HERE' # the name of your ACS index
}
# Completion text
$body = @{
dataSources = @(
@{
type = 'AzureCognitiveSearch'
parameters = @{
endpoint = $acs.search_endpoint
key = $acs.search_key
indexName = $acs.search_index
}
}
)
messages = @(
@{
role = 'user'
content = 'What are my available health plans?'
}
)
} | convertto-json -depth 5
# Header for authentication
$headers = [ordered]@{
'api-key' = $openai.api_key
}
# Send a completion call to generate an answer
$url = "$($openai.api_base)/openai/deployments/$($openai.name)/extensions/chat/completions?api-version=$($openai.api_version)"
$response = Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Post -ContentType 'application/json'
return $response.choices.messages[1].content
出力例
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.
重要
運用環境では、 Azure Key Vault を使用した PowerShell シークレット管理などの資格情報を安全に格納してアクセスする方法を使用します。 資格情報のセキュリティの詳細については、この セキュリティ に関する記事を参照してください。
Web アプリを使用してモデルとチャットする
データを使用する Azure OpenAI モデルとのチャットを開始するには、GitHub で提供されている Azure AI Foundry ポータルまたはサンプル コードを使用して Web アプリをデプロイできます。 このアプリは、Azure App Service を使用してデプロイされます。これにより、クエリを送信するためのユーザー インターフェイスが提供されます。 このアプリは、データを使用する Azure OpenAI モデル、またはデータを使用しないモデルで使用できます。 要件、セットアップ、デプロイの手順については、リポジトリ内の readme ファイルを参照してください。 必要に応じて、ソース コードに変更を加えることで、Web アプリの フロントエンドとバックエンドのロジック をカスタマイズできます。
前提条件
次のリソース:
- Azure OpenAI
- Azure Blob Storage
- Azure AI 検索
- サポートされているリージョンにデプロイされ、サポートされているモデルを持つAzure OpenAI リソース。
- 少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
Microsoft Entra ID の前提条件
Microsoft Entra ID で推奨されるキーレス認証の場合、次のことを行う必要があります。
- Microsoft Entra ID を使用したキーレス認証に使用される Azure CLI をインストールします。
- ユーザー アカウントに
Cognitive Services User
ロールを割り当てます。 Azure portal の [アクセス制御 (IAM)]>[ロールの割り当ての追加] で、ロールを割り当てることができます。
セットアップ
dall-e-quickstart
新しいフォルダーを作成し、次のコマンドを使用してクイック スタート フォルダーに移動します。mkdir dall-e-quickstart && cd dall-e-quickstart
Microsoft Entra ID を使用 して推奨される キーレス認証の場合は、次のコマンドを使用して Azure にサインインします。
az login
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
クイック スタートを実行する
このクイックスタートのサンプル コードでは、推奨されるキーレス認証に Microsoft Entra ID を使用します。 API キーを使用する場合は、 NewDefaultAzureCredential
の実装を NewKeyCredential
に置き換えることができます。
azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
credential, err := azidentity.NewDefaultAzureCredential(nil)
client, err := azopenai.NewClient(azureOpenAIEndpoint, credential, nil)
サンプルを実行するには
quickstart.go という名前の新しいファイルを作成します。 quickstart.go ファイルに次のコードをコピーします。
package main import ( "context" "fmt" "log" "os" "github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" ) func main() { azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT") credential, err := azidentity.NewDefaultAzureCredential(nil) client, err := azopenai.NewClient(azureOpenAIEndpoint, credential, nil) modelDeploymentID := os.Getenv("AZURE_OPENAI_DEPLOYMENT_NAME") // Azure AI Search configuration searchIndex := os.Getenv("AZURE_AI_SEARCH_INDEX") searchEndpoint := os.Getenv("AZURE_AI_SEARCH_ENDPOINT") searchAPIKey := os.Getenv("AZURE_AI_SEARCH_API_KEY") if modelDeploymentID == "" || azureOpenAIEndpoint == "" || searchIndex == "" || searchEndpoint == "" || searchAPIKey == "" { fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n") return } client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, credential, nil) if err != nil { // Implement application specific error handling logic. log.Printf("ERROR: %s", err) return } resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{ Messages: []azopenai.ChatRequestMessageClassification{ &azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What are my available health plans?")}, }, MaxTokens: to.Ptr[int32](512), AzureExtensionsOptions: []azopenai.AzureChatExtensionConfigurationClassification{ &azopenai.AzureSearchChatExtensionConfiguration{ // This allows Azure OpenAI to use an Azure AI Search index. // Answers are based on the model's pretrained knowledge // and the latest information available in the designated data source. Parameters: &azopenai.AzureSearchChatExtensionParameters{ Endpoint: &searchEndpoint, IndexName: &searchIndex, Authentication: &azopenai.OnYourDataAPIKeyAuthenticationOptions{ Key: &searchAPIKey, }, }, }, }, DeploymentName: &modelDeploymentID, }, nil) if err != nil { // Implement application specific error handling logic. log.Printf("ERROR: %s", err) return } fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n", *resp.Choices[0].Message.Role, len(*resp.Choices[0].Message.Content)) fmt.Fprintf(os.Stderr, "ChatRole: %s\nChat content: %s\n", *resp.Choices[0].Message.Role, *resp.Choices[0].Message.Content, ) }
次のコマンドを実行して、新しい Go モジュールを作成します。
go mod init quickstart.go
go mod tidy
を実行して、必要な依存関係をインストールします。go mod tidy
次のコマンドを実行してサンプルを実行します。
go run quickstart.go
このアプリケーションは、クエリに対する回答とアップロードされたファイルからの引用の両方を含む応答を出力します。
前提条件
次のリソース:
- Azure OpenAI
- Azure Blob Storage
- Azure AI 検索
- サポートされているリージョンにデプロイされ、サポートされているモデルを持つAzure OpenAI リソース。
- 少なくとも Azure OpenAI リソースの Cognitive Services 共同作成者 ロールが割り当てられていることを確認します。
- 独自のデータがない場合は 、GitHub からサンプル データをダウンロードします。
Azure AI Foundry ポータルを使用してデータを追加する
ヒント
Azure Developer CLI を使用して、Azure OpenAI On Your Data に必要なリソースをプログラムで作成できます。
Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。
Azure AI Foundry プロジェクトを作成するには、[プロジェクトの作成] をクリックするか、Azure AI Foundry Models の [Focused on Azure OpenAI] タイルのボタンをクリックして直接続行します。
左側のウィンドウの [プレイグラウンド] で [チャット] を選択し、モデルのデプロイを選択します。
[チャット] プレイグラウンドで、[データの追加] を選択し、[データ ソースの追加] を選択します
表示されたウィンドウで、[データ ソースの選択] で [ファイルのアップロード (プレビュー)] を選択します。 Azure OpenAI では、データにアクセスしてインデックスを付けるために、ストレージ リソースと検索リソースの両方が必要です。
ヒント
- 詳細については、次のリソースを参照してください。
- 長いテキストを含むドキュメントとデータセットの場合は、使用可能な データ準備スクリプトを使用することをお勧めします。
Azure OpenAI がストレージ アカウントにアクセスするには、 クロスオリジン リソース共有 (CORS) を有効にする必要があります。 Azure Blob Storage リソースに対して CORS がまだ有効になっていない場合は、[ CORS を有効にする] を選択します。
ご自分の Azure AI Search リソースを選択し、接続するとアカウントで使用量が発生することの確認を選択します。 次に、Next を選択します。
[ ファイルのアップロード ] ウィンドウで、[ ファイルの参照 ] を選択し、[ 前提条件 ] セクションからダウンロードしたファイル、または独自のデータを選択します。 次に、[ ファイルのアップロード] を選択します。 次に、Next を選択します。
[ データ管理 ] ウィンドウで、インデックスの セマンティック検索とベクター検索 のどちらを有効にするかを選択できます。
入力した詳細を確認し、[ 保存して閉じる] を選択します。 これでモデルとチャットできるようになり、データからの情報を使用して応答が作成されます。
リソース情報の取得
Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。 このクイックスタートでは、Azure Blob Storage アカウントにデータをアップロードし、Azure AI Search インデックスを作成していることを前提としています。 「Azure AI Foundry ポータルを使用してデータを追加する」を参照してください。
変数名 | 価値 |
---|---|
AZURE_OPENAI_ENDPOINT |
この値は、Azure portal から Azure OpenAI リソースを調べるときに、 キーとエンドポイント のセクションにあります。 エンドポイントの例: https://my-resoruce.openai.azure.com 。 |
AZURE_OPENAI_DEPLOYMENT_NAME |
この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理>デプロイ ] にあります。 |
AZURE_AI_SEARCH_ENDPOINT |
この値は、Azure portal から Azure AI Search リソースを調べるときに 、[概要 ] セクションにあります。 |
AZURE_AI_SEARCH_INDEX |
この値は、データを格納するために作成したインデックスの名前に対応します。 Azure portal から Azure AI Search リソースを調べる場合は、[ 概要 ] セクションで確認できます。 |
cURL コマンドの例
Azure OpenAI チャット モデルは、会話形式の入力を処理するように最適化されています。 messages
変数は、システム、ユーザー、ツール、アシスタントによって示された会話内のさまざまなロールを持つディクショナリの配列を渡します。 dataSources
変数は Azure AI Search インデックスに接続し、Azure OpenAI モデルがデータを使用して応答できるようにします。
モデルからの応答をトリガーするには、アシスタントが応答する番であることを示すユーザー メッセージで終了する必要があります。
ヒント
temperature
や top_p
など、モデルの応答を変更するために使用できるパラメーターがいくつかあります。 詳細については、 リファレンス ドキュメント を参照してください。
curl -i -X POST $AZURE_OPENAI_ENDPOINT/openai/deployments/$AZURE_OPENAI_DEPLOYMENT_NAME/chat/completions?api-version=2024-10-21 \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d \
'
{
"data_sources": [
{
"type": "azure_search",
"parameters": {
"endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
"index_name": "'$AZURE_AI_SEARCH_INDEX'",
"authentication": {
"type": "api_key",
"key": "'$AZURE_AI_SEARCH_API_KEY'"
}
}
}
],
"messages": [
{
"role": "user",
"content": "What are my available health plans?"
}
]
}
'
出力例
{
"id": "12345678-1a2b-3c4e5f-a123-12345678abcd",
"model": "gpt-4",
"created": 1709835345,
"object": "extensions.chat.completion",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans. [doc1].",
"end_turn": true,
"context": {
"citations": [
{
"content": "...",
"title": "...",
"url": "https://mysearch.blob.core.windows.net/xyz/001.txt",
"filepath": "001.txt",
"chunk_id": "0"
}
],
"intent": "[\"Available health plans\"]"
}
}
}
],
"usage": {
"prompt_tokens": 3779,
"completion_tokens": 105,
"total_tokens": 3884
},
"system_fingerprint": "fp_65792305e4"
}
Web アプリを使用してモデルとチャットする
データを使用する Azure OpenAI モデルとのチャットを開始するには、GitHub で提供されている Azure AI Foundry ポータルまたはサンプル コードを使用して Web アプリをデプロイできます。 このアプリは、Azure App Service を使用してデプロイされます。これにより、クエリを送信するためのユーザー インターフェイスが提供されます。 このアプリは、データを使用する Azure OpenAI モデル、またはデータを使用しないモデルで使用できます。 要件、セットアップ、デプロイの手順については、リポジトリ内の readme ファイルを参照してください。 必要に応じて、ソース コードに変更を加えることで、Web アプリの フロントエンドとバックエンドのロジック をカスタマイズできます。
リソースをクリーンアップする
Azure OpenAI リソースまたは Azure AI Search リソースをクリーンアップして削除する場合は、リソースまたはリソース グループを削除します。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。