From e893110ee5b5dc72cace0dc763c681149bb7025b Mon Sep 17 00:00:00 2001 From: ageer Date: Mon, 24 Mar 2025 23:35:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E5=9C=B0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/controller/KnowledgeController.java | 8 ++++++++ .../ruoyi/fusion/controller/ChatController.java | 16 ++++++++-------- .../chain/vectorstore/WeaviateVectorStore.java | 14 ++++++-------- .../system/service/impl/SseServiceImpl.java | 14 +++++++++++--- 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 5ccaa43f..6b353a78 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.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) 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 713c6f1b..2bdc4c31 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 @@ 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 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> 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 8895a251..3b28d913 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 @@ public class WeaviateVectorStore implements VectorStore{ @Override public void storeEmbeddings(List chunkList, List> vectorList,String kid, String docId,List 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 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 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 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 b0a88275..3f35e535 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.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 msgList = chatRequest.getMessages(); - Message message = msgList.get(msgList.size() - 1); + List 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 调用