文章导入知识库
This commit is contained in:
@@ -967,5 +967,163 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<TbAiKnowledge> createKnowledgeInternal(TbAiKnowledge knowledge) {
|
||||
ResultDomain<TbAiKnowledge> resultDomain = new ResultDomain<>();
|
||||
|
||||
try {
|
||||
// 1. 参数验证
|
||||
if (!StringUtils.hasText(knowledge.getTitle())) {
|
||||
resultDomain.fail("知识库标题不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 2. 检查是否已存在(通过ID)
|
||||
if (StringUtils.hasText(knowledge.getId())) {
|
||||
TbAiKnowledge existing = knowledgeMapper.selectKnowledgeById(knowledge.getId());
|
||||
if (existing != null && !existing.getDeleted()) {
|
||||
log.info("知识库已存在,跳过创建: id={}, title={}", knowledge.getId(), knowledge.getTitle());
|
||||
resultDomain.success("知识库已存在", existing);
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 在Dify创建知识库
|
||||
String difyDatasetId = null;
|
||||
String indexingTechnique = knowledge.getDifyIndexingTechnique();
|
||||
String embeddingModel = knowledge.getEmbeddingModel();
|
||||
|
||||
try {
|
||||
DatasetCreateRequest difyRequest = new DatasetCreateRequest();
|
||||
difyRequest.setName(knowledge.getTitle());
|
||||
difyRequest.setDescription(knowledge.getDescription());
|
||||
|
||||
// 使用配置的索引方式和Embedding模型
|
||||
if (!StringUtils.hasText(indexingTechnique)) {
|
||||
indexingTechnique = difyConfig.getDataset().getDefaultIndexingTechnique();
|
||||
}
|
||||
difyRequest.setIndexingTechnique(indexingTechnique);
|
||||
|
||||
if (!StringUtils.hasText(embeddingModel)) {
|
||||
embeddingModel = difyConfig.getDataset().getDefaultEmbeddingModel();
|
||||
}
|
||||
difyRequest.setEmbeddingModel(embeddingModel);
|
||||
|
||||
// 设置模型提供商
|
||||
String provider = knowledge.getEmbeddingModelProvider();
|
||||
if (StringUtils.hasText(provider)) {
|
||||
difyRequest.setEmbeddingModelProvider(provider);
|
||||
}
|
||||
|
||||
// 设置检索模型配置
|
||||
RetrievalModel retrievalModel = new RetrievalModel();
|
||||
retrievalModel.setSearchMethod("hybrid_search");
|
||||
|
||||
if (knowledge.getRetrievalTopK() != null && knowledge.getRetrievalTopK() > 0) {
|
||||
retrievalModel.setTopK(knowledge.getRetrievalTopK());
|
||||
} else {
|
||||
retrievalModel.setTopK(5);
|
||||
}
|
||||
|
||||
if (knowledge.getRetrievalScoreThreshold() != null && knowledge.getRetrievalScoreThreshold() >= 0) {
|
||||
retrievalModel.setScoreThreshold(knowledge.getRetrievalScoreThreshold());
|
||||
retrievalModel.setScoreThresholdEnabled(knowledge.getRetrievalScoreThreshold() > 0);
|
||||
} else {
|
||||
retrievalModel.setScoreThreshold(0.5);
|
||||
retrievalModel.setScoreThresholdEnabled(true);
|
||||
}
|
||||
|
||||
Boolean rerankEnable = knowledge.getRerankingEnable() != null ? knowledge.getRerankingEnable() : false;
|
||||
retrievalModel.setRerankingEnable(rerankEnable);
|
||||
|
||||
if (rerankEnable && StringUtils.hasText(knowledge.getRerankModel())
|
||||
&& StringUtils.hasText(knowledge.getRerankModelProvider())) {
|
||||
retrievalModel.setRerankingMode("reranking_model");
|
||||
RetrievalModel.RerankingModel rerankingModel = new RetrievalModel.RerankingModel();
|
||||
rerankingModel.setRerankingProviderName(knowledge.getRerankModelProvider());
|
||||
rerankingModel.setRerankingModelName(knowledge.getRerankModel());
|
||||
retrievalModel.setRerankingModel(rerankingModel);
|
||||
}
|
||||
|
||||
difyRequest.setRetrievalModel(retrievalModel);
|
||||
|
||||
log.info("内部创建知识库 - 请求参数: title={}, indexingTechnique={}",
|
||||
knowledge.getTitle(), indexingTechnique);
|
||||
DatasetCreateResponse difyResponse = difyApiClient.createDataset(difyRequest);
|
||||
|
||||
difyDatasetId = difyResponse.getId();
|
||||
log.info("Dify知识库创建成功: {} - {}", difyDatasetId, knowledge.getTitle());
|
||||
|
||||
} catch (DifyException e) {
|
||||
log.error("Dify知识库创建失败", e);
|
||||
resultDomain.fail("创建Dify知识库失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 4. 保存到本地数据库
|
||||
if (!StringUtils.hasText(knowledge.getId())) {
|
||||
knowledge.setId(UUID.randomUUID().toString());
|
||||
}
|
||||
knowledge.setDifyDatasetId(difyDatasetId);
|
||||
knowledge.setDifyIndexingTechnique(indexingTechnique);
|
||||
knowledge.setEmbeddingModel(embeddingModel);
|
||||
knowledge.setCreator("1"); // 系统创建
|
||||
knowledge.setUpdater("1");
|
||||
knowledge.setCreateTime(new Date());
|
||||
knowledge.setUpdateTime(new Date());
|
||||
knowledge.setDeleted(false);
|
||||
|
||||
if (knowledge.getStatus() == null) {
|
||||
knowledge.setStatus(1);
|
||||
}
|
||||
if (knowledge.getDocumentCount() == null) {
|
||||
knowledge.setDocumentCount(0);
|
||||
}
|
||||
if (knowledge.getTotalChunks() == null) {
|
||||
knowledge.setTotalChunks(0);
|
||||
}
|
||||
|
||||
int rows = knowledgeMapper.insertKnowledge(knowledge);
|
||||
if (rows <= 0) {
|
||||
try {
|
||||
difyApiClient.deleteDataset(difyDatasetId);
|
||||
} catch (Exception ex) {
|
||||
log.error("回滚删除Dify知识库失败", ex);
|
||||
}
|
||||
resultDomain.fail("保存知识库失败");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 5. 创建公开权限(所有人可访问)
|
||||
// 创建一个superadmin的UserDeptRoleVO来调用权限创建
|
||||
try {
|
||||
UserDeptRoleVO superAdminRole = new UserDeptRoleVO();
|
||||
superAdminRole.setUserID("system");
|
||||
superAdminRole.setDeptID("root_department");
|
||||
superAdminRole.setRoleID("superadmin");
|
||||
|
||||
resourcePermissionService.createResourcePermission(
|
||||
ResourceType.AI_KNOWLEDGE.getCode(),
|
||||
knowledge.getId(),
|
||||
superAdminRole
|
||||
);
|
||||
log.info("内部知识库权限创建成功: knowledgeId={}", knowledge.getId());
|
||||
} catch (Exception e) {
|
||||
log.error("内部知识库权限创建失败,但知识库已创建成功", e);
|
||||
// 权限创建失败不影响知识库创建
|
||||
}
|
||||
|
||||
log.info("内部知识库创建成功: {} - {}", knowledge.getId(), knowledge.getTitle());
|
||||
resultDomain.success("知识库创建成功", knowledge);
|
||||
return resultDomain;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("内部创建知识库异常", e);
|
||||
resultDomain.fail("创建知识库异常: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user