NVIDIA チャット
NVIDIA LLM API (英語) は、さまざまなプロバイダー (英語) の幅広いモデルを提供するプロキシ AI 推論エンジンです。
Spring AI は、既存の OpenAI クライアントを再利用して NVIDIA LLM API と統合します。そのためには、ベース URL を integrate.api.nvidia.com (英語)
に設定し、提供されている LLM モデル (英語) の 1 つを選択して、それに対する api-key
を取得する必要があります。
NVIDIA LLM API では、max-tokens パラメーターを明示的に設定する必要があります。そうしないと、サーバーエラーがスローされます。 |
Spring AI で NVIDIA LLM API を使用する例については、NvidiaWithOpenAiChatModelIT.java [GitHub] (英語) テストを確認してください。
前提条件
十分なクレジットで NVIDIA (英語) アカウントを作成します。
使用する LLM モデルを選択します。たとえば、下のスクリーンショットの
meta/llama-3.1-70b-instruct
です。選択したモデルのページから、このモデルにアクセスするための
api-key
を取得できます。
自動構成
Spring AI は、OpenAI チャットクライアント用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml
ファイルに次の依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
または、Gradle build.gradle
ビルドファイルに保存します。
dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
チャットのプロパティ
再試行プロパティ
プレフィックス spring.ai.retry
は、OpenAI チャットモデルの再試行メカニズムを構成できるプロパティプレフィックスとして使用されます。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.retry.max-attempts | 再試行の最大回数。 | 10 |
spring.ai.retry.backoff.initial-interval | 指数関数的バックオフポリシーの初期スリープ期間。 | 2 秒 |
spring.ai.retry.backoff.multiplier | バックオフ間隔の乗数。 | 5 |
spring.ai.retry.backoff.max-interval | 最大バックオフ期間。 | 3 分 |
spring.ai.retry.on-client-errors | false の場合、NonTransientAiException をスローし、 | false |
spring.ai.retry.exclude-on-http-codes | 再試行をトリガーすべきではない HTTP ステータスコードのリスト (NonTransientAiException をスローするなど)。 | 空 |
spring.ai.retry.on-http-codes | 再試行をトリガーする必要がある HTTP ステータスコードのリスト (例: TransientAiException をスローする)。 | 空 |
接続プロパティ
接頭辞 spring.ai.openai
は、OpenAI への接続を可能にするプロパティ接頭辞として使用されます。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.openai.base-url | 接続先の URL。 | - |
spring.ai.openai.api-key | NVIDIA API キー | - |
プロパティの構成
プレフィックス spring.ai.openai.chat
は、OpenAI のチャットモデル実装を構成できるプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.openai.chat.enabled | OpenAI チャットモデルを有効にします。 | true |
spring.ai.openai.chat.base-url | オプションで spring.ai.openai.base-url をオーバーライドしてチャット固有の URL を提供します。 | - |
spring.ai.openai.chat.api-key | オプションで spring.ai.openai.api-key をオーバーライドしてチャット固有の API キーを提供します | - |
spring.ai.openai.chat.options.model | 使用する NVIDIA LLM モデル (英語) | - |
spring.ai.openai.chat.options.temperature | 生成される補完の見かけの創造性を制御するために使用するサンプリング温度。値を高くすると出力がよりランダムになり、値を低くすると結果がより集中的で決定的になります。これら 2 つの設定の相互作用を予測するのは難しいため、同じ完了リクエストに対して温度と top_p を変更することはお勧めできません。 | 0.8 |
spring.ai.openai.chat.options.frequencyPenalty | -2.0 から 2.0 までの数値。正の値を指定すると、これまでのテキスト内の既存の頻度に基づいて新しいトークンにペナルティが課され、モデルが同じ行をそのまま繰り返す可能性が低くなります。 | 0.0f |
spring.ai.openai.chat.options.maxTokens | チャット補完で生成するトークンの最大数。入力トークンと生成されたトークンの合計の長さは、モデルのコンテキストの長さによって制限されます。 | NOTE: NVIDIA LLM API では、 |
spring.ai.openai.chat.options.n | 各入力メッセージに対して生成するチャット補完の選択肢の数。すべての選択肢にわたって生成されたトークンの数に基づいて料金が請求されることに注意してください。コストを最小限に抑えるために、n を 1 に保ちます。 | 1 |
spring.ai.openai.chat.options.presencePenalty | -2.0 から 2.0 までの数値。正の値を指定すると、これまでにテキストに出現したかどうかに基づいて新しいトークンにペナルティが課され、モデルが新しいトピックについて話す可能性が高まります。 | - |
spring.ai.openai.chat.options.responseFormat | モデルが出力する必要がある形式を指定するオブジェクト。 | - |
spring.ai.openai.chat.options.seed | この機能はベータ版です。指定した場合、システムは、同じシードとパラメーターを使用した繰り返しリクエストが同じ結果を返すように、決定論的にサンプリングするために最善の努力をします。 | - |
spring.ai.openai.chat.options.stop | API がさらなるトークンの生成を停止する最大 4 つのシーケンス。 | - |
spring.ai.openai.chat.options.topP | 核サンプリングと呼ばれる、温度によるサンプリングの代替方法。モデルは、top_p 確率質量を使用してトークンの結果を考慮します。0.1 は、上位 10% の確率質量を構成するトークンのみが考慮されることを意味します。通常、これまたは温度を変更することをお勧めしますが、両方を変更することは推奨しません。 | - |
spring.ai.openai.chat.options.tools | モデルが呼び出す可能性のあるツールのリスト。現在、ツールとしては関数のみがサポートされています。これを使用して、モデルが JSON 入力を生成する可能性のある関数のリストを提供します。 | - |
spring.ai.openai.chat.options.toolChoice | モデルによって呼び出される関数 (存在する場合) を制御します。none は、モデルが関数を呼び出さず、代わりにメッセージを生成することを意味します。auto は、モデルがメッセージを生成するか関数を呼び出すかを選択できることを意味します。{"type: "function" , "function" : {"name" : "my_function" }} で特定の関数を指定すると、モデルは強制的にその関数を呼び出します。関数が存在しない場合は none がデフォルトです。auto はデフォルトです。機能が存在します。 | - |
spring.ai.openai.chat.options.user | エンドユーザーを表す一意の識別子。OpenAI が不正使用を監視および検出できます。 | - |
spring.ai.openai.chat.options.functions | 単一のプロンプトリクエストで関数呼び出しを有効にするために、名前で識別される関数のリスト。これらの名前を持つ関数は、functionCallbacks レジストリに存在する必要があります。 | - |
spring.ai.openai.chat.options.stream-usage | (ストリーミングのみ) リクエスト全体のトークン使用統計を含む追加のチャンクを追加するように設定します。このチャンクの | false |
spring.ai.openai.chat.options.proxy-tool-calls | true の場合、Spring AI は関数呼び出しを内部で処理せず、クライアントにプロキシします。関数呼び出しを処理し、適切な関数にディスパッチして、結果を返すのはクライアントの責任です。false (デフォルト) の場合、Spring AI は関数呼び出しを内部で処理します。関数呼び出しをサポートするチャットモデルにのみ適用されます。 | false |
spring.ai.openai.chat.options というプレフィックスが付いたすべてのプロパティは、リクエスト固有のランタイムオプションを Prompt 呼び出しに追加することで実行時にオーバーライドできます。 |
ランタイムオプション
OpenAiChatOptions.java [GitHub] (英語) は、使用するモデル、温度、周波数ペナルティなどのモデル構成を提供します。
起動時に、OpenAiChatModel(api, options)
コンストラクターまたは spring.ai.openai.chat.options.*
プロパティを使用してデフォルトのオプションを構成できます。
実行時に、新しいリクエスト固有のオプションを Prompt
呼び出しに追加することで、デフォルトのオプションをオーバーライドできます。たとえば、特定のリクエストのデフォルトのモデルと温度をオーバーライドするには、次のようにします。
ChatResponse response = chatModel.call(
new Prompt(
"Generate the names of 5 famous pirates.",
OpenAiChatOptions.builder()
.withModel("mixtral-8x7b-32768")
.withTemperature(0.4)
.build()
));
モデル固有の OpenAiChatOptions [GitHub] (英語) に加えて、ChatOptionsBuilder#builder() [GitHub] (英語) で作成されたポータブル ChatOptions [GitHub] (英語) インスタンスを使用できます。 |
関数呼び出し
NVIDIA LLM API は、それをサポートするモデルを選択した場合にツール / 関数の呼び出しをサポートします。
ChatModel にカスタム Java 関数を登録し、提供されたモデルに、登録された関数の 1 つまたは複数を呼び出すための引数を含む JSON オブジェクトを出力するようインテリジェントに選択させることができます。これは、LLM 機能を外部ツールや API に接続するための強力な手法です。
ツールの例
Spring AI で NVIDIA LLM API 関数呼び出しを使用する方法の簡単な例を次に示します。
spring.ai.openai.api-key=${NVIDIA_API_KEY}
spring.ai.openai.base-url=https://integrate.api.nvidia.com
spring.ai.openai.chat.options.model=meta/llama-3.1-70b-instruct
spring.ai.openai.chat.options.max-tokens=2048
@SpringBootApplication
public class NvidiaLlmApplication {
public static void main(String[] args) {
SpringApplication.run(NvidiaLlmApplication.class, args);
}
@Bean
CommandLineRunner runner(ChatClient.Builder chatClientBuilder) {
return args -> {
var chatClient = chatClientBuilder.build();
var response = chatClient.prompt()
.user("What is the weather in Amsterdam and Paris?")
.functions("weatherFunction") // reference by bean name.
.call()
.content();
System.out.println(response);
};
}
@Bean
@Description("Get the weather in location")
public Function<WeatherRequest, WeatherResponse> weatherFunction() {
return new MockWeatherService();
}
public static class MockWeatherService implements Function<WeatherRequest, WeatherResponse> {
public record WeatherRequest(String location, String unit) {}
public record WeatherResponse(double temp, String unit) {}
@Override
public WeatherResponse apply(WeatherRequest request) {
double temperature = request.location().contains("Amsterdam") ? 20 : 25;
return new WeatherResponse(temperature, request.unit);
}
}
}
この例では、モデルが気象情報を必要とする場合、自動的に weatherFunction
Bean を呼び出し、リアルタイムの気象データを取得できます。予想されるレスポンスは次のようになります。「アムステルダムの気象は現在 20 度で、パリの気象は現在 25 度です。」
OpenAI 関数呼び出しの詳細を参照してください。
サンプルコントローラー
新しい Spring Boot プロジェクトを作成し、spring-ai-openai-spring-boot-starter
を pom (または gradle) の依存関係に追加します。
src/main/resources
ディレクトリに application.properties
ファイルを追加して、OpenAi チャットモデルを有効にして構成します。
spring.ai.openai.api-key=${NVIDIA_API_KEY}
spring.ai.openai.base-url=https://integrate.api.nvidia.com
spring.ai.openai.chat.options.model=meta/llama-3.1-70b-instruct
# The NVIDIA LLM API doesn't support embeddings, so we need to disable it.
spring.ai.openai.embedding.enabled=false
# The NVIDIA LLM API requires this parameter to be set explicitly or server internal error will be thrown.
spring.ai.openai.chat.options.max-tokens=2048
api-key を NVIDIA の資格情報に置き換えます。 |
NVIDIA LLM API では、max-token パラメーターを明示的に設定する必要があります。そうしないと、サーバーエラーがスローされます。 |
以下は、テキスト生成にチャットモデルを使用する単純な @Controller
クラスの例です。
@RestController
public class ChatController {
private final OpenAiChatModel chatModel;
@Autowired
public ChatController(OpenAiChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.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 this.chatModel.stream(prompt);
}
}