跳到主要内容

Azure OpenAI

备注

これは、Microsoft Azure SDKを使用するAzure OpenAI統合のドキュメントで、Microsoft Javaスタック(高度なAzure認証メカニズムを含む)を使用している場合に最適です。

LangChain4j はチャットモデル用に 3 つの異なる OpenAI 統合を提供しており、これはその #3 です:

  • OpenAIは、OpenAI REST APIのカスタムJava実装を使用し、Quarkus(Quarkus RESTクライアントを使用)とSpring(SpringのRestClientを使用)で最適に動作します。
  • OpenAI公式SDKは、OpenAIの公式Java SDKを使用します。
  • Azure OpenAIは、Microsoft Azure SDKを使用し、高度なAzure認証メカニズムを含むMicrosoft Javaスタックを使用している場合に最適です。

Azure OpenAI は、Azure OpenAI Java SDK を使用して、Azure 上でホストされている OpenAI の言語モデル(gpt-4、gpt-4o など)を提供します。

Azure OpenAIドキュメント​

Maven依存関係​

通常のJava​

langchain4j-azure-open-aiライブラリはMaven Centralで利用可能です。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai</artifactId>
<version>1.23.0</version>
</dependency>

Spring Boot​

Spring Bootスターターを使用すると、langchain4j-azure-open-aiライブラリをより簡単に設定できます。

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai-spring-boot4-starter</artifactId>
<version>1.23.0-beta33</version>
</dependency>
备注

この starter には Spring Boot 4 が必要です。Spring Boot 3 では、代わりに langchain4j-azure-open-ai-spring-boot-starter を使用してください。 詳細は Spring Boot 統合を参照してください。

备注

Azure OpenAIモデルを使用する前に、それらをデプロイする必要があります。

APIキーを使用したAzureOpenAiChatModelの作成​

通常のJava​

ChatModel model = AzureOpenAiChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
...
.build();

これにより、指定したエンドポイント、API キー、デプロイ名で AzureOpenAiChatModel のインスタンスが作成されます。 デフォルトのモデルパラメータは、ビルダーで値を提供することでカスタマイズできます。

Spring Boot​

application.propertiesに追加:

langchain4j.azure-open-ai.chat-model.endpoint=${AZURE_OPENAI_URL}
langchain4j.azure-open-ai.chat-model.service-version=...
langchain4j.azure-open-ai.chat-model.api-key=${AZURE_OPENAI_KEY}
langchain4j.azure-open-ai.chat-model.non-azure-api-key=${OPENAI_API_KEY}
langchain4j.azure-open-ai.chat-model.deployment-name=gpt-4o
langchain4j.azure-open-ai.chat-model.max-completion-tokens=...
langchain4j.azure-open-ai.chat-model.max-tokens=...
langchain4j.azure-open-ai.chat-model.temperature=...
langchain4j.azure-open-ai.chat-model.top-p=
langchain4j.azure-open-ai.chat-model.logit-bias=...
langchain4j.azure-open-ai.chat-model.user=
langchain4j.azure-open-ai.chat-model.stop=...
langchain4j.azure-open-ai.chat-model.presence-penalty=...
langchain4j.azure-open-ai.chat-model.frequency-penalty=...
langchain4j.azure-open-ai.chat-model.seed=...
langchain4j.azure-open-ai.chat-model.strict-json-schema=...
langchain4j.azure-open-ai.chat-model.timeout=...
langchain4j.azure-open-ai.chat-model.max-retries=...
langchain4j.azure-open-ai.chat-model.log-requests-and-responses=...
langchain4j.azure-open-ai.chat-model.user-agent-suffix=
langchain4j.azure-open-ai.chat-model.custom-headers=...
langchain4j.azure-open-ai.chat-model.reasoningEffort=...

上記のパラメータの一部の説明はこちらで確認できます。

この設定により、AzureOpenAiChatModelビーン(デフォルトのモデルパラメータを持つ)が作成され、 AIサービスで使用するか、 必要な場所でオートワイヤすることができます。例えば:

@RestController
class ChatModelController {

ChatModel chatModel;

ChatModelController(ChatModel chatModel) {
this.chatModel = chatModel;
}

@GetMapping("/model")
public String model(@RequestParam(value = "message", defaultValue = "Hello") String message) {
return chatModel.chat(message);
}
}

Azure認証情報を使用したAzureOpenAiChatModelの作成​

APIキーにはいくつかのセキュリティ問題(コミットされる可能性、共有される可能性など)があります。 セキュリティを向上させたい場合は、代わりにAzure認証情報を使用することをお勧めします。 そのためには、プロジェクトにazure-identity依存関係を追加する必要があります。

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<scope>compile</scope>
</dependency>

