(improvement)(Chat) Split chatService into chatManageService and chatService (#826)

Co-authored-by: jolunoluo
This commit is contained in:
LXW
2024-03-15 16:54:55 +08:00
committed by GitHub
parent 4291ec7bd7
commit 7f24c4c4e0
6 changed files with 266 additions and 210 deletions

View File

@@ -7,7 +7,7 @@ import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
import com.tencent.supersonic.chat.api.pojo.response.QueryResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp; import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.service.ChatService; import com.tencent.supersonic.chat.server.service.ChatManageService;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
@@ -23,9 +24,9 @@ import java.util.List;
@RequestMapping({"/api/chat/manage", "/openapi/chat/manage"}) @RequestMapping({"/api/chat/manage", "/openapi/chat/manage"})
public class ChatController { public class ChatController {
private final ChatService chatService; private final ChatManageService chatService;
public ChatController(ChatService chatService) { public ChatController(ChatManageService chatService) {
this.chatService = chatService; this.chatService = chatService;
} }

View File

@@ -0,0 +1,47 @@
package com.tencent.supersonic.chat.server.service;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatParseDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
import java.util.List;
public interface ChatManageService {
Boolean addChat(User user, String chatName, Integer agentId);
List<ChatDO> getAll(String userName, Integer agentId);
boolean updateChatName(Long chatId, String chatName, String userName);
boolean updateFeedback(Integer id, Integer score, String feedback);
boolean updateChatIsTop(Long chatId, int isTop);
Boolean deleteChat(Long chatId, String userName);
PageInfo<QueryResp> queryInfo(PageQueryInfoReq pageQueryInfoReq, long chatId);
void createChatQuery(ChatParseReq chatParseReq, ParseResp parseResp);
QueryResp getChatQuery(Long queryId);
ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoReq, int agentId);
ChatQueryDO saveQueryResult(ChatExecuteReq chatExecuteReq, QueryResult queryResult);
int updateQuery(ChatQueryDO chatQueryDO);
List<ChatParseDO> batchAddParse(ChatParseReq chatParseReq, ParseResp parseResult);
SemanticParseInfo getParseInfo(Long questionId, int parseId);
}

View File

@@ -1,16 +1,9 @@
package com.tencent.supersonic.chat.server.service; package com.tencent.supersonic.chat.server.service;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq; import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatQueryDataReq; import com.tencent.supersonic.chat.api.pojo.request.ChatQueryDataReq;
import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatParseDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
@@ -33,27 +26,4 @@ public interface ChatService {
Object queryDimensionValue(DimensionValueReq dimensionValueReq, User user) throws Exception; Object queryDimensionValue(DimensionValueReq dimensionValueReq, User user) throws Exception;
Boolean addChat(User user, String chatName, Integer agentId);
List<ChatDO> getAll(String userName, Integer agentId);
boolean updateChatName(Long chatId, String chatName, String userName);
boolean updateFeedback(Integer id, Integer score, String feedback);
boolean updateChatIsTop(Long chatId, int isTop);
Boolean deleteChat(Long chatId, String userName);
PageInfo<QueryResp> queryInfo(PageQueryInfoReq pageQueryInfoCommend, long chatId);
QueryResp getChatQuery(Long queryId);
ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoCommend, int agentId);
List<ChatParseDO> batchAddParse(ChatParseReq chatParseReq, ParseResp parseResult);
int updateQuery(ChatQueryDO chatQueryDO);
void saveQueryResult(ChatExecuteReq chatExecuteReq, QueryResult queryResult);
} }

View File

