From 69242f9f2ddfd375b30093e7486437eceb0ee999 Mon Sep 17 00:00:00 2001 From: LXW <1264174498@qq.com> Date: Sun, 8 Oct 2023 12:00:28 +0800 Subject: [PATCH] =?UTF-8?q?(improvement)(chat)=20add=20responder=20to=20fi?= =?UTF-8?q?ll=20additional=20information,=20such=20as=C2=A0=20entity=20inf?= =?UTF-8?q?ormation=20(#173)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (improvement)(chat) add responder to fill additional information, such as entity information --------- Co-authored-by: jolunoluo --- .../dsl}/HeuristicModelResolver.java | 2 +- .../chat/parser/llm/dsl/LLMDslParser.java | 1 - .../dsl}/ModelMatchResult.java | 2 +- .../function => llm/dsl}/ModelResolver.java | 2 +- .../embedding/EmbeddingEntityResolver.java | 98 ------------------- .../plugin/function/FunctionBasedParser.java | 5 +- .../plugin/function/FunctionCallConfig.java} | 4 +- .../chat/query/llm/dsl/DslQuery.java | 6 -- .../query/plugin/webpage/WebPageQuery.java | 3 - .../chat/query/rule/RuleSemanticQuery.java | 9 -- .../chat/queryresponder/QueryResponder.java | 13 --- .../execute/EntityInfoExecuteResponder.java | 19 ++++ .../responder/execute/ExecuteResponder.java | 11 +++ .../parse/EntityInfoParseResponder.java | 33 +++++++ .../parse/ExplainSqlParseResponder.java | 41 ++++++++ .../chat/responder/parse/ParseResponder.java | 10 ++ .../parse/SolvedQueryParseResponder.java | 23 +++++ .../chat/rest/ChatQueryController.java | 6 +- .../chat/service/SemanticService.java | 4 +- .../chat/service/impl/QueryServiceImpl.java | 50 +++------- .../chat/utils/ComponentFactory.java | 15 ++- .../SolvedQueryManager.java} | 22 ++--- .../test/context/MockBeansConfiguration.java | 3 +- .../main/resources/META-INF/spring.factories | 14 ++- .../main/resources/META-INF/spring.factories | 14 ++- 25 files changed, 207 insertions(+), 203 deletions(-) rename chat/core/src/main/java/com/tencent/supersonic/chat/parser/{plugin/function => llm/dsl}/HeuristicModelResolver.java (99%) rename chat/core/src/main/java/com/tencent/supersonic/chat/parser/{plugin/function => llm/dsl}/ModelMatchResult.java (67%) rename chat/core/src/main/java/com/tencent/supersonic/chat/parser/{plugin/function => llm/dsl}/ModelResolver.java (81%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{config/FunctionCallInfoConfig.java => parser/plugin/function/FunctionCallConfig.java} (77%) delete mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/QueryResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/ExecuteResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java create mode 100644 chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/SolvedQueryParseResponder.java rename chat/core/src/main/java/com/tencent/supersonic/chat/{queryresponder/DefaultQueryResponder.java => utils/SolvedQueryManager.java} (92%) diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/HeuristicModelResolver.java similarity index 99% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/HeuristicModelResolver.java index a342398c9..3fc444062 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/HeuristicModelResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/HeuristicModelResolver.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.plugin.function; +package com.tencent.supersonic.chat.parser.llm.dsl; import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.pojo.ChatContext; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java index fa8d46a5a..7cf8dfd93 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/LLMDslParser.java @@ -17,7 +17,6 @@ import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.config.LLMParserConfig; import com.tencent.supersonic.chat.parser.SatisfactionChecker; -import com.tencent.supersonic.chat.parser.plugin.function.ModelResolver; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; import com.tencent.supersonic.chat.query.llm.dsl.LLMReq; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelMatchResult.java similarity index 67% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelMatchResult.java index f6a1d45d4..f85463b4a 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelMatchResult.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelMatchResult.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.plugin.function; +package com.tencent.supersonic.chat.parser.llm.dsl; import lombok.Data; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelResolver.java similarity index 81% rename from chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelResolver.java index e80b167a7..464612ec7 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/ModelResolver.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/llm/dsl/ModelResolver.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.parser.plugin.function; +package com.tencent.supersonic.chat.parser.llm.dsl; import com.tencent.supersonic.chat.api.pojo.ChatContext; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java deleted file mode 100644 index 70fb33842..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/embedding/EmbeddingEntityResolver.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.tencent.supersonic.chat.parser.plugin.embedding; - -import com.alibaba.fastjson.JSONObject; -import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; -import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo; -import com.tencent.supersonic.chat.api.pojo.ChatContext; -import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; -import com.tencent.supersonic.chat.service.ConfigService; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Objects; -import java.util.Set; - -@Slf4j -@Component("EmbeddingEntityResolver") -public class EmbeddingEntityResolver { - private ConfigService configService; - - public EmbeddingEntityResolver(ConfigService configService) { - this.configService = configService; - } - - - private Long getEntityValue(Long modelId, Long entityElementId, QueryContext queryCtx, ChatContext chatCtx) { - Long entityId = null; - QueryFilters queryFilters = queryCtx.getRequest().getQueryFilters(); - if (queryFilters != null) { - entityId = getEntityValueFromQueryFilter(queryFilters.getFilters()); - if (entityId != null) { - log.info("get entity id:{} model id:{} from query filter :{} ", entityId, modelId, queryFilters); - return entityId; - } - } - entityId = getEntityValueFromSchemaMapInfo(modelId, queryCtx.getMapInfo(), entityElementId); - log.info("get entity id:{} from schema map Info :{} ", - entityId, JSONObject.toJSONString(queryCtx.getMapInfo())); - if (entityId == null || entityId == 0) { - Long entityIdFromChat = getEntityValueFromParseInfo(chatCtx.getParseInfo(), entityElementId); - if (entityIdFromChat != null && entityIdFromChat > 0) { - entityId = entityIdFromChat; - } - } - return entityId; - } - - private Long getEntityValueFromQueryFilter(List queryFilters) { - if (CollectionUtils.isEmpty(queryFilters)) { - return null; - } - QueryFilter filter = queryFilters.get(0); - String value = String.valueOf(filter.getValue()); - if (StringUtils.isNumeric(value)) { - return Long.parseLong(value); - } - return null; - } - - private Long getEntityValueFromParseInfo(SemanticParseInfo semanticParseInfo, Long entityElementId) { - Set filters = semanticParseInfo.getDimensionFilters(); - if (CollectionUtils.isEmpty(filters)) { - return null; - } - for (QueryFilter filter : filters) { - if (entityElementId.equals(filter.getElementID())) { - String value = String.valueOf(filter.getValue()); - if (StringUtils.isNumeric(value)) { - return Long.parseLong(value); - } - } - } - return null; - } - - - private Long getEntityValueFromSchemaMapInfo(Long modelId, SchemaMapInfo schemaMapInfo, Long entityElementId) { - List schemaElementMatchList = schemaMapInfo.getMatchedElements(modelId); - if (CollectionUtils.isEmpty(schemaElementMatchList)) { - return null; - } - for (SchemaElementMatch schemaElementMatch : schemaElementMatchList) { - if (Objects.equals(schemaElementMatch.getElement().getId(), entityElementId)) { - if (StringUtils.isNumeric(schemaElementMatch.getWord())) { - return Long.parseLong(schemaElementMatch.getWord()); - } - } - - } - return null; - } - -} diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java index 71f15fd68..b5972d092 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionBasedParser.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.parser.plugin.function; import com.alibaba.fastjson.JSON; import com.tencent.supersonic.chat.api.pojo.QueryContext; -import com.tencent.supersonic.chat.config.FunctionCallInfoConfig; import com.tencent.supersonic.chat.parser.ParseMode; import com.tencent.supersonic.chat.parser.SatisfactionChecker; import com.tencent.supersonic.chat.parser.plugin.PluginParser; @@ -37,7 +36,7 @@ public class FunctionBasedParser extends PluginParser { @Override public boolean checkPreCondition(QueryContext queryContext) { - FunctionCallInfoConfig functionCallConfig = ContextUtils.getBean(FunctionCallInfoConfig.class); + FunctionCallConfig functionCallConfig = ContextUtils.getBean(FunctionCallConfig.class); String functionUrl = functionCallConfig.getUrl(); if (StringUtils.isBlank(functionUrl) || SatisfactionChecker.check(queryContext)) { log.info("functionUrl:{}, skip function parser, queryText:{}", functionUrl, @@ -134,7 +133,7 @@ public class FunctionBasedParser extends PluginParser { } public FunctionResp requestFunction(FunctionReq functionReq) { - FunctionCallInfoConfig functionCallInfoConfig = ContextUtils.getBean(FunctionCallInfoConfig.class); + FunctionCallConfig functionCallInfoConfig = ContextUtils.getBean(FunctionCallConfig.class); String url = functionCallInfoConfig.getUrl() + functionCallInfoConfig.getPluginSelectPath(); HttpHeaders headers = new HttpHeaders(); long startTime = System.currentTimeMillis(); diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionCallConfig.java similarity index 77% rename from chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionCallConfig.java index 2d694044f..3e6645133 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/plugin/function/FunctionCallConfig.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.config; +package com.tencent.supersonic.chat.parser.plugin.function; import lombok.Data; import org.springframework.beans.factory.annotation.Value; @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @Data -public class FunctionCallInfoConfig { +public class FunctionCallConfig { @Value("${functionCall.url:}") private String url; diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java index 64f13c624..31b67dfba 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/llm/dsl/DslQuery.java @@ -2,18 +2,15 @@ package com.tencent.supersonic.chat.query.llm.dsl; import com.tencent.supersonic.auth.api.authentication.pojo.User; import com.tencent.supersonic.chat.api.component.SemanticInterpreter; -import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.parser.llm.dsl.DSLParseResult; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery; -import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.chat.utils.ComponentFactory; import com.tencent.supersonic.chat.utils.QueryReqBuilder; import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.QueryColumn; -import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.semantic.api.model.enums.QueryTypeEnum; import com.tencent.supersonic.semantic.api.model.response.ExplainResp; @@ -66,9 +63,6 @@ public class DslQuery extends PluginSemanticQuery { queryResult.setQueryMode(QUERY_MODE); queryResult.setQueryState(QueryState.SUCCESS); - // add model info - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class).getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); parseInfo.setProperties(null); return queryResult; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java index 29df82412..f706e30bf 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/plugin/webpage/WebPageQuery.java @@ -8,7 +8,6 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; import com.tencent.supersonic.chat.api.pojo.request.QueryFilters; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; -import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.plugin.Plugin; @@ -57,8 +56,6 @@ public class WebPageQuery extends PluginSemanticQuery { SemanticService semanticService = ContextUtils.getBean(SemanticService.class); ModelSchema modelSchema = semanticService.getModelSchema(parseInfo.getModelId()); parseInfo.setModel(modelSchema.getModel()); - EntityInfo entityInfo = semanticService.getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); queryResult.setQueryState(QueryState.SUCCESS); return queryResult; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java index a85822a85..509fda2ab 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/query/rule/RuleSemanticQuery.java @@ -12,7 +12,6 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch; import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.request.QueryFilter; -import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.query.QueryManager; @@ -211,10 +210,6 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { queryResult.setQueryMode(queryMode); queryResult.setQueryState(QueryState.SUCCESS); - // add Model info - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) - .getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); return queryResult; } @@ -260,10 +255,6 @@ public abstract class RuleSemanticQuery implements SemanticQuery, Serializable { queryResult.setQueryMode(queryMode); queryResult.setQueryState(QueryState.SUCCESS); - // add Model info - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) - .getEntityInfo(parseInfo, user); - queryResult.setEntityInfo(entityInfo); return queryResult; } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/QueryResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/QueryResponder.java deleted file mode 100644 index 1c101165a..000000000 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/QueryResponder.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tencent.supersonic.chat.queryresponder; - -import com.tencent.supersonic.chat.api.pojo.request.SolvedQueryReq; -import com.tencent.supersonic.chat.api.pojo.response.SolvedQueryRecallResp; -import java.util.List; - -public interface QueryResponder { - - void saveSolvedQuery(SolvedQueryReq solvedQueryReq); - - List recallSolvedQuery(String queryText, Integer agentId); - -} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java new file mode 100644 index 000000000..92dab6ec5 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/EntityInfoExecuteResponder.java @@ -0,0 +1,19 @@ +package com.tencent.supersonic.chat.responder.execute; + +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.common.util.ContextUtils; + +public class EntityInfoExecuteResponder implements ExecuteResponder { + + @Override + public void fillResponse(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq) { + SemanticService semanticService = ContextUtils.getBean(SemanticService.class); + EntityInfo entityInfo = semanticService.getEntityInfo(semanticParseInfo, queryReq.getUser()); + queryResult.setEntityInfo(entityInfo); + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/ExecuteResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/ExecuteResponder.java new file mode 100644 index 000000000..a179a73e7 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/execute/ExecuteResponder.java @@ -0,0 +1,11 @@ +package com.tencent.supersonic.chat.responder.execute; + +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; +import com.tencent.supersonic.chat.api.pojo.response.QueryResult; + +public interface ExecuteResponder { + + void fillResponse(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq); + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java new file mode 100644 index 000000000..9074c9dbc --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/EntityInfoParseResponder.java @@ -0,0 +1,33 @@ +package com.tencent.supersonic.chat.responder.parse; + +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.chat.service.SemanticService; +import com.tencent.supersonic.common.util.ContextUtils; +import org.springframework.util.CollectionUtils; +import java.util.List; + +public class EntityInfoParseResponder implements ParseResponder { + + @Override + public void fillResponse(ParseResp parseResp, QueryContext queryContext) { + List selectedParses = parseResp.getSelectedParses(); + if (CollectionUtils.isEmpty(selectedParses)) { + return; + } + QueryReq queryReq = queryContext.getRequest(); + selectedParses.forEach(parseInfo -> { + String queryMode = parseInfo.getQueryMode(); + if (QueryManager.isEntityQuery(queryMode)) { + EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) + .getEntityInfo(parseInfo, queryReq.getUser()); + parseInfo.setEntityInfo(entityInfo); + } + }); + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java new file mode 100644 index 000000000..22a82e734 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ExplainSqlParseResponder.java @@ -0,0 +1,41 @@ +package com.tencent.supersonic.chat.responder.parse; + +import com.tencent.supersonic.chat.api.component.SemanticQuery; +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.chat.api.pojo.request.QueryReq; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.query.QueryManager; +import com.tencent.supersonic.semantic.api.model.response.ExplainResp; +import org.springframework.util.CollectionUtils; +import java.util.List; +import java.util.Objects; + +public class ExplainSqlParseResponder implements ParseResponder { + + @Override + public void fillResponse(ParseResp parseResp, QueryContext queryContext) { + List selectedParses = parseResp.getSelectedParses(); + if (CollectionUtils.isEmpty(selectedParses)) { + return; + } + QueryReq queryReq = queryContext.getRequest(); + selectedParses.forEach(parseInfo -> { + addExplainSql(queryReq, parseInfo); + }); + } + + private void addExplainSql(QueryReq queryReq, SemanticParseInfo parseInfo) { + SemanticQuery semanticQuery = QueryManager.createQuery(parseInfo.getQueryMode()); + if (Objects.isNull(semanticQuery)) { + return; + } + semanticQuery.setParseInfo(parseInfo); + ExplainResp explain = semanticQuery.explain(queryReq.getUser()); + if (Objects.isNull(explain)) { + return; + } + parseInfo.getSqlInfo().setQuerySql(explain.getSql()); + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java new file mode 100644 index 000000000..6112b9331 --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/ParseResponder.java @@ -0,0 +1,10 @@ +package com.tencent.supersonic.chat.responder.parse; + +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; + +public interface ParseResponder { + + void fillResponse(ParseResp parseResp, QueryContext queryContext); + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/SolvedQueryParseResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/SolvedQueryParseResponder.java new file mode 100644 index 000000000..538a3d73d --- /dev/null +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/responder/parse/SolvedQueryParseResponder.java @@ -0,0 +1,23 @@ +package com.tencent.supersonic.chat.responder.parse; + +import com.tencent.supersonic.chat.api.pojo.QueryContext; +import com.tencent.supersonic.chat.api.pojo.response.ParseResp; +import com.tencent.supersonic.chat.api.pojo.response.SolvedQueryRecallResp; +import com.tencent.supersonic.chat.utils.SolvedQueryManager; +import com.tencent.supersonic.common.util.ContextUtils; +import lombok.extern.slf4j.Slf4j; +import java.util.List; + +@Slf4j +public class SolvedQueryParseResponder implements ParseResponder { + + @Override + public void fillResponse(ParseResp parseResp, QueryContext queryContext) { + SolvedQueryManager solvedQueryManager = ContextUtils.getBean(SolvedQueryManager.class); + List solvedQueryRecallResps = + solvedQueryManager.recallSolvedQuery(queryContext.getRequest().getQueryText(), + queryContext.getRequest().getAgentId()); + parseResp.setSimilarSolvedQuery(solvedQueryRecallResps); + } + +} \ No newline at end of file diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java index d27d36842..f2485d50e 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/rest/ChatQueryController.java @@ -54,11 +54,11 @@ public class ChatQueryController { } @PostMapping("execute") - public Object execute(@RequestBody ExecuteQueryReq queryCtx, + public Object execute(@RequestBody ExecuteQueryReq queryReq, HttpServletRequest request, HttpServletResponse response) throws Exception { - queryCtx.setUser(UserHolder.findUser(request, response)); - return queryService.performExecution(queryCtx); + queryReq.setUser(UserHolder.findUser(request, response)); + return queryService.performExecution(queryReq); } @PostMapping("queryContext") diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java index e903a4f57..7eb1b0e00 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/SemanticService.java @@ -227,8 +227,8 @@ public class SemanticService { QueryResultWithSchemaResp queryResultWithColumns = null; try { - queryResultWithColumns = semanticInterpreter.queryByStruct(QueryReqBuilder.buildStructReq(semanticParseInfo), - user); + queryResultWithColumns = semanticInterpreter.queryByStruct( + QueryReqBuilder.buildStructReq(semanticParseInfo), user); } catch (Exception e) { log.warn("setMainModel queryByStruct error, e:", e); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java index a4c12d733..370f7b0d5 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/service/impl/QueryServiceImpl.java @@ -16,12 +16,10 @@ import com.tencent.supersonic.chat.api.pojo.request.DimensionValueReq; import com.tencent.supersonic.chat.api.pojo.request.ExecuteQueryReq; import com.tencent.supersonic.chat.api.pojo.request.QueryReq; import com.tencent.supersonic.chat.api.pojo.request.SolvedQueryReq; -import com.tencent.supersonic.chat.api.pojo.response.EntityInfo; import com.tencent.supersonic.chat.api.pojo.response.ParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; import com.tencent.supersonic.chat.api.pojo.response.QueryState; import com.tencent.supersonic.chat.parser.llm.dsl.DSLParseResult; -import com.tencent.supersonic.chat.api.pojo.response.SolvedQueryRecallResp; import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.persistence.dataobject.CostType; @@ -30,15 +28,14 @@ import com.tencent.supersonic.chat.query.QuerySelector; import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.llm.dsl.DslQuery; import com.tencent.supersonic.chat.query.llm.dsl.LLMResp; -import com.tencent.supersonic.chat.queryresponder.QueryResponder; +import com.tencent.supersonic.chat.responder.execute.ExecuteResponder; +import com.tencent.supersonic.chat.responder.parse.ParseResponder; import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.QueryService; -import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.chat.service.StatisticsService; import com.tencent.supersonic.chat.utils.ComponentFactory; - import java.util.Map; -import com.tencent.supersonic.semantic.api.model.response.ExplainResp; +import com.tencent.supersonic.chat.utils.SolvedQueryManager; import com.tencent.supersonic.common.util.jsqlparser.FilterExpression; import com.tencent.supersonic.common.util.jsqlparser.SqlParserSelectHelper; import java.util.List; @@ -49,10 +46,8 @@ import java.util.HashMap; import java.util.Comparator; import java.util.Objects; import java.util.stream.Collectors; - import com.tencent.supersonic.common.pojo.Constants; import com.tencent.supersonic.common.pojo.DateConf; -import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.common.util.jsqlparser.SqlParserUpdateHelper; import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp; @@ -79,7 +74,7 @@ public class QueryServiceImpl implements QueryService { @Autowired private StatisticsService statisticsService; @Autowired - private QueryResponder queryResponder; + private SolvedQueryManager solvedQueryManager; @Value("${time.threshold: 100}") private Integer timeThreshold; @@ -87,6 +82,8 @@ public class QueryServiceImpl implements QueryService { private List schemaMappers = ComponentFactory.getSchemaMappers(); private List semanticParsers = ComponentFactory.getSemanticParsers(); private QuerySelector querySelector = ComponentFactory.getQuerySelector(); + private List parseResponders = ComponentFactory.getParseResponders(); + private List executeResponders = ComponentFactory.getExecuteResponders(); @Override public ParseResp performParsing(QueryReq queryReq) { @@ -124,17 +121,6 @@ public class QueryServiceImpl implements QueryService { .map(SemanticQuery::getParseInfo) .sorted(Comparator.comparingDouble(SemanticParseInfo::getScore).reversed()) .collect(Collectors.toList()); - - selectedParses.forEach(parseInfo -> { - String queryMode = parseInfo.getQueryMode(); - if (QueryManager.isEntityQuery(queryMode)) { - EntityInfo entityInfo = ContextUtils.getBean(SemanticService.class) - .getEntityInfo(parseInfo, queryReq.getUser()); - parseInfo.setEntityInfo(entityInfo); - } - addExplainSql(queryReq, parseInfo); - - }); List candidateParses = queryCtx.getCandidateQueries().stream() .map(SemanticQuery::getParseInfo).collect(Collectors.toList()); parseResult = ParseResp.builder() @@ -154,25 +140,12 @@ public class QueryServiceImpl implements QueryService { .state(ParseResp.ParseState.FAILED) .build(); } - List solvedQueryRecallResps = - queryResponder.recallSolvedQuery(queryCtx.getRequest().getQueryText(), queryReq.getAgentId()); - parseResult.setSimilarSolvedQuery(solvedQueryRecallResps); + for (ParseResponder parseResponder : parseResponders) { + parseResponder.fillResponse(parseResult, queryCtx); + } return parseResult; } - private void addExplainSql(QueryReq queryReq, SemanticParseInfo parseInfo) { - SemanticQuery semanticQuery = QueryManager.createQuery(parseInfo.getQueryMode()); - if (Objects.isNull(semanticQuery)) { - return; - } - semanticQuery.setParseInfo(parseInfo); - ExplainResp explain = semanticQuery.explain(queryReq.getUser()); - if (Objects.isNull(explain)) { - return; - } - parseInfo.getSqlInfo().setQuerySql(explain.getSql()); - } - @Override public QueryResult performExecution(ExecuteQueryReq queryReq) throws Exception { ChatParseDO chatParseDO = chatService.getParseInfo(queryReq.getQueryId(), @@ -202,7 +175,7 @@ public class QueryServiceImpl implements QueryService { if (queryReq.isSaveAnswer() && QueryState.SUCCESS.equals(queryResult.getQueryState())) { chatCtx.setParseInfo(parseInfo); chatService.updateContext(chatCtx); - queryResponder.saveSolvedQuery(SolvedQueryReq.builder().parseId(queryReq.getParseId()) + solvedQueryManager.saveSolvedQuery(SolvedQueryReq.builder().parseId(queryReq.getParseId()) .queryId(queryReq.getQueryId()) .agentId(chatQueryDO.getAgentId()) .modelId(parseInfo.getModelId()) @@ -211,6 +184,9 @@ public class QueryServiceImpl implements QueryService { chatCtx.setQueryText(queryReq.getQueryText()); chatCtx.setUser(queryReq.getUser().getName()); chatService.updateQuery(queryReq.getQueryId(), queryResult, chatCtx); + for (ExecuteResponder executeResponder : executeResponders) { + executeResponder.fillResponse(queryResult, parseInfo, queryReq); + } } else { chatService.deleteChatQuery(queryReq.getQueryId()); } diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java index 3e2ea2a95..489a43b30 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/ComponentFactory.java @@ -9,8 +9,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import com.tencent.supersonic.chat.parser.plugin.function.ModelResolver; +import com.tencent.supersonic.chat.parser.llm.dsl.ModelResolver; import com.tencent.supersonic.chat.query.QuerySelector; +import com.tencent.supersonic.chat.responder.execute.ExecuteResponder; +import com.tencent.supersonic.chat.responder.parse.ParseResponder; import org.apache.commons.collections.CollectionUtils; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -18,9 +20,10 @@ public class ComponentFactory { private static List schemaMappers = new ArrayList<>(); private static List semanticParsers = new ArrayList<>(); - private static List dslCorrections = new ArrayList<>(); private static SemanticInterpreter semanticInterpreter; + private static List parseResponders = new ArrayList<>(); + private static List executeResponders = new ArrayList<>(); private static QuerySelector querySelector; private static ModelResolver modelResolver; public static List getSchemaMappers() { @@ -35,6 +38,14 @@ public class ComponentFactory { return CollectionUtils.isEmpty(dslCorrections) ? init(SemanticCorrector.class, dslCorrections) : dslCorrections; } + public static List getParseResponders() { + return CollectionUtils.isEmpty(parseResponders) ? init(ParseResponder.class, parseResponders) : parseResponders; + } + + public static List getExecuteResponders() { + return CollectionUtils.isEmpty(executeResponders) + ? init(ExecuteResponder.class, executeResponders) : executeResponders; + } public static SemanticInterpreter getSemanticLayer() { if (Objects.isNull(semanticInterpreter)) { diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/DefaultQueryResponder.java b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SolvedQueryManager.java similarity index 92% rename from chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/DefaultQueryResponder.java rename to chat/core/src/main/java/com/tencent/supersonic/chat/utils/SolvedQueryManager.java index ffaaa6f2f..2b5df8cfc 100644 --- a/chat/core/src/main/java/com/tencent/supersonic/chat/queryresponder/DefaultQueryResponder.java +++ b/chat/core/src/main/java/com/tencent/supersonic/chat/utils/SolvedQueryManager.java @@ -1,4 +1,4 @@ -package com.tencent.supersonic.chat.queryresponder; +package com.tencent.supersonic.chat.utils; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; @@ -30,20 +30,14 @@ import java.util.Set; @Slf4j @Component -public class DefaultQueryResponder implements QueryResponder { - +public class SolvedQueryManager { private EmbeddingConfig embeddingConfig; - private RestTemplate restTemplate; - - public DefaultQueryResponder(EmbeddingConfig embeddingConfig, - RestTemplate restTemplate) { + public SolvedQueryManager(EmbeddingConfig embeddingConfig) { this.embeddingConfig = embeddingConfig; - this.restTemplate = restTemplate; } - @Override public void saveSolvedQuery(SolvedQueryReq solvedQueryReq) { String queryText = solvedQueryReq.getQueryText(); try { @@ -62,7 +56,6 @@ public class DefaultQueryResponder implements QueryResponder { } } - @Override public List recallSolvedQuery(String queryText, Integer agentId) { List solvedQueryRecallResps = Lists.newArrayList(); try { @@ -81,6 +74,7 @@ public class DefaultQueryResponder implements QueryResponder { String jsonBody = JSONObject.toJSONString(map, SerializerFeature.WriteMapNullValue); HttpEntity entity = new HttpEntity<>(jsonBody, headers); log.info("[embedding] request body:{}, url:{}", jsonBody, url); + RestTemplate restTemplate = new RestTemplate(); ResponseEntity> embeddingResponseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference>() { @@ -100,9 +94,9 @@ public class DefaultQueryResponder implements QueryResponder { } String id = embeddingRetrieval.getId(); SolvedQueryRecallResp solvedQueryRecallResp = SolvedQueryRecallResp.builder() - .queryText(embeddingRetrieval.getQuery()) - .queryId(getQueryId(id)).parseId(getParseId(id)) - .build(); + .queryText(embeddingRetrieval.getQuery()) + .queryId(getQueryId(id)).parseId(getParseId(id)) + .build(); solvedQueryRecallResps.add(solvedQueryRecallResp); querySet.add(embeddingRetrieval.getQuery()); } @@ -143,6 +137,7 @@ public class DefaultQueryResponder implements QueryResponder { .fromHttpUrl(url).build().encode().toUri(); HttpEntity entity = new HttpEntity<>(jsonBody, headers); log.info("[embedding] request body :{}, url:{}", jsonBody, url); + RestTemplate restTemplate = new RestTemplate(); ResponseEntity responseEntity = restTemplate.exchange(requestUrl, HttpMethod.POST, entity, new ParameterizedTypeReference() {}); log.info("[embedding] result body:{}", responseEntity); @@ -152,4 +147,5 @@ public class DefaultQueryResponder implements QueryResponder { } return ResponseEntity.of(Optional.empty()); } + } diff --git a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java index 76e85d1c2..11699ffef 100644 --- a/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java +++ b/chat/core/src/test/java/com/tencent/supersonic/chat/test/context/MockBeansConfiguration.java @@ -4,7 +4,6 @@ import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import com.tencent.supersonic.chat.api.component.SemanticInterpreter; import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.response.ChatConfigResp; import com.tencent.supersonic.chat.config.DefaultMetric; @@ -41,7 +40,7 @@ public class MockBeansConfiguration { when(chatService.getOrCreateContext(1)).thenReturn(context); } - public static void buildHttpSemanticServiceImpl(SemanticInterpreter httpSemanticInterpreter, List dimensionDescs, + public static void buildHttpSemanticServiceImpl(List dimensionDescs, List metricDescs) { DefaultMetric defaultMetricDesc = new DefaultMetric(); defaultMetricDesc.setUnit(3); diff --git a/launchers/chat/src/main/resources/META-INF/spring.factories b/launchers/chat/src/main/resources/META-INF/spring.factories index 30aa701fc..7802fe784 100644 --- a/launchers/chat/src/main/resources/META-INF/spring.factories +++ b/launchers/chat/src/main/resources/META-INF/spring.factories @@ -20,8 +20,8 @@ com.tencent.supersonic.chat.api.component.SemanticInterpreter=\ com.tencent.supersonic.chat.query.QuerySelector=\ com.tencent.supersonic.chat.query.HeuristicQuerySelector -com.tencent.supersonic.chat.parser.plugin.function.ModelResolver=\ - com.tencent.supersonic.chat.parser.plugin.function.HeuristicModelResolver +com.tencent.supersonic.chat.parser.llm.dsl.ModelResolver=\ + com.tencent.supersonic.chat.parser.llm.dsl.HeuristicModelResolver com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor=\ com.tencent.supersonic.auth.authentication.interceptor.DefaultAuthenticationInterceptor @@ -36,4 +36,12 @@ com.tencent.supersonic.chat.api.component.SemanticCorrector=\ com.tencent.supersonic.chat.corrector.WhereCorrector, \ com.tencent.supersonic.chat.corrector.GroupByCorrector, \ com.tencent.supersonic.chat.corrector.HavingCorrector, \ - com.tencent.supersonic.chat.corrector.GlobalAfterCorrector \ No newline at end of file + com.tencent.supersonic.chat.corrector.GlobalAfterCorrector + +com.tencent.supersonic.chat.responder.parse.ParseResponder=\ + com.tencent.supersonic.chat.responder.parse.EntityInfoParseResponder, \ + com.tencent.supersonic.chat.responder.parse.ExplainSqlParseResponder, \ + com.tencent.supersonic.chat.responder.parse.SolvedQueryParseResponder + +com.tencent.supersonic.chat.responder.execute.ExecuteResponder=\ + com.tencent.supersonic.chat.responder.execute.EntityInfoExecuteResponder \ No newline at end of file diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index 1054e36b0..4f81060f3 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -21,8 +21,8 @@ com.tencent.supersonic.chat.api.component.SemanticInterpreter=\ com.tencent.supersonic.chat.query.QuerySelector=\ com.tencent.supersonic.chat.query.HeuristicQuerySelector -com.tencent.supersonic.chat.parser.plugin.function.ModelResolver=\ - com.tencent.supersonic.chat.parser.plugin.function.HeuristicModelResolver +com.tencent.supersonic.chat.parser.llm.dsl.ModelResolver=\ + com.tencent.supersonic.chat.parser.llm.dsl.HeuristicModelResolver com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor=\ com.tencent.supersonic.auth.authentication.interceptor.DefaultAuthenticationInterceptor @@ -36,4 +36,12 @@ com.tencent.supersonic.chat.api.component.SemanticCorrector=\ com.tencent.supersonic.chat.corrector.WhereCorrector, \ com.tencent.supersonic.chat.corrector.GroupByCorrector, \ com.tencent.supersonic.chat.corrector.HavingCorrector, \ - com.tencent.supersonic.chat.corrector.GlobalAfterCorrector \ No newline at end of file + com.tencent.supersonic.chat.corrector.GlobalAfterCorrector + +com.tencent.supersonic.chat.responder.parse.ParseResponder=\ + com.tencent.supersonic.chat.responder.parse.EntityInfoParseResponder, \ + com.tencent.supersonic.chat.responder.parse.ExplainSqlParseResponder, \ + com.tencent.supersonic.chat.responder.parse.SolvedQueryParseResponder + +com.tencent.supersonic.chat.responder.execute.ExecuteResponder=\ + com.tencent.supersonic.chat.responder.execute.EntityInfoExecuteResponder \ No newline at end of file