(improvement)(chat) rename QueryResponder to ExecuteResultProcessor and add ResultProcessor (#504)

Co-authored-by: jolunoluo
This commit is contained in:
LXW
2023-12-13 22:16:42 +08:00
committed by GitHub
parent f89be48e98
commit fda5a577d6
20 changed files with 78 additions and 63 deletions

View File

@@ -0,0 +1,8 @@
package com.tencent.supersonic.chat.processor;
/**
* A ResultProcessor wraps things up before returning results to users.
*/
public interface ResultProcessor {
}

View File

@@ -0,0 +1,15 @@
package com.tencent.supersonic.chat.processor.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;
import com.tencent.supersonic.chat.processor.ResultProcessor;
/**
* A ExecuteResultProcessor wraps things up before returning results to users in execute stage.
*/
public interface ExecuteResultProcessor extends ResultProcessor {
void process(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq);
}

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.query; package com.tencent.supersonic.chat.processor.execute;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.tencent.supersonic.chat.api.pojo.SchemaElement; import com.tencent.supersonic.chat.api.pojo.SchemaElement;
@@ -13,6 +13,8 @@ import com.tencent.supersonic.common.util.embedding.RetrieveQuery;
import com.tencent.supersonic.common.util.embedding.RetrieveQueryResult; import com.tencent.supersonic.common.util.embedding.RetrieveQueryResult;
import com.tencent.supersonic.common.util.embedding.S2EmbeddingStore; import com.tencent.supersonic.common.util.embedding.S2EmbeddingStore;
import com.tencent.supersonic.semantic.model.domain.listener.MetaEmbeddingListener; import com.tencent.supersonic.semantic.model.domain.listener.MetaEmbeddingListener;
import org.springframework.util.CollectionUtils;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
@@ -20,19 +22,18 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.util.CollectionUtils;
/** /**
* SimilarMetricQueryResponder fills recommended metrics based on embedding similarity. * SimilarMetricQueryResponder fills recommended metrics based on embedding similarity.
*/ */
public class SimilarMetricQueryResponder implements QueryResponder { public class SimilarMetricProcessor implements ExecuteResultProcessor {
private static final int METRIC_RECOMMEND_SIZE = 5; private static final int METRIC_RECOMMEND_SIZE = 5;
private S2EmbeddingStore s2EmbeddingStore = ComponentFactory.getS2EmbeddingStore(); private S2EmbeddingStore s2EmbeddingStore = ComponentFactory.getS2EmbeddingStore();
@Override @Override
public void fillInfo(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq) { public void process(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq) {
fillSimilarMetric(queryResult.getChatContext()); fillSimilarMetric(queryResult.getChatContext());
} }

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.component.SemanticQuery;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.component.SemanticQuery;

View File

@@ -1,12 +1,13 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;
import com.tencent.supersonic.chat.api.pojo.QueryContext; 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.ParseResp;
import com.tencent.supersonic.chat.processor.ResultProcessor;
/** /**
* A ParseResultProcessor wraps things up before returning results to users. * A ParseResultProcessor wraps things up before returning results to users in parse stage.
*/ */
public interface ParseResultProcessor { public interface ParseResultProcessor extends ResultProcessor {
void process(ParseResp parseResp, QueryContext queryContext, ChatContext chatContext); void process(ParseResp parseResp, QueryContext queryContext, ChatContext chatContext);

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.component.SemanticQuery;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.component.SemanticQuery;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.component.SemanticQuery; import com.tencent.supersonic.chat.api.component.SemanticQuery;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;

View File

@@ -1,4 +1,4 @@
package com.tencent.supersonic.chat.processor; package com.tencent.supersonic.chat.processor.parse;
import com.tencent.supersonic.chat.api.pojo.ChatContext; import com.tencent.supersonic.chat.api.pojo.ChatContext;
import com.tencent.supersonic.chat.api.pojo.QueryContext; import com.tencent.supersonic.chat.api.pojo.QueryContext;

View File

@@ -1,14 +0,0 @@
package com.tencent.supersonic.chat.query;
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;
/**
* A query responder fill some auxiliary information into query results.
*/
public interface QueryResponder {
void fillInfo(QueryResult queryResult, SemanticParseInfo semanticParseInfo, ExecuteQueryReq queryReq);
}

View File

@@ -28,11 +28,11 @@ import com.tencent.supersonic.chat.persistence.dataobject.ChatParseDO;
import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.persistence.dataobject.ChatQueryDO;
import com.tencent.supersonic.chat.persistence.dataobject.CostType; import com.tencent.supersonic.chat.persistence.dataobject.CostType;
import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO; import com.tencent.supersonic.chat.persistence.dataobject.StatisticsDO;
import com.tencent.supersonic.chat.processor.ParseResultProcessor; import com.tencent.supersonic.chat.processor.parse.ParseResultProcessor;
import com.tencent.supersonic.chat.query.QueryManager; import com.tencent.supersonic.chat.query.QueryManager;
import com.tencent.supersonic.chat.query.llm.s2sql.LLMSqlQuery; import com.tencent.supersonic.chat.query.llm.s2sql.LLMSqlQuery;
import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery; import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery;
import com.tencent.supersonic.chat.query.QueryResponder; import com.tencent.supersonic.chat.processor.execute.ExecuteResultProcessor;
import com.tencent.supersonic.chat.service.ChatService; import com.tencent.supersonic.chat.service.ChatService;
import com.tencent.supersonic.chat.service.QueryService; import com.tencent.supersonic.chat.service.QueryService;
import com.tencent.supersonic.chat.service.SemanticService; import com.tencent.supersonic.chat.service.SemanticService;
@@ -111,8 +111,8 @@ public class QueryServiceImpl implements QueryService {
private List<SchemaMapper> schemaMappers = ComponentFactory.getSchemaMappers(); private List<SchemaMapper> schemaMappers = ComponentFactory.getSchemaMappers();
private List<SemanticParser> semanticParsers = ComponentFactory.getSemanticParsers(); private List<SemanticParser> semanticParsers = ComponentFactory.getSemanticParsers();
private List<ParseResultProcessor> responseProcessors = ComponentFactory.getPostProcessors(); private List<ParseResultProcessor> parseProcessors = ComponentFactory.getParseProcessors();
private List<QueryResponder> executeResponders = ComponentFactory.getExecuteResponders(); private List<ExecuteResultProcessor> executeProcessors = ComponentFactory.getExecuteProcessors();
private List<SemanticCorrector> semanticCorrectors = ComponentFactory.getSemanticCorrectors(); private List<SemanticCorrector> semanticCorrectors = ComponentFactory.getSemanticCorrectors();
@Override @Override
@@ -156,7 +156,7 @@ public class QueryServiceImpl implements QueryService {
} }
// 4. processor // 4. processor
responseProcessors.forEach(processor -> { parseProcessors.forEach(processor -> {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
processor.process(parseResult, queryCtx, chatCtx); processor.process(parseResult, queryCtx, chatCtx);
timeCostDOList.add(StatisticsDO.builder().cost((int) (System.currentTimeMillis() - startTime)) timeCostDOList.add(StatisticsDO.builder().cost((int) (System.currentTimeMillis() - startTime))
@@ -206,8 +206,8 @@ public class QueryServiceImpl implements QueryService {
} }
chatCtx.setQueryText(queryReq.getQueryText()); chatCtx.setQueryText(queryReq.getQueryText());
chatCtx.setUser(queryReq.getUser().getName()); chatCtx.setUser(queryReq.getUser().getName());
for (QueryResponder executeResponder : executeResponders) { for (ExecuteResultProcessor executeResultProcessor : executeProcessors) {
executeResponder.fillInfo(queryResult, parseInfo, queryReq); executeResultProcessor.process(queryResult, parseInfo, queryReq);
} }
chatService.updateQuery(queryReq.getQueryId(), queryResult, chatCtx); chatService.updateQuery(queryReq.getQueryId(), queryResult, chatCtx);
} else { } else {

View File

@@ -7,17 +7,17 @@ import com.tencent.supersonic.chat.api.component.SemanticParser;
import com.tencent.supersonic.chat.parser.JavaLLMProxy; import com.tencent.supersonic.chat.parser.JavaLLMProxy;
import com.tencent.supersonic.chat.parser.LLMProxy; import com.tencent.supersonic.chat.parser.LLMProxy;
import com.tencent.supersonic.chat.parser.sql.llm.ModelResolver; import com.tencent.supersonic.chat.parser.sql.llm.ModelResolver;
import com.tencent.supersonic.chat.processor.ParseResultProcessor; import com.tencent.supersonic.chat.processor.execute.ExecuteResultProcessor;
import com.tencent.supersonic.chat.query.QueryResponder; import com.tencent.supersonic.chat.processor.parse.ParseResultProcessor;
import com.tencent.supersonic.common.util.ContextUtils; import com.tencent.supersonic.common.util.ContextUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.io.support.SpringFactoriesLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j @Slf4j
public class ComponentFactory { public class ComponentFactory {
@@ -28,8 +28,8 @@ public class ComponentFactory {
private static SemanticInterpreter semanticInterpreter; private static SemanticInterpreter semanticInterpreter;
private static LLMProxy llmProxy; private static LLMProxy llmProxy;
private static List<ParseResultProcessor> responseProcessors = new ArrayList<>(); private static List<ParseResultProcessor> parseProcessors = new ArrayList<>();
private static List<QueryResponder> executeResponders = new ArrayList<>(); private static List<ExecuteResultProcessor> executeProcessors = new ArrayList<>();
private static ModelResolver modelResolver; private static ModelResolver modelResolver;
public static List<SchemaMapper> getSchemaMappers() { public static List<SchemaMapper> getSchemaMappers() {
@@ -45,14 +45,14 @@ public class ComponentFactory {
semanticCorrectors) : semanticCorrectors; semanticCorrectors) : semanticCorrectors;
} }
public static List<ParseResultProcessor> getPostProcessors() { public static List<ParseResultProcessor> getParseProcessors() {
return CollectionUtils.isEmpty(responseProcessors) ? init(ParseResultProcessor.class, return CollectionUtils.isEmpty(parseProcessors) ? init(ParseResultProcessor.class,
responseProcessors) : responseProcessors; parseProcessors) : parseProcessors;
} }
public static List<QueryResponder> getExecuteResponders() { public static List<ExecuteResultProcessor> getExecuteProcessors() {
return CollectionUtils.isEmpty(executeResponders) return CollectionUtils.isEmpty(executeProcessors)
? init(QueryResponder.class, executeResponders) : executeResponders; ? init(ExecuteResultProcessor.class, executeProcessors) : executeProcessors;
} }
public static SemanticInterpreter getSemanticLayer() { public static SemanticInterpreter getSemanticLayer() {

View File

@@ -8,6 +8,7 @@ import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SchemaElementType; import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo; import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticSchema; import com.tencent.supersonic.chat.api.pojo.SemanticSchema;
import com.tencent.supersonic.chat.processor.parse.MetricCheckProcessor;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;

View File

@@ -39,5 +39,5 @@ com.tencent.supersonic.chat.postprocessor.PostProcessor=\
com.tencent.supersonic.chat.postprocessor.TimeCostPostProcessor, \ com.tencent.supersonic.chat.postprocessor.TimeCostPostProcessor, \
com.tencent.supersonic.chat.postprocessor.RespBuildPostProcessor com.tencent.supersonic.chat.postprocessor.RespBuildPostProcessor
com.tencent.supersonic.chat.query.QueryResponder=\ com.tencent.supersonic.chat.processor.execute.ExecuteResultProcessor=\
com.tencent.supersonic.chat.query.SimilarMetricQueryResponder com.tencent.supersonic.chat.processor.execute.SimilarMetricProcessor

View File

@@ -20,14 +20,14 @@ com.tencent.supersonic.chat.api.component.SemanticCorrector=\
com.tencent.supersonic.chat.corrector.HavingCorrector, \ com.tencent.supersonic.chat.corrector.HavingCorrector, \
com.tencent.supersonic.chat.corrector.FromCorrector com.tencent.supersonic.chat.corrector.FromCorrector
com.tencent.supersonic.chat.processor.ParseResultProcessor=\ com.tencent.supersonic.chat.processor.parse.ParseResultProcessor=\
com.tencent.supersonic.chat.processor.MetricCheckProcessor, \ com.tencent.supersonic.chat.processor.parse.MetricCheckProcessor, \
com.tencent.supersonic.chat.processor.ParseInfoProcessor, \ com.tencent.supersonic.chat.processor.parse.ParseInfoProcessor, \
com.tencent.supersonic.chat.processor.QueryRankProcessor, \ com.tencent.supersonic.chat.processor.parse.QueryRankProcessor, \
com.tencent.supersonic.chat.processor.EntityInfoProcessor, \ com.tencent.supersonic.chat.processor.parse.EntityInfoProcessor, \
com.tencent.supersonic.chat.processor.SqlInfoProcessor, \ com.tencent.supersonic.chat.processor.parse.SqlInfoProcessor, \
com.tencent.supersonic.chat.processor.TimeCostProcessor, \ com.tencent.supersonic.chat.processor.parse.TimeCostProcessor, \
com.tencent.supersonic.chat.processor.RespBuildProcessor com.tencent.supersonic.chat.processor.parse.RespBuildProcessor
com.tencent.supersonic.chat.api.component.SemanticInterpreter=\ com.tencent.supersonic.chat.api.component.SemanticInterpreter=\
com.tencent.supersonic.knowledge.semantic.LocalSemanticInterpreter com.tencent.supersonic.knowledge.semantic.LocalSemanticInterpreter
@@ -41,8 +41,8 @@ com.tencent.supersonic.auth.authentication.interceptor.AuthenticationInterceptor
com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor=\ com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor=\
com.tencent.supersonic.auth.authentication.adaptor.DefaultUserAdaptor com.tencent.supersonic.auth.authentication.adaptor.DefaultUserAdaptor
com.tencent.supersonic.chat.query.QueryResponder=\ com.tencent.supersonic.chat.processor.execute.ExecuteResultProcessor=\
com.tencent.supersonic.chat.query.SimilarMetricQueryResponder com.tencent.supersonic.chat.processor.execute.SimilarMetricProcessor
com.tencent.supersonic.common.util.embedding.S2EmbeddingStore=\ com.tencent.supersonic.common.util.embedding.S2EmbeddingStore=\
com.tencent.supersonic.common.util.embedding.InMemoryS2EmbeddingStore com.tencent.supersonic.common.util.embedding.InMemoryS2EmbeddingStore

View File

@@ -296,6 +296,7 @@ CREATE TABLE `s2_metric` (
`alias` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `alias` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`tags` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `tags` varchar(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`relate_dimensions` varchar(500) DEFAULT NULL COMMENT '指标相关维度', `relate_dimensions` varchar(500) DEFAULT NULL COMMENT '指标相关维度',
`ext` text DEFAULT NULL ,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='指标表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='指标表';

View File

@@ -130,6 +130,8 @@ CREATE TABLE `s2_collect`
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
alter table s2_metric add column `ext` text DEFAULT NULL;
CREATE TABLE `s2_metric_query_default_config` CREATE TABLE `s2_metric_query_default_config`
( (
`id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT, `id` bigint NOT NULL PRIMARY KEY AUTO_INCREMENT,

View File

@@ -41,8 +41,8 @@ com.tencent.supersonic.chat.postprocessor.PostProcessor=\
com.tencent.supersonic.chat.postprocessor.RespBuildPostProcessor com.tencent.supersonic.chat.postprocessor.RespBuildPostProcessor
com.tencent.supersonic.chat.query.QueryResponder=\ com.tencent.supersonic.chat.processor.execute.ExecuteResultProcessor=\
com.tencent.supersonic.chat.query.SimilarMetricQueryResponder com.tencent.supersonic.chat.processor.execute.SimilarMetricProcessor
com.tencent.supersonic.common.util.embedding.S2EmbeddingStore=\ com.tencent.supersonic.common.util.embedding.S2EmbeddingStore=\