From 525045628243128ba55b670483378ae5aeddb52d Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Tue, 7 May 2024 17:28:33 +0800 Subject: [PATCH] =?UTF-8?q?1.=20qanyting=20=E9=9B=86=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=8E=A5=E5=8F=A3=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qanything/dto/offline/ChatParam.java | 35 ++++++ .../qanything/dto/offline/ChatResult.java | 68 ++++++++++++ .../qanything/dto/offline/SourceDocument.java | 30 +++++ .../impl/OfflineQanythingServiceImpl.java | 105 ++++++++++++++++++ .../qanything/impl/QanythingServiceImpl.java | 2 + .../src/main/resources/application-dev.yml | 3 +- .../src/main/resources/application-test.yml | 3 +- .../test/java/com/supervision/YoudaoTest.java | 3 +- 8 files changed, 246 insertions(+), 3 deletions(-) create mode 100644 kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatParam.java create mode 100644 kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatResult.java create mode 100644 kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/SourceDocument.java create mode 100644 kbqa-graph/src/main/java/com/supervision/qanything/impl/OfflineQanythingServiceImpl.java diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatParam.java b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatParam.java new file mode 100644 index 0000000..9ad0746 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatParam.java @@ -0,0 +1,35 @@ +package com.supervision.qanything.dto.offline; + +import com.supervision.qanything.dto.HistoryDTO; +import lombok.Data; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class ChatParam { + + private String userId; + + private List kbIds; + + private List history; + + private String question; + + private boolean streaming; + + private String productSource; + + public Map toMap() { + Map map = new HashMap<>(); + map.put("user_id", userId); + map.put("kb_ids", kbIds); + map.put("history", history); + map.put("question", question); + map.put("streaming", streaming); + map.put("product_source", productSource); + return map; + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatResult.java b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatResult.java new file mode 100644 index 0000000..3fca5e9 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/ChatResult.java @@ -0,0 +1,68 @@ +package com.supervision.qanything.dto.offline; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.supervision.qanything.dto.HistoryDTO; +import com.supervision.qanything.dto.ResultWrapper; +import com.supervision.qanything.dto.SourceDTO; +import lombok.Data; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Data +public class ChatResult { + private String code; + + private String msg; + + private String question; + + private String response; + + private List> history; + + private List source_documents; + + public ResultWrapper toResultWrapper() { + ResultWrapper resultWrapper = new ResultWrapper<>(); + resultWrapper.setMsg("200".equals(code)?"0":"500"); + resultWrapper.setMsg(msg); + com.supervision.qanything.dto.ChatResult chatResult = new com.supervision.qanything.dto.ChatResult(); + chatResult.setQuestion(question); + if (StrUtil.isNotEmpty(response)){ + String jsonString = StrUtil.removePrefix(response, "data: "); + String answer = JSONUtil.parseObj(jsonString).getStr("answer"); + chatResult.setResponse(answer); + } + + // setHistory + if (CollUtil.isNotEmpty(history)){ + List historyDTOS = history.stream().map(item -> { + if (CollUtil.isNotEmpty(item)) { + HistoryDTO historyDTO = new HistoryDTO(); + historyDTO.setQuestion(item.get(0)); + if (item.size() > 1) { + historyDTO.setResponse(item.get(1)); + } + return historyDTO; + } else { + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toList()); + chatResult.setHistory(historyDTOS); + } + + // setSource + if (CollUtil.isNotEmpty(source_documents)){ + List sourceDTOS = this.source_documents.stream().map(SourceDocument::toSourceDTO).collect(Collectors.toList()); + chatResult.setSource(sourceDTOS); + } + + resultWrapper.setResult(chatResult); + return resultWrapper; + + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/SourceDocument.java b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/SourceDocument.java new file mode 100644 index 0000000..cd4c1a0 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/qanything/dto/offline/SourceDocument.java @@ -0,0 +1,30 @@ +package com.supervision.qanything.dto.offline; + +import com.supervision.qanything.dto.SourceDTO; +import lombok.Data; + +@Data +public class SourceDocument { + private String file_id; + + private String file_name; + + private String content; + + private String retrieval_query; + + private String file_path; + + private String score; + + private String embed_version; + + public SourceDTO toSourceDTO() { + SourceDTO sourceDTO = new SourceDTO(); + sourceDTO.setFileId(this.file_id); + sourceDTO.setFileName(this.file_name); + sourceDTO.setContent(this.content); + sourceDTO.setScore(this.score); + return sourceDTO; + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/qanything/impl/OfflineQanythingServiceImpl.java b/kbqa-graph/src/main/java/com/supervision/qanything/impl/OfflineQanythingServiceImpl.java new file mode 100644 index 0000000..681477c --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/qanything/impl/OfflineQanythingServiceImpl.java @@ -0,0 +1,105 @@ +package com.supervision.qanything.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONUtil; +import com.supervision.qanything.QanythingService; +import com.supervision.qanything.dto.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +@Service +@Slf4j +@RequiredArgsConstructor +@ConditionalOnProperty(name = "youdao.qanthing.online", havingValue = "false") +public class OfflineQanythingServiceImpl implements QanythingService { + + @Value("${youdao.qanthing.baseUrl}") + private String BASE_URL; + + @Value("${youdao.qanthing.default_user_id:zzp}") + private String defaultUserId; + @Override + public ResultWrapper createKB(String kbName) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper deleteKB(String kbId) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper chat(String question, List kbIds) { + + kbIds = CollUtil.newArrayList("KB90b7c7ca27d543eab714e746c5f6f1f0"); + Assert.notEmpty(kbIds, "kbIds不能为空"); + Assert.notEmpty(question, "问题不能为空"); + + com.supervision.qanything.dto.offline.ChatParam chatParam = new com.supervision.qanything.dto.offline.ChatParam(); + chatParam.setQuestion(question); + chatParam.setKbIds(kbIds); + chatParam.setUserId(defaultUserId); + String paramString = JSONUtil.toJsonStr(chatParam.toMap()); + log.info("chat:请求参数:{}", paramString); + HttpRequest request = HttpRequest.post(BASE_URL + "/api/local_doc_qa/local_doc_chat") + .body(paramString); + try (HttpResponse response = request.execute()){ + String body = response.body(); + log.info("chat:响应结果:{}", body); + com.supervision.qanything.dto.offline.ChatResult offLineChatResult = JSONUtil.toBean(body, com.supervision.qanything.dto.offline.ChatResult.class); + return offLineChatResult.toResultWrapper(); + } + } + + @Override + public ResultWrapper chat(String question, List history, List kbIds) throws NoSuchAlgorithmException { + return null; + } + + @Override + public void chatStream(HttpServletResponse response, String question, List kbIds) throws NoSuchAlgorithmException, IOException { + + } + + @Override + public ResultWrapper> uploadDoc(String kbId, File file) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper> uploadDoc(String kbId, String fileName, byte[] bytes) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper> uploadUrl(String kbId, String url) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper> deleteFile(String kbId, List fileIds) throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper> kbList() throws NoSuchAlgorithmException { + return null; + } + + @Override + public ResultWrapper> fileList(String kbId) throws NoSuchAlgorithmException { + return null; + } +} 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 4d8e8cf..dbe81a2 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 @@ -13,6 +13,7 @@ import com.supervision.qanything.util.AuthV3Util; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; @@ -25,6 +26,7 @@ import java.util.List; @Slf4j @Service @RequiredArgsConstructor +@ConditionalOnProperty(name = "youdao.qanthing.online", matchIfMissing = true) public class QanythingServiceImpl implements QanythingService { @Value("${youdao.qanthing.appKey}") diff --git a/kbqa-graph/src/main/resources/application-dev.yml b/kbqa-graph/src/main/resources/application-dev.yml index 8cc0cff..adc27bb 100644 --- a/kbqa-graph/src/main/resources/application-dev.yml +++ b/kbqa-graph/src/main/resources/application-dev.yml @@ -67,4 +67,5 @@ youdao: baseUrl: https://openapi.youdao.com appKey: 071053d9bc4b544c appSecret: nObcggsh0li2eGtyII6XOGtSCo6nFgdD - kbId: KB6ada48988e694ad197af53cc0d1e4b78_240328 \ No newline at end of file + kbId: KB6ada48988e694ad197af53cc0d1e4b78_240328 + online: false \ No newline at end of file diff --git a/kbqa-graph/src/main/resources/application-test.yml b/kbqa-graph/src/main/resources/application-test.yml index 3ccae08..88e7859 100644 --- a/kbqa-graph/src/main/resources/application-test.yml +++ b/kbqa-graph/src/main/resources/application-test.yml @@ -67,4 +67,5 @@ youdao: baseUrl: https://openapi.youdao.com appKey: 071053d9bc4b544c appSecret: nObcggsh0li2eGtyII6XOGtSCo6nFgdD - kbId: KB6ada48988e694ad197af53cc0d1e4b78_240328 \ No newline at end of file + kbId: KB6ada48988e694ad197af53cc0d1e4b78_240328 + online: false \ No newline at end of file diff --git a/kbqa-graph/src/test/java/com/supervision/YoudaoTest.java b/kbqa-graph/src/test/java/com/supervision/YoudaoTest.java index c32f5a3..88e0ff4 100644 --- a/kbqa-graph/src/test/java/com/supervision/YoudaoTest.java +++ b/kbqa-graph/src/test/java/com/supervision/YoudaoTest.java @@ -44,7 +44,8 @@ public class YoudaoTest { HistoryDTO historyDTO = new HistoryDTO(); historyDTO.setQuestion("居民养老保险关系如何转移?"); historyDTO.setResponse("居民养老保险关系的转移需要按照相关规定办理手续。根据参考信息中的《城镇企业职工基本养老保险关系转移接续暂行办法》,参保人员在跨省流动就业时,需要向原参保地的社会保险经办机构提出申请,并提供相关材料。新参保地的社保经办机构会审核申请,并在符合条件的情况下发出同意接收函。转移接续手续完成后,参保人员的基本养老保险关系会随之转移到新参保地。具体的转移接续流程和要求可以根据相关部门的规定进行办理。"); - ResultWrapper chat = qanythingService.chat("需要提供哪些材料?", CollUtil.newArrayList(historyDTO),CollUtil.newArrayList("KB6ada48988e694ad197af53cc0d1e4b78_240328")); + //ResultWrapper chat = qanythingService.chat("需要提供哪些材料?", CollUtil.newArrayList(historyDTO),CollUtil.newArrayList("KB6ada48988e694ad197af53cc0d1e4b78_240328")); + ResultWrapper chat = qanythingService.chat("广东省城乡居民基本养老保险实施办法讲的是什么?",CollUtil.newArrayList("KB950dcd224dbb4bb9a323c84157fdd216")); System.out.println("====================回答========================="); System.out.println(chat.getResult().getResponse()); }