1. 添加 问答对话 功能逻辑

main
xueqingkun 11 months ago
parent 8fe1433df1
commit 1334e87c8e

@ -1,9 +1,13 @@
package com.supervision.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.supervision.model.KgInfo;
import com.supervision.qanything.QanythingService;
import com.supervision.qanything.dto.ChatResult;
import com.supervision.qanything.dto.ResultWrapper;
import com.supervision.service.KGService;
import com.supervision.vo.kg.ChatReqVo;
import com.supervision.vo.kg.ChatResVo;
@ -24,6 +28,8 @@ import java.security.NoSuchAlgorithmException;
public class KGController {
private final KGService kgService;
private final QanythingService qanythingService;
@ApiOperation("问答对话")
@PostMapping("/chat")
public ChatResVo chat(@RequestBody ChatReqVo chatReqVo) throws NoSuchAlgorithmException {
@ -31,6 +37,13 @@ public class KGController {
return kgService.chat(chatReqVo.getQuestion());
}
@ApiOperation("qanythingChat问答对话-调试用")
@PostMapping("/qanythingChat")
public ResultWrapper<ChatResult> qanythingChat(@RequestBody ChatReqVo chatReqVo) throws NoSuchAlgorithmException {
return qanythingService.chat(chatReqVo.getQuestion(), CollUtil.newArrayList("KB6ada48988e694ad197af53cc0d1e4b78_240328"));
}
@ApiOperation("热点知识")
@PostMapping("/hotKG")

@ -4,6 +4,7 @@ package com.supervision.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.supervision.model.GeBytearray;
@ -22,20 +23,15 @@ import com.supervision.vo.kg.UploadDocResVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -57,7 +53,8 @@ public class KGServiceImpl implements KGService {
public ChatResVo chat(String question) throws NoSuchAlgorithmException {
Assert.notEmpty(question, "问题不能为空");
ResultWrapper<ChatResult> chat = qanythingService.chat(question, CollUtil.newArrayList(kbId));
ArrayList<String> kbIds = CollUtil.newArrayList("KB6ada48988e694ad197af53cc0d1e4b78_240328", "KB403a6543629648a3a74b60be5707398f_240328");
ResultWrapper<ChatResult> chat = qanythingService.chat(question, kbIds);
if (!chat.isSuccess()) {
log.info("Qanything 聊天失败,原因:{}",chat.getMsg());
return ChatResVo.makeError();
@ -71,13 +68,30 @@ public class KGServiceImpl implements KGService {
if (CollUtil.isEmpty(result.getSource())){
return chatResVo;
}
Set<String> qaFileId = result.getSource().stream().map(SourceDTO::getFileId).filter(Objects::nonNull).collect(Collectors.toSet());
chatResVo.setSourceKgInfoList(qaSource2SourceKgInfo(result.getSource()));
return chatResVo;
}
private List<SourceKgInfo> qaSource2SourceKgInfo(List<SourceDTO> sourceDTOList){
List<SourceKgInfo> sourceKgInfoList = CollUtil.newArrayList();
if (CollUtil.isEmpty(sourceDTOList)){
return sourceKgInfoList;
}
Set<String> qaFileId = sourceDTOList.stream().map(SourceDTO::getFileId).filter(Objects::nonNull).collect(Collectors.toSet());
Set<String> preferFileIds = new HashSet<>();
if (CollUtil.isNotEmpty(qaFileId)) {
List<SourceKgInfo> sourceKgInfos = kgInfoService.lambdaQuery().in(KgInfo::getFileQaDocId, qaFileId).list()
.stream().map(SourceKgInfo::kgInfo2SourceKgInfo).collect(Collectors.toList());
chatResVo.setSourceKgInfoList(sourceKgInfos);
// 优先使用数据库中配置的信息
List<KgInfo> preferKgInfoList = kgInfoService.lambdaQuery().in(KgInfo::getFileQaDocId, qaFileId).list();
List<SourceKgInfo> sourceKgInfos = preferKgInfoList.stream().peek(kgInfo->preferFileIds.add(kgInfo.getFileQaDocId()))
.map(SourceKgInfo::kgInfo2SourceKgInfo)
.filter(source-> StrUtil.isNotEmpty(source.getSummary())).collect(Collectors.toList());
sourceKgInfoList.addAll(sourceKgInfos);
}
return chatResVo;
// 数据库中未配置信息则是使用Qanything返回的信息
List<SourceKgInfo> candidateKgInfoList = sourceDTOList.stream().filter(source -> !preferFileIds.contains(source.getFileId()))
.map(SourceKgInfo::sourceDTO2SourceKgInfo).collect(Collectors.toList());
sourceKgInfoList.addAll(candidateKgInfoList);
return sourceKgInfoList;
}
@Override

@ -1,6 +1,8 @@
package com.supervision.vo.kg;
import cn.hutool.core.util.StrUtil;
import com.supervision.model.KgInfo;
import com.supervision.qanything.dto.SourceDTO;
import lombok.Data;
import java.util.Objects;
@ -48,4 +50,21 @@ public class SourceKgInfo {
sourceKgInfo.setSummary(kgInfo.getSummary());
return sourceKgInfo;
}
public static SourceKgInfo sourceDTO2SourceKgInfo(SourceDTO sourceDTO){
SourceKgInfo sourceKgInfo = new SourceKgInfo();
if (Objects.isNull(sourceDTO)){
return sourceKgInfo;
}
sourceKgInfo.setFileId(sourceDTO.getFileId());
String fileName = sourceDTO.getFileName();
if (StrUtil.isNotEmpty(fileName)){
sourceKgInfo.setTitle(fileName.substring(0,fileName.lastIndexOf(".")));
}
sourceKgInfo.setLabel("1");
sourceKgInfo.setClassify(1);
sourceKgInfo.setContentType(1);
sourceKgInfo.setSummary(sourceDTO.getContent());
return sourceKgInfo;
}
}

@ -40,10 +40,10 @@ public class YoudaoTest {
@Test
public void qanythingChatTest() throws NoSuchAlgorithmException {
/* ResultWrapper<ChatResult> chat = qanythingService.chat("怎样创建创建知识库", CollUtil.newArrayList("KB249d43fdb96f4e1399340b8f95e1baa0_240328"));
ResultWrapper<ChatResult> chat = qanythingService.chat("居民养老保险关系如何转移?", CollUtil.newArrayList("KB6ada48988e694ad197af53cc0d1e4b78_240328"));
System.out.println("返回结果:"+ JSONUtil.toJsonStr(chat));
System.out.println(chat.getResult().getResponse());*/
System.out.println("====================回答=========================");
System.out.println(chat.getResult().getResponse());
}
@Test

Loading…
Cancel
Save