文章导入知识库

This commit is contained in:
2026-01-12 13:52:19 +08:00
parent 26df740dd0
commit 12dca45b4d
20 changed files with 1371 additions and 15 deletions

View File

@@ -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;
}
}
}