From 677b57ae09b6cdaf2504414e1ac2e148bc3b0141 Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Mon, 14 Apr 2025 18:36:00 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=9F=A5=E8=AF=86=E5=BA=93=E3=80=91?= =?UTF-8?q?=E7=9F=A5=E8=AF=86=E5=BA=93=E4=B8=8A=E4=BC=A0=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=91=BD=E4=B8=AD=EF=BC=8C=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD=E4=B8=8D=E4=B8=8B=E6=9D=A5?= =?UTF-8?q?=E3=80=82=E4=BD=86=E6=98=AF=E7=A3=81=E7=9B=98=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E6=9C=89---?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airag/llm/handler/EmbeddingHandler.java | 14 ++-- .../impl/AiragKnowledgeDocServiceImpl.java | 66 +++++++++++++++---- 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java index 50e201bbd..ca814e25a 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java @@ -451,10 +451,16 @@ public class EmbeddingHandler implements IEmbeddingHandler { // 如果是md文件,查找所有图片语法,如果是本地图片,替换成网络图片 String baseUrl = doc.getBaseUrl() + "/sys/common/static/"; String sourcePath = metadataJson.getString(LLMConsts.KNOWLEDGE_DOC_METADATA_SOURCES_PATH); - sourcePath = sourcePath.replaceFirst("^" + uploadpath, "").replace("\\", "/"); - baseUrl = baseUrl + sourcePath + "/"; - StringBuffer sb = replaceImageUrl(content, baseUrl); - content = sb.toString(); + if(oConvertUtils.isNotEmpty(sourcePath)) { + String escapedPath = uploadpath; + if (File.separator.equals("\\")){ + escapedPath = uploadpath.replace("//", "\\\\"); + } + sourcePath = sourcePath.replaceFirst("^" + escapedPath, "").replace("\\", "/"); + baseUrl = baseUrl + sourcePath + "/"; + StringBuffer sb = replaceImageUrl(content, baseUrl); + content = sb.toString(); + } } return content; } diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java index abf24e03d..0256a9169 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.config.TenantContext; +import org.jeecg.common.config.mqtoken.UserTokenContext; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.*; import org.jeecg.common.util.filter.SsrfFileTypeFilter; @@ -110,7 +112,7 @@ public class AiragKnowledgeDocServiceImpl extends ServiceImpl rebuildDocument(String docIds) { AssertUtils.assertNotEmpty("请选择要重建的文档", docIds); @@ -123,38 +125,65 @@ public class AiragKnowledgeDocServiceImpl extends ServiceImpl knowledgeDocs = docList.stream() - .filter(doc -> !KNOWLEDGE_DOC_STATUS_BUILDING.equalsIgnoreCase(doc.getStatus())) + .filter(doc -> { + //update-begin---author:chenrui ---date:20250410 for:[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中?------------ + if(KNOWLEDGE_DOC_STATUS_BUILDING.equalsIgnoreCase(doc.getStatus())){ + Date updateTime = doc.getUpdateTime(); + if (updateTime != null) { + // 向量化超过了5分钟,重新向量化 + long timeDifference = System.currentTimeMillis() - updateTime.getTime(); + return timeDifference > 5 * 60 * 1000; + }else{ + return true; + } + } else { + return true; + } + //update-end---author:chenrui ---date:20250410 for:[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中?------------ + }) .peek(doc -> { doc.setStatus(KNOWLEDGE_DOC_STATUS_BUILDING); doc.setBaseUrl(baseUrl); }) .collect(Collectors.toList()); if (oConvertUtils.isObjectEmpty(knowledgeDocs)) { - return Result.ok("向量化成功"); + return Result.ok("操作成功"); } if (oConvertUtils.isObjectEmpty(knowledgeDocs)) { - return Result.ok("向量化成功"); + return Result.ok("操作成功"); } // 更新状态 this.updateBatchById(knowledgeDocs); // 异步重建文档 + String tenantId = TenantContext.getTenant(); + String token = TokenUtils.getTokenByRequest(); knowledgeDocs.forEach((doc) -> { CompletableFuture.runAsync(() -> { + UserTokenContext.setToken(token); + TenantContext.setTenant(tenantId); String knowId = doc.getKnowledgeId(); log.info("开始重建文档, 知识库id: {}, 文档id: {}", knowId, doc.getId()); doc.setStatus(KNOWLEDGE_DOC_STATUS_BUILDING); this.updateById(doc); - Map metadata = embeddingHandler.embeddingDocument(knowId, doc); - // 更新数据 date:2025/2/18 - if (null != metadata) { - doc.setStatus(KNOWLEDGE_DOC_STATUS_COMPLETE); - this.updateById(doc); - log.info("重建文档成功, 知识库id: {}, 文档id: {}", knowId, doc.getId()); - } else { + //update-begin---author:chenrui ---date:20250410 for:[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中?------------ + try { + Map metadata = embeddingHandler.embeddingDocument(knowId, doc); + // 更新数据 date:2025/2/18 + if (null != metadata) { + doc.setStatus(KNOWLEDGE_DOC_STATUS_COMPLETE); + this.updateById(doc); + log.info("重建文档成功, 知识库id: {}, 文档id: {}", knowId, doc.getId()); + } else { + doc.setStatus(KNOWLEDGE_DOC_STATUS_DRAFT); + this.updateById(doc); + log.info("重建文档失败, 知识库id: {}, 文档id: {}", knowId, doc.getId()); + } + }catch (Throwable t){ doc.setStatus(KNOWLEDGE_DOC_STATUS_DRAFT); this.updateById(doc); - log.info("重建文档失败, 知识库id: {}, 文档id: {}", knowId, doc.getId()); + log.error("重建文档失败:" + t.getMessage() + ", 知识库id: " + knowId + ", 文档id: " + doc.getId(), t); } + //update-end---author:chenrui ---date:20250410 for:[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中?------------ }, buildDocExecutorService); }); log.info("返回操作成功"); @@ -201,7 +230,7 @@ public class AiragKnowledgeDocServiceImpl extends ServiceImpl importDocumentFromZip(String knowId, MultipartFile zipFile) { AssertUtils.assertNotEmpty("请先选择知识库", knowId); @@ -238,8 +267,17 @@ public class AiragKnowledgeDocServiceImpl extends ServiceImpl