同步平台业务模块能力
This commit is contained in:
@@ -1,16 +1,31 @@
|
||||
package com.xspaceagi.knowledge.api;
|
||||
|
||||
import com.xspaceagi.knowledge.core.spec.enums.KnowledgeDataTypeEnum;
|
||||
import com.xspaceagi.knowledge.domain.model.KnowledgeDocumentModel;
|
||||
import com.xspaceagi.knowledge.domain.service.IKnowledgeDocumentDomainService;
|
||||
import com.xspaceagi.knowledge.domain.service.impl.KnowledgeConfigDomainService;
|
||||
import com.xspaceagi.knowledge.sdk.enums.KnowledgePubStatusEnum;
|
||||
import com.xspaceagi.knowledge.sdk.request.KnowledgeDocumentRequestVo;
|
||||
import com.xspaceagi.knowledge.sdk.response.KnowledgeDocumentResponseVo;
|
||||
import com.xspaceagi.knowledge.sdk.sevice.IKnowledgeDocumentSearchRpcService;
|
||||
|
||||
import com.xspaceagi.knowledge.sdk.vo.DocumentAddRequestVo;
|
||||
import com.xspaceagi.knowledge.sdk.vo.SegmentConfigModel;
|
||||
import com.xspaceagi.system.domain.log.LogRecordPrint;
|
||||
import com.xspaceagi.system.spec.common.UserContext;
|
||||
import com.xspaceagi.system.spec.exception.BizExceptionCodeEnum;
|
||||
import com.xspaceagi.system.spec.exception.KnowledgeException;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Objects;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSearchRpcService {
|
||||
@@ -18,6 +33,9 @@ public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSear
|
||||
@Resource
|
||||
private IKnowledgeDocumentDomainService knowledgeDocumentDomainService;
|
||||
|
||||
@Resource
|
||||
private KnowledgeConfigDomainService knowledgeConfigDomainService;
|
||||
|
||||
|
||||
@LogRecordPrint(content = "[知识库文档]-根据知识库id查询文档")
|
||||
@Override
|
||||
@@ -30,4 +48,74 @@ public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSear
|
||||
responseVo.setDocumentVoList(ans);
|
||||
return responseVo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long documentAdd(DocumentAddRequestVo documentAddRequestVo) {
|
||||
// 查询基础配置,补全基础信息
|
||||
var knowledgeConfig = this.knowledgeConfigDomainService.queryOneInfoById(documentAddRequestVo.getKbId());
|
||||
if (Objects.isNull(knowledgeConfig)) {
|
||||
throw KnowledgeException.build(BizExceptionCodeEnum.resourceDataNotFound);
|
||||
}
|
||||
KnowledgeDocumentModel knowledgeDocumentModel = new KnowledgeDocumentModel();
|
||||
knowledgeDocumentModel.setTenantId(knowledgeConfig.getTenantId());
|
||||
knowledgeDocumentModel.setCreatorId(knowledgeConfig.getCreatorId());
|
||||
knowledgeDocumentModel.setCreatorName(knowledgeConfig.getCreatorName());
|
||||
knowledgeDocumentModel.setSpaceId(knowledgeConfig.getSpaceId());
|
||||
knowledgeDocumentModel.setId(null);
|
||||
knowledgeDocumentModel.setKbId(documentAddRequestVo.getKbId());
|
||||
knowledgeDocumentModel.setName(documentAddRequestVo.getName());
|
||||
knowledgeDocumentModel.setDocUrl(documentAddRequestVo.getDocUrl());
|
||||
knowledgeDocumentModel.setPubStatus(KnowledgePubStatusEnum.Waiting);
|
||||
knowledgeDocumentModel.setHasQa(Boolean.FALSE);
|
||||
knowledgeDocumentModel.setHasEmbedding(Boolean.FALSE);
|
||||
SegmentConfigModel segmentConfig = SegmentConfigModel.obtainDefaultModel();
|
||||
segmentConfig.setSegment(documentAddRequestVo.getSegment());
|
||||
segmentConfig.setWords(documentAddRequestVo.getWords());
|
||||
segmentConfig.setIsTrim(true);
|
||||
segmentConfig.setOverlaps(10);
|
||||
knowledgeDocumentModel.setSegmentConfig(segmentConfig);
|
||||
//默认 url地址的方式记录存储
|
||||
knowledgeDocumentModel.setDataType(StringUtils.isNotBlank(documentAddRequestVo.getDocUrl()) ? KnowledgeDataTypeEnum.URL_FILE.getCode() : KnowledgeDataTypeEnum.CUSTOM_TEXT.getCode());
|
||||
if (KnowledgeDataTypeEnum.URL_FILE.getCode().equals(knowledgeDocumentModel.getDataType())) {
|
||||
try {
|
||||
knowledgeDocumentModel.setFileSize(getFileSize(documentAddRequestVo.getDocUrl()));
|
||||
} catch (Exception e) {
|
||||
log.warn("获取文件大小失败 {}", documentAddRequestVo.getDocUrl(), e);
|
||||
}
|
||||
} else {
|
||||
knowledgeDocumentModel.setFileContent(documentAddRequestVo.getFileContent());
|
||||
}
|
||||
|
||||
UserContext userContext = UserContext.builder()
|
||||
.userId(knowledgeConfig.getCreatorId())
|
||||
.userName(knowledgeConfig.getCreatorName())
|
||||
.tenantId(knowledgeConfig.getTenantId())
|
||||
.build();
|
||||
var id = this.knowledgeDocumentDomainService.customAddInfo(knowledgeDocumentModel, userContext);
|
||||
// 触发更新知识库文件预估大小值
|
||||
this.knowledgeDocumentDomainService.triggerUpdateKnowledgeFileSize(knowledgeDocumentModel.getKbId());
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取远程文件大小(字节)
|
||||
*/
|
||||
public static long getFileSize(String fileUrl) throws IOException, URISyntaxException {
|
||||
URL url = new URI(fileUrl).toURL();
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("HEAD"); // 只获取头信息,不下载内容
|
||||
conn.setConnectTimeout(5000);
|
||||
conn.setReadTimeout(5000);
|
||||
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
|
||||
|
||||
int code = conn.getResponseCode();
|
||||
if (code != HttpURLConnection.HTTP_OK) {
|
||||
throw new IOException("请求失败,HTTP状态码: " + code);
|
||||
}
|
||||
|
||||
long size = conn.getContentLengthLong();
|
||||
conn.disconnect();
|
||||
return size;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,8 +35,8 @@ public class FileParseService {
|
||||
|
||||
List<String> segments = null;
|
||||
|
||||
int words = segmentConfig.getWords();
|
||||
int overlaps = segmentConfig.getOverlaps();
|
||||
int words = segmentConfig.getWords() == null ? 800 : segmentConfig.getWords();
|
||||
int overlaps = segmentConfig.getOverlaps() == null ? 10 : segmentConfig.getOverlaps();
|
||||
|
||||
if (segmentConfig.getSegment().equals(SegmentEnum.WORDS)) {
|
||||
List<String> contents = new ArrayList<>(1);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.xspaceagi.knowledge.sdk.sevice;
|
||||
|
||||
import com.xspaceagi.knowledge.sdk.request.KnowledgeDocumentRequestVo;
|
||||
import com.xspaceagi.knowledge.sdk.response.KnowledgeDocumentResponseVo;
|
||||
import com.xspaceagi.knowledge.sdk.vo.DocumentAddRequestVo;
|
||||
|
||||
/**
|
||||
* Q&A搜索接口
|
||||
@@ -15,6 +16,13 @@ public interface IKnowledgeDocumentSearchRpcService {
|
||||
* @param requestVo 搜索参数
|
||||
* @return 列表
|
||||
*/
|
||||
public KnowledgeDocumentResponseVo documentSearch(KnowledgeDocumentRequestVo requestVo);
|
||||
KnowledgeDocumentResponseVo documentSearch(KnowledgeDocumentRequestVo requestVo);
|
||||
|
||||
/**
|
||||
* 文档添加
|
||||
*
|
||||
* @param documentAddRequestVo 文档添加参数
|
||||
* @return 文档id
|
||||
*/
|
||||
Long documentAdd(DocumentAddRequestVo documentAddRequestVo);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.xspaceagi.knowledge.sdk.vo;
|
||||
|
||||
import com.xspaceagi.knowledge.sdk.enums.SegmentEnum;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class DocumentAddRequestVo implements Serializable {
|
||||
|
||||
@Schema(description = "知识库ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private Long kbId;
|
||||
|
||||
@Schema(description = "文档名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "文件内容")
|
||||
private String fileContent;
|
||||
|
||||
@Schema(description = "文件URL")
|
||||
private String docUrl;
|
||||
|
||||
@Schema(description = "分段类型,words: 按照词数分段, delimiter: 按照分隔符分段,field: 按照字段分段")
|
||||
private SegmentEnum segment;
|
||||
|
||||
@Schema(description = "分段最大字符数,选择words或delimiter时有效")
|
||||
private Integer words;
|
||||
|
||||
@Schema(description = "用户ID")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "用户名称")
|
||||
private String userName;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user