From e893110ee5b5dc72cace0dc763c681149bb7025b Mon Sep 17 00:00:00 2001
From: ageer <ageerle@163.com>
Date: 星期一, 24 三月 2025 23:35:45 +0800
Subject: [PATCH] feat: 本地知识库功能优化

---
 ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java |   14 ++++++--------
 ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java                                    |    8 ++++++++
 ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java                 |   14 +++++++++++---
 ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java                   |   16 ++++++++--------
 4 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java b/ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java
index 5ccaa43..6b353a7 100644
--- a/ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java
+++ b/ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java
@@ -33,6 +33,7 @@
 import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
 import org.ruoyi.knowledge.service.IKnowledgeInfoService;
 import org.ruoyi.system.listener.SSEEventSourceListener;
+import org.ruoyi.system.service.ISseService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
@@ -68,11 +69,14 @@
 
     private final ChatConfig chatConfig;
 
+    private final ISseService sseService;
+
     /**
      * 鐭ヨ瘑搴撳璇�
      */
     @PostMapping("/send")
     public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest) {
+
         openAiStreamClient = chatConfig.getOpenAiStreamClient();
         SseEmitter sseEmitter = new SseEmitter(0L);
         SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(sseEmitter);
@@ -87,6 +91,10 @@
         }
         Message userMessage = Message.builder().content(content + (nearestList.size() > 0 ? "\n\n娉ㄦ剰锛氬洖绛旈棶棰樻椂锛岄』涓ユ牸鏍规嵁鎴戠粰浣犵殑绯荤粺涓婁笅鏂囧唴瀹瑰師鏂囪繘琛屽洖绛旓紝璇蜂笉瑕佽嚜宸卞彂鎸�,鍥炵瓟鏃朵繚鎸佸師鏉ユ枃鏈殑娈佃惤灞傜骇" : "") ).role(Message.Role.USER).build();
         messages.add(userMessage);
+        if (chatRequest.getModel().startsWith("ollama")) {
+            return sseService.ollamaChat(chatRequest);
+        }
+
         ChatCompletion completion = ChatCompletion
             .builder()
             .messages(messages)
diff --git a/ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java b/ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java
index 713c6f1..2bdc4c3 100644
--- a/ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java
+++ b/ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java
@@ -43,7 +43,7 @@
 @RequestMapping("/chat")
 public class ChatController {
 
-    private final ISseService ISseService;
+    private final ISseService sseService;
 
     private final IChatMessageService chatMessageService;
 
@@ -54,9 +54,9 @@
     @ResponseBody
     public SseEmitter sseChat(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
         if (chatRequest.getModel().startsWith("ollama")) {
-            return ISseService.ollamaChat(chatRequest);
+            return sseService.ollamaChat(chatRequest);
         }
-        return ISseService.sseChat(chatRequest,request);
+        return sseService.sseChat(chatRequest,request);
     }
 
 
@@ -66,7 +66,7 @@
     @PostMapping("/upload")
     @ResponseBody
     public UploadFileResponse upload(@RequestPart("file") MultipartFile file) {
-        return ISseService.upload(file);
+        return sseService.upload(file);
     }
 
 
@@ -78,7 +78,7 @@
     @PostMapping("/audio")
     @ResponseBody
     public WhisperResponse audio(@RequestParam("file") MultipartFile file) {
-        WhisperResponse whisperResponse = ISseService.speechToTextTranscriptionsV2(file);
+        WhisperResponse whisperResponse = sseService.speechToTextTranscriptionsV2(file);
         return whisperResponse;
     }
 
@@ -90,7 +90,7 @@
     @PostMapping("/speech")
     @ResponseBody
     public ResponseEntity<Resource> speech(@RequestBody TextToSpeech textToSpeech) {
-        return ISseService.textToSpeed(textToSpeech);
+        return sseService.textToSpeed(textToSpeech);
     }
 
     /**
@@ -101,13 +101,13 @@
     @PostMapping("/translation")
     @ResponseBody
     public String translation(@RequestBody TranslationRequest translationRequest) {
-        return ISseService.translation(translationRequest);
+        return sseService.translation(translationRequest);
     }
 
     @PostMapping("/dall3")
     @ResponseBody
     public R<List<Item>> dall3(@RequestBody @Valid Dall3Request request) {
-        return R.ok(ISseService.dall3(request));
+        return R.ok(sseService.dall3(request));
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java
index 8895a25..3b28d91 100644
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java
+++ b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java
@@ -229,21 +229,19 @@
     @Override
     public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList,String kid, String docId,List<String> fidList) {
         WeaviateClient client = getClient();
-        for (int i = 0; i < chunkList.size(); i++) {
-            if (vectorList != null) {
+        if (vectorList != null) {
+            for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
                 List<Double> vector = vectorList.get(i);
-                Float[] vf = new Float[vector.size()];
-                for (int j = 0; j < vector.size(); j++) {
-                    Double value = vector.get(j);
-                    vf[j] = value.floatValue();
-                }
+                Float[] vf = vector.stream().map(Double::floatValue).toArray(Float[]::new);
+
                 Map<String, Object> dataSchema = new HashMap<>();
                 dataSchema.put("content", chunkList.get(i));
                 dataSchema.put("kid", kid);
                 dataSchema.put("docId", docId);
                 dataSchema.put("fid", fidList.get(i));
-                String uuid = UUID.randomUUID(true).toString();
+                String uuid = UUID.randomUUID().toString();
                 dataSchema.put("uuid", uuid);
+
                 Result<WeaviateObject> result = client.data().creator()
                         .withClassName(className + kid)
                         .withID(uuid)
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java
index b0a8827..3f35e53 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java
@@ -6,6 +6,7 @@
 import com.zhipu.oapi.ClientV4;
 import com.zhipu.oapi.service.v4.tools.*;
 import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.models.chat.OllamaChatMessage;
 import io.github.ollama4j.models.chat.OllamaChatMessageRole;
 import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
 import io.github.ollama4j.models.chat.OllamaChatRequestModel;
@@ -626,13 +627,20 @@
         final SseEmitter emitter = new SseEmitter();
         String host = sysModel.getApiHost();
         List<Message> msgList = chatRequest.getMessages();
-        Message message = msgList.get(msgList.size() - 1);
+        List<OllamaChatMessage> messages = new ArrayList<>();
+
+        for (Message message : msgList) {
+            OllamaChatMessage ollamaChatMessage = new OllamaChatMessage();
+            ollamaChatMessage.setRole(OllamaChatMessageRole.USER);
+            ollamaChatMessage.setContent(message.getContent().toString());
+            messages.add(ollamaChatMessage);
+        }
         OllamaAPI api = new OllamaAPI(host);
         api.setRequestTimeoutSeconds(100);
         OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(parts[1]);
+
         OllamaChatRequestModel requestModel = builder
-            .withMessage(OllamaChatMessageRole.USER,
-                message.getContent().toString())
+            .withMessages(messages)
             .build();
 
         // 寮傛鎵ц OllAma API 璋冪敤

--
Gitblit v1.9.3