@@ -0,0 +1,197 @@
package com.tencent.supersonic.chat.server.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatParseDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.QueryDO;
import com.tencent.supersonic.chat.server.persistence.repository.ChatQueryRepository;
import com.tencent.supersonic.chat.server.persistence.repository.ChatRepository;
import com.tencent.supersonic.chat.server.service.ChatManageService;
import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ChatManageServiceImpl implements ChatManageService {
@Autowired
private ChatRepository chatRepository;
@Autowired
private ChatQueryRepository chatQueryRepository;
@Override
public Boolean addChat(User user, String chatName, Integer agentId) {
ChatDO chatDO = new ChatDO();
chatDO.setChatName(chatName);
chatDO.setCreator(user.getName());
chatDO.setCreateTime(getCurrentTime());
chatDO.setIsDelete(0);
chatDO.setLastTime(getCurrentTime());
chatDO.setLastQuestion("Hello, welcome to using supersonic");
chatDO.setIsTop(0);
chatDO.setAgentId(agentId);
return chatRepository.createChat(chatDO);
}
@Override
public List<ChatDO> getAll(String userName, Integer agentId) {
return chatRepository.getAll(userName, agentId);
}
@Override
public boolean updateChatName(Long chatId, String chatName, String userName) {
return chatRepository.updateChatName(chatId, chatName, getCurrentTime(), userName);
}
@Override
public boolean updateFeedback(Integer id, Integer score, String feedback) {
QueryDO intelligentQueryDO = new QueryDO();
intelligentQueryDO.setId(id);
intelligentQueryDO.setScore(score);
intelligentQueryDO.setFeedback(feedback);
return chatRepository.updateFeedback(intelligentQueryDO);
}
@Override
public boolean updateChatIsTop(Long chatId, int isTop) {
return chatRepository.updateConversionIsTop(chatId, isTop);
}
@Override
public Boolean deleteChat(Long chatId, String userName) {
return chatRepository.deleteChat(chatId, userName);
}
@Override
public PageInfo<QueryResp> queryInfo(PageQueryInfoReq pageQueryInfoReq, long chatId) {
PageInfo<QueryResp> queryRespPageInfo = chatQueryRepository.getChatQuery(pageQueryInfoReq, chatId);
if (CollectionUtils.isEmpty(queryRespPageInfo.getList())) {
return queryRespPageInfo;
}
fillParseInfo(queryRespPageInfo.getList());
return queryRespPageInfo;
}
@Override
public void createChatQuery(ChatParseReq chatParseReq, ParseResp parseResp) {
Long queryId = chatQueryRepository.createChatQuery(chatParseReq);
parseResp.setQueryId(queryId);
}
@Override
public QueryResp getChatQuery(Long queryId) {
return chatQueryRepository.getChatQuery(queryId);
}
@Override
public ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoReq, int agentId) {
ShowCaseResp showCaseResp = new ShowCaseResp();
showCaseResp.setCurrent(pageQueryInfoReq.getCurrent());
showCaseResp.setPageSize(pageQueryInfoReq.getPageSize());
List<QueryResp> queryResps = chatQueryRepository.queryShowCase(pageQueryInfoReq, agentId);
if (CollectionUtils.isEmpty(queryResps)) {
return showCaseResp;
}
queryResps.removeIf(queryResp -> {
if (queryResp.getQueryResult() == null) {
return true;
}
if (queryResp.getQueryResult().getResponse() != null) {
return false;
}
if (CollectionUtils.isEmpty(queryResp.getQueryResult().getQueryResults())) {
return true;
}
Map<String, Object> data = queryResp.getQueryResult().getQueryResults().get(0);
return CollectionUtils.isEmpty(data);
});
queryResps = new ArrayList<>(queryResps.stream()
.collect(Collectors.toMap(QueryResp::getQueryText, Function.identity(),
(existing, replacement) -> existing, LinkedHashMap::new)).values());
fillParseInfo(queryResps);
Map<Long, List<QueryResp>> showCaseMap = queryResps.stream()
.collect(Collectors.groupingBy(QueryResp::getChatId));
showCaseResp.setShowCaseMap(showCaseMap);
return showCaseResp;
}
private void fillParseInfo(List<QueryResp> queryResps) {
List<Long> queryIds = queryResps.stream()
.map(QueryResp::getQuestionId).collect(Collectors.toList());
List<ChatParseDO> chatParseDOs = chatQueryRepository.getParseInfoList(queryIds);
if (CollectionUtils.isEmpty(chatParseDOs)) {
return;
}
Map<Long, List<ChatParseDO>> chatParseMap = chatParseDOs.stream()
.collect(Collectors.groupingBy(ChatParseDO::getQuestionId));
for (QueryResp queryResp : queryResps) {
List<ChatParseDO> chatParseDOList = chatParseMap.get(queryResp.getQuestionId());
if (CollectionUtils.isEmpty(chatParseDOList)) {
continue;
}
List<SemanticParseInfo> parseInfos = chatParseDOList.stream().map(chatParseDO ->
JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class))
.sorted(Comparator.comparingDouble(SemanticParseInfo::getScore).reversed())
.collect(Collectors.toList());
queryResp.setParseInfos(parseInfos);
}
}
@Override
public ChatQueryDO saveQueryResult(ChatExecuteReq chatExecuteReq, QueryResult queryResult) {
ChatQueryDO chatQueryDO = chatQueryRepository.getChatQueryDO(chatExecuteReq.getQueryId());
chatQueryDO.setQuestionId(chatExecuteReq.getQueryId());
chatQueryDO.setQueryResult(JsonUtil.toString(queryResult));
chatQueryDO.setQueryState(1);
updateQuery(chatQueryDO);
chatRepository.updateLastQuestion(chatExecuteReq.getChatId().longValue(),
chatExecuteReq.getQueryText(), getCurrentTime());
return chatQueryDO;
}
@Override
public int updateQuery(ChatQueryDO chatQueryDO) {
return chatQueryRepository.updateChatQuery(chatQueryDO);
}
@Override
public List<ChatParseDO> batchAddParse(ChatParseReq chatParseReq, ParseResp parseResult) {
List<SemanticParseInfo> candidateParses = parseResult.getSelectedParses();
return chatQueryRepository.batchSaveParseInfo(chatParseReq, parseResult, candidateParses);
}
private String getCurrentTime() {
SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return tempDate.format(new java.util.Date());
}
@Override
public SemanticParseInfo getParseInfo(Long questionId, int parseId) {
ChatParseDO chatParseDO = chatQueryRepository.getParseInfo(questionId, parseId);
return JSONObject.parseObject(chatParseDO.getParseInfo(), SemanticParseInfo.class);
}
}

