diff --git a/pom.xml b/pom.xml index 462eee0..d93520b 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ 21 1.0.3 + 3.19.0 @@ -39,6 +40,12 @@ spring-boot-starter-test test + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + diff --git a/src/main/java/com/hanserwei/airobot/controller/DeepSeekChatController.java b/src/main/java/com/hanserwei/airobot/controller/DeepSeekChatController.java index 12b66fb..5e1ab0e 100644 --- a/src/main/java/com/hanserwei/airobot/controller/DeepSeekChatController.java +++ b/src/main/java/com/hanserwei/airobot/controller/DeepSeekChatController.java @@ -1,11 +1,14 @@ package com.hanserwei.airobot.controller; import jakarta.annotation.Resource; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.deepseek.DeepSeekChatModel; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; @RestController @RequestMapping("/ai") @@ -25,4 +28,19 @@ public class DeepSeekChatController { return chatModel.call(message); } + /** + * 流式对话 + * @param message 对话输入内容 + * @return 对话结果 + */ + @GetMapping(value = "/generateStream", produces = "text/html;charset=utf-8") + public Flux generateStream(@RequestParam(value = "message", defaultValue = "你是谁?") String message) { + // 构建提示词 + Prompt prompt = new Prompt(new UserMessage(message)); + + // 流式输出 + return chatModel.stream(prompt) + .mapNotNull(chatResponse -> chatResponse.getResult().getOutput().getText()); + } + } \ No newline at end of file diff --git a/src/main/java/com/hanserwei/airobot/controller/DeepSeekR1ChatController.java b/src/main/java/com/hanserwei/airobot/controller/DeepSeekR1ChatController.java new file mode 100644 index 0000000..ff4ced5 --- /dev/null +++ b/src/main/java/com/hanserwei/airobot/controller/DeepSeekR1ChatController.java @@ -0,0 +1,49 @@ +package com.hanserwei.airobot.controller; + +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.ai.deepseek.DeepSeekAssistantMessage; +import org.springframework.ai.deepseek.DeepSeekChatModel; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +@RestController +@RequestMapping("/v1/ai") +public class DeepSeekR1ChatController { + + @Resource + private DeepSeekChatModel chatModel; + + /** + * 流式对话 + * @param message 对话输入内容 + * @return 对话结果 + */ + @GetMapping(value = "/generateStream", produces = "text/html;charset=utf-8") + public Flux generateStream(@RequestParam(value = "message", defaultValue = "你是谁?") String message) { + // 构建提示词 + Prompt prompt = new Prompt(new UserMessage(message)); + + // 流式输出 + return chatModel.stream(prompt) + .mapNotNull(chatResponse -> { + // 获取响应内容 + DeepSeekAssistantMessage deepSeekAssistantMessage = (DeepSeekAssistantMessage) chatResponse.getResult().getOutput(); + // 推理内容 + String reasoningContent = deepSeekAssistantMessage.getReasoningContent(); + // 推理结束后的正式回答 + String text = deepSeekAssistantMessage.getText(); + + // 若推理内容有值,则响应推理内容,否则,说明推理结束了,响应正式回答 + return StringUtils.isNotBlank(reasoningContent) ? reasoningContent : text; + }); + + + + } +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 04a8fe6..3be31b2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,7 +8,7 @@ spring: base-url: https://api.deepseek.com # DeepSeek 的请求 URL, 可不填,默认值为 api.deepseek.com chat: options: - model: deepseek-chat # 使用哪个模型 + model: deepseek-reasoner # 使用哪个模型 temperature: 0.8 # 温度值 jasypt: encryptor: