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