diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/agent/Agent.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/agent/Agent.java index d5c8528cb..98ae8363f 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/agent/Agent.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/agent/Agent.java @@ -42,7 +42,11 @@ public class Agent extends RecordInfo { } public boolean enableSearch() { - return enableSearch != null && enableSearch == 1; + return enableSearch == 1; + } + + public boolean enableFeedback() { + return enableFeedback == 1; } public boolean enableMemoryReview() { diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java index 19a67a2b4..609782830 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/parser/NL2SQLParser.java @@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.server.parser; import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; import com.tencent.supersonic.chat.api.pojo.response.QueryResp; -import com.tencent.supersonic.chat.server.plugin.PluginQueryManager; import com.tencent.supersonic.chat.server.pojo.ChatContext; import com.tencent.supersonic.chat.server.pojo.ParseContext; import com.tencent.supersonic.chat.server.service.ChatContextService; @@ -15,11 +14,9 @@ import com.tencent.supersonic.common.pojo.enums.AppModule; import com.tencent.supersonic.common.service.impl.ExemplarServiceImpl; import com.tencent.supersonic.common.util.ChatAppManager; import com.tencent.supersonic.common.util.ContextUtils; -import com.tencent.supersonic.headless.api.pojo.SchemaElement; import com.tencent.supersonic.headless.api.pojo.SchemaElementMatch; import com.tencent.supersonic.headless.api.pojo.SchemaElementType; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; import com.tencent.supersonic.headless.api.pojo.request.QueryNLReq; import com.tencent.supersonic.headless.api.pojo.response.MapResp; import com.tencent.supersonic.headless.api.pojo.response.ParseResp; @@ -35,7 +32,6 @@ import dev.langchain4j.provider.ModelProvider; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Collections; @@ -43,8 +39,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; -import java.util.Set; import java.util.stream.Collectors; import static com.tencent.supersonic.headless.chat.parser.ParserConfig.PARSER_EXEMPLAR_RECALL_NUMBER; @@ -68,26 +62,11 @@ public class NL2SQLParser implements ChatQueryParser { + "#History Mapped Schema: {{history_schema}}" + "#History SQL: {{history_sql}}" + "#Rewritten Question: "; - public static final String APP_KEY_ERROR_MESSAGE = "REWRITE_ERROR_MESSAGE"; - private static final String REWRITE_ERROR_MESSAGE_INSTRUCTION = "" - + "#Role: You are a data business partner who closely interacts with business people.\n" - + "#Task: Your will be provided with user input, system output and some examples, " - + "please respond shortly to teach user how to ask the right question, " - + "by using `Examples` as references." - + "#Rules: ALWAYS respond with the same language as the `Input`.\n" - + "#Input: {{user_question}}\n" + "#Output: {{system_message}}\n" - + "#Examples: {{examples}}\n" + "#Response: "; - public NL2SQLParser() { ChatAppManager.register(APP_KEY_MULTI_TURN, ChatApp.builder().prompt(REWRITE_MULTI_TURN_INSTRUCTION).name("多轮对话改写") .appModule(AppModule.CHAT).description("通过大模型根据历史对话来改写本轮对话").enable(false) .build()); - - ChatAppManager.register(APP_KEY_ERROR_MESSAGE, - ChatApp.builder().prompt(REWRITE_ERROR_MESSAGE_INSTRUCTION).name("异常提示改写") - .appModule(AppModule.CHAT).description("通过大模型将异常信息改写为更友好和引导性的提示用语") - .enable(false).build()); } @Override @@ -102,8 +81,10 @@ public class NL2SQLParser implements ChatQueryParser { ParseResp parseResp = parseContext.getResponse(); ChatParseReq parseReq = parseContext.getRequest(); - if (!parseContext.getRequest().isDisableLLM()) { + if (!parseContext.getRequest().isDisableLLM() && queryNLReq.getText2SQLType().enableLLM()) { processMultiTurn(parseContext); + addDynamicExemplars(parseContext.getAgent().getId(), queryNLReq); + parseResp.setUsedExemplars(queryNLReq.getDynamicExemplars()); } ChatContextService chatContextService = ContextUtils.getBean(ChatContextService.class); @@ -111,64 +92,16 @@ public class NL2SQLParser implements ChatQueryParser { if (chatCtx != null) { queryNLReq.setContextParseInfo(chatCtx.getParseInfo()); } - addDynamicExemplars(parseContext.getAgent().getId(), queryNLReq); ChatLayerService chatLayerService = ContextUtils.getBean(ChatLayerService.class); ParseResp text2SqlParseResp = chatLayerService.parse(queryNLReq); if (ParseResp.ParseState.COMPLETED.equals(text2SqlParseResp.getState())) { parseResp.getSelectedParses().addAll(text2SqlParseResp.getSelectedParses()); - } else { - if (!parseReq.isDisableLLM()) { - parseResp.setErrorMsg(rewriteErrorMessage(parseContext, - text2SqlParseResp.getErrorMsg(), queryNLReq.getDynamicExemplars())); - } } + parseResp.setErrorMsg(text2SqlParseResp.getErrorMsg()); parseResp.setState(text2SqlParseResp.getState()); parseResp.getParseTimeCost().setSqlTime(text2SqlParseResp.getParseTimeCost().getSqlTime()); parseResp.setErrorMsg(text2SqlParseResp.getErrorMsg()); - formatParseResult(parseResp); - } - - private void formatParseResult(ParseResp parseResp) { - List selectedParses = parseResp.getSelectedParses(); - for (SemanticParseInfo parseInfo : selectedParses) { - formatParseInfo(parseInfo); - } - } - - private void formatParseInfo(SemanticParseInfo parseInfo) { - if (!PluginQueryManager.isPluginQuery(parseInfo.getQueryMode())) { - formatNL2SQLParseInfo(parseInfo); - } - } - - private void formatNL2SQLParseInfo(SemanticParseInfo parseInfo) { - StringBuilder textBuilder = new StringBuilder(); - textBuilder.append("**数据集:** ").append(parseInfo.getDataSet().getName()).append(" "); - Optional metric = parseInfo.getMetrics().stream().findFirst(); - metric.ifPresent(schemaElement -> textBuilder.append("**指标:** ") - .append(schemaElement.getName()).append(" ")); - List dimensionNames = parseInfo.getDimensions().stream().map(SchemaElement::getName) - .filter(Objects::nonNull).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(dimensionNames)) { - textBuilder.append("**维度:** ").append(String.join(",", dimensionNames)); - } - textBuilder.append("\n\n**筛选条件:** \n"); - if (parseInfo.getDateInfo() != null) { - textBuilder.append("**数据时间:** ").append(parseInfo.getDateInfo().getStartDate()) - .append("~").append(parseInfo.getDateInfo().getEndDate()).append(" "); - } - if (!CollectionUtils.isEmpty(parseInfo.getDimensionFilters()) - || CollectionUtils.isEmpty(parseInfo.getMetricFilters())) { - Set queryFilters = parseInfo.getDimensionFilters(); - queryFilters.addAll(parseInfo.getMetricFilters()); - for (QueryFilter queryFilter : queryFilters) { - textBuilder.append("**").append(queryFilter.getName()).append("**").append(" ") - .append(queryFilter.getOperator().getValue()).append(" ") - .append(queryFilter.getValue()).append(" "); - } - } - parseInfo.setTextInfo(textBuilder.toString()); } private void processMultiTurn(ParseContext parseContext) { @@ -214,35 +147,6 @@ public class NL2SQLParser implements ChatQueryParser { currentMapResult.getQueryText(), rewrittenQuery); } - private String rewriteErrorMessage(ParseContext parseContext, String errMsg, - List similarExemplars) { - - ChatApp chatApp = parseContext.getAgent().getChatAppConfig().get(APP_KEY_ERROR_MESSAGE); - if (Objects.isNull(chatApp) || !chatApp.isEnable()) { - return errMsg; - } - - Map variables = new HashMap<>(); - variables.put("user_question", parseContext.getRequest().getQueryText()); - variables.put("system_message", errMsg); - - StringBuilder exampleStr = new StringBuilder(); - similarExemplars.forEach(e -> exampleStr.append( - String.format(" ", e.getQuestion(), e.getDbSchema()))); - parseContext.getAgent().getExamples() - .forEach(e -> exampleStr.append(String.format(" ", e))); - variables.put("examples", exampleStr); - - Prompt prompt = PromptTemplate.from(chatApp.getPrompt()).apply(variables); - ChatLanguageModel chatLanguageModel = - ModelProvider.getChatModel(ModelConfigHelper.getChatModelConfig(chatApp)); - Response response = chatLanguageModel.generate(prompt.toUserMessage()); - String rewrittenMsg = response.content().text(); - keyPipelineLog.info("ErrorRewrite modelReq:\n{} \nmodelResp:\n{}", prompt.text(), response); - - return rewrittenMsg; - } - private String generateSchemaPrompt(List elementMatches) { List metrics = new ArrayList<>(); List dimensions = new ArrayList<>(); diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/ErrorMessageProcessor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/ErrorMessageProcessor.java new file mode 100644 index 000000000..c6f05980d --- /dev/null +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/ErrorMessageProcessor.java @@ -0,0 +1,72 @@ +package com.tencent.supersonic.chat.server.processor.parse; + +import com.tencent.supersonic.chat.server.pojo.ParseContext; +import com.tencent.supersonic.common.pojo.ChatApp; +import com.tencent.supersonic.common.pojo.enums.AppModule; +import com.tencent.supersonic.common.util.ChatAppManager; +import com.tencent.supersonic.headless.server.utils.ModelConfigHelper; +import dev.langchain4j.data.message.AiMessage; +import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.input.Prompt; +import dev.langchain4j.model.input.PromptTemplate; +import dev.langchain4j.model.output.Response; +import dev.langchain4j.provider.ModelProvider; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ErrorMessageProcessor implements ParseResultProcessor { + + private static final Logger keyPipelineLog = LoggerFactory.getLogger("keyPipeline"); + + public static final String APP_KEY_ERROR_MESSAGE = "REWRITE_ERROR_MESSAGE"; + private static final String REWRITE_ERROR_MESSAGE_INSTRUCTION = "" + + "#Role: You are a data business partner who closely interacts with business people.\n" + + "#Task: Your will be provided with user input, system output and some examples, " + + "please respond shortly to teach user how to ask the right question, " + + "by using `Examples` as references." + + "#Rules: ALWAYS respond with the same language as the `Input`.\n" + + "#Input: {{user_question}}\n" + "#Output: {{system_message}}\n" + + "#Examples: {{examples}}\n" + "#Response: "; + + public ErrorMessageProcessor() { + ChatAppManager.register(APP_KEY_ERROR_MESSAGE, + ChatApp.builder().prompt(REWRITE_ERROR_MESSAGE_INSTRUCTION).name("异常提示改写") + .appModule(AppModule.CHAT).description("通过大模型将异常信息改写为更友好和引导性的提示用语") + .enable(false).build()); + } + + @Override + public void process(ParseContext parseContext) { + String errMsg = parseContext.getResponse().getErrorMsg(); + ChatApp chatApp = parseContext.getAgent().getChatAppConfig().get(APP_KEY_ERROR_MESSAGE); + if (StringUtils.isBlank(errMsg) || Objects.isNull(chatApp) || !chatApp.isEnable()) { + return; + } + + Map variables = new HashMap<>(); + variables.put("user_question", parseContext.getRequest().getQueryText()); + variables.put("system_message", errMsg); + + StringBuilder exampleStr = new StringBuilder(); + parseContext.getResponse().getUsedExemplars().forEach(e -> exampleStr.append( + String.format(" ", e.getQuestion(), e.getDbSchema()))); + parseContext.getAgent().getExamples() + .forEach(e -> exampleStr.append(String.format(" ", e))); + variables.put("examples", exampleStr); + + Prompt prompt = PromptTemplate.from(chatApp.getPrompt()).apply(variables); + ChatLanguageModel chatLanguageModel = + ModelProvider.getChatModel(ModelConfigHelper.getChatModelConfig(chatApp)); + Response response = chatLanguageModel.generate(prompt.toUserMessage()); + String rewrittenMsg = response.content().text(); + parseContext.getResponse().setErrorMsg(rewrittenMsg); + keyPipelineLog.info("ErrorMessageProcessor modelReq:\n{} \nmodelResp:\n{}", prompt.text(), + rewrittenMsg); + } + +} diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/TextInfoProcessor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/TextInfoProcessor.java new file mode 100644 index 000000000..d921a78b2 --- /dev/null +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/processor/parse/TextInfoProcessor.java @@ -0,0 +1,54 @@ +package com.tencent.supersonic.chat.server.processor.parse; + +import com.tencent.supersonic.chat.server.plugin.PluginQueryManager; +import com.tencent.supersonic.chat.server.pojo.ParseContext; +import com.tencent.supersonic.headless.api.pojo.SchemaElement; +import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; +import com.tencent.supersonic.headless.api.pojo.request.QueryFilter; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +public class TextInfoProcessor implements ParseResultProcessor { + @Override + public void process(ParseContext parseContext) { + parseContext.getResponse().getSelectedParses().forEach(p -> { + if (!PluginQueryManager.isPluginQuery(p.getQueryMode())) { + formatNL2SQLParseInfo(p); + } + }); + } + + private static void formatNL2SQLParseInfo(SemanticParseInfo parseInfo) { + StringBuilder textBuilder = new StringBuilder(); + textBuilder.append("**数据集:** ").append(parseInfo.getDataSet().getName()).append(" "); + Optional metric = parseInfo.getMetrics().stream().findFirst(); + metric.ifPresent(schemaElement -> textBuilder.append("**指标:** ") + .append(schemaElement.getName()).append(" ")); + List dimensionNames = parseInfo.getDimensions().stream().map(SchemaElement::getName) + .filter(Objects::nonNull).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(dimensionNames)) { + textBuilder.append("**维度:** ").append(String.join(",", dimensionNames)); + } + textBuilder.append("\n\n**筛选条件:** \n"); + if (parseInfo.getDateInfo() != null) { + textBuilder.append("**数据时间:** ").append(parseInfo.getDateInfo().getStartDate()) + .append("~").append(parseInfo.getDateInfo().getEndDate()).append(" "); + } + if (!CollectionUtils.isEmpty(parseInfo.getDimensionFilters()) + || CollectionUtils.isEmpty(parseInfo.getMetricFilters())) { + Set queryFilters = parseInfo.getDimensionFilters(); + queryFilters.addAll(parseInfo.getMetricFilters()); + for (QueryFilter queryFilter : queryFilters) { + textBuilder.append("**").append(queryFilter.getName()).append("**").append(" ") + .append(queryFilter.getOperator().getValue()).append(" ") + .append(queryFilter.getValue()).append(" "); + } + } + parseInfo.setTextInfo(textBuilder.toString()); + } +} diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaElementMatch.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaElementMatch.java index a0431169c..95e6e688f 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaElementMatch.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaElementMatch.java @@ -12,13 +12,13 @@ import lombok.ToString; @AllArgsConstructor @NoArgsConstructor public class SchemaElementMatch { - SchemaElement element; - double offset; - double similarity; - String detectWord; - String word; - Long frequency; - boolean isInherited; + private SchemaElement element; + private double offset; + private double similarity; + private String detectWord; + private String word; + private Long frequency; + private boolean isInherited; public boolean isFullMatched() { return 1.0 == similarity; diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaMapInfo.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaMapInfo.java index d7c936845..96197527a 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaMapInfo.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/SchemaMapInfo.java @@ -2,6 +2,7 @@ package com.tencent.supersonic.headless.api.pojo; import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.common.collect.Lists; +import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import java.util.HashMap; @@ -9,9 +10,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +@Getter public class SchemaMapInfo { - private Map> dataSetElementMatches = new HashMap<>(); + private final Map> dataSetElementMatches = new HashMap<>(); public Set getMatchedDataSetInfos() { return dataSetElementMatches.keySet(); @@ -21,10 +23,6 @@ public class SchemaMapInfo { return dataSetElementMatches.getOrDefault(dataSet, Lists.newArrayList()); } - public Map> getDataSetElementMatches() { - return dataSetElementMatches; - } - public void setMatchedElements(Long dataSet, List elementMatches) { dataSetElementMatches.put(dataSet, elementMatches); } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryNLReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryNLReq.java index 6172761a4..11b7826d2 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryNLReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QueryNLReq.java @@ -31,6 +31,15 @@ public class QueryNLReq extends SemanticQueryReq { @Override public String toCustomizedString() { - return ""; + StringBuilder stringBuilder = new StringBuilder("{"); + stringBuilder.append("\"queryText\":").append(dataSetId); + stringBuilder.append("\"dataSetId\":").append(dataSetId); + stringBuilder.append("\"modelIds\":").append(modelIds); + stringBuilder.append(",\"params\":").append(params); + stringBuilder.append(",\"cacheInfo\":").append(cacheInfo); + stringBuilder.append(",\"mapMode\":").append(mapModeEnum); + stringBuilder.append(",\"dataType\":").append(queryDataType); + stringBuilder.append('}'); + return stringBuilder.toString(); } } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java index 99d4b06f6..94324a4cc 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/QuerySqlReq.java @@ -17,7 +17,6 @@ import java.util.Objects; public class QuerySqlReq extends SemanticQueryReq { private String sql; - private Integer limit = 1000; @Override diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MapResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MapResp.java index e83fa5c78..a8686cbf6 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MapResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/MapResp.java @@ -7,10 +7,10 @@ import lombok.Data; public class MapResp { private final String queryText; + private final SchemaMapInfo mapInfo; - private SchemaMapInfo mapInfo = new SchemaMapInfo(); - - public MapResp(String queryText) { + public MapResp(String queryText, SchemaMapInfo schemaMapInfo) { this.queryText = queryText; + this.mapInfo = schemaMapInfo; } } diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ParseResp.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ParseResp.java index 1870deedf..2e8022151 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ParseResp.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/response/ParseResp.java @@ -1,6 +1,7 @@ package com.tencent.supersonic.headless.api.pojo.response; import com.google.common.collect.Lists; +import com.tencent.supersonic.common.pojo.Text2SQLExemplar; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; import lombok.Data; @@ -16,6 +17,7 @@ public class ParseResp { private String errorMsg; private List selectedParses = Lists.newArrayList(); private ParseTimeCostResp parseTimeCost = new ParseTimeCostResp(); + private List usedExemplars; public enum ParseState { COMPLETED, PENDING, FAILED diff --git a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/BaseMapper.java b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/BaseMapper.java index f3cc64f9f..5abd198f1 100644 --- a/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/BaseMapper.java +++ b/headless/chat/src/main/java/com/tencent/supersonic/headless/chat/mapper/BaseMapper.java @@ -114,8 +114,7 @@ public abstract class BaseMapper implements SchemaMapper { return element.getAlias(); } - public List getMatches(ChatQueryContext chatQueryContext, - BaseMatchStrategy matchStrategy) { + public List getMatches(ChatQueryContext chatQueryContext, MatchStrategy matchStrategy) { String queryText = chatQueryContext.getRequest().getQueryText(); List terms = HanlpHelper.getTerms(queryText, chatQueryContext.getModelIdToDataSetIds()); diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2ChatLayerService.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2ChatLayerService.java index fa85ef3b2..79c604789 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2ChatLayerService.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/facade/service/impl/S2ChatLayerService.java @@ -64,11 +64,9 @@ public class S2ChatLayerService implements ChatLayerService { @Override public MapResp map(QueryNLReq queryNLReq) { - MapResp mapResp = new MapResp(queryNLReq.getQueryText()); ChatQueryContext queryCtx = buildChatQueryContext(queryNLReq); ComponentFactory.getSchemaMappers().forEach(mapper -> mapper.map(queryCtx)); - mapResp.setMapInfo(queryCtx.getMapInfo()); - return mapResp; + return new MapResp(queryNLReq.getQueryText(), queryCtx.getMapInfo()); } @Override diff --git a/launchers/standalone/src/main/resources/META-INF/spring.factories b/launchers/standalone/src/main/resources/META-INF/spring.factories index cae949e6d..30f262855 100644 --- a/launchers/standalone/src/main/resources/META-INF/spring.factories +++ b/launchers/standalone/src/main/resources/META-INF/spring.factories @@ -67,7 +67,9 @@ com.tencent.supersonic.chat.server.plugin.recognize.PluginRecognizer=\ com.tencent.supersonic.chat.server.processor.parse.ParseResultProcessor=\ com.tencent.supersonic.chat.server.processor.parse.QueryRecommendProcessor,\ - com.tencent.supersonic.chat.server.processor.parse.TimeCostProcessor + com.tencent.supersonic.chat.server.processor.parse.TimeCostProcessor,\ + com.tencent.supersonic.chat.server.processor.parse.ErrorMessageProcessor,\ + com.tencent.supersonic.chat.server.processor.parse.TextInfoProcessor com.tencent.supersonic.chat.server.processor.execute.ExecuteResultProcessor=\ com.tencent.supersonic.chat.server.processor.execute.MetricRecommendProcessor,\