From 8f8ab67b5da1a11a08d88bec792f56602c6e77a5 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Sat, 12 Jul 2025 10:44:25 +0800 Subject: [PATCH] =?UTF-8?q?AI=E5=AF=B9=E8=AF=9D=E3=80=81=E5=A4=9A=E6=A8=A1?= =?UTF-8?q?=E6=80=81=E3=80=81=E7=B3=BB=E7=BB=9F=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/controller/AiController.java | 59 +++++++++++++++++++ .../com/huangge1199/ai/service/AiService.java | 59 +++++++++++++++++++ src/main/resources/system-prompt.txt | 6 ++ 3 files changed, 124 insertions(+) create mode 100644 src/main/java/com/huangge1199/ai/controller/AiController.java create mode 100644 src/main/java/com/huangge1199/ai/service/AiService.java create mode 100644 src/main/resources/system-prompt.txt diff --git a/src/main/java/com/huangge1199/ai/controller/AiController.java b/src/main/java/com/huangge1199/ai/controller/AiController.java new file mode 100644 index 0000000..a129fb9 --- /dev/null +++ b/src/main/java/com/huangge1199/ai/controller/AiController.java @@ -0,0 +1,59 @@ +package com.huangge1199.ai.controller; + +import com.huangge1199.ai.common.R; +import com.huangge1199.ai.service.AiService; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * AI测试类 + * + * @author huangge1199 + * @since 2025/7/12 9:30:51 + */ +@RestController +@RequestMapping("/ai") +public class AiController { + + @Resource + private AiService aiService; + + /** + * AI对话 + * + * @param message 输入信息 + * @return ai返回结果 + */ + @PostMapping("/chat") + public R chat(@RequestBody String message) { + String result = aiService.chat(message); + return R.ok(result); + } + + /** + * 多模态-描述图片 + * + * @param message 输入信息 + * @return ai返回结果 + */ + @PostMapping("/chatWithPicUrl") + public R chatWithPicUrl(@RequestBody String message) { + String result = aiService.chatWithPicUrl(message); + return R.ok(result); + } + + /** + * AI对话-带上系统提示词 + * + * @param message 输入信息 + * @return ai返回结果 + */ + @PostMapping("/chatWithSysMessage") + public R chatWithSysMessage(@RequestBody String message) { + String result = aiService.chatWithSysMessage(message); + return R.ok(result); + } +} diff --git a/src/main/java/com/huangge1199/ai/service/AiService.java b/src/main/java/com/huangge1199/ai/service/AiService.java new file mode 100644 index 0000000..63d19c8 --- /dev/null +++ b/src/main/java/com/huangge1199/ai/service/AiService.java @@ -0,0 +1,59 @@ +package com.huangge1199.ai.service; + +import dev.langchain4j.data.message.*; +import dev.langchain4j.model.chat.ChatModel; +import dev.langchain4j.model.chat.response.ChatResponse; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * AiCodeHelper + * + * @author huangge1199 + * @since 2025/7/12 9:26:14 + */ +@Service +@Slf4j +public class AiService { + + @Resource + private ChatModel qwenChatModel; + + public String chat(String message) { + UserMessage userMessage = UserMessage.from(message); + ChatResponse chatResponse = qwenChatModel.chat(userMessage); + AiMessage aiMessage = chatResponse.aiMessage(); + log.info("AI 输出:{}", aiMessage.toString()); + return aiMessage.text(); + } + + public String chatWithPicUrl(String picUrl) { + UserMessage userMessage = UserMessage.from( + TextContent.from("描述图片"), + ImageContent.from(picUrl) + ); + ChatResponse chatResponse = qwenChatModel.chat(userMessage); + AiMessage aiMessage = chatResponse.aiMessage(); + log.info("AI 输出:{}", aiMessage.toString()); + return aiMessage.text(); + } + + private static final String SYSTEM_MESSAGE = """ + 你是旅游方面的小助手,帮助用户解答旅游路线相关的问题,并给出建议。重点关注 4 个方向: + 1. 规划旅游路线 + 2. 提供当地可游玩的景点 + 3. 给出整个行程的计划 + 4. 分享高质量的行程规划 + 请用简洁易懂的语言回答,提高用户的兴趣减少用户的规划时间。 + """; + + public String chatWithSysMessage(String message) { + SystemMessage systemMessage = SystemMessage.from(SYSTEM_MESSAGE); + UserMessage userMessage = UserMessage.from(message); + ChatResponse chatResponse = qwenChatModel.chat(systemMessage, userMessage); + AiMessage aiMessage = chatResponse.aiMessage(); + log.info("AI 输出:{}", aiMessage.toString()); + return aiMessage.text(); + } +} diff --git a/src/main/resources/system-prompt.txt b/src/main/resources/system-prompt.txt new file mode 100644 index 0000000..a30d9a0 --- /dev/null +++ b/src/main/resources/system-prompt.txt @@ -0,0 +1,6 @@ +你是旅游方面的小助手,帮助用户解答旅游路线相关的问题,并给出建议。重点关注 4 个方向: +1. 规划旅游路线 +2. 提供当地可游玩的景点 +3. 给出整个行程的计划 +4. 分享高质量的行程规划 +请用简洁易懂的语言回答,提高用户的兴趣减少用户的规划时间。 \ No newline at end of file