Browse Source

feat: 本地知识库功能优化

ageer 4 tháng trước cách đây
mục cha
commit
e893110ee5

+ 8 - 0
ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java

@@ -33,6 +33,7 @@ import org.ruoyi.knowledge.service.IKnowledgeAttachService;
 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 @@ public class KnowledgeController extends BaseController {
 
     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 @@ public class KnowledgeController extends BaseController {
         }
         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)

+ 8 - 8
ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java

@@ -43,7 +43,7 @@ import java.util.List;
 @RequestMapping("/chat")
 public class ChatController {
 
-    private final ISseService ISseService;
+    private final ISseService sseService;
 
     private final IChatMessageService chatMessageService;
 
@@ -54,9 +54,9 @@ public class ChatController {
     @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 @@ public class ChatController {
     @PostMapping("/upload")
     @ResponseBody
     public UploadFileResponse upload(@RequestPart("file") MultipartFile file) {
-        return ISseService.upload(file);
+        return sseService.upload(file);
     }
 
 
@@ -78,7 +78,7 @@ public class ChatController {
     @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 @@ public class ChatController {
     @PostMapping("/speech")
     @ResponseBody
     public ResponseEntity<Resource> speech(@RequestBody TextToSpeech textToSpeech) {
-        return ISseService.textToSpeed(textToSpeech);
+        return sseService.textToSpeed(textToSpeech);
     }
 
     /**
@@ -101,13 +101,13 @@ public class ChatController {
     @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));
     }
 
     /**

+ 6 - 8
ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java

@@ -229,21 +229,19 @@ public class WeaviateVectorStore implements VectorStore{
     @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)

+ 11 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 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 @@ public class SseServiceImpl implements ISseService {
         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 调用