diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/QanythingService.java b/kbqa-graph/src/main/java/com/supervision/qanything/QanythingService.java index 20b0968..efa9c32 100644 --- a/kbqa-graph/src/main/java/com/supervision/qanything/QanythingService.java +++ b/kbqa-graph/src/main/java/com/supervision/qanything/QanythingService.java @@ -1,9 +1,6 @@ package com.supervision.qanything; -import com.supervision.qanything.dto.ChatResult; -import com.supervision.qanything.dto.CreateKBResult; -import com.supervision.qanything.dto.ResultWrapper; -import com.supervision.qanything.dto.UploadResult; +import com.supervision.qanything.dto.*; import java.io.File; import java.security.NoSuchAlgorithmException; @@ -28,6 +25,9 @@ public interface QanythingService { */ ResultWrapper chat(String question,List kbIds) throws NoSuchAlgorithmException; + + ResultWrapper chat(String question,List history, List kbIds) throws NoSuchAlgorithmException; + /** * 上传文件接口 * @param kbId 知识库ID diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/dto/SourceDTO.java b/kbqa-graph/src/main/java/com/supervision/qanything/dto/SourceDTO.java index ecc6a43..7a40290 100644 --- a/kbqa-graph/src/main/java/com/supervision/qanything/dto/SourceDTO.java +++ b/kbqa-graph/src/main/java/com/supervision/qanything/dto/SourceDTO.java @@ -26,5 +26,5 @@ public class SourceDTO { /** * 可信度 */ - private String source; + private String score; } diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/impl/QanythingServiceImpl.java b/kbqa-graph/src/main/java/com/supervision/qanything/impl/QanythingServiceImpl.java index 0689cdc..303c985 100644 --- a/kbqa-graph/src/main/java/com/supervision/qanything/impl/QanythingServiceImpl.java +++ b/kbqa-graph/src/main/java/com/supervision/qanything/impl/QanythingServiceImpl.java @@ -96,6 +96,29 @@ public class QanythingServiceImpl implements QanythingService { } } + @Override + public ResultWrapper chat(String question, List history, List kbIds) throws NoSuchAlgorithmException { + Assert.notEmpty(kbIds, "kbIds不能为空"); + Assert.notEmpty(question, "问题不能为空"); + + log.info("chat:请求入参:question:{},kbIds:{},history:{}", question, kbIds,JSONUtil.toJsonStr(history)); + ChatParam chatParam = new ChatParam(); + chatParam.setQ(question); + chatParam.setKbIds(kbIds); + chatParam.setHistory(history); + // 添加鉴权相关参数 + AuthV3Util.addAuthParams(APP_KEY, APP_SECRET, chatParam); + String paramString = JSONUtil.toJsonStr(chatParam); + log.info("chat:请求参数:{}", paramString); + HttpRequest request = HttpRequest.post(BASE_URL + QanythingConstant.URL_CHAT) + .body(paramString); + try (HttpResponse response = request.execute()){ + String body = response.body(); + log.info("chat:响应结果:{}", body); + return JSONUtil.toBean(body, new TypeReference>(){},true); + } + } + @Override public ResultWrapper> uploadDoc(String kbId, File file) throws NoSuchAlgorithmException { Assert.notNull(file, "文件不能为空"); diff --git a/kbqa-graph/src/main/java/com/supervision/service/impl/KGServiceImpl.java b/kbqa-graph/src/main/java/com/supervision/service/impl/KGServiceImpl.java index 4c1fd6b..178e43b 100644 --- a/kbqa-graph/src/main/java/com/supervision/service/impl/KGServiceImpl.java +++ b/kbqa-graph/src/main/java/com/supervision/service/impl/KGServiceImpl.java @@ -32,6 +32,9 @@ import java.io.IOException; import java.nio.file.Files; import java.security.NoSuchAlgorithmException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; @Slf4j @@ -77,13 +80,22 @@ public class KGServiceImpl implements KGService { if (CollUtil.isEmpty(sourceDTOList)){ return sourceKgInfoList; } + // 根据fileId进行去重 + sourceDTOList = sourceDTOList.stream().filter(distinctPredicate(SourceDTO::getFileId)).collect(Collectors.toList()); + // qanything 中文件id与文件内容的映射 + Map fileIdMapContent = sourceDTOList.stream().collect(Collectors.toMap(SourceDTO::getFileId, SourceDTO::getContent, (o, n) -> o)); Set qaFileId = sourceDTOList.stream().map(SourceDTO::getFileId).filter(Objects::nonNull).collect(Collectors.toSet()); + // 优先选择的文档id Set preferFileIds = new HashSet<>(); if (CollUtil.isNotEmpty(qaFileId)) { // 优先使用数据库中配置的信息 List preferKgInfoList = kgInfoService.lambdaQuery().in(KgInfo::getFileQaDocId, qaFileId).list(); List sourceKgInfos = preferKgInfoList.stream().peek(kgInfo->preferFileIds.add(kgInfo.getFileQaDocId())) - .map(SourceKgInfo::kgInfo2SourceKgInfo) + .peek(kgInfo->{ + if (StrUtil.isEmpty(kgInfo.getContent())){ + kgInfo.setContent(fileIdMapContent.get(kgInfo.getFileQaDocId())); + } + }).map(SourceKgInfo::kgInfo2SourceKgInfo) .filter(source-> StrUtil.isNotEmpty(source.getSummary())).collect(Collectors.toList()); sourceKgInfoList.addAll(sourceKgInfos); } @@ -141,4 +153,11 @@ public class KGServiceImpl implements KGService { return null; } + + public static Predicate distinctPredicate(Function function) { + ConcurrentHashMap map = new ConcurrentHashMap<>(); + // 根据key进行去重,并排除为null的数据 + return t -> null == map.putIfAbsent(function.apply(t), true); + + } } diff --git a/kbqa-graph/src/main/java/com/supervision/vo/kg/SourceKgInfo.java b/kbqa-graph/src/main/java/com/supervision/vo/kg/SourceKgInfo.java index 90c1f24..fe27405 100644 --- a/kbqa-graph/src/main/java/com/supervision/vo/kg/SourceKgInfo.java +++ b/kbqa-graph/src/main/java/com/supervision/vo/kg/SourceKgInfo.java @@ -18,7 +18,7 @@ public class SourceKgInfo { private String title; /** - * 标签 1:知识 2:通知 3:办事指南 4:政策解读 + * 标签 1:知识 2:通知 3:办事指南 4:政策解读 5:政策法规 6: 意见 */ private String label; diff --git a/kbqa-model/src/main/java/com/supervision/model/KgInfo.java b/kbqa-model/src/main/java/com/supervision/model/KgInfo.java index 58b5f68..6206f0f 100644 --- a/kbqa-model/src/main/java/com/supervision/model/KgInfo.java +++ b/kbqa-model/src/main/java/com/supervision/model/KgInfo.java @@ -21,7 +21,7 @@ public class KgInfo implements Serializable { private String id; /** - * 标签 1:知识 2:通知 3:办事指南 4:政策解读 + * 标签 1:知识 2:通知 3:办事指南 4:政策解读 5:政策法规 6: 意见 */ private String label;