Azure OpenAI チャット
ChatGPT を搭載した Azure の OpenAI 製品は、従来の OpenAI 機能を超え、強化された機能を備えた AI 駆動型テキスト生成を提供します。Azure は、最近のアップデートで強調されているように、追加の AI 安全性と責任ある AI 機能を提供します。
Azure は、Azure 上の Vector ストアなどの AI 関連リソースを含む一連の Azure サービスと AI を統合することで、Java 開発者に AI の可能性を最大限に活用する機会を提供します。
前提条件
Azure OpenAI クライアントには、Azure API キーを使用するか、OpenAI API キーを使用するか、Microsoft Entra ID を使用するかの 3 つの接続オプションがあります。
Azure API キーとエンドポイント
Azure ポータル (英語) の Azure OpenAI サービスセクションから Azure、OpenAI、endpoint
、api-key
を入手します。
Spring AI は 2 つの構成プロパティを定義します。
spring.ai.azure.openai.api-key
: これを Azure から取得したAPI Key
の値に設定します。spring.ai.azure.openai.endpoint
: Azure でモデルをプロビジョニングするときに取得したエンドポイント URL に設定します。
環境変数をエクスポートすることで、これらの構成プロパティを設定できます。
export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT AZURE KEY HERE>
export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>
OpenAI キー
OpenAI サービス (Azure ではない) で認証するには、OpenAI API キーを指定します。これにより、エンドポイントが自動的に api.openai.com/v1 (英語) に設定されます。
この方法を使用する場合は、spring.ai.azure.openai.chat.options.deployment-name
プロパティを、使用する OpenAI モデル (英語) の名前に設定します。
export SPRING_AI_AZURE_OPENAI_OPENAI_API_KEY=<INSERT OPENAI KEY HERE>
マイクロソフトエントラ ID
Microsoft Entra ID (旧称 Azure Active Directory) を使用して認証するには、構成に TokenCredential
Bean を作成します。この Bean が使用可能な場合は、トークン資格情報を使用して OpenAIClient
インスタンスが作成されます。bd === デプロイ名
Azure AI アプリケーションを使用するには、Azure AI ポータル (英語) を介して Azure AI デプロイを作成する必要があります。Azure では、各クライアントが Deployment Name
を指定して Azure OpenAI サービスに接続する必要があります。Deployment Name
は、デプロイするモデルとは異なることに注意してください。例: 'MyAiDeployment' という名前の デプロイは、GPT 3.5 Turbo モデルまたは GPT 4.0 モデルのいずれかを使用するように構成できます。
まず、次の手順に従って、デフォルト設定で デプロイを作成します。
Deployment Name: `gpt-4o` Model Name: `gpt-4o`
この Azure 構成は、Spring Boot Azure AI スターターとその自動構成機能のデフォルト構成と一致しています。別の デプロイ名を使用する場合は、それに応じて構成プロパティを更新してください。
spring.ai.azure.openai.chat.options.deployment-name=<my deployment name>
Azure、OpenAI、OpenAI の異なる デプロイ構造により、Azure、OpenAI クライアントライブラリに deploymentOrModelName
というプロパティが作成されます。これは、OpenAI には Deployment Name
がなく、Model Name
のみがあるためです。
プロパティ spring.ai.azure.openai.chat.options.model の名前が spring.ai.azure.openai.chat.options.deployment-name に変更されました。 |
spring.ai.azure.openai.openai-api-key=<Your OpenAI Key> プロパティを設定して、Azure OpeanAI ではなく OpenAI に接続することにした場合、spring.ai.azure.openai.chat.options.deployment-name は OpenAI モデル (英語) 名として扱われます。 |
自動構成
Spring AI は、Azure OpenAI チャットクライアント用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml
ファイルに次の依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>
または、Gradle build.gradle
ビルドファイルに保存します。
dependencies {
implementation 'org.springframework.ai:spring-ai-azure-openai-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
チャットのプロパティ
プレフィックス spring.ai.azure.openai
は、Azure OpenAI への接続を構成するプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.azure.openai.api-key |
| - |
spring.ai.azure.openai.endpoint |
| - |
spring.ai.azure.openai.openai-api-key | (非 Azure) OpenAI API キー。Azure OpenAI ではなく、OpenAI サービスで認証するために使用されます。これにより、エンドポイントが api.openai.com/v1 (英語) に自動的に設定されます。 | - |
プレフィックス spring.ai.azure.openai.chat
は、Azure OpenAI の ChatModel
実装を構成するプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.azure.openai.chat.enabled | Azure OpenAI チャットモデルを有効にします。 | true |
spring.ai.azure.openai.chat.options.deployment-name | Azure で使用する場合、これはモデルの「デプロイ名」を指し、oai.azure.com/portal (英語) で確認できます。Azure、OpenAI、デプロイ内では、「デプロイ名」はモデル自体とは異なることに注意してください。これらの用語に関する混乱は、Azure、OpenAI クライアントライブラリを元の OpenAI エンドポイントと互換性を持たせる意図から生じています。Azure、OpenAI、Sam Altman の OpenAI によって提供される デプロイ構造は大きく異なります。この補完リクエストの一部として提供する デプロイモデル名。 | gpt-4o |
spring.ai.azure.openai.chat.options.maxTokens | 生成するトークンの最大数。 | - |
spring.ai.azure.openai.chat.options.temperature | 生成される補完の見かけの創造性を制御するために使用するサンプリング温度。値を高くすると出力がよりランダムになり、値を低くすると結果がより集中的で決定的になります。これら 2 つの設定の相互作用を予測するのは難しいため、同じ完了リクエストに対して温度と top_p を変更することはお勧めできません。 | 0.7 |
spring.ai.azure.openai.chat.options.topP | 温度によるサンプリングの代替方法は、核サンプリングと呼ばれます。この値により、モデルは指定された確率質量を持つトークンの結果を考慮します。 | - |
spring.ai.azure.openai.chat.options.logitBias | GPT トークン ID とバイアススコア間のマップ。完了レスポンスに特定のトークンが現れる確率に影響します。トークン ID は外部トークナイザーツールを介して計算されますが、バイアススコアは -100 ~ 100 の範囲内にあり、最小値と最大値はそれぞれトークンの完全な禁止または排他的選択に対応します。特定のバイアススコアの正確な動作はモデルによって異なります。 | - |
spring.ai.azure.openai.chat.options.user | 操作の呼び出し元またはエンドユーザーの識別子。これは、追跡またはレート制限の目的で使用される場合があります。 | - |
spring.ai.azure.openai.chat.options.n | チャット補完レスポンスに対して生成する必要があるチャット補完の選択肢の数。 | - |
spring.ai.azure.openai.chat.options.stop | 補完の生成を終了するテキストシーケンスのコレクション。 | - |
spring.ai.azure.openai.chat.options.presencePenalty | 生成されたテキスト内の既存の存在に基づいて、生成されたトークンが出現する確率に影響を与える値。正の値を指定すると、トークンがすでに存在する場合にトークンが表示される可能性が低くなり、モデルが新しいトピックを出力する可能性が高くなります。 | - |
spring.ai.azure.openai.chat.options.responseFormat | モデルが出力する必要がある形式を指定するオブジェクト。 | - |
spring.ai.azure.openai.chat.options.frequencyPenalty | 生成されたテキスト内の累積頻度に基づいて、生成されたトークンが出現する確率に影響を与える値。正の値を指定すると、トークンの頻度が増加するにつれてトークンが出現する可能性が低くなり、モデルが同じステートメントを逐語的に繰り返す可能性が低くなります。 | - |
spring.ai.azure.openai.chat.options というプレフィックスが付いたすべてのプロパティは、リクエスト固有のランタイムオプションを Prompt 呼び出しに追加することで実行時にオーバーライドできます。 |
ランタイムオプション
AzureOpenAiChatOptions.java [GitHub] (英語) は、使用するモデル、温度、周波数ペナルティなどのモデル構成を提供します。
起動時に、AzureOpenAiChatModel(api, options)
コンストラクターまたは spring.ai.azure.openai.chat.options.*
プロパティを使用してデフォルトのオプションを構成できます。
実行時に、新しいリクエスト固有のオプションを Prompt
呼び出しに追加することで、デフォルトのオプションをオーバーライドできます。たとえば、特定のリクエストのデフォルトのモデルと温度をオーバーライドするには、次のようにします。
ChatResponse response = chatModel.call(
new Prompt(
"Generate the names of 5 famous pirates.",
AzureOpenAiChatOptions.builder()
.withModel("gpt-4-o")
.withTemperature(0.4)
.build()
));
モデル固有の AzureOpenAiChatOptions.java [GitHub] (英語) に加えて、ChatOptionsBuilder#builder() [GitHub] (英語) で作成されたポータブル ChatOptions [GitHub] (英語) インスタンスを使用できます。 |
関数呼び出し
カスタム Java 関数を AzureOpenAiChatModel に登録すると、登録された関数の 1 つまたは複数を呼び出すための引数を含む JSON オブジェクトの出力をモデルがインテリジェントに選択できます。これは、LLM 機能を外部ツールや API に接続するための強力な手法です。Azure OpenAI 関数呼び出しについて詳しく参照してください。
マルチモーダル
マルチモーダル性とは、テキスト、イメージ、音声、その他のデータ形式など、さまざまなソースからの情報を同時に理解して処理するモデルの機能を指します。現在、Azure、OpenAI、gpt-4o
モデルはマルチモーダルサポートを提供しています。
Azure OpenAI は、メッセージに base64 でエンコードされたイメージのリストまたはイメージ URL を組み込むことができます。Spring AI のメッセージ [GitHub] (英語) インターフェースは、メディア [GitHub] (英語) 型を導入することで、マルチモーダル AI モデルをサポートします。この型には、メッセージ内のメディア添付ファイルに関するデータと詳細が含まれており、Spring の org.springframework.util.MimeType
と、生のメディアデータ用の java.lang.Object
が使用されます。
以下は、OpenAiChatModelIT.java [GitHub] (英語) から抜粋したコード例であり、GPT_4_O
モデルを使用してユーザーテキストとイメージを融合する方法を示しています。
URL url = new URL("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png");
String response = ChatClient.create(chatModel).prompt()
.options(AzureOpenAiChatOptions.builder().withDeploymentName("gpt4o").build())
.user(u -> u.text("Explain what do you see on this picture?").media(MimeTypeUtils.IMAGE_PNG, url))
.call()
.content();
複数のイメージを渡すこともできます。 |
入力イメージ multimodal.test.png
:
"Explain what do you see on this picture?" というテキストメッセージで、次のようなレスポンスが生成されます。
This is an image of a fruit bowl with a simple design. The bowl is made of metal with curved wire edges that create an open structure, allowing the fruit to be visible from all angles. Inside the bowl, there are two yellow bananas resting on top of what appears to be a red apple. The bananas are slightly overripe, as indicated by the brown spots on their peels. The bowl has a metal ring at the top, likely to serve as a handle for carrying. The bowl is placed on a flat surface with a neutral-colored background that provides a clear view of the fruit inside.
以下の例に示すように、URL の代わりにクラスパスリソースを渡すこともできます。
Resource resource = new ClassPathResource("multimodality/multimodal.test.png");
String response = ChatClient.create(chatModel).prompt()
.options(AzureOpenAiChatOptions.builder()
.withDeploymentName("gpt-4o").build())
.user(u -> u.text("Explain what do you see on this picture?")
.media(MimeTypeUtils.IMAGE_PNG, resource))
.call()
.content();
サンプルコントローラー
新しい Spring Boot プロジェクトを作成し、spring-ai-azure-openai-spring-boot-starter
を pom (または gradle) の依存関係に追加します。
src/main/resources
ディレクトリに application.properties
ファイルを追加して、OpenAi チャットモデルを有効にして構成します。
spring.ai.azure.openai.api-key=YOUR_API_KEY
spring.ai.azure.openai.endpoint=YOUR_ENDPOINT
spring.ai.azure.openai.chat.options.deployment-name=gpt-4o
spring.ai.azure.openai.chat.options.temperature=0.7
api-key と endpoint を Azure OpenAI の資格情報に置き換えます。 |
これにより、クラスに挿入できる AzureOpenAiChatModel
実装が作成されます。以下は、テキスト生成にチャットモデルを使用する単純な @Controller
クラスの例です。
@RestController
public class ChatController {
private final AzureOpenAiChatModel chatModel;
@Autowired
public ChatController(AzureOpenAiChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", chatModel.call(message));
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatModel.stream(prompt);
}
}
手動構成
AzureOpenAiChatModel [GitHub] (英語) は ChatModel
および StreamingChatModel
を実装し、Azure OpenAI Java クライアント (英語) を使用します。
これを有効にするには、プロジェクトの Maven pom.xml
ファイルに spring-ai-azure-openai
依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-azure-openai</artifactId>
</dependency>
または、Gradle build.gradle
ビルドファイルに保存します。
dependencies {
implementation 'org.springframework.ai:spring-ai-azure-openai'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
spring-ai-azure-openai 依存関係により、AzureOpenAiChatModel へのアクセスも提供されます。AzureOpenAiChatModel の詳細については、Azure OpenAI チャットセクションを参照してください。 |
次に、AzureOpenAiChatModel
インスタンスを作成し、それを使用してテキストレスポンスを生成します。
var openAIClient = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(System.getenv("AZURE_OPENAI_API_KEY")))
.endpoint(System.getenv("AZURE_OPENAI_ENDPOINT"))
.buildClient();
var openAIChatOptions = AzureOpenAiChatOptions.builder()
.withDeploymentName("gpt-4o")
.withTemperature(0.4f)
.withMaxTokens(200)
.build();
var chatModel = new AzureOpenAiChatModel(openAIClient, openAIChatOptions);
ChatResponse response = chatModel.call(
new Prompt("Generate the names of 5 famous pirates."));
// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(
new Prompt("Generate the names of 5 famous pirates."));
gpt-4o は、Azure AI ポータルで示されているように、実際には Deployment Name です。 |