S0025136190 7 kuukautta sitten
vanhempi
commit
e9cb33fda7

+ 2 - 2
takai-admin/src/main/java/com/takai/web/controller/takaiai/TakaiAiController.java

@@ -263,10 +263,10 @@ public class TakaiAiController extends BaseController {
      * @throws Exception
      */
     @PostMapping("/uploadDocument/{knowledgeId}") //@RequestPart DocumentParams documentParams,
-    public AjaxResult uploadDocument(@RequestParam("file") MultipartFile file,
+    public AjaxResult uploadDocument(@RequestParam("files") MultipartFile[] files,
                                      @PathVariable String knowledgeId) throws Exception {
         try{
-            int i = takaiAisService.uploadDocument(file, knowledgeId);
+            int i = takaiAisService.uploadDocument(files, knowledgeId);
             return success(i);
         }catch (Exception e){
             return error("0");

+ 2 - 1
takai-admin/src/main/resources/application.yml

@@ -164,8 +164,9 @@ bigmodel:
   prompt: 你是总结和提问大师。 """应用的名称:{{应用名称}} 这是用户的历史对话记录:{{历史对话}}""" 你只根据用户的对话记录,推演出用户接下来可能提出的问题,不要杜撰问题。可以参考应用的名称和应用的简介。 你必须遵守以下要求:1. 不要输出用户问过的问题;2. 你需要输出3个问题供用户选择。3. 你只需要输出问题,不需要解释,不需要提问。4. 你的问题可以是空的,但你不能杜撰问题。5. 问题需要站在使用这个应用的人的视角提出,因此你要注意提问的语气和人称代词。不要用您这个字。你一定要按照以下格式输出:{"问题":["xxx","xxx","xxx"]}
 deepseek:
   #base url
-  baseurl: http://10.1.27.4:18079
+#  baseurl: http://10.1.27.4:18079
 #  baseurl: http://xia0miduo.gicp.net:6001
+  baseurl: https://rag.ryuiso.com:61079
   #创建知识库
   createKnowledge: /rag/create_collection
   #删除知识库

+ 14 - 0
takai-ai/src/main/java/com/takai/ai/domain/entity/UploadDocumentParams.java

@@ -0,0 +1,14 @@
+package com.takai.ai.domain.entity;
+
+import lombok.Data;
+
+@Data
+public class UploadDocumentParams {
+
+    private String name;
+
+    private String url;
+
+    private String document_id;
+
+}

+ 1 - 1
takai-ai/src/main/java/com/takai/ai/service/ITakaiAiService.java

@@ -45,7 +45,7 @@ public interface ITakaiAiService
 
     int delKnowledge(String knowledgeId);
 
-    int uploadDocument(MultipartFile files, String knowledgeId) throws Exception;
+    int uploadDocument(MultipartFile[] files, String knowledgeId) throws Exception;
 
     int updateDocument(TakaiDocumentParams documentParams, String documentId);
 

+ 73 - 53
takai-ai/src/main/java/com/takai/ai/service/impl/TakaiAiServiceImpl.java

@@ -107,28 +107,28 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         setRedisCache(null);
     }
 
-    private void setRedisCache(String knowledgeId){
+    private void setRedisCache(String knowledgeId) {
         //获取知识库列表
         List<TakaiKnowledge> knowledgeList = null;
-        if(StringUtils.isEmpty(knowledgeId)){
-            knowledgeList =  takaiKnowledgeMapper.selectKnowledgeList(null);
-        }else{
-            knowledgeList =  takaiKnowledgeMapper.selectKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
+        if (StringUtils.isEmpty(knowledgeId)) {
+            knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(null);
+        } else {
+            knowledgeList = takaiKnowledgeMapper.selectKnowledgeList(TakaiKnowledge.builder().knowledgeId(knowledgeId).build());
         }
 
         //获取知识列表
-        if(!knowledgeList.isEmpty()) {
-            for(TakaiKnowledge bmKnowledge : knowledgeList) {
+        if (!knowledgeList.isEmpty()) {
+            for (TakaiKnowledge bmKnowledge : knowledgeList) {
                 TakaiDocument conditon = TakaiDocument.builder().knowledgeId(bmKnowledge.getKnowledgeId()).build();
                 List<TakaiDocument> documentList = takaiDocumentMapper.selectDocumentList(conditon);
-                if(!documentList.isEmpty()) {
+                if (!documentList.isEmpty()) {
                     for (TakaiDocument bmDocument : documentList) {
                         //获取知识图片列表
                         TakaiMediaReplacement conditonR = TakaiMediaReplacement.builder().documentId(bmDocument.getDocumentId()).build();
                         List<TakaiMediaReplacement> imageList = takaiMediaReplacementMapper.selectMediaList(conditonR);
-                        if(!imageList.isEmpty()) {
-                            for(TakaiMediaReplacement image : imageList) {
-                                redisCache.setCacheObject(image.getOriginText(),image.getMediaUrl());
+                        if (!imageList.isEmpty()) {
+                            for (TakaiMediaReplacement image : imageList) {
+                                redisCache.setCacheObject(image.getOriginText(), image.getMediaUrl());
                             }
                         }
                     }
@@ -147,8 +147,8 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                 String url = deepseekConfig.getBaseurl() + deepseekConfig.getChat();
                 TakaiAppInfo info = takaiAppInfoMapper.selectAppInfoByAppId(sseParams.getAppId());
                 JSONObject json = JSONObject.parseObject(info.getAppInfo());
-                String query = sseParams.getPrompt().get(sseParams.getPrompt().size()-1).getContent();
-                log.info("deepseek聊天请求参数:"+ query);
+                String query = sseParams.getPrompt().get(sseParams.getPrompt().size() - 1).getContent();
+                log.info("deepseek聊天请求参数:" + query);
                 json.put("query", query);
                 json.put("embeddingId", knowledge.getEmbeddingId());
 
@@ -190,11 +190,11 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
                                         //获取完整Key
                                         int startPos = symbolData.indexOf(START_SIGN);
                                         int endPos = symbolData.indexOf(END_SIGN) + 1;
-                                        String key = symbolData.substring(startPos,endPos);
+                                        String key = symbolData.substring(startPos, endPos);
                                         String url = redisCache.getCacheObject(key);
-                                        if(org.springframework.util.StringUtils.hasText(url)) {
+                                        if (org.springframework.util.StringUtils.hasText(url)) {
                                             //匹配markdown图片格式
-                                            symbolData = symbolData.replace(key,"![](" + url +")");
+                                            symbolData = symbolData.replace(key, "![](" + url + ")");
                                         }
                                     }
                                     JSONObject json = new JSONObject();
@@ -444,54 +444,62 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
     }
 
     @Override
-    public int uploadDocument(MultipartFile files, String knowledgeId) {
-        TakaiSysOss result = null;
+    public int uploadDocument(MultipartFile[] files, String knowledgeId) {
+        List<TakaiSysOss> result = null;
         try {
             result = minioUtil.uploadMultiple(files);
         } catch (Exception e) {
             logger.error("上传文件失败", e.getMessage());
         }
-        if (result != null) {
-            SnowflakeDigitGenerator documentIdGenerator = new SnowflakeDigitGenerator(1, 1);
-            long documentId = documentIdGenerator.nextId();
+        if (result != null && result.size() > 0) {
+            List<UploadDocumentParams> params = new ArrayList<>();
+            for (int i = 0; i<result.size(); i++) {
+                SnowflakeDigitGenerator documentIdGenerator = new SnowflakeDigitGenerator(i, i);
+                long documentId = documentIdGenerator.nextId();
+                UploadDocumentParams param = new UploadDocumentParams();
+                param.setDocument_id("a" + documentId);
+                param.setName(result.get(i).getOriginalName());
+                param.setUrl(result.get(i).getUrl());
+                params.add(param);
+            }
 
             TakaiDocumentSettings settings = new TakaiDocumentSettings();
-            settings.setDocumentId("a" + documentId);
+//            settings.setDocumentId("a" + documentId);
             settings.setKnowledgeId(knowledgeId);
-            boolean flag = analysisFile(result, settings, "upload");
+            boolean flag = analysisFile(params, settings, "upload");
 
             if (flag) {
-                // 保存知识信息
-                TakaiDocument document = TakaiDocument.builder()
-                        .documentId("a" + documentId)
-                        .knowledgeId(knowledgeId)
-                        .customSeparator(String.format("[\"%s\"", "\\n") + "]")
-                        .sentenceSize("300")
-                        .name(result.getOriginalName())
-                        .url(result.getUrl()).build();
-                int documentIdInsert = takaiDocumentMapper.insertDocument(document);
-                int ossInsert = 0;
-                int settingInsert = 0;
-                if (documentIdInsert > 0) {
+                for (TakaiSysOss oss : result) {
                     // oss保存到数据库
-                    ossInsert = takaiSysOssMapper.insertSysOss(result);
-                    if (ossInsert > 0) {
+                    takaiSysOssMapper.insertSysOss(oss);
+                }
+
+                for (UploadDocumentParams vo : params) {
+                    // 保存知识信息
+                    TakaiDocument document = TakaiDocument.builder()
+                            .documentId(vo.getDocument_id())
+                            .knowledgeId(knowledgeId)
+                            .customSeparator(String.format("[\"%s\"", "\\n") + "]")
+                            .sentenceSize("300")
+                            .name(vo.getName())
+                            .url(vo.getUrl()).build();
+                    int documentIdInsert = takaiDocumentMapper.insertDocument(document);
+
+                    if (documentIdInsert > 0) {
                         // 保存知识设置信息
                         SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
                         long id = snowflakeDigitGenerator.nextId();
                         TakaiDocumentSettings dSettings = new TakaiDocumentSettings();
                         dSettings.setId(String.valueOf(id));
                         dSettings.setKnowledgeId(knowledgeId);
-                        dSettings.setDocumentId("a" + documentId);
+                        dSettings.setDocumentId(vo.getDocument_id());
                         dSettings.setSetSlice("0");   // 默认 按标题段落切片
                         dSettings.setSetAnalyze("1"); // 默认 图片转换成标识符
-                        settingInsert = takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
+                        takaiDocumentSettingsMapper.insertDocumentSettings(dSettings);
                     }
                 }
-                if (documentIdInsert > 0 && ossInsert > 0 && settingInsert > 0) {
-                    setRedisCache(knowledgeId);
-                    return 1;
-                }
+                setRedisCache(knowledgeId);
+                return 1;
             }
         }
         return 0;
@@ -659,18 +667,29 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
 //            int i = takaiDocumentSettingsMapper.updateDocumentSettings(documentSettings);
 //            return i;
 //        }
-        TakaiSysOss ossVo = new TakaiSysOss();
+//        List<TakaiSysOss> list = new ArrayList<>();
+//        TakaiSysOss ossVo = new TakaiSysOss();
         TakaiDocumentSettings settings = new TakaiDocumentSettings();
         TakaiDocumentSettings settingsVo = takaiDocumentSettingsMapper.selectById(documentId);
-        settings.setDocumentId(documentId);
+//        settings.setDocumentId(documentId);
         settings.setKnowledgeId(settingsVo.getKnowledgeId());
         settings.setSetSlice(documentSettings.getSetSlice());
         settings.setSliceValue(documentSettings.getSliceValue());
         settings.setSetAnalyze(documentSettings.getSetAnalyze());
         TakaiDocument document = takaiDocumentMapper.selectTargetDocument(TakaiDocument.builder().documentId(documentId).build());
-        ossVo.setUrl(document.getUrl());
-        ossVo.setOriginalName(document.getName());
-        boolean status = analysisFile(ossVo, settings, "update");
+//        ossVo.setUrl(document.getUrl());
+//        ossVo.setOriginalName(document.getName());
+//        list.add(ossVo);
+        List<UploadDocumentParams> listParams = new ArrayList<>();
+        if (document != null) {
+            UploadDocumentParams params = new UploadDocumentParams();
+            params.setDocument_id(documentId);
+            params.setName(document.getName());
+            params.setUrl(document.getUrl());
+            listParams.add(params);
+        }
+
+        boolean status = analysisFile(listParams, settings, "update");
         if (status) {
             logger.info("update document setting success, id:{}", documentId);
             documentSettings.setDocumentId(documentId);
@@ -795,15 +814,16 @@ public class TakaiAiServiceImpl implements ITakaiAiService {
         return mrVo;
     }
 
-    private boolean analysisFile(TakaiSysOss result, TakaiDocumentSettings settings, String flag) {
+    private boolean analysisFile(List<UploadDocumentParams> result, TakaiDocumentSettings settings, String flag) {
         TakaiKnowledge knowledge = takaiKnowledgeMapper.selectTargetKnowledge(TakaiKnowledge.builder().knowledgeId(settings.getKnowledgeId()).build());
         String url = deepseekConfig.getBaseurl() + deepseekConfig.getUploadKnowledge();
         JSONObject json = new JSONObject();
         json.put("knowledge_id", settings.getKnowledgeId());
-        json.put("document_id", settings.getDocumentId());
-        json.put("embedding_id", knowledge == null ? "" : knowledge.getEmbeddingId());
-        json.put("name", result.getOriginalName());
-        json.put("url", result.getUrl());
+//        json.put("document_id", settings.getDocumentId());
+//        json.put("embedding_id", knowledge == null ? "" : knowledge.getEmbeddingId());
+        json.put("docs", result);
+//        json.put("name", result.getOriginalName());
+//        json.put("url", result.getUrl());
         if ("upload".equals(flag)) {
             json.put("set_slice", "0");
             json.put("slice_value", null);

+ 21 - 21
takai-ai/src/main/java/com/takai/ai/utils/MinioUtil.java

@@ -39,28 +39,28 @@ public class MinioUtil {
      * @param files      文件列表
      * @return 上传成功的文件URL列表
      */
-    public TakaiSysOss uploadMultiple(MultipartFile files) throws Exception {
-        try {
-            TakaiSysOss ossVo = upload(files);
-            return ossVo;
-        } catch (Exception e) {
-            // 记录失败文件信息,但继续处理其他文件
-            System.err.println("文件上传失败: " + files.getOriginalFilename() + ", 原因: " + e.getMessage());
-        }
-//        List<TakaiSysOss> result = new ArrayList<>();
-//        for (MultipartFile file : files) {
-//            if (file.isEmpty()) {
-//                continue;
-//            }
-//            try {
-//                TakaiSysOss ossVo = upload(file);
-//                result.add(ossVo);
-//            } catch (Exception e) {
-//                // 记录失败文件信息,但继续处理其他文件
-//                System.err.println("文件上传失败: " + file.getOriginalFilename() + ", 原因: " + e.getMessage());
-//            }
+    public List<TakaiSysOss> uploadMultiple(MultipartFile[] files) throws Exception {
+//        try {
+//            TakaiSysOss ossVo = upload(files);
+//            return ossVo;
+//        } catch (Exception e) {
+//            // 记录失败文件信息,但继续处理其他文件
+//            System.err.println("文件上传失败: " + files.getOriginalFilename() + ", 原因: " + e.getMessage());
 //        }
-        return null;
+        List<TakaiSysOss> result = new ArrayList<>();
+        for (MultipartFile file : files) {
+            if (file.isEmpty()) {
+                continue;
+            }
+            try {
+                TakaiSysOss ossVo = upload(file);
+                result.add(ossVo);
+            } catch (Exception e) {
+                // 记录失败文件信息,但继续处理其他文件
+                System.err.println("文件上传失败: " + file.getOriginalFilename() + ", 原因: " + e.getMessage());
+            }
+        }
+        return result;
     }
 
     /**