办学质量监测教学评价系统
ageer
2025-03-24 e893110ee5b5dc72cace0dc763c681149bb7025b
feat: 本地知识库功能优化
已修改4个文件
52 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/org/ruoyi/controller/KnowledgeController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-fusion/src/main/java/org/ruoyi/fusion/controller/ChatController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorstore/WeaviateVectorStore.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SseServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 调用