その後、DefaultAzureCredentialBuilder API を使用して AzureOpenAiChatModel を作成できます:

ChatModel model = AzureOpenAiChatModel.builder()
.deploymentName("gpt-4o")
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.tokenCredential(new DefaultAzureCredentialBuilder().build())
.build();
备注

マネージドIDを使用してモデルをデプロイする必要があることに注意してください。詳細については、Azure CLIデプロイメントスクリプトを確認してください。

ツール​

ツール(「関数呼び出し」とも呼ばれる)はサポートされており、モデルがJavaコード内のメソッドを呼び出すことを可能にします。並列ツール呼び出しも含まれます。 「関数呼び出し」はOpenAIのドキュメントでこちらに説明されています。

备注

LangChain4jでの「関数呼び出し」の使用方法に関する完全なチュートリアルはこちらにあります。

関数はToolSpecificationクラスを使用して指定できますが、次の例のように@Toolアノテーションを使用するとより簡単です:

class StockPriceService {

private Logger log = Logger.getLogger(StockPriceService.class.getName());

@Tool("Get the stock price of a company by its ticker")
public double getStockPrice(@P("Company ticker") String ticker) {
log.info("Getting stock price for " + ticker);
if (Objects.equals(ticker, "MSFT")) {
return 400.0;
} else {
return 0.0;
}
}
}

その後、次のように AI Assistant で StockPriceService を使用できます:


interface Assistant {
String chat(String userMessage);
}

public class Demo {
String functionCalling(Model model) {
String question = "Is the current Microsoft stock higher than $450?";
StockPriceService stockPriceService = new StockPriceService();

Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(model)
.tools(stockPriceService)
.build();

String answer = assistant.chat(question);

model.addAttribute("answer", answer);
return "demo";
}
}

Structured Outputs​

Structured Outputs(構造化出力)は、モデルのレスポンスが JSON スキーマに準拠することを保証します。

备注

LangChain4j での Structured Outputs の使用方法に関するドキュメントはこちらにあり、以下のセクションでは Azure OpenAI 固有の情報を説明します。

JSON スキーマへの準拠を強制するには、モデルで strictJsonSchema パラメータを true に設定する必要があります:

ChatModel model = AzureOpenAiChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
.strictJsonSchema(true)
.supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA))
.build();
备注

strictJsonSchema を false に設定して JSON スキーマを指定した場合、モデルはスキーマに準拠したレスポンスを生成しようとしますが、レスポンスがスキーマに準拠していなくても失敗しません。これを行う理由の 1 つは、パフォーマンスの向上です。

その後、以下で詳しく説明するように、このモデルを高レベルの Assistant API または低レベルの ChatModel API のどちらでも使用できます。 高レベルの Assistant API で使用する場合は、supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA)) を設定して、JSON スキーマによる構造化出力を有効にします。

高レベル Assistant API の使用​

前のセクションのツールの場合と同様に、Structured Output は AI Assistant で自動的に使用できます:


interface PersonAssistant {
Person extractPerson(String message);
}

class Person {
private final String name;
private final List<String> favouriteColors;

public Person(String name, List<String> favouriteColors) {
this.name = name;
this.favouriteColors = favouriteColors;
}

public String getName() {
return name;
}

public List<String> getFavouriteColors() {
return favouriteColors;
}
}

この Assistant は、次の例のように、Person クラスに対応する JSON スキーマにレスポンスが準拠するようにします:

String question = "Julien likes the colors blue, white and red";

PersonAssistant assistant = AiServices.builder(PersonAssistant.class)
.chatModel(chatModel)
.build();

Person person = assistant.extractPerson(question);

低レベル ChatModel API の使用​

これは高レベル API と同様のプロセスですが、今回は JSON スキーマを手動で設定する必要があり、JSON レスポンスを Java オブジェクトにマッピングする作業も手動で行います。

モデルを設定したら、リクエストごとに ChatRequest オブジェクトで JSON スキーマを指定する必要があります。 その後、モデルは次の例のようにスキーマに準拠したレスポンスを生成します:

ChatRequest chatRequest = ChatRequest.builder()
.messages(UserMessage.from("Julien likes the colors blue, white and red"))
.responseFormat(ResponseFormat.builder()
.type(JSON)
.jsonSchema(JsonSchema.builder()
.name("Person")
.rootElement(JsonObjectSchema.builder()
.addStringProperty("name")
.addProperty("favouriteColors", JsonArraySchema.builder()
.items(new JsonStringSchema())
.build())
.required("name", "favouriteColors")
.build())
.build())
.build())
.build();

