Skip to content

Commit ccd6221

Browse files
committed
add mcp server for chatBI
1 parent 1288258 commit ccd6221

7 files changed

Lines changed: 75 additions & 41 deletions

File tree

tis-ontology-plugin/infer.json

Lines changed: 35 additions & 21 deletions
Large diffs are not rendered by default.

tis-ontology-plugin/src/main/java/com/qlangtech/tis/plugin/ontology/EnableChatBI.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ private ChatBIService getChatBIService() {
134134
}
135135

136136
@Override
137-
public ChatBIResult ask(String domain, String nlq, Consumer<TraceStep> stepCallback) {
138-
return getChatBIService().ask(domain, nlq, stepCallback);
137+
public ChatBIResult ask(String domain, String nlq, boolean forceQueryExecute, Consumer<TraceStep> stepCallback) {
138+
return getChatBIService().ask(domain, nlq, forceQueryExecute, stepCallback);
139139
}
140140

141141
@Override

tis-ontology-plugin/src/main/java/com/qlangtech/tis/plugin/ontology/chatbi/DefaultChatBIService.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.qlangtech.tis.plugin.ontology.chatbi.validation.ValidationResult;
3434
import com.qlangtech.tis.plugin.ontology.graphrag.DefaultGraphRAGService;
3535
import com.qlangtech.tis.plugin.ontology.graphrag.GraphRAGService;
36+
import com.qlangtech.tis.plugin.ontology.graphrag.LinkerInfo;
3637
import com.qlangtech.tis.plugin.ontology.graphrag.RetrievalResult;
3738
import org.apache.commons.compress.utils.Lists;
3839
import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -44,7 +45,9 @@
4445
import java.util.List;
4546
import java.util.Map;
4647
import java.util.Objects;
48+
import java.util.Set;
4749
import java.util.UUID;
50+
import java.util.stream.Collectors;
4851

4952
/**
5053
* ChatBI 服务默认实现(§5 T5:重试编排)。
@@ -94,7 +97,12 @@ public void setConfigs(com.qlangtech.tis.plugin.ontology.chatbi.config.RetryConf
9497

9598

9699
@Override
97-
public ChatBIResult ask(String domain, String nlq, java.util.function.Consumer<TraceStep> stepCallback) {
100+
public ChatBIResult ask(String domain, String nlq, boolean forceQueryExecute, java.util.function.Consumer<TraceStep> stepCallback) {
101+
102+
if (forceQueryExecute && !this.executionConfig.isExecuteQuery()) {
103+
throw new IllegalStateException("ExecuteQuery is not enable, please switch it on. in ontology domain:" + domain);
104+
}
105+
98106
// 请求 ID:yyyyMMddHHmmss-{uuid32},贯穿整个流水线,用作 trace 文件名
99107
String createTime = TimeFormat.yyyyMMddHHmmss.format(new Date());// LocalDateTime.now().format(DATETIME_FORMATTER);
100108
String reqId = createTime + "-" + UUID.randomUUID().toString().replace("-", "");
@@ -109,7 +117,12 @@ public ChatBIResult ask(String domain, String nlq, java.util.function.Consumer<T
109117
: com.qlangtech.tis.plugin.ontology.graphrag.RetrievalOptions.defaults();
110118
final RetrievalResult retrievalResult = graphRAGService.retrieve(domain, nlq, retrievalOptions);
111119
long t2 = System.currentTimeMillis();
112-
TraceStep retrieveStep = TraceStep.retrieve(retrievalResult.objectTypes().size(), retrievalResult.linkers().size(), t2 - t1);
120+
Set<String> linkers = retrievalResult.linkers().stream().map(LinkerInfo::linkerName).collect(Collectors.toSet());
121+
TraceStep retrieveStep = TraceStep.retrieve(retrievalResult.objectTypes().size(), linkers.size(), t2 - t1);
122+
JSONObject data = Objects.requireNonNull(retrieveStep.data(), "data can not be null");
123+
data.put("ots", String.join(",", retrievalResult.objectTypes()));
124+
data.put("linkers", String.join(",", linkers));
125+
data.put("glossaries", String.join(",", retrievalResult.glossaryTerms()));
113126
trace.add(retrieveStep);
114127
stepCallback.accept(retrieveStep);
115128

@@ -211,7 +224,7 @@ public ChatBIResult ask(String domain, String nlq, java.util.function.Consumer<T
211224
// Step 6: 执行(可选)
212225
QueryResult queryResult = null;
213226
boolean executeQuery = executionConfig == null || executionConfig.isExecuteQuery();
214-
if (validationResult.valid() && executeQuery) {
227+
if (Objects.requireNonNull(validationResult, "validationResult can not be null").valid() && executeQuery) {
215228
long t5 = System.currentTimeMillis();
216229
queryResult = executeQuery(domain, retrievalResult, candidateSql);
217230
long t6 = System.currentTimeMillis();

tis-ontology-plugin/src/main/java/com/qlangtech/tis/plugin/ontology/impl/infer/BaseInferenceParseCreatorFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ public final CMeta.ParsePostMCols<InferenceParse> parsePostMCols(IPropertyType p
4343
Integer id = col.getInteger("id");
4444
Boolean selected = col.getBoolean(KEY_SELECTED);
4545

46-
Ontology.OntologyEnum ontologyEnum = Ontology.OntologyEnum.parse(IEndTypeGetter.EndType.parse(col.getString(Option.KEY_END_TYPE)));
46+
// Ontology.OntologyEnum ontologyEnum = null;
47+
IEndTypeGetter.EndType endType = IEndTypeGetter.EndType.parse(col.getString(Option.KEY_END_TYPE));
4748
// Ontology ontologyRes = switch (ontologyEnum) {
4849
// case ValueType -> new DefaultOntologyValueType();
4950
// case Linker -> new DefaultOntologyLinker();
@@ -58,7 +59,7 @@ public final CMeta.ParsePostMCols<InferenceParse> parsePostMCols(IPropertyType p
5859

5960
InferenceParse infer = new InferenceParse(id, this.getInferBatch(), col.getString(InferenceParse.KEY_REASON)
6061
, InferenceParse.InferenceConfidence.parse(col.getString(InferenceParse.KEY_CONFIDENCE))
61-
, col.getString(InferenceParse.KEY_NAME), ontologyEnum, Collections.emptyList());
62+
, col.getString(InferenceParse.KEY_NAME), endType, null, Collections.emptyList());
6263

6364
// InferenceParse.deserialize(id, this.getInferBatch(), col, ontologyRes);
6465
//

tis-ontology-plugin/src/main/java/com/qlangtech/tis/plugin/ontology/impl/infer/InferOntologyFromLLMStep1.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.util.List;
5555
import java.util.Objects;
5656
import java.util.Optional;
57+
import java.util.Set;
5758
import java.util.concurrent.ConcurrentLinkedQueue;
5859
import java.util.concurrent.Future;
5960
import java.util.stream.Collectors;
@@ -74,12 +75,7 @@
7475
@SuppressWarnings("all")
7576
public class InferOntologyFromLLMStep1 extends OneStepOfMultiSteps {
7677

77-
// @FormField(ordinal = 0, type = FormFieldType.SELECTABLE, validate = {Validator.require, Validator.identity})
78-
// public String ontologyDomain;
79-
// public static final String KEY_LINK_TYPES = "linkTypes";
80-
// public static final String KEY_SHARED_PROPERTIES = "sharedProperties";
81-
// public static final String KEY_VALUE_TYPES = "valueTypes";
82-
// public static final String KEY_GLOSSARIES = "glossaries";
78+
private static final String KEY_FIELD_TARGET_TABLES = "targetTables";
8379
private static final Logger logger = LoggerFactory.getLogger(InferOntologyFromLLMStep1.class);
8480
/**
8581
* 大模型接口
@@ -408,10 +404,6 @@ public void onNext(InferenceParse item) {
408404
public static final class DftDesc extends OneStepOfMultiSteps.BasicDesc implements FormFieldType.IMultiSelectValidator {
409405
public DftDesc() {
410406
super();
411-
// List<Pair<OntologyDomain, IPluginStore<OntologyDomain>>> domainList = OntologyDomain
412-
// .getDoaminList();
413-
// List<OntologyDomain> domains = domainList.stream().map(Pair::getKey).toList();
414-
// this.registerSelectOptions("ontologyDomain", () -> domains);
415407
this.registerSelectOptions(KEY_FIELD_LLM_NAME, LLMProvider::getExistProviders);
416408
}
417409

@@ -430,11 +422,20 @@ public String getStepDescription() {
430422
return "基本设置";
431423
}
432424

425+
private static final Integer MAX_INFERE_OBJECT_TYPE_COUNT = 30;
426+
433427
@Override
434428
protected boolean validateAll(IControlMsgHandler msgHandler, Context context, PostFormVals postFormVals) {
435429
// return super.validateAll(msgHandler, context, postFormVals);
436430
OntologyPluginMeta ometa = getOntologyPluginMeta((IPluginContext) msgHandler, Optional.of(context));
437-
431+
InferOntologyFromLLMStep1 step1 = postFormVals.newInstance();
432+
Set<String> targetObjType
433+
= step1.targetTables.stream().map((target) -> target.identityValue()).collect(Collectors.toSet());
434+
if (targetObjType.size() > MAX_INFERE_OBJECT_TYPE_COUNT) {
435+
msgHandler.addFieldError(context, KEY_FIELD_TARGET_TABLES
436+
, "为了避免LLM推理超时,目前最大可选数量为:" + MAX_INFERE_OBJECT_TYPE_COUNT + ",当前已选数量为:" + targetObjType.size());
437+
return false;
438+
}
438439
List<OntologyObjectType> objectTypes = OntologyObjectType.loadAll(ometa.getDomain());
439440
if (objectTypes.isEmpty()) {
440441
throw new IllegalStateException("domain '" + ometa.getDomain()
@@ -443,6 +444,9 @@ protected boolean validateAll(IControlMsgHandler msgHandler, Context context, Po
443444
Optional<OntologyProperty> pk = null;
444445
List<OntologyObjectType> lackPkObjTypes = Lists.newArrayList();
445446
for (OntologyObjectType objType : objectTypes) {
447+
if (!targetObjType.contains(objType.getName())) {
448+
continue;
449+
}
446450
if (objType.hasDisablePK()) {
447451
continue;
448452
}

0 commit comments

Comments
 (0)