View File

@@ -1,42 +1,32 @@
package com.tencent.supersonic.chat.server.service.impl; package com.tencent.supersonic.chat.server.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq; import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatQueryDataReq; import com.tencent.supersonic.chat.api.pojo.request.ChatQueryDataReq;
import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
import com.tencent.supersonic.chat.api.pojo.request.SimilarQueryReq; import com.tencent.supersonic.chat.api.pojo.request.SimilarQueryReq;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.agent.Agent; import com.tencent.supersonic.chat.server.agent.Agent;
import com.tencent.supersonic.chat.server.executor.ChatExecutor; import com.tencent.supersonic.chat.server.executor.ChatExecutor;
import com.tencent.supersonic.chat.server.parser.ChatParser; import com.tencent.supersonic.chat.server.parser.ChatParser;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatParseDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO;
import com.tencent.supersonic.chat.server.persistence.dataobject.QueryDO;
import com.tencent.supersonic.chat.server.persistence.repository.ChatQueryRepository;
import com.tencent.supersonic.chat.server.persistence.repository.ChatRepository;
import com.tencent.supersonic.chat.server.pojo.ChatExecuteContext; import com.tencent.supersonic.chat.server.pojo.ChatExecuteContext;
import com.tencent.supersonic.chat.server.pojo.ChatParseContext; import com.tencent.supersonic.chat.server.pojo.ChatParseContext;
import com.tencent.supersonic.chat.server.processor.execute.ExecuteResultProcessor; import com.tencent.supersonic.chat.server.processor.execute.ExecuteResultProcessor;
import com.tencent.supersonic.chat.server.processor.parse.ParseResultProcessor; import com.tencent.supersonic.chat.server.processor.parse.ParseResultProcessor;
import com.tencent.supersonic.chat.server.service.AgentService; import com.tencent.supersonic.chat.server.service.AgentService;
import com.tencent.supersonic.chat.server.service.ChatManageService;
import com.tencent.supersonic.chat.server.service.ChatService; import com.tencent.supersonic.chat.server.service.ChatService;
import com.tencent.supersonic.chat.server.util.ComponentFactory; import com.tencent.supersonic.chat.server.util.ComponentFactory;
import com.tencent.supersonic.chat.server.util.QueryReqConverter; import com.tencent.supersonic.chat.server.util.QueryReqConverter;
import com.tencent.supersonic.chat.server.util.SimilarQueryManager; import com.tencent.supersonic.chat.server.util.SimilarQueryManager;
import com.tencent.supersonic.common.util.BeanMapper; import com.tencent.supersonic.common.util.BeanMapper;
import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq; import com.tencent.supersonic.headless.api.pojo.request.QueryDataReq;
import com.tencent.supersonic.headless.api.pojo.request.QueryReq; import com.tencent.supersonic.headless.api.pojo.request.QueryReq;
import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.api.pojo.response.MapResp;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.headless.api.pojo.response.QueryResult; import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
import com.tencent.supersonic.headless.api.pojo.response.SearchResult; import com.tencent.supersonic.headless.api.pojo.response.SearchResult;
import com.tencent.supersonic.headless.server.service.ChatQueryService; import com.tencent.supersonic.headless.server.service.ChatQueryService;
@@ -44,15 +34,7 @@ import com.tencent.supersonic.headless.server.service.SearchService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@@ -60,9 +42,7 @@ import java.util.stream.Collectors;
public class ChatServiceImpl implements ChatService { public class ChatServiceImpl implements ChatService {
@Autowired @Autowired
private ChatRepository chatRepository; private ChatManageService chatManageService;
@Autowired
private ChatQueryRepository chatQueryRepository;
@Autowired @Autowired
private ChatQueryService chatQueryService; private ChatQueryService chatQueryService;
@Autowired @Autowired
@@ -84,7 +64,7 @@ public class ChatServiceImpl implements ChatService {
@Override @Override
public ParseResp performParsing(ChatParseReq chatParseReq) { public ParseResp performParsing(ChatParseReq chatParseReq) {
ParseResp parseResp = new ParseResp(chatParseReq.getChatId(), chatParseReq.getQueryText()); ParseResp parseResp = new ParseResp(chatParseReq.getChatId(), chatParseReq.getQueryText());
createChatQuery(chatParseReq, parseResp); chatManageService.createChatQuery(chatParseReq, parseResp);
ChatParseContext chatParseContext = buildParseContext(chatParseReq); ChatParseContext chatParseContext = buildParseContext(chatParseReq);
for (ChatParser chatParser : chatParsers) { for (ChatParser chatParser : chatParsers) {
chatParser.parse(chatParseContext, parseResp); chatParser.parse(chatParseContext, parseResp);
@@ -92,7 +72,7 @@ public class ChatServiceImpl implements ChatService {
for (ParseResultProcessor processor : parseResultProcessors) { for (ParseResultProcessor processor : parseResultProcessors) {
processor.process(chatParseContext, parseResp); processor.process(chatParseContext, parseResp);
} }
batchAddParse(chatParseReq, parseResp); chatManageService.batchAddParse(chatParseReq, parseResp);
return parseResp; return parseResp;
} }
@@ -128,7 +108,8 @@ public class ChatServiceImpl implements ChatService {
private ChatExecuteContext buildExecuteContext(ChatExecuteReq chatExecuteReq) { private ChatExecuteContext buildExecuteContext(ChatExecuteReq chatExecuteReq) {
ChatExecuteContext chatExecuteContext = new ChatExecuteContext(); ChatExecuteContext chatExecuteContext = new ChatExecuteContext();
BeanMapper.mapper(chatExecuteReq, chatExecuteContext); BeanMapper.mapper(chatExecuteReq, chatExecuteContext);
SemanticParseInfo parseInfo = getParseInfo(chatExecuteReq.getQueryId(), chatExecuteReq.getParseId()); SemanticParseInfo parseInfo = chatManageService.getParseInfo(
chatExecuteReq.getQueryId(), chatExecuteReq.getParseId());
chatExecuteContext.setParseInfo(parseInfo); chatExecuteContext.setParseInfo(parseInfo);
return chatExecuteContext; return chatExecuteContext;
} }
@@ -136,7 +117,8 @@ public class ChatServiceImpl implements ChatService {
@Override @Override
public Object queryData(ChatQueryDataReq chatQueryDataReq, User user) throws Exception { public Object queryData(ChatQueryDataReq chatQueryDataReq, User user) throws Exception {
Integer parseId = chatQueryDataReq.getParseId(); Integer parseId = chatQueryDataReq.getParseId();
SemanticParseInfo parseInfo = getParseInfo(chatQueryDataReq.getQueryId(), parseId); SemanticParseInfo parseInfo = chatManageService.getParseInfo(
chatQueryDataReq.getQueryId(), parseId);
QueryDataReq queryData = new QueryDataReq(); QueryDataReq queryData = new QueryDataReq();
BeanMapper.mapper(chatQueryDataReq, queryData); BeanMapper.mapper(chatQueryDataReq, queryData);
queryData.setParseInfo(parseInfo); queryData.setParseInfo(parseInfo);
@@ -153,160 +135,15 @@ public class ChatServiceImpl implements ChatService {
return chatQueryService.queryDimensionValue(dimensionValueReq, user); return chatQueryService.queryDimensionValue(dimensionValueReq, user);
} }
@Override
public Boolean addChat(User user, String chatName, Integer agentId) {
ChatDO chatDO = new ChatDO();
chatDO.setChatName(chatName);
chatDO.setCreator(user.getName());
chatDO.setCreateTime(getCurrentTime());
chatDO.setIsDelete(0);
chatDO.setLastTime(getCurrentTime());
chatDO.setLastQuestion("Hello, welcome to using supersonic");
chatDO.setIsTop(0);
chatDO.setAgentId(agentId);
return chatRepository.createChat(chatDO);
}
@Override
public List<ChatDO> getAll(String userName, Integer agentId) {
return chatRepository.getAll(userName, agentId);
}
@Override
public boolean updateChatName(Long chatId, String chatName, String userName) {
return chatRepository.updateChatName(chatId, chatName, getCurrentTime(), userName);
}
@Override
public boolean updateFeedback(Integer id, Integer score, String feedback) {
QueryDO intelligentQueryDO = new QueryDO();
intelligentQueryDO.setId(id);
intelligentQueryDO.setScore(score);
intelligentQueryDO.setFeedback(feedback);
return chatRepository.updateFeedback(intelligentQueryDO);
}
@Override
public boolean updateChatIsTop(Long chatId, int isTop) {
return chatRepository.updateConversionIsTop(chatId, isTop);
}
@Override
public Boolean deleteChat(Long chatId, String userName) {
return chatRepository.deleteChat(chatId, userName);
}
@Override
public PageInfo<QueryResp> queryInfo(PageQueryInfoReq pageQueryInfoReq, long chatId) {
PageInfo<QueryResp> queryRespPageInfo = chatQueryRepository.getChatQuery(pageQueryInfoReq, chatId);
if (CollectionUtils.isEmpty(queryRespPageInfo.getList())) {
return queryRespPageInfo;
}
fillParseInfo(queryRespPageInfo.getList());
return queryRespPageInfo;
}
public void createChatQuery(ChatParseReq chatParseReq, ParseResp parseResp) {
Long queryId = chatQueryRepository.createChatQuery(chatParseReq);
parseResp.setQueryId(queryId);
}
@Override
public QueryResp getChatQuery(Long queryId) {
return chatQueryRepository.getChatQuery(queryId);
}
@Override
public ShowCaseResp queryShowCase(PageQueryInfoReq pageQueryInfoReq, int agentId) {
ShowCaseResp showCaseResp = new ShowCaseResp();
showCaseResp.setCurrent(pageQueryInfoReq.getCurrent());
showCaseResp.setPageSize(pageQueryInfoReq.getPageSize());
List<QueryResp> queryResps = chatQueryRepository.queryShowCase(pageQueryInfoReq, agentId);
if (CollectionUtils.isEmpty(queryResps)) {
return showCaseResp;
}
queryResps.removeIf(queryResp -> {
if (queryResp.getQueryResult() == null) {
return true;
}
if (queryResp.getQueryResult().getResponse() != null) {
return false;
}
if (CollectionUtils.isEmpty(queryResp.getQueryResult().getQueryResults())) {
return true;
}
Map<String, Object> data = queryResp.getQueryResult().getQueryResults().get(0);
return CollectionUtils.isEmpty(data);
});
queryResps = new ArrayList<>(queryResps.stream()
.collect(Collectors.toMap(QueryResp::getQueryText, Function.identity(),
(existing, replacement) -> existing, LinkedHashMap::new)).values());
fillParseInfo(queryResps);
Map<Long, List<QueryResp>> showCaseMap = queryResps.stream()
.collect(Collectors.groupingBy(QueryResp::getChatId));
showCaseResp.setShowCaseMap(showCaseMap);
return showCaseResp;
}
private void fillParseInfo(List<QueryResp> queryResps) {
List<Long> queryIds = queryResps.stream()
.map(QueryResp::getQuestionId).collect(Collectors.toList());
List<ChatParseDO> chatParseDOs = chatQueryRepository.getParseInfoList(queryIds);
if (CollectionUtils.isEmpty(chatParseDOs)) {
return;
}
Map<Long, List<ChatParseDO>> chatParseMap = chatParseDOs.stream()
.collect(Collectors.groupingBy(ChatParseDO::getQuestionId));
for (QueryResp queryResp : queryResps) {
List<ChatParseDO> chatParseDOList = chatParseMap.get(queryResp.getQuestionId());
if (CollectionUtils.isEmpty(chatParseDOList)) {
continue;
}
List<SemanticParseInfo> parseInfos = chatParseDOList.stream().map(chatParseDO ->
JsonUtil.toObject(chatParseDO.getParseInfo(), SemanticParseInfo.class))
.sorted(Comparator.comparingDouble(SemanticParseInfo::getScore).reversed())
.collect(Collectors.toList());
queryResp.setParseInfos(parseInfos);
}
}
@Override
public void saveQueryResult(ChatExecuteReq chatExecuteReq, QueryResult queryResult) { public void saveQueryResult(ChatExecuteReq chatExecuteReq, QueryResult queryResult) {
//The history record only retains the query result of the first parse //The history record only retains the query result of the first parse
if (chatExecuteReq.getParseId() > 1) { if (chatExecuteReq.getParseId() > 1) {
return; return;
} }
ChatQueryDO chatQueryDO = chatQueryRepository.getChatQueryDO(chatExecuteReq.getQueryId()); ChatQueryDO chatQueryDO = chatManageService.saveQueryResult(chatExecuteReq, queryResult);
chatQueryDO.setQuestionId(chatExecuteReq.getQueryId());
chatQueryDO.setQueryResult(JsonUtil.toString(queryResult));
chatQueryDO.setQueryState(1);
updateQuery(chatQueryDO);
chatRepository.updateLastQuestion(chatExecuteReq.getChatId().longValue(),
chatExecuteReq.getQueryText(), getCurrentTime());
SimilarQueryReq similarQueryReq = SimilarQueryReq.builder().queryId(chatExecuteReq.getQueryId()) SimilarQueryReq similarQueryReq = SimilarQueryReq.builder().queryId(chatExecuteReq.getQueryId())
.queryText(chatQueryDO.getQueryText()).agentId(chatQueryDO.getAgentId()).build(); .queryText(chatQueryDO.getQueryText()).agentId(chatQueryDO.getAgentId()).build();
similarQueryManager.saveSimilarQuery(similarQueryReq); similarQueryManager.saveSimilarQuery(similarQueryReq);
} }
@Override
public int updateQuery(ChatQueryDO chatQueryDO) {
return chatQueryRepository.updateChatQuery(chatQueryDO);
}
@Override
public List<ChatParseDO> batchAddParse(ChatParseReq chatParseReq, ParseResp parseResult) {
List<SemanticParseInfo> candidateParses = parseResult.getSelectedParses();
return chatQueryRepository.batchSaveParseInfo(chatParseReq, parseResult, candidateParses);
}
private String getCurrentTime() {
SimpleDateFormat tempDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return tempDate.format(new java.util.Date());
}
public SemanticParseInfo getParseInfo(Long questionId, int parseId) {
ChatParseDO chatParseDO = chatQueryRepository.getParseInfo(questionId, parseId);
return JSONObject.parseObject(chatParseDO.getParseInfo(), SemanticParseInfo.class);
}
} }

View File

@@ -15,14 +15,13 @@ import com.tencent.supersonic.chat.server.plugin.PluginParseConfig;
import com.tencent.supersonic.chat.server.plugin.build.ParamOption; import com.tencent.supersonic.chat.server.plugin.build.ParamOption;
import com.tencent.supersonic.chat.server.plugin.build.WebBase; import com.tencent.supersonic.chat.server.plugin.build.WebBase;
import com.tencent.supersonic.chat.server.service.AgentService; import com.tencent.supersonic.chat.server.service.AgentService;
import com.tencent.supersonic.chat.server.service.ChatManageService;
import com.tencent.supersonic.chat.server.service.ChatService; import com.tencent.supersonic.chat.server.service.ChatService;
import com.tencent.supersonic.chat.server.service.PluginService; import com.tencent.supersonic.chat.server.service.PluginService;
import com.tencent.supersonic.common.pojo.SysParameter; import com.tencent.supersonic.common.pojo.SysParameter;
import com.tencent.supersonic.common.service.SysParameterService; import com.tencent.supersonic.common.service.SysParameterService;
import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import java.util.Arrays;
import java.util.List;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@@ -31,6 +30,9 @@ import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;
@Component @Component
@Slf4j @Slf4j
@Order(3) @Order(3)
@@ -40,6 +42,8 @@ public class ChatDemoLoader implements CommandLineRunner {
@Autowired @Autowired
private ChatService chatService; private ChatService chatService;
@Autowired @Autowired
private ChatManageService chatManageService;
@Autowired
private PluginService pluginService; private PluginService pluginService;
@Autowired @Autowired
private AgentService agentService; private AgentService agentService;
@@ -100,7 +104,7 @@ public class ChatDemoLoader implements CommandLineRunner {
} }
public void addSampleChats() throws Exception { public void addSampleChats() throws Exception {
chatService.addChat(user, "样例对话1", 1); chatManageService.addChat(user, "样例对话1", 1);
parseAndExecute(1, "超音数 访问次数"); parseAndExecute(1, "超音数 访问次数");
parseAndExecute(1, "按部门统计"); parseAndExecute(1, "按部门统计");
@@ -108,7 +112,7 @@ public class ChatDemoLoader implements CommandLineRunner {
} }
public void addSampleChats2() throws Exception { public void addSampleChats2() throws Exception {
chatService.addChat(user, "样例对话2", 1); chatManageService.addChat(user, "样例对话2", 1);
parseAndExecute(2, "alice 停留时长"); parseAndExecute(2, "alice 停留时长");
parseAndExecute(2, "对比alice和lucy的访问次数"); parseAndExecute(2, "对比alice和lucy的访问次数");
@@ -246,7 +250,7 @@ public class ChatDemoLoader implements CommandLineRunner {
} }
private void updateQueryScore(Integer queryId) { private void updateQueryScore(Integer queryId) {
chatService.updateFeedback(queryId, 5, ""); chatManageService.updateFeedback(queryId, 5, "");
} }
private boolean checkEnable() { private boolean checkEnable() {