OpenAI 互換言語モデル
多くのサービスやツールが OpenAI 互換 API を公開しています。LangChain4j でそれらを使う一般的な手順は次のとおりです:
-
Base URL を特定する: サービスの API エンドポイントを見つけます。多くの場合
/v1で終わります。 -
API Key を取得する: サービスが認証を必要とする場合は API キーを取得します。ローカルサービスでキーが不要な場合は、
apiKeyパラメータにプレースホルダーを入れてください。 -
モデル名を指定する: サービスで使う正しいモデル名を確認します。多くの場合必須です。
-
OpenAiChatModelまたはOpenAiStreamingChatModelを設定する:ChatModel model = OpenAiChatModel.builder()
.baseUrl("YOUR_API_BASE_URL") // e.g., "http://localhost:8000/v1"
.apiKey("YOUR_API_KEY_OR_PLACEHOLDER") // e.g., "sk-yourkey" or "none"
.modelName("MODEL_NAME_AS_PER_PROVIDER_DOCS") // e.g., "gpt-3.5-turbo" or custom name
// Add other configurations like temperature, timeout, etc. as needed
.logRequests(true)
.logResponses(true)
.build();
特定の OpenAI 互換 API 向け設定
一部の OpenAI 互換 API は、特にツール呼び出しにおけるストリーミング応答の挙動が異なる場合があります。LangChain4j はこれらの違いに対応する設定オプションを提供します:
accumulateToolCallId(OpenAiStreamingChatModel 用)
ストリーミング応答におけるツール呼び出し ID の扱いを制御します。デフォルトは true です。
- 有効(
true):ツール呼び出し ID はストリーミングチャンク間で蓄積されます(標準の OpenAI 挙動)- 例:チャンク 1 が "abc"、チャンク 2 が "def" → 最終 ID:"abcdef"
- 無効(
false):各チャンクのツール呼び出し ID が前のものを置き換えます- 例:チャンク 1 が "abc"、チャンク 2 が "abc" → 最終 ID:"abc"
- すべてのチャンクで完全なツール呼び出し ID を送る DeepSeek や Qwen などの API で使用します
StreamingChatModel model = OpenAiStreamingChatModel.builder()
.baseUrl("https://api.deepseek.com/v1") // or other provider
.apiKey("YOUR_API_KEY")
.modelName("deepseek-chat")
.accumulateToolCallId(false) // Set to false for DeepSeek, Qwen, etc.
.build();
以下では、Tuning Engines、Groq、Docker Model Runner、GPT4All、Ollama、LM Studio を含む、人気の OpenAI 互換 API 向けの具体例を示します。
目次:
OpenAI 互換言語モデルを使う前提条件
LangChain4j の OpenAI モジュールは、ローカルおよびクラウドベースのソリューションを含む、さまざまな OpenAI 互換 API で利用できます。以下の各モデルについて、標準の OpenAI 例 と同様にモデルとチャットできる ChatModel の作成方法を示します。
まず、pom.xml または Gradle ビルドファイルに OpenAI モジュールがあることを確認してください:
プレーン Java
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.18.1</version>
</dependency>
Spring Boot
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.18.1-beta28</version>
</dependency>
Tuning Engines
デプロイ: SaaS(キー必須)
説明: Tuning Engines は、モデルプロバイダーの前に置ける OpenAI 互換エンドポイントを公開します。LangChain4j はアプリケーションとエージェントロジックを保持し、エンドポイント側でルーティング、ポリシー制御、監査ログ、トレース 、承認、コスト可視化を集中管理できます。
ChatModel model = OpenAiChatModel.builder()
.baseUrl("https://api.tuningengines.com/v1")
.apiKey(System.getenv("TUNING_ENGINES_API_KEY"))
.modelName("gpt-4o-mini")
.build();
Groq
デプロイ: SaaS(キー必須)
説明: Groq は LLM 向けに非常に高速な推論を提供します。
セットアップ: Groq を使うには GroqCloud の API キーが必要です。
LangChain4j の OpenAiChatModel または OpenAiStreamingChatModel を設定します:
ChatModel model = OpenAiChatModel.builder()
.baseUrl("https://api.groq.com/openai/v1")
.apiKey(System.getenv("GROQ_API_KEY")) // Or your actual key
.modelName("llama3-8b-8192") // Or any other model offered by Groq, e.g., mixtral-8x7b-32768, llama3-70b-8192
.temperature(0.0)
.build();
利用可能なモデル名は Groq モデルページ で確認できます。
Docker Model Runner
デプロイ: ローカル
説明: Docker Model Runner を使うと、Docker Desktop で LLM をローカル実行できます(内部で llama.cpp を使い、CPU も利用可能)。開発、テスト、オフライン利用に便利です。Mac と Windows で動作します。
セットアップ:
- Docker Desktop をインストールする
- Docker Desktop で Docker Model Runner 機能を有効にする(Settings > Experimental Features > Enable Docker Model Runner)
- その直下で "Enable host-side TCP support" にチェックを入れる。
- Docker Model Runner CLI でモデルを pull する。例:
docker model pull ai/qwen3、または この一覧 の他のモデル。
ai/qwen3 の例(モデルの詳細は こちら):
ChatModel model = OpenAiChatModel.builder()
.baseUrl("http://localhost:12434/engines/llama.cpp/v1")
.modelName("ai/qwen3")
.build();
一部のモデルはツール呼び出しをサポートします。詳細は docker モデルページを参照してください。
GPT4All
デプロイ: ローカル
説明: GPT4All は、マシン上でオープンソース LLM を実行するデスクトップアプリケーションを提供します。OpenAI 互換 API を公開することもできます。
セットアップ:
- https://gpt4all.io/ から GPT4All をダウンロードしてインストールします。
- GPT4All を起動し、UI から目的のモデルをダウンロードします(例:
llama-3.2-1b-instruct)。 - GPT4All 設定で "Web Server" モードを有効にします("Settings" > "Application" > Advanced 配下:"Enable Local API Server")。
- GPT4All に表示される IP アドレスとポートを控えます(通常は
http://localhost:4891/v1)。 - LangChain4j を設定します:
ChatModel model = OpenAiChatModel.builder()
.baseUrl("http://localhost:4891/v1")
.modelName("llama-3.2-1b-instruct") // The model name might be derived from the model loaded in GPT4All UI or configurable. Check GPT4All docs.
.build();
Ollama
LangChain4j には専用の langchain4j-ollama モジュールがありますが(Ollama ドキュメント を参照)、上記のように OpenAI モジュールを使って Ollama の OpenAI 互換エンドポイントに接続することもできます。
デプロイ: ローカル
説明: Ollama を使うと、Llama 3、Mistral などのオープンソース大規模言語モデルをローカルで実行できます。OpenAI 互換 API エンドポイントを提供します。
セットアップ:
- https://ollama.ai/ から Ollama をインストールします。
- コマンドラインでモデルを pull します:
ollama pull <model_name>(例:ollama pull gemma3)。 - Ollama が稼働していることを確認します。
http://localhost:11434/v1/で OpenAI 互換 API を提供します。 - LangChain4j を設定します:
ChatModel model = OpenAiChatModel.builder()
.baseUrl("http://localhost:11434/v1/")
.modelName("gemma3")
.build();
例:
- OpenAI 互換エンドポイントの利用では、一般的な OpenAI の例を応用してください。
- 専用 Ollama モジュールの利用:langchain4j-examples/.../OllamaChatModelExamples.java
LM Studio
デプロイ: ローカル
説明: LM Studio は、ローカル LLM の発見、ダウンロード、実行のための UI を提供します。OpenAI 互換のローカルサーバー機能もあります。
セットアップ:
- https://lmstudio.ai/ から LM Studio をダウンロードしてインストールします。
- LM Studio UI(Search タブ)から目的のモデルをダウンロードします。例:
smollm2-135m-instruct。 - 「Developer」タブ(左側の
>_のようなアイコン)に移動し、サーバー状態を 'running' に切り替えます - サーバーが稼働すると、右上にアドレスが表示されます(例:
http://127.0.0.1:1234)。あるいは cURL 呼び出しから完全な URL も確認できます。 - 現時点で LM Studio は HTTP2 をサポートしないため、HTTP1.1 の使用を強制する必要があります。そのために正しい maven または gradle 依存関係を追加します:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-http-client-jdk</artifactId>
<version>1.18.1</version>
</dependency>
- LangChain4j を設定し、
httpClientBuilderを指定します
import java.net.http.HttpClient;
import dev.langchain4j.http.client.jdk.JdkHttpClientBuilder;
import dev.langchain4j.http.client.jdk.JdkHttpClient;
...
HttpClient.Builder httpClientBuilder = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1) ;
JdkHttpClientBuilder jdkHttpClientBuilder = JdkHttpClient.builder()
.httpClientBuilder(httpClientBuilder);
ChatModel model = OpenAiChatModel.builder()
.baseUrl("http://127.0.0.1:1234/v1")
.modelName("smollm2-135m-instruct")
.httpClientBuilder(jdkHttpClientBuilder)
.build();