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) 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)); } /** 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) 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 调用