String answer = chatModel.chat(chatRequest).aiMessage().text();

In this example, the answer will be:

{
"name": "Julien",
"favouriteColors": ["blue", "white", "red"]
}

この JSON レスポンスは通常、Jackson などのライブラリを使用して Java オブジェクトにデシリアライズされます。

Creating AzureOpenAiStreamingChatModel to stream results​

この実装は上記の AzureOpenAiChatModel と似ていますが、レスポンスをトークンごとにストリーミングします。

Plain Java​

StreamingChatModel model = AzureOpenAiStreamingChatModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("gpt-4o")
...
.build();

Spring Boot​

Add to the application.properties:

langchain4j.azure-open-ai.streaming-chat-model.endpoint=${AZURE_OPENAI_URL}
langchain4j.azure-open-ai.streaming-chat-model.service-version=...
langchain4j.azure-open-ai.streaming-chat-model.api-key=${AZURE_OPENAI_KEY}
langchain4j.azure-open-ai.streaming-chat-model.deployment-name=gpt-4o
langchain4j.azure-open-ai.streaming-chat-model.max-completion-tokens=...
langchain4j.azure-open-ai.streaming-chat-model.max-tokens=...
langchain4j.azure-open-ai.streaming-chat-model.temperature=...
langchain4j.azure-open-ai.streaming-chat-model.top-p=...
langchain4j.azure-open-ai.streaming-chat-model.logit-bias=...
langchain4j.azure-open-ai.streaming-chat-model.user=...
langchain4j.azure-open-ai.streaming-chat-model.stop=...
langchain4j.azure-open-ai.streaming-chat-model.presence-penalty=...
langchain4j.azure-open-ai.streaming-chat-model.frequency-penalty=...
langchain4j.azure-open-ai.streaming-chat-model.seed=...
langchain4j.azure-open-ai.streaming-chat-model.timeout=...
langchain4j.azure-open-ai.streaming-chat-model.max-retries=...
langchain4j.azure-open-ai.streaming-chat-model.log-requests-and-responses=...
langchain4j.azure-open-ai.streaming-chat-model.user-agent-suffix=...
langchain4j.azure-open-ai.streaming-chat-model.customHeaders=...
langchain4j.azure-open-ai.streaming-chat-model.reasoningEffort=...

音声文字起こし(Audio Transcription)​

Azure OpenAI は音声の文字起こしをサポートするようになり、Azure 上でホストされている最先端のモデルを使って、音声ファイルの話し言葉をテキストに変換できます。

Maven 依存関係​

音声文字起こし機能は、メインの langchain4j-azure-open-ai パッケージに含まれています:

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai</artifactId>
<version>1.23.0</version>
</dependency>

プレーン Java での使用​

AzureOpenAiAudioTranscriptionModel を使用して音声ファイルを文字起こしできます:

import dev.langchain4j.data.audio.Audio;
import dev.langchain4j.model.audio.AudioTranscriptionRequest;
import dev.langchain4j.model.audio.AudioTranscriptionResponse;
import java.io.File;
import java.nio.file.Files;

AzureOpenAiAudioTranscriptionModel model = AzureOpenAiAudioTranscriptionModel.builder()
.endpoint(System.getenv("AZURE_OPENAI_URL"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.deploymentName("your-audio-model-deployment-name") // e.g., "whisper"
.build();

// Read audio file as binary data
File audioFile = new File("path/to/audio-file.wav");
byte[] audioData = Files.readAllBytes(audioFile.toPath());

// Create Audio object with binary data
Audio audio = Audio.builder()
.binaryData(audioData)
.build();

// Create transcription request
AudioTranscriptionRequest request = AudioTranscriptionRequest.builder()
.audio(audio)
.prompt("This is an audio file containing ...") // optional
.language("en") // optional
.temperature(0.0) // optional
.build();

// Transcribe audio
AudioTranscriptionResponse response = model.transcribe(request);
String transcript = response.text();
System.out.println(transcript);

注意事項​

  • デプロイ:Azure OpenAI リソースに音声文字起こしモデル(Whisper など)をデプロイする必要があります。詳細は Azure OpenAI ドキュメントを参照してください。
  • サポートされる形式:WAV、MP3、FLAC などの一般的な音声形式がサポートされています。
  • クォータと料金:音声文字起こしは Azure サブスクリプションのリソースを消費します。適用されるクォータと料金は Azure ポータルで確認してください。

Examples​