推理模型(deepseek-reasoner)
DeepSeek-Reasoner是DeepSeek开发的一种推理模型。在给出最终答案之前,该模型首先会生成一个思维链(Chain of Thought,CoT),以提高其响应的准确性。我们的API允许用户访问DeepSeek-Reasoner生成的思维链内容,使他们能够查看、展示和提炼这些内容。
您可以使用DeepSeekAssistantMessage来获取由deepseek-reasoner生成的思维链(CoT)内容。
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_content)和最终答案(content)。在下一轮对话中,前几轮的思维链不会被合并到上下文中,如下图所示:
请注意,如果输入消息序列中包含reasoning_content字段,API将返回400错误。因此,在发出API请求之前,您应从API响应中移除reasoning_content字段,如API示例所示。
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(AssistantMessage.builder().content(Objects.requireNonNull(text)).build()); 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实现了ChatModel和StreamingChatModel接口,并使用Low-level 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'}
接下来,创建一个DeepSeekChatModel,并使用它进行文本生成:
DeepSeekApi deepSeekApi = DeepSeekApi.builder() .apiKey(System.getenv("DEEPSEEK_API_KEY")) .build();DeepSeekChatOptions options = DeepSeekChatOptions.builder() .model(DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue()) .temperature(0.4) .maxTokens(200) .build();DeepSeekChatModel chatModel = DeepSeekChatModel.builder() .deepSeekApi(deepSeekApi) .defaultOptions(options) .build();ChatResponse response = chatModel.call( new Prompt("Generate the names of 5 famous pirates."));// Or with streaming responsesFlux<ChatResponse> streamResponse = chatModel.stream( new Prompt("Generate the names of 5 famous pirates."));
DeepSeekChatOptions提供了聊天请求的配置信息。DeepSeekChatOptions.Builder是一个流畅的选项构建器。
Low-level DeepSeekApi客户端
DeepSeekApi是DeepSeek API的一个轻量级Java客户端。
以下是一个简单的代码片段,展示了如何以编程方式使用API:
DeepSeekApi deepSeekApi = new DeepSeekApi(System.getenv("DEEPSEEK_API_KEY"));ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);// Sync requestResponseEntity<ChatCompletion> response = deepSeekApi.chatCompletionEntity( new ChatCompletionRequest(List.of(chatCompletionMessage), DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue(), 0.7, false));// Streaming requestFlux<ChatCompletionChunk> streamResponse = deepSeekApi.chatCompletionStream( new ChatCompletionRequest(List.of(chatCompletionMessage), DeepSeekApi.ChatModel.DEEPSEEK_CHAT.getValue(), 0.7, true));
DeepSeekApi示例
DeepSeekApiIT测试提供了一些使用轻量级库的一般示例。
import java.util.List;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;import reactor.core.publisher.Flux;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatCompletion;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatCompletionChunk;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatCompletionMessage;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatCompletionMessage.Role;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatCompletionRequest;import org.springframework.ai.deepseek.api.DeepSeekApi.ChatModel;import org.springframework.http.ResponseEntity;import static org.assertj.core.api.Assertions.assertThat;/** * @author Geng Rong */@EnabledIfEnvironmentVariable(named = "DEEPSEEK_API_KEY", matches = ".+")public class DeepSeekApiIT {DeepSeekApi deepSeekApi = DeepSeekApi.builder().apiKey(System.getenv("DEEPSEEK_API_KEY")).build();@Testvoid chatCompletionEntity() {ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);ResponseEntity<ChatCompletion> response = this.deepSeekApi.chatCompletionEntity(new ChatCompletionRequest(List.of(chatCompletionMessage), ChatModel.DEEPSEEK_CHAT.value, 1D, false));assertThat(response).isNotNull();assertThat(response.getBody()).isNotNull(); }@Testvoid chatCompletionStream() {ChatCompletionMessage chatCompletionMessage = new ChatCompletionMessage("Hello world", Role.USER);Flux<ChatCompletionChunk> response = this.deepSeekApi.chatCompletionStream(new ChatCompletionRequest(List.of(chatCompletionMessage), ChatModel.DEEPSEEK_CHAT.value, 1D, true));assertThat(response).isNotNull();assertThat(response.collectList().block()).isNotNull(); }}