first commit

This commit is contained in:
jerryjzhang
2023-06-12 18:44:01 +08:00
commit dc4fc69b57
879 changed files with 573090 additions and 0 deletions

33
chat/api/pom.xml Normal file
View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>chat</artifactId>
<groupId>com.tencent.supersonic</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>chat-api</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>auth-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.tencent.supersonic</groupId>
<artifactId>semantic-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.chat.api.pojo;
import lombok.Data;
@Data
public class ChatContext {
private Integer chatId;
private String queryText;
private SemanticParseInfo parseInfo = new SemanticParseInfo();
private String user;
}

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.chat.api.pojo;
import lombok.Data;
@Data
public class DataInfo {
private Integer itemId;
private String name;
private String bizName;
private String value;
}

View File

@@ -0,0 +1,12 @@
package com.tencent.supersonic.chat.api.pojo;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
@Data
public class DomainInfo extends DataInfo implements Serializable {
private List<String> words;
private String primaryEntityBizName;
}

View File

@@ -0,0 +1,14 @@
package com.tencent.supersonic.chat.api.pojo;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class EntityInfo {
private DomainInfo domainInfo = new DomainInfo();
private List<DataInfo> dimensions = new ArrayList<>();
private List<DataInfo> metrics = new ArrayList<>();
private String entityId;
}

View File

@@ -0,0 +1,20 @@
package com.tencent.supersonic.chat.api.pojo;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
import lombok.Data;
import lombok.ToString;
@Data
@ToString(callSuper = true)
public class Filter {
private String bizName;
private String name;
private FilterOperatorEnum operator = FilterOperatorEnum.EQUALS;
private Object value;
private Long elementID;
}

View File

