Browse Source

格式化查询结果

tsurumure 5 tháng trước cách đây
mục cha
commit
3472625e07

+ 2 - 0
src/main/java/com/backendsys/modules/ai/chat/entity/Chat.java

@@ -50,6 +50,8 @@ public class Chat {
     private String content_type;    // 对话内容类型 (THINK: 思考, REPLY: 回复)
     private Long duration;
 
+    @TableField(exist = false)
+    private Boolean internet = false;       // 是否联网搜索
     private Integer del_flag;
     private String create_time;
     private String update_time;

+ 17 - 0
src/main/java/com/backendsys/modules/ai/chat/entity/ChatCompletionParam.java

@@ -0,0 +1,17 @@
+package com.backendsys.modules.ai.chat.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ChatCompletionParam {
+
+    private Long user_id;
+    private String model;                   // 模型
+    private String prompt;                  // 对话内容
+    private String history_code;            // 对话历史记录ID
+    private List<Chat> chatList;            // 上下文对话内容
+    private Boolean internet = false;       // 是否联网操作
+
+}

+ 3 - 0
src/main/java/com/backendsys/modules/ai/chat/entity/ChatResult.java

@@ -8,4 +8,7 @@ public class ChatResult {
     private Long reasoning_duration;
     private String content;
     private Long content_duration;
+
+    private String internet_content;
+    private Long internet_duration;
 }

+ 30 - 6
src/main/java/com/backendsys/modules/ai/chat/service/impl/ChatServiceImpl.java

@@ -7,6 +7,7 @@ import com.backendsys.exception.CustException;
 import com.backendsys.modules.ai.chat.dao.ChatDao;
 import com.backendsys.modules.ai.chat.dao.ChatHistoryDao;
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatHistory;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 import com.backendsys.modules.ai.chat.service.ChatService;
@@ -148,26 +149,49 @@ public class ChatServiceImpl implements ChatService {
 
                 ChatResult chatResult = null;
                 // -- [Deepseek R1] -------------------------------------------------------
-//                if ("DEEPSEEK_R1".equals(model) || "GEMMA".equals(model)) {
+
+                // [Param] 对话参数
+                ChatCompletionParam chatCompletionParam = new ChatCompletionParam();
+                chatCompletionParam.setUser_id(user_id);
+                chatCompletionParam.setModel(model_version);
+                chatCompletionParam.setPrompt(prompt);
+                chatCompletionParam.setHistory_code(final_history_code);
+                chatCompletionParam.setChatList(chatList);
+                chatCompletionParam.setInternet(chat.getInternet());
+
                 if ("OLLAMA".equals(tag)) {
-                    chatResult = ollamaUtil.chatCompletion(user_id, model_version, prompt, final_history_code, chatList);
+                    chatResult = ollamaUtil.chatCompletion(chatCompletionParam);
                 }
                 if ("API".equals(tag)) {
                     // -- [Deepseek Api] ------------------------------------------------------
                     if ("DEEPSEEK_API".equals(model)) {
                         // [DeepSeek] 发起对话
-                        chatResult = deepSeekClient.chatCompletion(user_id, model_version, prompt, final_history_code, chatList);
+                        chatResult = deepSeekClient.chatCompletion(chatCompletionParam);
                     }
                     // -- [腾讯混元大模型] -------------------------------------------------------
                     if ("HUNYUAN".equals(model)) {
-                        chatResult = hunYuanClient.chatCompletion(user_id, prompt, final_history_code, chatList);
+                        chatResult = hunYuanClient.chatCompletion(chatCompletionParam);
                     }
                     // ------------------------------------------------------------------------
                 }
 
                 if (chatResult != null) {
 
-                    // [INSERT][思考] THINK
+                    // [顺序1][INSERT][引用] SYSTEM
+                    String internetContent = chatResult.getInternet_content();
+                    if (StrUtil.isNotEmpty(internetContent)) {
+                        //
+                        Chat internetChat = new Chat();
+                        BeanUtil.copyProperties(chat, internetChat);
+                        //
+                        internetChat.setRole("system");
+                        internetChat.setContent("INTERNET");
+                        internetChat.setContent(internetContent);
+                        internetChat.setDuration(chatResult.getInternet_duration());
+                        chatDao.insert(internetChat);
+                    }
+
+                    // [顺序2][INSERT][思考] THINK
                     String reasoningContent = chatResult.getReasoning_content();
                     if (StrUtil.isNotEmpty(reasoningContent)) {
                         //
@@ -181,7 +205,7 @@ public class ChatServiceImpl implements ChatService {
                         chatDao.insert(thinkChat);
                     }
 
-                    // [INSERT][回复] REPLY
+                    // [顺序3][INSERT][回复] REPLY
                     String content = chatResult.getContent();
                     if (StrUtil.isNotEmpty(content)) {
                         //

+ 5 - 2
src/main/java/com/backendsys/modules/sdk/bocha/service/impl/BochaServiceImpl.java

@@ -115,7 +115,7 @@ public class BochaServiceImpl implements BochaService {
             List<BochaResult> bochaResultList = new ArrayList<>();
             for (JsonNode node : resultList) {
                 BochaResult bochaResult = new BochaResult();
-                bochaResult.setName(node.path("title").asText()); // 根据 JSON 字段名获取值
+                bochaResult.setName(node.path("name").asText()); // 根据 JSON 字段名获取值
                 bochaResult.setUrl(node.path("url").asText());
                 bochaResult.setSummary(node.path("summary").asText());
                 bochaResult.setSiteIcon(node.path("siteIcon").asText());
@@ -135,11 +135,14 @@ public class BochaServiceImpl implements BochaService {
     public String WebSearchToString(JsonNode result) {
         List<BochaResult> bochaResultList = WebSearchToList(result);
         if (!bochaResultList.isEmpty()) {
+            int index = 1;
             StringBuilder context = new StringBuilder();
             for (BochaResult item : bochaResultList) {
                 context.append("标题: ").append(item.getName()).append("\n");
-                context.append("摘要: ").append(item.getSummary()).append("\n");
+                context.append("引用: ").append(item.getSummary()).append("\n");
                 context.append("链接: ").append(item.getUrl()).append("\n\n");
+//                context.append("引用").append(index).append(": ").append(item.getSummary()).append(";\n");
+                index++;
             }
             // 将搜索结果作为上下文添加到消息中
             return context.toString();

+ 2 - 1
src/main/java/com/backendsys/modules/sdk/deepseek/service/DeepSeekClient.java

@@ -2,6 +2,7 @@ package com.backendsys.modules.sdk.deepseek.service;
 
 import cn.hutool.json.JSONArray;
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 
 import java.util.List;
@@ -9,7 +10,7 @@ import java.util.List;
 public interface DeepSeekClient {
 
     // [DeepSeek] 发起对话
-    ChatResult chatCompletion(Long user_id, String model, String prompt, String history_code, List<Chat> chatList);
+    ChatResult chatCompletion(ChatCompletionParam chatCompletionParam);
 
     // [DeepSeek] 获得模型
     JSONArray getModels(Long user_id);

+ 30 - 1
src/main/java/com/backendsys/modules/sdk/deepseek/service/impl/DeepSeekClientImpl.java

@@ -7,9 +7,12 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 import com.backendsys.modules.ai.chat.entity.ChatSseMessage;
 import com.backendsys.modules.common.config.redis.utils.RedisUtil;
+import com.backendsys.modules.sdk.bocha.entity.BochaParam;
+import com.backendsys.modules.sdk.bocha.service.BochaService;
 import com.backendsys.modules.sdk.deepseek.entity.DSRequest;
 import com.backendsys.modules.sdk.deepseek.entity.DSRequestMessage;
 import com.backendsys.modules.sdk.deepseek.service.DeepSeekClient;
@@ -56,13 +59,23 @@ public class DeepSeekClientImpl implements DeepSeekClient {
     private SseUtil sseUtil;
     @Autowired
     private RedisUtil redisUtil;
+    @Autowired
+    private BochaService bochaService;
 
     /**
      * [DeepSeek] 发起对话
      * - 文档:https://api-docs.deepseek.com/zh-cn/api/create-chat-completion
      */
     @Override
-    public ChatResult chatCompletion(Long user_id, String model, String prompt, String history_code, List<Chat> chatList) {
+    public ChatResult chatCompletion(ChatCompletionParam chatCompletionParam) {
+
+        // 参数化
+        Long user_id = chatCompletionParam.getUser_id();
+        String model = chatCompletionParam.getModel();
+        String prompt = chatCompletionParam.getPrompt();
+        String history_code = chatCompletionParam.getHistory_code();
+        List<Chat> chatList = chatCompletionParam.getChatList();
+        Boolean internet = chatCompletionParam.getInternet();
 
         // 定义作用于全局的变量
         Long replyDuration = 0L;
@@ -98,6 +111,22 @@ public class DeepSeekClientImpl implements DeepSeekClient {
                 Collections.reverse(messages);
             }
 
+            // -- [博查] Web Search API ----------------------------------------------
+            if (internet) {
+
+                // 博查、统计接口时间、设置返回参数
+                long internetStartTime = System.currentTimeMillis();
+                JsonNode searchResult = bochaService.WebSearch(new BochaParam(prompt));
+                String context = bochaService.WebSearchToString(searchResult);
+                long internetEndTime = System.currentTimeMillis();
+                chatResult.setInternet_duration(internetStartTime - internetEndTime);
+                chatResult.setInternet_content(context);
+
+                // 将搜索结果作为上下文添加到消息中
+                messages.add(new DSRequestMessage("system", context));
+            }
+            // -----------------------------------------------------------------------
+
             // 新的对话内容
             messages.add(new DSRequestMessage("user", prompt));
 

+ 20 - 36
src/main/java/com/backendsys/modules/sdk/deepseek/utils/OllamaUtil.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 import com.backendsys.modules.ai.chat.entity.ChatSseMessage;
 import com.backendsys.modules.common.config.redis.utils.RedisUtil;
@@ -59,7 +60,15 @@ public class OllamaUtil {
     /**
      * 流式对话
      */
-    public ChatResult chatCompletion(Long user_id, String model, String prompt, String history_code, List<Chat> chatList) {
+    public ChatResult chatCompletion(ChatCompletionParam chatCompletionParam) {
+
+        // 参数化
+        Long user_id = chatCompletionParam.getUser_id();
+        String model = chatCompletionParam.getModel();
+        String prompt = chatCompletionParam.getPrompt();
+        String history_code = chatCompletionParam.getHistory_code();
+        List<Chat> chatList = chatCompletionParam.getChatList();
+        Boolean internet = chatCompletionParam.getInternet();
 
         // 定义作用于全局的变量
         Long contentDuration = 0L;
@@ -89,19 +98,22 @@ public class OllamaUtil {
                 Collections.reverse(messages);
             }
 
-            // 加 联网搜索 参数?
-
             // -- [博查] Web Search API ----------------------------------------------
-            if (false) {
+            if (internet) {
+
+                // 博查、统计接口时间、设置返回参数
+                long internetStartTime = System.currentTimeMillis();
                 JsonNode searchResult = bochaService.WebSearch(new BochaParam(prompt));
                 String context = bochaService.WebSearchToString(searchResult);
+                long internetEndTime = System.currentTimeMillis();
+                chatResult.setInternet_duration(internetStartTime - internetEndTime);
+                chatResult.setInternet_content(context);
+
                 // 将搜索结果作为上下文添加到消息中
                 messages.add(new DSRequestMessage("system", context));
             }
             // -----------------------------------------------------------------------
 
-
-
             // 新的对话内容
             messages.add(new DSRequestMessage("user", prompt));
 
@@ -134,6 +146,7 @@ public class OllamaUtil {
                             "content": "你是一个能够理解中文指令并帮助完成任务的智能助手。你的任务是根据用户的需求生成合适的分类任务或生成任务,并准确判断这些任务的类型。请确保你的回答简洁、准确且符合中英文语境。"
                         },
                         {
+                            // "role": "assistant",
                             "role": "user",
                             "content": "写一个简单的 Python 函数,用于计算两个数的和"
                         }
@@ -230,12 +243,6 @@ public class OllamaUtil {
 //                        String content = resJson.getString("response");
                         // --------------------------------------------------------------
 
-
-                        // System.out.println("content: " + content);
-                        // content: \n\n
-                        // content: <think>
-                        // content: </think>
-
                         // 开始思考
                         if (content.contains("<think>")) {
                             isThinking = true;
@@ -296,12 +303,7 @@ public class OllamaUtil {
                     System.out.println("全部推理: " + allThinkContent);
                     System.out.println("全部回答: " + allReplyContent);
                     System.out.println("总输出耗时: " + contentDuration + " 毫秒");
-
-                    System.out.println("-----");
-//                    System.out.println("Think content: " + allThinkContent.toString());
-//                    System.out.println("Think content length: " + allThinkContent.toString().length());
-//                    System.out.println("Think content is not empty: " + StrUtil.isNotEmpty(allThinkContent.toString()));
-//                    System.out.println("-----");
+                    System.out.println("---------------------------------------------------");
 
                     if (StrUtil.isNotEmpty(allThinkContent.toString())) {
                         chatResult.setReasoning_content(allThinkContent.toString());
@@ -362,23 +364,5 @@ public class OllamaUtil {
 
             }
 
-
-//        } catch (Exception e) {
-//            System.out.println("Exception(3): " + e.getMessage());
-//            // [SSE] 发送消息
-//            ChatSseMessage chatSseMessage = new ChatSseMessage("REPLY", e.getMessage(), contentDuration);
-//            sseUtil.send(user_id, new SseResponse(SseResponseEnum.DEEPSEEK, chatSseMessage).toJsonStr());
-//
-//            chatResult.setContent(e.getMessage());
-//            return chatResult;
-//        }
-
-//        } finally {
-//            System.out.println("Finally.");
-//            // [SSE] 发送消息
-//            ChatSseMessage chatSseMessage = new ChatSseMessage("REPLY", "[DONE][REPLY]", contentDuration);
-//            sseUtil.send(user_id, new SseResponse(SseResponseEnum.DEEPSEEK, chatSseMessage).toJsonStr());
-//        }
-
     }
 }

+ 2 - 1
src/main/java/com/backendsys/modules/sdk/tencentcloud/huanyuan/service/HunYuanClient.java

@@ -1,6 +1,7 @@
 package com.backendsys.modules.sdk.tencentcloud.huanyuan.service;
 
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 
 import java.util.List;
@@ -8,6 +9,6 @@ import java.util.List;
 public interface HunYuanClient {
 
     // [HunYuan] 发起对话
-    ChatResult chatCompletion(Long user_id, String prompt, String history_code, List<Chat> chatList);
+    ChatResult chatCompletion(ChatCompletionParam chatCompletionParam);
 
 }

+ 29 - 1
src/main/java/com/backendsys/modules/sdk/tencentcloud/huanyuan/service/impl/HunYuanClientImpl.java

@@ -3,10 +3,13 @@ package com.backendsys.modules.sdk.tencentcloud.huanyuan.service.impl;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.backendsys.modules.ai.chat.entity.Chat;
+import com.backendsys.modules.ai.chat.entity.ChatCompletionParam;
 import com.backendsys.modules.ai.chat.entity.ChatResult;
 import com.backendsys.modules.ai.chat.entity.ChatSseMessage;
 import com.backendsys.modules.common.config.redis.utils.RedisUtil;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.sdk.bocha.entity.BochaParam;
+import com.backendsys.modules.sdk.bocha.service.BochaService;
 import com.backendsys.modules.sdk.deepseek.entity.DSRequestMessage;
 import com.backendsys.modules.sdk.tencentcloud.huanyuan.service.HunYuanClient;
 import com.backendsys.modules.sse.entity.SseResponse;
@@ -51,6 +54,8 @@ public class HunYuanClientImpl implements HunYuanClient {
     private SseUtil sseUtil;
     @Autowired
     private RedisUtil redisUtil;
+    @Autowired
+    private BochaService bochaService;
 
     private Message setMessage(String role, String content) {
         Message msg = new Message();
@@ -64,7 +69,14 @@ public class HunYuanClientImpl implements HunYuanClient {
      * https://cloud.tencent.com/document/product/1729/101836
      */
     @Override
-    public ChatResult chatCompletion(Long user_id, String prompt, String history_code, List<Chat> chatList) {
+    public ChatResult chatCompletion(ChatCompletionParam chatCompletionParam) {
+
+        // 参数化
+        Long user_id = chatCompletionParam.getUser_id();
+        String prompt = chatCompletionParam.getPrompt();
+        String history_code = chatCompletionParam.getHistory_code();
+        List<Chat> chatList = chatCompletionParam.getChatList();
+        Boolean internet = chatCompletionParam.getInternet();
 
         // 定义作用于全局的变量
         Long replyDuration = 0L;
@@ -93,6 +105,22 @@ public class HunYuanClientImpl implements HunYuanClient {
                 Collections.reverse(messages);
             }
 
+            // -- [博查] Web Search API ----------------------------------------------
+            if (internet) {
+
+                // 博查、统计接口时间、设置返回参数
+                long internetStartTime = System.currentTimeMillis();
+                JsonNode searchResult = bochaService.WebSearch(new BochaParam(prompt));
+                String context = bochaService.WebSearchToString(searchResult);
+                long internetEndTime = System.currentTimeMillis();
+                chatResult.setInternet_duration(internetStartTime - internetEndTime);
+                chatResult.setInternet_content(context);
+
+                // 将搜索结果作为上下文添加到消息中
+                messages.add(setMessage("system", context));
+            }
+            // -----------------------------------------------------------------------
+
             // 新的对话内容
             messages.add(setMessage("user", prompt));