跳到主要内容

OpenAI 公式 SDK

备注

これは公式OpenAI Java SDKを使用するOpenAI 公式 SDK統合のドキュメントです。

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

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

この統合のユースケース

この統合はOpenAI Java SDK GitHubリポジトリを使用し、以下が提供するすべてのOpenAIモデルで動作します:

  • OpenAI
  • Azure OpenAI
  • GitHub Models

また、DeepSeekなどのOpenAI APIをサポートするモデルでも動作します。

OpenAIドキュメント

Maven依存関係

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-official</artifactId>
<version>1.0.0-beta4</version>
</dependency>

モデルの設定

备注

この設定と次のセクションの使用方法は、非ストリーミングモード(「ブロッキング」または「同期」モードとも呼ばれます)のためのものです。 ストリーミングモードについては2セクション後で詳しく説明します:モデルとのリアルタイムチャットを可能にしますが、使用はより複雑です。

OpenAIモデルを使用するには、通常、エンドポイントURL、APIキー、モデル名が必要です。これはモデルがホストされている場所によって異なり、この統合は いくつかの自動設定でより簡単にしようとしています:

一般的な設定

import com.openai.models.ChatModel;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openaiofficial.OpenAiOfficialChatModel;

// ....

ChatModel model = OpenAiOfficialChatModel.builder()
.baseUrl(System.getenv("OPENAI_BASE_URL"))
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(ChatModel.GPT_4O_MINI)
.build();

OpenAI設定

OpenAIのbaseUrlhttps://api.openai.com/v1)はデフォルトなので、省略できます:

ChatModel model = OpenAiOfficialChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(ChatModel.GPT_4O_MINI)
.build();

Azure OpenAI設定

一般的な設定

Azure OpenAIの場合、baseUrlの設定は必須であり、そのURLがopenai.azure.comで終わる場合、Azure OpenAIが自動的に検出されます:

ChatModel model = OpenAiOfficialChatModel.builder()
.baseUrl(System.getenv("AZURE_OPENAI_ENDPOINT"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.modelName(ChatModel.GPT_4O_MINI)
.build();

Azure OpenAIの使用を強制したい場合は、isAzure()メソッドも使用できます:

ChatModel model = OpenAiOfficialChatModel.builder()
.baseUrl(System.getenv("AZURE_OPENAI_ENDPOINT"))
.apiKey(System.getenv("AZURE_OPENAI_KEY"))
.isAzure(true)
.modelName(ChatModel.GPT_4O_MINI)
.build();

パスワードレス認証

「パスワードレス」認証を使用してAzure OpenAIに認証することができます。これはAPIキーを管理する必要がないため、より安全です。

そのためには、まずAzure OpenAIインスタンスがマネージドIDをサポートするように設定し、このアプリケーションにアクセス権を与える必要があります。例えば:

# Azure OpenAIインスタンスでシステムマネージドIDを有効にする
az cognitiveservices account identity assign \
--name <your-openai-instance-name> \
--resource-group <your-resource-group>

# ログインしているIDを取得する
az ad signed-in-user show \
--query id -o tsv

# Azure OpenAIインスタンスへのアクセス権を付与する
az role assignment create \
--role "Cognitive Services OpenAI User" \
--assignee <your-logged-identity-from-the-previous-command> \
--scope "/subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>"

次に、Maven pom.xmlazure-identity依存関係を追加する必要があります:

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

APIキーが設定されていない場合、LangChain4jはAzure OpenAIでパスワードレス認証を自動的に使用します。

GitHub Models設定

GitHub Modelsの場合、デフォルトのbaseUrlhttps://models.inference.ai.azure.com)を使用できます:

ChatModel model = OpenAiOfficialChatModel.builder()
.baseUrl("https://models.inference.ai.azure.com")
.apiKey(System.getenv("GITHUB_TOKEN"))
.modelName(ChatModel.GPT_4O_MINI)
.build();

または、GitHub Modelsの使用を強制するためにisGitHubModels()メソッドを使用することもできます。これによりbaseUrlが自動的に設定されます:

ChatModel model = OpenAiOfficialChatModel.builder()
.apiKey(System.getenv("GITHUB_TOKEN"))
.modelName(ChatModel.GPT_4O_MINI)
.isGitHubModels(true)
.build();

GitHub ModelsはGitHub ActionsやGitHub Codespacesを使用する際に自動的に入力されるGITHUB_TOKEN環境変数を使用して設定されることが多いため、自動的に検出されます:

ChatModel model = OpenAiOfficialChatModel.builder()
.modelName(ChatModel.GPT_4O_MINI)
.isGitHubModels(true)
.build();

この最後の設定は使いやすく、GITHUB_TOKEN環境変数がコードやGitHubログに公開されないため、より安全です。

モデルの使用

前のセクションでは、ChatModelインターフェースを実装するOpenAiOfficialChatModelオブジェクトが作成されました。

これはAIサービスによって使用されるか、Javaアプリケーションで直接使用されます。

この例では、Spring Beanとしてオートワイヤリングされています:

@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);
}
}

構造化出力

構造化出力機能は ツールレスポンスフォーマットの両方でサポートされています。

構造化出力の詳細についてはこちらをご覧ください。

ツール用の構造化出力

ツールの構造化出力機能を有効にするには、モデルを構築する際に.strictTools(true)を設定します:

OpenAiOfficialChatModel.builder()
// ...
.strictTools(true)
.build();

これにより、現在のOpenAIの制限により、すべてのツールパラメータが必須(JSONスキーマではrequired)になり、 JSONスキーマの各objectに対してadditionalProperties=falseが設定されることに注意してください。

レスポンスフォーマット用の構造化出力

AIサービスを使用する際にレスポンスフォーマット用の構造化出力機能を有効にするには、 モデルを構築する際にsupportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA)).strictJsonSchema(true)を設定します:

import static dev.langchain4j.model.chat.Capability.RESPONSE_FORMAT_JSON_SCHEMA;

// ...

OpenAiChatModel.builder()
// ...
.supportedCapabilities(Set.of(RESPONSE_FORMAT_JSON_SCHEMA))
.strictJsonSchema(true)
.build();

この場合、AIサービスは指定されたPOJOからJSONスキーマを自動的に生成し、それをLLMに渡します。

ストリーミング用のモデル設定

备注

上記の2つのセクションでは、非ストリーミングモード(「ブロッキング」または「同期」モードとも呼ばれます)のモデル設定について詳しく説明しました。 このセクションはストリーミングモード用であり、モデルとのリアルタイムチャットを可能にしますが、使用はより複雑です。

これは非ストリーミングモードと似ていますが、OpenAiOfficialChatModelの代わりにOpenAiOfficialStreamingChatModelクラスを使用する必要があります:

StreamingChatModel model = OpenAiOfficialStreamingChatModel.builder()
.baseUrl(System.getenv("OPENAI_BASE_URL"))
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(ChatModel.GPT_4O_MINI)
.build();

非ストリーミング設定セクションで詳述されているように、Azure OpenAIまたはGitHub Modelsの使用を強制するために、特定のisAzure()およびisGitHubModels()メソッドを使用することもできます。