@@ -0,0 +1,10 @@
package com.tencent.supersonic.chat.api.pojo;
import lombok.Data;
@Data
public class SchemaElementCount {
private Integer count = 0;
private double maxSimilarity;
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.chat.api.pojo;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class SchemaElementMatch {
SchemaElementType elementType;
int elementID;
double similarity;
String word;
public SchemaElementMatch() {
}
public SchemaElementMatch(SchemaElementType schemaElementType, int elementID, double similarity, String word) {
this.elementID = elementID;
this.elementType = schemaElementType;
this.similarity = similarity;
this.word = word;
}
}

View File

@@ -0,0 +1,11 @@
package com.tencent.supersonic.chat.api.pojo;
public enum SchemaElementType {
DOMAIN,
METRIC,
DIMENSION,
VALUE,
ENTITY,
ID,
DATE
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.chat.api.pojo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SchemaMapInfo {
private Map<Integer, List<SchemaElementMatch>> domainElementMatches = new HashMap<>();
public Set<Integer> getMatchedDomains() {
return domainElementMatches.keySet();
}
public List<SchemaElementMatch> getMatchedElements(Integer domain) {
return domainElementMatches.get(domain);
}
public Map<Integer, List<SchemaElementMatch>> getDomainElementMatches() {
return domainElementMatches;
}
public void setMatchedElements(Integer domain, List<SchemaElementMatch> elementMatches) {
domainElementMatches.put(domain, elementMatches);
}
}

View File

@@ -0,0 +1,28 @@
package com.tencent.supersonic.chat.api.pojo;
import com.tencent.supersonic.common.enums.AggregateTypeEnum;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.Order;
import com.tencent.supersonic.common.pojo.SchemaItem;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class SemanticParseInfo {
String queryMode;
AggregateTypeEnum aggType = AggregateTypeEnum.NONE;
Long domainId = 0L;
String domainName;
Long entity = 0L;
List<SchemaItem> metrics = new ArrayList<>();
List<SchemaItem> dimensions = new ArrayList<>();
List<Filter> dimensionFilters = new ArrayList<>();
List<Filter> metricFilters = new ArrayList<>();
private List<Order> orders = new ArrayList<>();
private DateConf dateInfo;
private Long limit;
private Boolean nativeQuery = false;
}

View File

@@ -0,0 +1,19 @@
package com.tencent.supersonic.chat.api.request;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import lombok.Data;
@Data
public class QueryContextReq {
private String queryText;
private Integer chatId;
private Integer domainId = 0;
private User user;
private SemanticParseInfo parseInfo = new SemanticParseInfo();
private SchemaMapInfo mapInfo = new SchemaMapInfo();
private boolean saveAnswer = true;
}

View File

@@ -0,0 +1,24 @@
package com.tencent.supersonic.chat.api.response;
import com.tencent.supersonic.chat.api.pojo.EntityInfo;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.semantic.api.core.pojo.QueryAuthorization;
import com.tencent.supersonic.semantic.api.core.pojo.QueryColumn;
import java.util.List;
import java.util.Map;
import lombok.Data;
@Data
public class QueryResultResp {
private Long queryId;
private String queryMode;
private String querySql;
private int queryState;
private List<QueryColumn> queryColumns;
private QueryAuthorization queryAuthorization;
public EntityInfo entityInfo;
private SemanticParseInfo chatContext;
private Object response;
private List<Map<String, Object>> queryResults;
}

View File

@@ -0,0 +1,15 @@
package com.tencent.supersonic.chat.api.service;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
/**
* This interface defines the contract for a schema mapper that identifies references to schema
* elements in natural language queries.
*
* The schema mapper matches queries against the knowledge base which is constructed using the
* schema of semantic models.
*/
public interface SchemaMapper {
void map(QueryContextReq searchCtx);
}

View File

@@ -0,0 +1,30 @@
package com.tencent.supersonic.chat.api.service;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.semantic.api.core.response.DomainSchemaResp;
import com.tencent.supersonic.semantic.api.core.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
import java.util.List;
/**
* This interface defines the contract for a semantic layer that provides a simplified and
* consistent view of data from multiple sources.
* The semantic layer abstracts away the complexity of the underlying data sources and provides
* a unified view of the data that is easier to understand and use.
* <p>
* The interface defines methods for getting metadata as well as querying data in the semantic layer.
* Implementations of this interface should provide concrete implementations that interact with the
* underlying data sources and return results in a consistent format. Or it can be implemented
* as proxy to a remote semantic service.
* </p>
*/
public interface SemanticLayer {
QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user);
DomainSchemaResp getDomainSchemaInfo(Long domain);
List<DomainSchemaResp> getDomainSchemaInfo(List<Long> ids);
}

View File

@@ -0,0 +1,17 @@
package com.tencent.supersonic.chat.api.service;
import com.tencent.supersonic.chat.api.pojo.ChatContext;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
/**
* This interface defines the contract for a semantic parser that can analyze natural language query
* and extract meaning from it.
*
* The semantic parser uses either rule-based or model-based algorithms to identify query intent
* and related semantic items described in the query.
*/
public interface SemanticParser {
boolean parse(QueryContextReq queryContext, ChatContext chatCtx);
}

View File

@@ -0,0 +1,29 @@
package com.tencent.supersonic.chat.api.service;
import com.tencent.supersonic.chat.api.pojo.ChatContext;
import com.tencent.supersonic.chat.api.pojo.SchemaElementCount;
import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.chat.api.request.QueryContextReq;
import com.tencent.supersonic.chat.api.response.QueryResultResp;
import java.io.Serializable;
import java.util.List;
/**
* This interface defines the contract for a semantic query that executes specific type of
* query based on the results of semantic parsing.
*/
public interface SemanticQuery extends Serializable {
String getQueryMode();
QueryResultResp execute(QueryContextReq queryCtx, ChatContext chatCtx) throws Exception;
SchemaElementCount match(List<SchemaElementMatch> elementMatches, QueryContextReq queryCtx);
void updateContext(QueryResultResp queryResponse, ChatContext chatCtx, QueryContextReq queryCtx);
SemanticParseInfo getContext(ChatContext chatCtx, QueryContextReq queryCtx);
}