DeepSeek チャット
Spring AI は、DeepSeek のさまざまな AI 言語モデルをサポートしています。DeepSeek 言語モデルと対話し、DeepSeek モデルに基づいて多言語会話アシスタントを作成できます。
前提条件
DeepSeek 言語モデルにアクセスするには、DeepSeek で API キーを作成する必要があります。
DeepSeek 登録ページ (英語) でアカウントを作成し、API キーページ (英語) でトークンを生成します。
Spring AI プロジェクトは、API キーページから取得した API Key
の値に設定する必要がある spring.ai.deepseek.api-key
という名前の構成プロパティを定義します。
この構成プロパティは、application.properties
ファイルで設定できます。
spring.ai.deepseek.api-key=<your-deepseek-api-key>
API キーなどの機密情報を扱う際のセキュリティを強化するために、Spring 式言語 (SpEL) を使用してカスタム環境変数を参照できます。
# In application.yml
spring:
ai:
deepseek:
api-key: ${DEEPSEEK_API_KEY}
# In your environment or .env file
export DEEPSEEK_API_KEY=<your-deepseek-api-key>
この構成をアプリケーションコード内でプログラム的に設定することもできます。
// Retrieve API key from a secure source or environment variable
String apiKey = System.getenv("DEEPSEEK_API_KEY");
リポジトリと BOM の追加
Spring AI アーティファクトは、Spring マイルストーンリポジトリとスナップショットリポジトリで公開されています。これらのリポジトリをビルドシステムに追加するには、アーティファクトリポジトリセクションを参照してください。
依存関係の管理を容易にするため、Spring AI は BOM(部品表)を提供しており、プロジェクト全体で Spring AI の一貫したバージョンが使用されることを保証します。Spring AI の BOM をビルドシステムに追加するには、依存関係管理セクションを参照してください。
自動構成
Spring AI は、DeepSeek チャットモデル用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml
ファイルに次の依存関係を追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
または、Gradle build.gradle
ファイルに追加します。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-deepseek'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
チャットのプロパティ
再試行プロパティ
プレフィックス spring.ai.retry
は、DeepSeek チャットモデルの再試行メカニズムを構成できるプロパティプレフィックスとして使用されます。
プロパティ | 説明 | デフォルト |
---|---|---|
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 | 偽の場合、NonTransientAiException をスローし、 | false |
spring.ai.retry.exclude-on-http-codes | 再試行をトリガーすべきではない HTTP ステータスコードのリスト (NonTransientAiException をスローするなど)。 | 空 |
spring.ai.retry.on-http-codes | 再試行をトリガーする必要がある HTTP ステータスコードのリスト (例: TransientAiException をスローする)。 | 空 |
接続プロパティ
接頭辞 spring.ai.deepseek
は、DeepSeek への接続を可能にするプロパティ接頭辞として使用されます。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.deepseek.base-url | 接続先の URL | |
spring.ai.deepseek.api-key | API キー | - |
プロパティの構成
プレフィックス spring.ai.deepseek.chat
は、DeepSeek のチャットモデル実装を構成できるプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.deepseek.chat.enabled | DeepSeek チャットモデルを有効にします。 | true |
spring.ai.deepseek.chat.base-url | オプションで spring.ai.deepseek.base-url をオーバーライドして、チャット固有の URL を提供します。 | |
spring.ai.deepseek.chat.api-key | オプションで spring.ai.deepseek.api-key をオーバーライドして、チャット固有の API キーを提供します | - |
spring.ai.deepseek.chat.completions-path | チャット補完エンドポイントへのパス | /chat/completions |
spring.ai.deepseek.chat.beta-prefix-path | ベータ関数エンドポイントへのプレフィックスパス | /beta/chat/completions |
spring.ai.deepseek.chat.options.model | 使用するモデルの ID。deepseek-coder または deepseek-chat のいずれかを使用できます。 | deepseek-chat |
spring.ai.deepseek.chat.options.frequencyPenalty | -2.0 から 2.0 までの数値。正の値を指定すると、これまでのテキスト内の既存の頻度に基づいて新しいトークンにペナルティが課され、モデルが同じ行をそのまま繰り返す可能性が低くなります。 | 0.0f |
spring.ai.deepseek.chat.options.maxTokens | チャット補完で生成するトークンの最大数。入力トークンと生成されたトークンの合計の長さは、モデルのコンテキストの長さによって制限されます。 | - |
spring.ai.deepseek.chat.options.presencePenalty | -2.0 から 2.0 までの数値。正の値を指定すると、これまでにテキストに出現したかどうかに基づいて新しいトークンにペナルティが課され、モデルが新しいトピックについて話す可能性が高まります。 | 0.0f |
spring.ai.deepseek.chat.options.stop | API がさらなるトークンの生成を停止する最大 4 つのシーケンス。 | - |
spring.ai.deepseek.chat.options.temperature | 使用するサンプリング温度(0 ~ 2)を指定します。0.8 のような高い値を指定すると出力はよりランダムになり、0.2 のような低い値を指定すると出力はより集中的かつ決定論的になります。通常は、この値か top_p のいずれか一方を変更することを推奨しますが、両方を変更することは推奨しません。 | 1.0F |
spring.ai.deepseek.chat.options.topP | 温度によるサンプリングの代わりに、核サンプリングと呼ばれる手法があります。この手法では、モデルは top_p の確率質量を持つトークンの結果を考慮します。つまり、0.1 は、上位 10% の確率質量を構成するトークンのみを考慮することを意味します。通常は、この方法か温度のいずれか一方を変更することを推奨しますが、両方を変更することは推奨しません。 | 1.0F |
spring.ai.deepseek.chat.options.logprobs | 出力トークンの対数確率を返すかどうか。true の場合、メッセージの内容で返される各出力トークンの対数確率を返します。 | - |
spring.ai.deepseek.chat.options.topLogprobs | 各トークン位置で返される可能性が最も高いトークンの数を指定する 0 から 20 までの整数。各トークンには、関連付けられた対数確率があります。このパラメーターを使用する場合は、logprobs を true に設定する必要があります。 | - |
ChatModel 実装では、共通の spring.ai.deepseek.base-url および spring.ai.deepseek.api-key プロパティをオーバーライドできます。spring.ai.deepseek.chat.base-url および spring.ai.deepseek.chat.api-key プロパティが設定されている場合は、共通プロパティよりも優先されます。これは、異なるモデルや異なるモデルエンドポイントに異なる DeepSeek アカウントを使用する場合に便利です。 |
spring.ai.deepseek.chat.options で始まるすべてのプロパティは、リクエスト固有のランタイムオプションを Prompt 呼び出しに追加することによって実行時にオーバーライドできます。 |
ランタイムオプション
DeepSeekChatOptions.java [GitHub] (英語) は、使用するモデル、温度、周波数ペナルティなどのモデル構成を提供します。
起動時に、DeepSeekChatModel(api, options)
コンストラクターまたは spring.ai.deepseek.chat.options.*
プロパティを使用してデフォルトのオプションを設定できます。
実行時に、Prompt
呼び出しに新しいリクエスト固有のオプションを追加することで、デフォルトのオプションをオーバーライドできます。例: 特定のリクエストのデフォルトのモデルと温度をオーバーライドするには、次のようにします。
ChatResponse response = chatModel.call(
new Prompt(
"Generate the names of 5 famous pirates. Please provide the JSON response without any code block markers such as ```json```.",
DeepSeekChatOptions.builder()
.withModel(DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue())
.withTemperature(0.8f)
.build()
));
モデル固有の DeepSeekChatOptions [GitHub] (英語) に加えて、ChatOptionsBuilder#builder() [GitHub] (英語) で作成されたポータブル ChatOptions [GitHub] (英語) インスタンスも使用できます。 |
サンプルコントローラー (自動構成)
新しい Spring Boot プロジェクトを作成し、spring-ai-starter-model-deepseek
を pom (または gradle) の依存関係に追加します。
src/main/resources
ディレクトリに application.properties
ファイルを追加して、DeepSeek チャットモデルを有効にして構成します。
spring.ai.deepseek.api-key=YOUR_API_KEY
spring.ai.deepseek.chat.options.model=deepseek-chat
spring.ai.deepseek.chat.options.temperature=0.8
api-key を DeepSeek の資格情報に置き換えます。 |
これにより、クラスに注入できる DeepSeekChatModel
実装が作成されます。以下は、チャットモデルを使用してテキストを生成するシンプルな @Controller
クラスの例です。
@RestController
public class ChatController {
private final DeepSeekChatModel chatModel;
@Autowired
public ChatController(DeepSeekChatModel 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) {
var prompt = new Prompt(new UserMessage(message));
return chatModel.stream(prompt);
}
}
チャットプレフィックス補完
チャットプレフィックスの補完は Chat Completion API に準拠しており、ユーザーがアシスタントのプレフィックスメッセージを提供すると、モデルがメッセージの残りを補完します。
プレフィックス補完を使用する場合、ユーザーはメッセージリスト内の最後のメッセージが DeepSeekAssistantMessage であることを確認する必要があります。
以下は、チャットプレフィックス補完の完全な Java コード例です。この例では、モデルによる追加の説明を防ぐために、アシスタントのプレフィックスメッセージを「```python\n" to force the model to output Python code, and set the stop parameter to [‘` ’ ]」に設定しています。
@RestController
public class CodeGenerateController {
private final DeepSeekChatModel chatModel;
@Autowired
public ChatController(DeepSeekChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generatePythonCode")
public String generate(@RequestParam(value = "message", defaultValue = "Please write quick sort code") String message) {
UserMessage userMessage = new UserMessage(message);
Message assistantMessage = DeepSeekAssistantMessage.prefixAssistantMessage("```python\\n");
Prompt prompt = new Prompt(List.of(userMessage, assistantMessage), ChatOptions.builder().stopSequences(List.of("```")).build());
ChatResponse response = chatModel.call(prompt);
return response.getResult().getOutput().getText();
}
}
推論モデル (deepseek-reasoner)
The deepseek-reasoner
is a reasoning model developed by DeepSeek. Before delivering the final answer, the model first generates a Chain of Thought (CoT) to enhance the accuracy of its responses. Our API provides users with access to the CoT content generated by deepseek-reasoner
, enabling them to view, display, and distill it.
You can use the DeepSeekAssistantMessage
to get the CoT content generated by deepseek-reasoner
.
public void deepSeekReasonerExample() {
DeepSeekChatOptions promptOptions = DeepSeekChatOptions.builder()
.model(DeepSeekApi.ChatModel.DEEPSEEK_REASONER.getValue())
.build();
Prompt prompt = new Prompt("9.11 and 9.8, which is greater?", promptOptions);
ChatResponse response = chatModel.call(prompt);
// Get the CoT content generated by deepseek-reasoner, only available when using deepseek-reasoner model
DeepSeekAssistantMessage deepSeekAssistantMessage = (DeepSeekAssistantMessage) response.getResult().getOutput();
String reasoningContent = deepSeekAssistantMessage.getReasoningContent();
String text = deepSeekAssistantMessage.getText();
}
Reasoning Model Multi-round Conversation
In each round of the conversation, the model outputs the CoT (reasoning_content) and the final answer (content). In the next round of the conversation, the CoT from previous rounds is not concatenated into the context, as illustrated in the following diagram:
Please note that if the reasoning_content field is included in the sequence of input messages, the API will return a 400 error. Therefore, you should remove the reasoning_content field from the API response before making the API request, as demonstrated in the API example.
public String deepSeekReasonerMultiRoundExample() {
List<Message> messages = new ArrayList<>();
messages.add(new UserMessage("9.11 and 9.8, which is greater?"));
DeepSeekChatOptions promptOptions = DeepSeekChatOptions.builder()
.model(DeepSeekApi.ChatModel.DEEPSEEK_REASONER.getValue())
.build();
Prompt prompt = new Prompt(messages, promptOptions);
ChatResponse response = chatModel.call(prompt);
DeepSeekAssistantMessage deepSeekAssistantMessage = (DeepSeekAssistantMessage) response.getResult().getOutput();
String reasoningContent = deepSeekAssistantMessage.getReasoningContent();
String text = deepSeekAssistantMessage.getText();
messages.add(new AssistantMessage(Objects.requireNonNull(text)));
messages.add(new UserMessage("How many Rs are there in the word 'strawberry'?"));
Prompt prompt2 = new Prompt(messages, promptOptions);
ChatResponse response2 = chatModel.call(prompt2);
DeepSeekAssistantMessage deepSeekAssistantMessage2 = (DeepSeekAssistantMessage) response2.getResult().getOutput();
String reasoningContent2 = deepSeekAssistantMessage2.getReasoningContent();
return deepSeekAssistantMessage2.getText();
}
手動構成
DeepSeekChatModel [GitHub] (英語) は ChatModel
と StreamingChatModel
を実装し、低レベル DeepSeekApi クライアントを使用して DeepSeek サービスに接続します。
spring-ai-deepseek
依存関係をプロジェクトの Maven pom.xml
ファイルに追加します。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-deepseek</artifactId>
</dependency>
または、Gradle build.gradle
ファイルに追加します。
dependencies {
implementation 'org.springframework.ai:spring-ai-deepseek'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
Next, create a DeepSeekChatModel
and use it for text generation:
var deepSeekApi = new DeepSeekApi(System.getenv("DEEPSEEK_API_KEY"));
var chatModel = new DeepSeekChatModel(deepSeekApi, DeepSeekChatOptions.builder()
.withModel(DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue())
.withTemperature(0.4f)
.withMaxTokens(200)
.build());
ChatResponse response = chatModel.call(
new Prompt("Generate the names of 5 famous pirates."));
// Or with streaming responses
Flux<ChatResponse> streamResponse = chatModel.stream(
new Prompt("Generate the names of 5 famous pirates."));
The DeepSeekChatOptions
provides the configuration information for the chat requests. The DeepSeekChatOptions.Builder
is a fluent options builder.
低レベル DeepSeekApi クライアント
The DeepSeekApi [GitHub] (英語) is a lightweight Java client for DeepSeek API (英語) .
以下は、API をプログラムで使用する方法を示す簡単なスニペットです。
DeepSeekApi deepSeekApi =
new DeepSeekApi(System.getenv("DEEPSEEK_API_KEY"));
ChatCompletionMessage chatCompletionMessage =
new ChatCompletionMessage("Hello world", Role.USER);
// Sync request
ResponseEntity<ChatCompletion> response = deepSeekApi.chatCompletionEntity(
new ChatCompletionRequest(List.of(chatCompletionMessage), DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue(), 0.7f, false));
// Streaming request
Flux<ChatCompletionChunk> streamResponse = deepSeekApi.chatCompletionStream(
new ChatCompletionRequest(List.of(chatCompletionMessage), DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue(), 0.7f, true));
詳細については、DeepSeekApi.java [GitHub] (英語) の JavaDoc を参照してください。
DeepSeekApi サンプル
The DeepSeekApiIT.java [GitHub] (英語) test provides some general examples of how to use the lightweight library.