diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ad4db1e5..a83be5058 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,24 @@
- All notable changes to this project will be documented in this file.
- "Breaking Changes" describes any changes that may break existing functionality or cause
compatibility issues with previous versions.
-
+
+
+
+## SuperSonic [0.7.2] - 2023-08-12
+
+### Added
+- Support asynchronous query - return parse information to user before executing result
+- Add Model as the basic data structure of the semantic definitions - this will repalce the old conception of subdomain
+
+### Updated
+- improve knowledge word similarity algorithm
+- improve embedding plugin chooser
+- improve DSLQuery field correction and parser
+
+
+### Fixed
+- Fix mapper error that detectWord text is shorter than word
+- Fix MetricDomainQuery inherit context
## SuperSonic [0.7.0] - 2023-07-30
@@ -96,4 +113,4 @@
### Removed
-- delete view module
\ No newline at end of file
+- delete view module
diff --git a/README.md b/README.md
index 92fbd62a5..78f942018 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@ English | [中文](README_CN.md)
# SuperSonic (超音数)
-**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to build logical semantic models (definition of metrics/dimensions/entities, along with their meaning, context and relationships) on top of physical data models, and no data modification or copying is required. Meanwhile, SuperSonic is designed to be pluggable, allowing new tools to be added through plugins.
+**SuperSonic is an out-of-the-box yet highly extensible framework for building a data chatbot**. SuperSonic provides a chat interface that empowers users to query data using natural language and visualize the results with suitable charts. To enable such experience, the only thing necessary is to build logical semantic models (definition of metrics/dimensions/entities, along with their meaning, context and relationships) on top of physical data models, and no data modification or copying is required. Meanwhile, SuperSonic is designed to be pluggable, allowing new functionalities to be added through plugins and core components to be integrated with other systems.
@@ -10,34 +10,35 @@ English | [中文](README_CN.md)
The emergence of Large Language Model (LLM) like ChatGPT is reshaping the way information is retrieved. In the field of data analytics, both academia and industry are primarily focused on leveraging LLM to convert natural language queries into SQL queries. While some works show promising results, they are still not applicable to real-world scenarios.
-From our perspective, the key to filling the real-world gap lies in three aspects:
-1. Utilize a combination of rule-based and LLM-based semantic parsers to deal with different scenarios.
+From our perspective, the key to filling the real-world gap lies in two aspects:
+1. Utilize a combination of rule-based and model-based semantic parsers to deal with different scenarios.
2. Introduce a semantic model layer encapsulating the underlying data complexity(joins, formulas, etc) to simplify semantic parsing.
-3. Integrate third-party plugins to augment semantic parsing capabilities or complement custom functionalities.
With these ideas in mind, we develop SuperSonic as a practical reference implementation and use it to power our real-world products. Additionally, to facilitate further development of data chatbot, we decide to open source SuperSonic as an extensible framework.
## Out-of-the-box Features
-- Built-in chat UI for business users to enter natural language queries and answer results with appropriate visualization charts.
-- Built-in modelling UI for analytics engineers to manage semantic models. The configurations related to access permission and chat conversation can also be set on the UI.
-- Support input auto-completion as well as query recommendation.
-- Support multi-turn conversation and history context management.
-- Support four-level permission control: domain-level, model-level, column-level and row-level.
+- Built-in graphical interface for business users to enter data queries
+- Built-in graphical interface for analytics engineers to manage semantic models
+- Support input auto-completion as well as query recommendation
+- Support multi-turn conversation and history context management
+- Support three-level permission control: domain-level, column-level and row-level
## Extensible Components
The high-level architecture and main process flow is shown in below diagram:
-
+
+
+- **Chat Interface:** accepts natural language queries and answer results with appropriate visualization charts. It supports input auto-completion as well as multi-turn conversation.
+
+- **Modeling Interface:** empowers analytics engineers to visually define and maintain semantic models. The configurations related to access permission and chat conversation can also be set on the UI.
- **Schema Mapper Chain:** identifies references to schema elements(metrics/dimensions/entities/values) in user queries. It matches the query text against a knowledge base constructed from the semantic models.
-- **Semantic Parser Chain:** understands user queries and extract semantic information. It consists of a combination of rule-based and LLM-based parsers, each of which deals with specific scenarios.
+- **Semantic Parser Chain:** understands user queries and extract semantic information. It consists of a combination of rule-based and model-based parsers, each of which deals with specific scenarios.
-- **Semantic Layer:** performs execution according to extracted semantic information. It generates SQL queries and executes them against physical data models.
-
-- **Chat Plugins**: perform custom execution given the results of schema mapping and semantic parsing. It would optionally resort to semantic layer to query semantic models.
+- **Semantic Query:** performs execution according to extracted semantic information. It generates SQL queries and executes them against physical data models.
## Quick Demo
@@ -57,4 +58,4 @@ Pull the source code and run script "assembly/bin/build-standalone.sh" to build
### Build for Distributed Mode
-Pull the source code and run scripts "assembly/bin/build-chat.sh" and "assembly/bin/build-semantic.sh" separately to build packages.
\ No newline at end of file
+Pull the source code and run scripts "assembly/bin/build-chat.sh" and "assembly/bin/build-semantic.sh" separately to build packages.
diff --git a/README_CN.md b/README_CN.md
index 0e8064aa1..bf3dce6e8 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -8,42 +8,43 @@
大型语言模型(LLMs)如ChatGPT的出现正在重塑信息检索的方式。在数据分析领域,学术界和工业界主要关注利用深度学习模型将自然语言查询转换为SQL查询。虽然一些工作显示出有前景的结果,但它们还并不适用于实际场景。
-在我们看来,为了在实际场景发挥价值,有三个关键点:
+在我们看来,为了在实际场景发挥价值,有两个关键点:
1. 将基于规则和基于模型的语义解析器相结合,发挥各自优势,以便处理不同的场景。
2. 引入语义模型层来封装数据底层的复杂性(关联、公式等),从而简化语义解析的求解空间。
-3. 整合第三方插件用于增强语义解析能力,或者扩充自定义功能。
为了验证上述想法,我们开发了超音数项目,并将其应用在实际的内部产品中。与此同时,我们将超音数作为一个可扩展的框架开源,希望能够促进数据问答对话领域的进一步发展。
## 开箱即用的特性
-- 内置的对话图形界面,使用户能够通过自然语言问询,并最终选择合适的可视化图表呈现结果。
-- 内置的建模图形界面,使分析工程师能够通过可视化方式定义和维护语义模型,与访问权限和聊天对话相关的配置也可以在用户界面上设置。
+- 内置图形界面以便业务用户输入数据查询。
+- 内置图形界面以便分析工程师管理语义模型。
- 支持文本输入的联想和查询问题的推荐。
- 支持多轮对话,根据语境自动切换上下文。
-- 支持四级权限控制:主题域级、模型级、列级及行级。
+- 支持三级权限控制:主题域级、列级、行级。
## 易于扩展的组件
超音数的整体架构和主流程如下图所示:
-
+
+
+- **问答对话界面(chat interface)**:接受用户查询并选择合适的可视化图表呈现结果,支持输入联想和多轮对话。
+
+- **语义建模界面(modeling interface)**:使分析工程师能够通过可视化方式定义和维护语义模型,与访问权限和聊天对话相关的配置也可以在用户界面上设置。
- **模式映射器(schema mapper chain)**:基于语义模型构建知识库,然后将自然语言文本在知识库中进行匹配,为后续的语义解析提供相关信息。
- **语义解析器(semantic parser chain)**:理解用户查询并抽取语义信息,其由一组基于规则和基于模型的解析器组成,每个解析器可应对不同的特定场景。
-- **语义层(semantic layer)**: 根据语义信息生成物理SQL执行查询。
-
-- **问答插件(chat plugins)**:基于模式映射和语义解析的结果,执行自定义的操作,同时可以选择利用语义层来查询语义模型。
+- **语义查询(semantic query)**: 根据语义信息生成物理SQL执行查询。
## 快速体验
超音数自带样例的语义模型和问答对话,只需以下三步即可快速体验:
-- 从[release page](https://github.com/tencentmusic/supersonic/releases)下载预先构建好的发行包;
-- 运行 "bin/start-standalone.sh"启动服务;
-- 在浏览器访问http://localhost:9080 开启探索。
+- 从[release page](https://github.com/tencentmusic/supersonic/releases)下载预先构建好的发行包
+- 运行 "bin/start-standalone.sh"启动服务
+- 在浏览器访问http://localhost:9080 开启探索
## 如何构建
@@ -51,8 +52,8 @@
### Standalone模式构建
-下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包。
+下载源码包,运行脚本"assembly/bin/build-standalone.sh",将所有服务一起编译打包
### Distributed模式构建
-下载源码包,分别运行脚本"assembly/bin/build-chat.sh"、"assembly/bin/build-semantic.sh",为问答层服务和语义层服务编译打包。
\ No newline at end of file
+下载源码包,分别运行脚本"assembly/bin/build-chat.sh"、"assembly/bin/build-semantic.sh",为问答层服务和语义层服务编译打包
\ No newline at end of file
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java
index 33c4cbe6a..e4966dfb4 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/adaptor/UserAdaptor.java
@@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authentication.adaptor;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
-
import java.util.List;
import java.util.Set;
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java
index a72870955..6f9f3a94f 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/pojo/Organization.java
@@ -1,9 +1,8 @@
package com.tencent.supersonic.auth.api.authentication.pojo;
import com.google.common.collect.Lists;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class Organization {
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java
index dcfb3b8ef..268462054 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserService.java
@@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authentication.service;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
-
import java.util.List;
import java.util.Set;
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java
index ae9d73a85..ad271eea1 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authentication/service/UserStrategy.java
@@ -1,7 +1,6 @@
package com.tencent.supersonic.auth.api.authentication.service;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
-
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java
index 2a9a053c1..5e4ffba0d 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthGroup.java
@@ -6,7 +6,7 @@ import lombok.Data;
@Data
public class AuthGroup {
- private String domainId;
+ private String modelId;
private String name;
private Integer groupId;
private List authRules;
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java
index d12bd7084..f15f02131 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/pojo/AuthRes.java
@@ -7,14 +7,14 @@ import lombok.ToString;
@ToString
public class AuthRes {
- private String domainId;
+ private String modelId;
private String name;
public AuthRes() {
}
- public AuthRes(String domainId, String name) {
- this.domainId = domainId;
+ public AuthRes(String modelId, String name) {
+ this.modelId = modelId;
this.name = name;
}
}
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java
index bf77f2e0d..a006769e9 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/request/QueryAuthResReq.java
@@ -3,7 +3,6 @@ package com.tencent.supersonic.auth.api.authorization.request;
import com.tencent.supersonic.auth.api.authorization.pojo.AuthRes;
import java.util.ArrayList;
import java.util.List;
-
import lombok.Data;
import lombok.ToString;
@@ -17,5 +16,5 @@ public class QueryAuthResReq {
private List resources;
- private String domainId;
+ private String modelId;
}
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java
index 059d3ce39..2a90bdaf2 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/response/AuthorizedResourceResp.java
@@ -4,7 +4,6 @@ import com.tencent.supersonic.auth.api.authorization.pojo.AuthResGrp;
import com.tencent.supersonic.auth.api.authorization.pojo.DimensionFilter;
import java.util.ArrayList;
import java.util.List;
-
import lombok.Data;
@Data
diff --git a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java
index a3256c86d..42b478f0e 100644
--- a/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java
+++ b/auth/api/src/main/java/com/tencent/supersonic/auth/api/authorization/service/AuthService.java
@@ -3,8 +3,8 @@ package com.tencent.supersonic.auth.api.authorization.service;
import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq;
import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp;
-import javax.servlet.http.HttpServletRequest;
import java.util.List;
+import javax.servlet.http.HttpServletRequest;
public interface AuthService {
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
index e762ca9a3..0c924d24e 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/adaptor/DefaultUserAdaptor.java
@@ -11,10 +11,10 @@ import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDO;
import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository;
import com.tencent.supersonic.auth.authentication.utils.UserTokenUtils;
import com.tencent.supersonic.common.util.ContextUtils;
-import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
+import org.springframework.beans.BeanUtils;
public class DefaultUserAdaptor implements UserAdaptor {
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java
new file mode 100644
index 000000000..474de6004
--- /dev/null
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/config/TppConfig.java
@@ -0,0 +1,21 @@
+package com.tencent.supersonic.auth.authentication.config;
+
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+public class TppConfig {
+
+ @Value(value = "${auth.app.secret:}")
+ private String appSecret;
+
+ @Value(value = "${auth.app.key:}")
+ private String appKey;
+
+ @Value(value = "${auth.oa.url:}")
+ private String tppOaUrl;
+
+}
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java
index 968085d2b..67daa9547 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/DefaultAuthenticationInterceptor.java
@@ -35,11 +35,14 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor
setFakerUser(request);
return true;
}
- HandlerMethod handlerMethod = (HandlerMethod) handler;
- Method method = handlerMethod.getMethod();
- AuthenticationIgnore ignore = method.getAnnotation(AuthenticationIgnore.class);
- if (ignore != null) {
- return true;
+
+ if (handler instanceof HandlerMethod) {
+ HandlerMethod handlerMethod = (HandlerMethod) handler;
+ Method method = handlerMethod.getMethod();
+ AuthenticationIgnore ignore = method.getAnnotation(AuthenticationIgnore.class);
+ if (ignore != null) {
+ return true;
+ }
}
String uri = request.getServletPath();
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java
index b754c3980..1c13cca3c 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/interceptor/InterceptorFactory.java
@@ -1,12 +1,11 @@
package com.tencent.supersonic.auth.authentication.interceptor;
+import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import java.util.List;
-
@Configuration
public class InterceptorFactory implements WebMvcConfigurer {
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java
index 97360894b..520e2c71f 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/persistence/repository/Impl/UserRepositoryImpl.java
@@ -3,8 +3,8 @@ package com.tencent.supersonic.auth.authentication.persistence.repository.Impl;
import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDO;
import com.tencent.supersonic.auth.authentication.persistence.dataobject.UserDOExample;
-import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository;
import com.tencent.supersonic.auth.authentication.persistence.mapper.UserDOMapper;
+import com.tencent.supersonic.auth.authentication.persistence.repository.UserRepository;
import java.util.List;
import java.util.Optional;
import org.springframework.stereotype.Component;
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java
index 14cc106d8..1eabf48e6 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/rest/UserController.java
@@ -11,7 +11,12 @@ import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/auth/user")
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java
index 15b102991..7eb17b03b 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/service/UserServiceImpl.java
@@ -7,7 +7,6 @@ import com.tencent.supersonic.auth.api.authentication.service.UserService;
import com.tencent.supersonic.auth.authentication.utils.ComponentFactory;
import java.util.List;
import java.util.Set;
-
import org.springframework.stereotype.Service;
@Service
@@ -16,7 +15,7 @@ public class UserServiceImpl implements UserService {
@Override
public List getUserNames() {
- return ComponentFactory.getUserAdaptor().getUserNames();
+ return ComponentFactory.getUserAdaptor().getUserNames();
}
@Override
diff --git a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java
index e6cee4640..7f0f51dd3 100644
--- a/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java
+++ b/auth/authentication/src/main/java/com/tencent/supersonic/auth/authentication/utils/ComponentFactory.java
@@ -1,8 +1,8 @@
package com.tencent.supersonic.auth.authentication.utils;
import com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor;
-import org.springframework.core.io.support.SpringFactoriesLoader;
import java.util.Objects;
+import org.springframework.core.io.support.SpringFactoriesLoader;
public class ComponentFactory {
diff --git a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
index 15eb2b49c..c8b15a120 100644
--- a/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
+++ b/auth/authentication/src/main/resources/mapper/UserDOMapper.xml
@@ -1,145 +1,159 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- and ${criterion.condition}
-
-
- and ${criterion.condition} #{criterion.value}
-
-
- and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
-
-
- and ${criterion.condition}
-
- #{listItem}
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and
+ #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
-
+
+
+
+ id
+ , name, password, display_name, email
+
+
+
+ select
+
+ from s2_user
+ where id = #{id,jdbcType=BIGINT}
+
+
+ delete
+ from s2_user
+ where id = #{id,jdbcType=BIGINT}
+
+
+ insert into s2_user (id, name, password,
+ display_name, email)
+ values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
+ #{displayName,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR})
+
+
+ insert into s2_user
+
+
+ id,
+
+
+ name,
+
+
+ password,
+
+
+ display_name,
+
+
+ email,
+
+
+
+
+ #{id,jdbcType=BIGINT},
+
+
+ #{name,jdbcType=VARCHAR},
+
+
+ #{password,jdbcType=VARCHAR},
+
+
+ #{displayName,jdbcType=VARCHAR},
+
+
+ #{email,jdbcType=VARCHAR},
+
+
+
+
+ select count(*) from s2_user
+
+
+
+
+
+ update s2_user
+
+
+ name = #{name,jdbcType=VARCHAR},
+
+
+ password = #{password,jdbcType=VARCHAR},
+
+
+ display_name = #{displayName,jdbcType=VARCHAR},
+
+
+ email = #{email,jdbcType=VARCHAR},
+
+
+ where id = #{id,jdbcType=BIGINT}
+
+
+ update s2_user
+ set name = #{name,jdbcType=VARCHAR},
+ password = #{password,jdbcType=VARCHAR},
+ display_name = #{displayName,jdbcType=VARCHAR},
+ email = #{email,jdbcType=VARCHAR}
+ where id = #{id,jdbcType=BIGINT}
+
\ No newline at end of file
diff --git a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java
index 878c7cfd4..5645a8077 100644
--- a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java
+++ b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/application/AuthServiceImpl.java
@@ -3,25 +3,27 @@ package com.tencent.supersonic.auth.authorization.application;
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.tencent.supersonic.auth.api.authentication.service.UserService;
+import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
import com.tencent.supersonic.auth.api.authorization.pojo.AuthRes;
import com.tencent.supersonic.auth.api.authorization.pojo.AuthResGrp;
+import com.tencent.supersonic.auth.api.authorization.pojo.AuthRule;
import com.tencent.supersonic.auth.api.authorization.pojo.DimensionFilter;
import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq;
import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp;
import com.tencent.supersonic.auth.api.authorization.service.AuthService;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
-
-import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
-import com.tencent.supersonic.auth.api.authorization.pojo.AuthRule;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
-import java.util.*;
-import java.util.stream.Collectors;
-
@Service
@Slf4j
public class AuthServiceImpl implements AuthService {
@@ -31,7 +33,7 @@ public class AuthServiceImpl implements AuthService {
private UserService userService;
public AuthServiceImpl(JdbcTemplate jdbcTemplate,
- UserService userService) {
+ UserService userService) {
this.jdbcTemplate = jdbcTemplate;
this.userService = userService;
}
@@ -43,10 +45,10 @@ public class AuthServiceImpl implements AuthService {
}
@Override
- public List queryAuthGroups(String domainId, Integer groupId) {
+ public List queryAuthGroups(String modelId, Integer groupId) {
return load().stream()
.filter(group -> (Objects.isNull(groupId) || groupId.equals(group.getGroupId()))
- && domainId.equals(group.getDomainId()))
+ && modelId.equals(group.getModelId()))
.collect(Collectors.toList());
}
@@ -83,16 +85,16 @@ public class AuthServiceImpl implements AuthService {
}
List groups = getAuthGroups(req);
AuthorizedResourceResp resource = new AuthorizedResourceResp();
- Map> authGroupsByDomainId = groups.stream()
- .collect(Collectors.groupingBy(AuthGroup::getDomainId));
+ Map> authGroupsByModelId = groups.stream()
+ .collect(Collectors.groupingBy(AuthGroup::getModelId));
Map> reqAuthRes = req.getResources().stream()
- .collect(Collectors.groupingBy(AuthRes::getDomainId));
+ .collect(Collectors.groupingBy(AuthRes::getModelId));
- for (String domainId : reqAuthRes.keySet()) {
- List reqResourcesList = reqAuthRes.get(domainId);
+ for (String modelId : reqAuthRes.keySet()) {
+ List reqResourcesList = reqAuthRes.get(modelId);
AuthResGrp rg = new AuthResGrp();
- if (authGroupsByDomainId.containsKey(domainId)) {
- List authGroups = authGroupsByDomainId.get(domainId);
+ if (authGroupsByModelId.containsKey(modelId)) {
+ List authGroups = authGroupsByModelId.get(modelId);
for (AuthRes reqRes : reqResourcesList) {
for (AuthGroup authRuleGroup : authGroups) {
List authRules = authRuleGroup.getAuthRules();
@@ -111,8 +113,8 @@ public class AuthServiceImpl implements AuthService {
}
}
- if (StringUtils.isNotEmpty(req.getDomainId())) {
- List authGroups = authGroupsByDomainId.get(req.getDomainId());
+ if (StringUtils.isNotEmpty(req.getModelId())) {
+ List authGroups = authGroupsByModelId.get(req.getModelId());
if (!CollectionUtils.isEmpty(authGroups)) {
for (AuthGroup group : authGroups) {
if (group.getDimensionFilters() != null
@@ -131,7 +133,7 @@ public class AuthServiceImpl implements AuthService {
private List getAuthGroups(QueryAuthResReq req) {
List groups = load().stream()
.filter(group -> {
- if (!Objects.equals(group.getDomainId(), req.getDomainId())) {
+ if (!Objects.equals(group.getModelId(), req.getModelId())) {
return false;
}
if (!CollectionUtils.isEmpty(group.getAuthorizedUsers()) && group.getAuthorizedUsers()
diff --git a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java
index 780f5bbc3..bede33b4c 100644
--- a/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java
+++ b/auth/authorization/src/main/java/com/tencent/supersonic/auth/authorization/rest/AuthController.java
@@ -1,9 +1,9 @@
package com.tencent.supersonic.auth.authorization.rest;
+import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq;
import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp;
import com.tencent.supersonic.auth.api.authorization.service.AuthService;
-import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
@@ -26,9 +26,9 @@ public class AuthController {
}
@GetMapping("/queryGroup")
- public List queryAuthGroup(@RequestParam("domainId") String domainId,
+ public List queryAuthGroup(@RequestParam("modelId") String modelId,
@RequestParam(value = "groupId", required = false) Integer groupId) {
- return authService.queryAuthGroups(domainId, groupId);
+ return authService.queryAuthGroups(modelId, groupId);
}
/**
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java
index 011a7d244..4fc92178d 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/component/SemanticLayer.java
@@ -2,17 +2,18 @@ package com.tencent.supersonic.chat.api.component;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
-import com.tencent.supersonic.chat.api.pojo.DomainSchema;
+import com.tencent.supersonic.chat.api.pojo.ModelSchema;
+import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.semantic.api.model.request.PageDimensionReq;
import com.tencent.supersonic.semantic.api.model.request.PageMetricReq;
import com.tencent.supersonic.semantic.api.model.response.DimensionResp;
import com.tencent.supersonic.semantic.api.model.response.DomainResp;
-import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.semantic.api.model.response.MetricResp;
+import com.tencent.supersonic.semantic.api.model.response.ModelResp;
+import com.tencent.supersonic.semantic.api.model.response.QueryResultWithSchemaResp;
import com.tencent.supersonic.semantic.api.query.request.QueryDslReq;
import com.tencent.supersonic.semantic.api.query.request.QueryMultiStructReq;
import com.tencent.supersonic.semantic.api.query.request.QueryStructReq;
-
import java.util.List;
/**
@@ -30,16 +31,22 @@ import java.util.List;
public interface SemanticLayer {
QueryResultWithSchemaResp queryByStruct(QueryStructReq queryStructReq, User user);
+
QueryResultWithSchemaResp queryByMultiStruct(QueryMultiStructReq queryMultiStructReq, User user);
+
QueryResultWithSchemaResp queryByDsl(QueryDslReq queryDslReq, User user);
- List getDomainSchema();
- List getDomainSchema(List ids);
- DomainSchema getDomainSchema(Long domain, Boolean cacheEnable);
+ List getModelSchema();
+
+ List getModelSchema(List ids);
+
+ ModelSchema getModelSchema(Long model, Boolean cacheEnable);
+
PageInfo getDimensionPage(PageDimensionReq pageDimensionCmd);
+
PageInfo getMetricPage(PageMetricReq pageMetricCmd);
- List getDomainListForViewer();
- List getDomainListForAdmin();
+ List getDomainList(User user);
+ List getModelList(AuthType authType, Long domainId, User user);
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java
similarity index 90%
rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java
rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java
index 83a1368d3..c190561a8 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/DomainSchema.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/ModelSchema.java
@@ -1,15 +1,14 @@
package com.tencent.supersonic.chat.api.pojo;
-import lombok.Data;
-
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
+import lombok.Data;
@Data
-public class DomainSchema {
+public class ModelSchema {
- private SchemaElement domain;
+ private SchemaElement model;
private Set metrics = new HashSet<>();
private Set dimensions = new HashSet<>();
private Set dimensionValues = new HashSet<>();
@@ -22,8 +21,8 @@ public class DomainSchema {
case ENTITY:
element = Optional.ofNullable(entity);
break;
- case DOMAIN:
- element = Optional.of(domain);
+ case MODEL:
+ element = Optional.of(model);
break;
case METRIC:
element = metrics.stream().filter(e -> e.getId() == elementID).findFirst();
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java
index 244468b9b..a5d77e553 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/QueryContext.java
@@ -2,12 +2,13 @@ package com.tencent.supersonic.chat.api.pojo;
import com.tencent.supersonic.chat.api.component.SemanticQuery;
import com.tencent.supersonic.chat.api.pojo.request.QueryReq;
-import lombok.Data;
-
import java.util.ArrayList;
import java.util.List;
+import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
+@NoArgsConstructor
public class QueryContext {
private QueryReq request;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java
index 6390545fd..d583fe30b 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElement.java
@@ -1,11 +1,12 @@
package com.tencent.supersonic.chat.api.pojo;
import com.google.common.base.Objects;
-
import java.io.Serializable;
import java.util.List;
-
-import lombok.*;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
@Data
@Getter
@@ -14,7 +15,7 @@ import lombok.*;
//@AllArgsConstructor
public class SchemaElement implements Serializable {
- private Long domain;
+ private Long model;
private Long id;
private String name;
private String bizName;
@@ -25,9 +26,9 @@ public class SchemaElement implements Serializable {
// public SchemaElement() {
// }
- public SchemaElement(Long domain, Long id, String name, String bizName,
- Long useCnt, SchemaElementType type, List alias) {
- this.domain = domain;
+ public SchemaElement(Long model, Long id, String name, String bizName,
+ Long useCnt, SchemaElementType type, List alias) {
+ this.model = model;
this.id = id;
this.name = name;
this.bizName = bizName;
@@ -45,7 +46,7 @@ public class SchemaElement implements Serializable {
return false;
}
SchemaElement schemaElement = (SchemaElement) o;
- return Objects.equal(domain, schemaElement.domain) && Objects.equal(id,
+ return Objects.equal(model, schemaElement.model) && Objects.equal(id,
schemaElement.id) && Objects.equal(name, schemaElement.name)
&& Objects.equal(bizName, schemaElement.bizName) && Objects.equal(
useCnt, schemaElement.useCnt) && Objects.equal(type, schemaElement.type);
@@ -53,6 +54,6 @@ public class SchemaElement implements Serializable {
@Override
public int hashCode() {
- return Objects.hashCode(domain, id, name, bizName, useCnt, type);
+ return Objects.hashCode(model, id, name, bizName, useCnt, type);
}
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java
index e958e24e4..0062988e3 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementMatch.java
@@ -18,10 +18,6 @@ public class SchemaElementMatch {
String detectWord;
String word;
Long frequency;
- MatchMode mode = MatchMode.CURRENT;
+ boolean isInherited;
- public enum MatchMode {
- CURRENT,
- INHERIT
- }
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java
index 718b2fc03..9eaf598b3 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaElementType.java
@@ -1,7 +1,7 @@
package com.tencent.supersonic.chat.api.pojo;
public enum SchemaElementType {
- DOMAIN,
+ MODEL,
METRIC,
DIMENSION,
VALUE,
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java
index 588d93f02..99bfd0714 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SchemaMapInfo.java
@@ -7,21 +7,21 @@ import java.util.Set;
public class SchemaMapInfo {
- private Map> domainElementMatches = new HashMap<>();
+ private Map> modelElementMatches = new HashMap<>();
- public Set getMatchedDomains() {
- return domainElementMatches.keySet();
+ public Set getMatchedModels() {
+ return modelElementMatches.keySet();
}
- public List getMatchedElements(Long domain) {
- return domainElementMatches.get(domain);
+ public List getMatchedElements(Long model) {
+ return modelElementMatches.get(model);
}
- public Map> getDomainElementMatches() {
- return domainElementMatches;
+ public Map> getModelElementMatches() {
+ return modelElementMatches;
}
- public void setMatchedElements(Long domain, List elementMatches) {
- domainElementMatches.put(domain, elementMatches);
+ public void setMatchedElements(Long model, List elementMatches) {
+ modelElementMatches.put(model, elementMatches);
}
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java
index 797800d5f..d11ae10d1 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticParseInfo.java
@@ -1,19 +1,25 @@
package com.tencent.supersonic.chat.api.pojo;
-import java.util.*;
-
import com.tencent.supersonic.chat.api.pojo.request.QueryFilter;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.Order;
import com.tencent.supersonic.common.pojo.enums.AggregateTypeEnum;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
import lombok.Data;
@Data
public class SemanticParseInfo {
private String queryMode;
- private SchemaElement domain;
+ private SchemaElement model;
private Set metrics = new TreeSet<>(new SchemaNameLengthComparator());
private Set dimensions = new LinkedHashSet();
private SchemaElement entity;
@@ -28,15 +34,16 @@ public class SemanticParseInfo {
private List elementMatches = new ArrayList<>();
private Map properties = new HashMap<>();
- public Long getDomainId() {
- return domain != null ? domain.getId() : 0L;
+ public Long getModelId() {
+ return model != null ? model.getId() : 0L;
}
- public String getDomainName() {
- return domain != null ? domain.getName() : "null";
+ public String getModelName() {
+ return model != null ? model.getName() : "null";
}
private static class SchemaNameLengthComparator implements Comparator {
+
@Override
public int compare(SchemaElement o1, SchemaElement o2) {
int len1 = o1.getName().length();
@@ -49,4 +56,11 @@ public class SemanticParseInfo {
}
}
+ public Set getMetrics() {
+ Set metricSet = new TreeSet<>(new SchemaNameLengthComparator());
+ metricSet.addAll(metrics);
+ metrics = metricSet;
+ return metrics;
+ }
+
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java
index 6c9e86d44..ed91180a0 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/SemanticSchema.java
@@ -7,48 +7,49 @@ import java.util.Map;
import java.util.stream.Collectors;
public class SemanticSchema implements Serializable {
- private List domainSchemaList;
- public SemanticSchema(List domainSchemaList) {
- this.domainSchemaList = domainSchemaList;
+ private List modelSchemaList;
+
+ public SemanticSchema(List modelSchemaList) {
+ this.modelSchemaList = modelSchemaList;
}
- public void add(DomainSchema schema) {
- domainSchemaList.add(schema);
+ public void add(ModelSchema schema) {
+ modelSchemaList.add(schema);
}
- public Map getDomainIdToName() {
- return domainSchemaList.stream()
- .collect(Collectors.toMap(a -> a.getDomain().getId(), a -> a.getDomain().getName(), (k1, k2) -> k1));
+ public Map getModelIdToName() {
+ return modelSchemaList.stream()
+ .collect(Collectors.toMap(a -> a.getModel().getId(), a -> a.getModel().getName(), (k1, k2) -> k1));
}
public List getDimensionValues() {
List dimensionValues = new ArrayList<>();
- domainSchemaList.stream().forEach(d -> dimensionValues.addAll(d.getDimensionValues()));
+ modelSchemaList.stream().forEach(d -> dimensionValues.addAll(d.getDimensionValues()));
return dimensionValues;
}
public List getDimensions() {
List dimensions = new ArrayList<>();
- domainSchemaList.stream().forEach(d -> dimensions.addAll(d.getDimensions()));
+ modelSchemaList.stream().forEach(d -> dimensions.addAll(d.getDimensions()));
return dimensions;
}
public List getMetrics() {
List metrics = new ArrayList<>();
- domainSchemaList.stream().forEach(d -> metrics.addAll(d.getMetrics()));
+ modelSchemaList.stream().forEach(d -> metrics.addAll(d.getMetrics()));
return metrics;
}
- public List getDomains() {
- List domains = new ArrayList<>();
- domainSchemaList.stream().forEach(d -> domains.add(d.getDomain()));
- return domains;
+ public List getModels() {
+ List models = new ArrayList<>();
+ modelSchemaList.stream().forEach(d -> models.add(d.getModel()));
+ return models;
}
public List getEntities() {
List entities = new ArrayList<>();
- domainSchemaList.stream().forEach(d -> entities.add(d.getEntity()));
+ modelSchemaList.stream().forEach(d -> entities.add(d.getEntity()));
return entities;
}
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java
index 56d83c326..fea0f2e05 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatAggConfigReq.java
@@ -1,8 +1,7 @@
package com.tencent.supersonic.chat.api.pojo.request;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class ChatAggConfigReq {
@@ -13,7 +12,7 @@ public class ChatAggConfigReq {
private ItemVisibility visibility;
/**
- * information about dictionary about the domain
+ * information about dictionary about the model
*/
private List knowledgeInfos;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java
index b1b64d647..b5453d036 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigBaseReq.java
@@ -1,34 +1,32 @@
package com.tencent.supersonic.chat.api.pojo.request;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
-
+import java.util.List;
import lombok.Data;
import lombok.ToString;
-import java.util.List;
-
/**
- * extended information command about domain
+ * extended information command about model
*/
@Data
@ToString
public class ChatConfigBaseReq {
- private Long domainId;
+ private Long modelId;
/**
- * the chatDetailConfig about the domain
+ * the chatDetailConfig about the model
*/
private ChatDetailConfigReq chatDetailConfig;
/**
- * the chatAggConfig about the domain
+ * the chatAggConfig about the model
*/
private ChatAggConfigReq chatAggConfig;
/**
- * the recommended questions about the domain
+ * the recommended questions about the model
*/
private List recommendedQuestions;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java
index 61cbdfe2c..cc9095bdf 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatConfigFilter.java
@@ -10,6 +10,6 @@ import lombok.NoArgsConstructor;
public class ChatConfigFilter {
private Long id;
- private Long domainId;
+ private Long modelId;
private StatusEnum status = StatusEnum.ONLINE;
}
\ No newline at end of file
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java
index 33ca4889c..eb46d8948 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDefaultConfigReq.java
@@ -2,10 +2,9 @@ package com.tencent.supersonic.chat.api.pojo.request;
import com.tencent.supersonic.common.pojo.Constants;
-import lombok.Data;
-
import java.util.ArrayList;
import java.util.List;
+import lombok.Data;
@Data
public class ChatDefaultConfigReq {
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java
index 6d3468c7f..dae93c376 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatDetailConfigReq.java
@@ -1,8 +1,7 @@
package com.tencent.supersonic.chat.api.pojo.request;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class ChatDetailConfigReq {
@@ -13,7 +12,7 @@ public class ChatDetailConfigReq {
private ItemVisibility visibility;
/**
- * information about dictionary about the domain
+ * information about dictionary about the model
*/
private List knowledgeInfos;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java
index 373b3cc11..6848e1dd2 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/Entity.java
@@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
import lombok.ToString;
/**
- * the entity info about the domain
+ * the entity info about the model
*/
@Data
@AllArgsConstructor
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java
index b1f4d6013..51ce237a2 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ExecuteQueryReq.java
@@ -7,6 +7,7 @@ import lombok.Data;
@Data
public class ExecuteQueryReq {
+
private User user;
private Integer chatId;
private String queryText;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java
index 3c5d8d501..d7644a269 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeAdvancedConfig.java
@@ -1,9 +1,8 @@
package com.tencent.supersonic.chat.api.pojo.request;
-import lombok.Data;
-
import java.util.ArrayList;
import java.util.List;
+import lombok.Data;
/**
* advanced knowledge config
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java
index 0ec5707db..1ef5adc2c 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/KnowledgeInfoReq.java
@@ -1,20 +1,18 @@
package com.tencent.supersonic.chat.api.pojo.request;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
-
import javax.validation.constraints.NotNull;
-
import lombok.Data;
/**
- * information about dictionary about the domain
+ * information about dictionary about the model
*/
@Data
public class KnowledgeInfoReq {
/**
- * metricId、DimensionId、domainId
+ * metricId、DimensionId、modelId
*/
private Long itemId;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java
index 14939bc63..72b31244a 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/PluginQueryReq.java
@@ -13,7 +13,7 @@ public class PluginQueryReq {
private String type;
- private String domain;
+ private String model;
private String pattern;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java
index 1dbaa4137..e2dd67e03 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryDataReq.java
@@ -1,18 +1,18 @@
package com.tencent.supersonic.chat.api.pojo.request;
-import java.util.HashSet;
-import java.util.Set;
-
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.common.pojo.DateConf;
import com.tencent.supersonic.common.pojo.Order;
+import java.util.HashSet;
+import java.util.Set;
import lombok.Data;
@Data
public class QueryDataReq {
+
String queryMode;
- SchemaElement domain;
+ SchemaElement model;
Set metrics = new HashSet<>();
Set dimensions = new HashSet<>();
Set dimensionFilters = new HashSet<>();
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java
index 903288cd1..a5f06518a 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryFilters.java
@@ -1,13 +1,14 @@
package com.tencent.supersonic.chat.api.pojo.request;
-import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import lombok.Data;
@Data
public class QueryFilters {
+
private List filters = new ArrayList<>();
private Map params = new HashMap<>();
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java
index 0e8c686ad..82f28358b 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/QueryReq.java
@@ -5,9 +5,10 @@ import lombok.Data;
@Data
public class QueryReq {
+
private String queryText;
private Integer chatId;
- private Long domainId = 0L;
+ private Long modelId = 0L;
private User user;
private QueryFilters queryFilters;
private boolean saveAnswer = true;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java
index 96cb05e13..57acac1f6 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/AggregateInfo.java
@@ -6,5 +6,6 @@ import lombok.Data;
@Data
public class AggregateInfo {
- private List metricInfos = new ArrayList<>();
+
+ private List metricInfos = new ArrayList<>();
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java
index b69a16f3c..dc6b80cdc 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatAggRichConfigResp.java
@@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.request.KnowledgeAdvancedConfig;
import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class ChatAggRichConfigResp {
@@ -15,7 +14,7 @@ public class ChatAggRichConfigResp {
private ItemVisibilityInfo visibility;
/**
- * information about dictionary about the domain
+ * information about dictionary about the model
*/
private List knowledgeInfos;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java
index c32efdd1b..6a23e65ba 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigResp.java
@@ -4,10 +4,8 @@ import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
-
import java.util.Date;
import java.util.List;
-
import lombok.Data;
@Data
@@ -15,7 +13,7 @@ public class ChatConfigResp {
private Long id;
- private Long domainId;
+ private Long modelId;
private ChatDetailConfigReq chatDetailConfig;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java
index e6f8e75a3..c75ffebca 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatConfigRichResp.java
@@ -4,7 +4,6 @@ import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import java.util.Date;
import java.util.List;
-
import lombok.Data;
@Data
@@ -12,9 +11,9 @@ public class ChatConfigRichResp {
private Long id;
- private Long domainId;
+ private Long modelId;
- private String domainName;
+ private String modelName;
private String bizName;
private ChatAggRichConfigResp chatAggRichConfig;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java
index 6ef966681..c0c3f8544 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDefaultRichConfigResp.java
@@ -4,9 +4,8 @@ package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.request.ChatDefaultConfigReq;
import com.tencent.supersonic.common.pojo.Constants;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class ChatDefaultRichConfigResp {
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java
index a3dbd60d8..734891766 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ChatDetailRichConfigResp.java
@@ -2,9 +2,8 @@ package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.request.KnowledgeAdvancedConfig;
import com.tencent.supersonic.chat.api.pojo.request.KnowledgeInfoReq;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class ChatDetailRichConfigResp {
@@ -15,7 +14,7 @@ public class ChatDetailRichConfigResp {
private ItemVisibilityInfo visibility;
/**
- * information about dictionary about the domain
+ * information about dictionary about the model
*/
private List knowledgeInfos;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java
index 0f0039380..f7e606469 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityInfo.java
@@ -7,7 +7,7 @@ import lombok.Data;
@Data
public class EntityInfo {
- private DomainInfo domainInfo = new DomainInfo();
+ private ModelInfo modelInfo = new ModelInfo();
private List dimensions = new ArrayList<>();
private List metrics = new ArrayList<>();
private String entityId;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java
index a8610fed1..655ad5519 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/EntityRichInfoResp.java
@@ -1,14 +1,14 @@
package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
-
import java.util.List;
import lombok.Data;
@Data
public class EntityRichInfoResp {
+
/**
- * entity alias
+ * entity alias
*/
private List names;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java
similarity index 75%
rename from chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java
rename to chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java
index 2be895e86..4600ca74b 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/DomainInfo.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ModelInfo.java
@@ -5,7 +5,7 @@ import java.util.List;
import lombok.Data;
@Data
-public class DomainInfo extends DataInfo implements Serializable {
+public class ModelInfo extends DataInfo implements Serializable {
private List words;
private String primaryEntityBizName;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java
index 6fd7f33e2..e096199cc 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/ParseResp.java
@@ -1,9 +1,12 @@
package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
-import lombok.*;
-
import java.util.List;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
@Data
@Getter
@@ -11,6 +14,7 @@ import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
public class ParseResp {
+
private Integer chatId;
private String queryText;
private ParseState state;
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java
index 62d106faf..e4b24088b 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendQuestionResp.java
@@ -1,14 +1,14 @@
package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq;
+import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
-import java.util.List;
-
@Data
@AllArgsConstructor
public class RecommendQuestionResp {
- private Long domainId;
+
+ private Long modelId;
private List recommendedQuestions;
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java
index 8490ab549..cbc794ef7 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/RecommendResp.java
@@ -1,12 +1,12 @@
package com.tencent.supersonic.chat.api.pojo.response;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class RecommendResp {
+
private List dimensions;
private List metrics;
}
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java
index 7cf443bd7..72abbed20 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResp.java
@@ -2,8 +2,6 @@ package com.tencent.supersonic.chat.api.pojo.response;
import java.util.List;
import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
@Data
public class SearchResp {
diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java
index 3c0c6a7a1..e2426cfbb 100644
--- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java
+++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/response/SearchResult.java
@@ -17,9 +17,9 @@ public class SearchResult {
private String subRecommend;
- private String domainName;
+ private String modelName;
- private Long domainId;
+ private Long modelId;
private SchemaElementType schemaElementType;
@@ -34,12 +34,12 @@ public class SearchResult {
return false;
}
SearchResult searchResult1 = (SearchResult) o;
- return Objects.equals(recommend, searchResult1.recommend) && Objects.equals(domainName,
- searchResult1.domainName);
+ return Objects.equals(recommend, searchResult1.recommend) && Objects.equals(modelName,
+ searchResult1.modelName);
}
@Override
public int hashCode() {
- return Objects.hash(recommend, domainName);
+ return Objects.hash(recommend, modelName);
}
}
diff --git a/chat/core/pom.xml b/chat/core/pom.xml
index 860369e16..2e9314c4a 100644
--- a/chat/core/pom.xml
+++ b/chat/core/pom.xml
@@ -1,7 +1,7 @@
+ 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">
chat
com.tencent.supersonic
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java
index 934b0ae21..3fabb66e1 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/AggregatorConfig.java
@@ -3,11 +3,13 @@ package com.tencent.supersonic.chat.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
+
@Configuration
@Data
public class AggregatorConfig {
- @Value("${metric.aggregator.ratio.enable:true}")
- private Boolean enableRatio;
+
+ @Value("${metric.aggregator.ratio.enable:true}")
+ private Boolean enableRatio;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java
index ecffde18b..cefb8ddab 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfig.java
@@ -3,13 +3,12 @@ package com.tencent.supersonic.chat.config;
import com.tencent.supersonic.chat.api.pojo.request.ChatAggConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatDetailConfigReq;
import com.tencent.supersonic.chat.api.pojo.request.RecommendedQuestionReq;
-import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.pojo.RecordInfo;
+import com.tencent.supersonic.common.pojo.enums.StatusEnum;
+import java.util.List;
import lombok.Data;
import lombok.ToString;
-import java.util.List;
-
@Data
@ToString
public class ChatConfig {
@@ -19,15 +18,15 @@ public class ChatConfig {
*/
private Long id;
- private Long domainId;
+ private Long modelId;
/**
- * the chatDetailConfig about the domain
+ * the chatDetailConfig about the model
*/
private ChatDetailConfigReq chatDetailConfig;
/**
- * the chatAggConfig about the domain
+ * the chatAggConfig about the model
*/
private ChatAggConfigReq chatAggConfig;
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java
index d6c634ca5..e298ae14b 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/ChatConfigFilterInternal.java
@@ -6,6 +6,6 @@ import lombok.Data;
public class ChatConfigFilterInternal {
private Long id;
- private Long domainId;
+ private Long modelId;
private Integer status;
}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java
index 227f3f679..df5d71b84 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/DefaultMetricInfo.java
@@ -6,7 +6,7 @@ import lombok.ToString;
/**
- * default metrics about the domain
+ * default metrics about the model
*/
@ToString
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/config/FunctionCallInfoConfig.java
index ec23773bd..de2a1e490 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/config/FunctionCallInfoConfig.java
@@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class FunctionCallInfoConfig {
+
@Value("${functionCall.url:}")
private String url;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java
deleted file mode 100644
index f65f29bef..000000000
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainInfoStat.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.tencent.supersonic.chat.mapper;
-
-import java.io.Serializable;
-import lombok.Builder;
-import lombok.Data;
-import lombok.ToString;
-
-@Data
-@ToString
-@Builder
-public class DomainInfoStat implements Serializable {
-
- private long domainCount;
-
- private long metricDomainCount;
-
- private long dimensionDomainCount;
-
- private long dimensionValueDomainCount;
-
-}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java
index 6ae9ceeba..388b76212 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/EntityMapper.java
@@ -2,14 +2,19 @@ package com.tencent.supersonic.chat.mapper;
import com.tencent.supersonic.chat.api.component.SchemaMapper;
-import com.tencent.supersonic.chat.api.pojo.*;
+import com.tencent.supersonic.chat.api.pojo.ModelSchema;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SchemaElement;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
import com.tencent.supersonic.chat.service.SemanticService;
import com.tencent.supersonic.common.util.ContextUtils;
+import java.util.List;
+import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
-import java.util.List;
-import java.util.stream.Collectors;
@Slf4j
@@ -18,20 +23,20 @@ public class EntityMapper implements SchemaMapper {
@Override
public void map(QueryContext queryContext) {
SchemaMapInfo schemaMapInfo = queryContext.getMapInfo();
- for (Long domainId : schemaMapInfo.getMatchedDomains()) {
- List schemaElementMatchList = schemaMapInfo.getMatchedElements(domainId);
+ for (Long modelId : schemaMapInfo.getMatchedModels()) {
+ List schemaElementMatchList = schemaMapInfo.getMatchedElements(modelId);
if (CollectionUtils.isEmpty(schemaElementMatchList)) {
continue;
}
- SchemaElement entity = getEntity(domainId);
+ SchemaElement entity = getEntity(modelId);
if (entity == null || entity.getId() == null) {
continue;
}
List valueSchemaElements = schemaElementMatchList.stream().filter(schemaElementMatch ->
- SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()))
+ SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()))
.collect(Collectors.toList());
for (SchemaElementMatch schemaElementMatch : valueSchemaElements) {
- if (!entity.getId().equals(schemaElementMatch.getElement().getId())){
+ if (!entity.getId().equals(schemaElementMatch.getElement().getId())) {
continue;
}
if (!checkExistSameEntitySchemaElements(schemaElementMatch, schemaElementMatchList)) {
@@ -46,7 +51,7 @@ public class EntityMapper implements SchemaMapper {
}
private boolean checkExistSameEntitySchemaElements(SchemaElementMatch valueSchemaElementMatch,
- List schemaElementMatchList) {
+ List schemaElementMatchList) {
List entitySchemaElements = schemaElementMatchList.stream().filter(schemaElementMatch ->
SchemaElementType.ENTITY.equals(schemaElementMatch.getElement().getType()))
.collect(Collectors.toList());
@@ -58,11 +63,11 @@ public class EntityMapper implements SchemaMapper {
return false;
}
- private SchemaElement getEntity(Long domainId) {
+ private SchemaElement getEntity(Long modelId) {
SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
- DomainSchema domainSchema = semanticService.getDomainSchema(domainId);
- if (domainSchema != null && domainSchema.getEntity() != null) {
- return domainSchema.getEntity();
+ ModelSchema modelSchema = semanticService.getModelSchema(modelId);
+ if (modelSchema != null && modelSchema.getEntity() != null) {
+ return modelSchema.getEntity();
}
return null;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java
index 470f43236..0dc646005 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/FuzzyNameMapper.java
@@ -2,10 +2,14 @@ package com.tencent.supersonic.chat.mapper;
import com.hankcs.hanlp.seg.common.Term;
import com.tencent.supersonic.chat.api.component.SchemaMapper;
-import com.tencent.supersonic.chat.api.pojo.*;
import com.tencent.supersonic.chat.api.pojo.QueryContext;
-import com.tencent.supersonic.knowledge.service.SchemaService;
+import com.tencent.supersonic.chat.api.pojo.SchemaElement;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
+import com.tencent.supersonic.chat.api.pojo.SemanticSchema;
import com.tencent.supersonic.common.util.ContextUtils;
+import com.tencent.supersonic.knowledge.service.SchemaService;
import com.tencent.supersonic.knowledge.utils.HanlpHelper;
import java.util.ArrayList;
import java.util.Comparator;
@@ -39,13 +43,13 @@ public class FuzzyNameMapper implements SchemaMapper {
log.debug("after db mapper,mapInfo:{}", queryContext.getMapInfo());
}
- private void detectAndAddToSchema(QueryContext queryContext, List terms, List domains,
- SchemaElementType schemaElementType) {
+ private void detectAndAddToSchema(QueryContext queryContext, List terms, List Models,
+ SchemaElementType schemaElementType) {
try {
- Map> domainResultSet = getResultSet(queryContext, terms, domains);
+ Map> ModelResultSet = getResultSet(queryContext, terms, Models);
- addToSchemaMapInfo(domainResultSet, queryContext.getMapInfo(), schemaElementType);
+ addToSchemaMapInfo(ModelResultSet, queryContext.getMapInfo(), schemaElementType);
} catch (Exception e) {
log.error("detectAndAddToSchema error", e);
@@ -53,7 +57,7 @@ public class FuzzyNameMapper implements SchemaMapper {
}
private Map> getResultSet(QueryContext queryContext, List terms,
- List domains) {
+ List Models) {
String queryText = queryContext.getRequest().getQueryText();
@@ -61,12 +65,12 @@ public class FuzzyNameMapper implements SchemaMapper {
Double metricDimensionThresholdConfig = getThreshold(queryContext, mapperHelper);
- Map> nameToItems = getNameToItems(domains);
+ Map> nameToItems = getNameToItems(Models);
Map regOffsetToLength = terms.stream().sorted(Comparator.comparing(Term::length))
.collect(Collectors.toMap(Term::getOffset, term -> term.word.length(), (value1, value2) -> value2));
- Map> domainResultSet = new HashMap<>();
+ Map> ModelResultSet = new HashMap<>();
for (Integer startIndex = 0; startIndex <= queryText.length() - 1; ) {
for (Integer endIndex = startIndex; endIndex <= queryText.length(); ) {
endIndex = mapperHelper.getStepIndex(regOffsetToLength, endIndex);
@@ -82,7 +86,7 @@ public class FuzzyNameMapper implements SchemaMapper {
|| mapperHelper.getSimilarity(detectSegment, name) < metricDimensionThresholdConfig) {
continue;
}
- Set preSchemaElements = domainResultSet.putIfAbsent(detectSegment,
+ Set preSchemaElements = ModelResultSet.putIfAbsent(detectSegment,
schemaElements);
if (Objects.nonNull(preSchemaElements)) {
preSchemaElements.addAll(schemaElements);
@@ -91,7 +95,7 @@ public class FuzzyNameMapper implements SchemaMapper {
}
startIndex = mapperHelper.getStepIndex(regOffsetToLength, startIndex);
}
- return domainResultSet;
+ return ModelResultSet;
}
private Double getThreshold(QueryContext queryContext, MapperHelper mapperHelper) {
@@ -99,9 +103,9 @@ public class FuzzyNameMapper implements SchemaMapper {
Double metricDimensionThresholdConfig = mapperHelper.getMetricDimensionThresholdConfig();
Double metricDimensionMinThresholdConfig = mapperHelper.getMetricDimensionMinThresholdConfig();
- Map> domainElementMatches = queryContext.getMapInfo()
- .getDomainElementMatches();
- boolean existElement = domainElementMatches.entrySet().stream()
+ Map> ModelElementMatches = queryContext.getMapInfo()
+ .getModelElementMatches();
+ boolean existElement = ModelElementMatches.entrySet().stream()
.anyMatch(entry -> entry.getValue().size() >= 1);
if (!existElement) {
@@ -109,14 +113,14 @@ public class FuzzyNameMapper implements SchemaMapper {
metricDimensionThresholdConfig = halfThreshold >= metricDimensionMinThresholdConfig ? halfThreshold
: metricDimensionMinThresholdConfig;
- log.info("domainElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}",
- domainElementMatches, metricDimensionThresholdConfig);
+ log.info("ModelElementMatches:{} , not exist Element metricDimensionThresholdConfig reduce by half:{}",
+ ModelElementMatches, metricDimensionThresholdConfig);
}
return metricDimensionThresholdConfig;
}
- private Map> getNameToItems(List domains) {
- return domains.stream().collect(
+ private Map> getNameToItems(List Models) {
+ return Models.stream().collect(
Collectors.toMap(SchemaElement::getName, a -> {
Set result = new HashSet<>();
result.add(a);
@@ -139,10 +143,10 @@ public class FuzzyNameMapper implements SchemaMapper {
Set schemaElements = entry.getValue();
for (SchemaElement schemaElement : schemaElements) {
- List elements = schemaMap.getMatchedElements(schemaElement.getDomain());
+ List elements = schemaMap.getMatchedElements(schemaElement.getModel());
if (CollectionUtils.isEmpty(elements)) {
elements = new ArrayList<>();
- schemaMap.setMatchedElements(schemaElement.getDomain(), elements);
+ schemaMap.setMatchedElements(schemaElement.getModel(), elements);
}
Set regElementSet = elements.stream()
.filter(elementMatch -> schemaElementType.equals(elementMatch.getElement().getType()))
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java
index c58e177c4..063822984 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/HanlpDictMapper.java
@@ -2,13 +2,18 @@ package com.tencent.supersonic.chat.mapper;
import com.hankcs.hanlp.seg.common.Term;
import com.tencent.supersonic.chat.api.component.SchemaMapper;
-import com.tencent.supersonic.chat.api.pojo.*;
+import com.tencent.supersonic.chat.api.pojo.ModelSchema;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SchemaElement;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
import com.tencent.supersonic.chat.service.SemanticService;
import com.tencent.supersonic.chat.utils.NatureHelper;
-import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder;
-import com.tencent.supersonic.knowledge.dictionary.MapResult;
-import com.tencent.supersonic.knowledge.dictionary.DictWordType;
import com.tencent.supersonic.common.util.ContextUtils;
+import com.tencent.supersonic.knowledge.dictionary.DictWordType;
+import com.tencent.supersonic.knowledge.dictionary.MapResult;
+import com.tencent.supersonic.knowledge.dictionary.builder.BaseWordBuilder;
import com.tencent.supersonic.knowledge.dictionary.builder.WordBuilderFactory;
import com.tencent.supersonic.knowledge.utils.HanlpHelper;
import java.util.ArrayList;
@@ -32,10 +37,10 @@ public class HanlpDictMapper implements SchemaMapper {
for (Term term : terms) {
log.info("word:{},nature:{},frequency:{}", term.word, term.nature.toString(), term.getFrequency());
}
- Long domainId = queryContext.getRequest().getDomainId();
+ Long modelId = queryContext.getRequest().getModelId();
QueryMatchStrategy matchStrategy = ContextUtils.getBean(QueryMatchStrategy.class);
- Map> matchResult = matchStrategy.match(queryText, terms, domainId);
+ Map> matchResult = matchStrategy.match(queryText, terms, modelId);
List matches = getMatches(matchResult);
@@ -57,8 +62,8 @@ public class HanlpDictMapper implements SchemaMapper {
for (MapResult mapResult : mapResults) {
for (String nature : mapResult.getNatures()) {
- Long domainId = NatureHelper.getDomainId(nature);
- if (Objects.isNull(domainId)) {
+ Long modelId = NatureHelper.getModelId(nature);
+ if (Objects.isNull(modelId)) {
continue;
}
SchemaElementType elementType = NatureHelper.convertToElementType(nature);
@@ -67,14 +72,14 @@ public class HanlpDictMapper implements SchemaMapper {
}
SemanticService schemaService = ContextUtils.getBean(SemanticService.class);
- DomainSchema domainSchema = schemaService.getDomainSchema(domainId);
+ ModelSchema modelSchema = schemaService.getModelSchema(modelId);
BaseWordBuilder baseWordBuilder = WordBuilderFactory.get(DictWordType.getNatureType(nature));
Long elementID = baseWordBuilder.getElementID(nature);
Long frequency = wordNatureToFrequency.get(mapResult.getName() + nature);
- SchemaElement element = domainSchema.getElement(elementType, elementID);
- if(Objects.isNull(element)){
+ SchemaElement element = modelSchema.getElement(elementType, elementID);
+ if (Objects.isNull(element)) {
log.info("element is null, elementType:{},elementID:{}", elementType, elementID);
continue;
}
@@ -89,11 +94,11 @@ public class HanlpDictMapper implements SchemaMapper {
.detectWord(mapResult.getDetectWord())
.build();
- Map> domainElementMatches = schemaMap.getDomainElementMatches();
- List schemaElementMatches = domainElementMatches.putIfAbsent(domainId,
+ Map> modelElementMatches = schemaMap.getModelElementMatches();
+ List schemaElementMatches = modelElementMatches.putIfAbsent(modelId,
new ArrayList<>());
if (schemaElementMatches == null) {
- schemaElementMatches = domainElementMatches.get(domainId);
+ schemaElementMatches = modelElementMatches.get(modelId);
}
schemaElementMatches.add(schemaElementMatch);
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java
index 7fc691404..0a3787153 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MapperHelper.java
@@ -83,4 +83,6 @@ public class MapperHelper {
return 1 - (double) EditDistance.compute(detectSegmentLower, matchNameLower) / Math.max(matchName.length(),
detectSegment.length());
}
+
+
}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java
index ea9db99f3..1a25a6475 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/MatchStrategy.java
@@ -2,7 +2,6 @@ package com.tencent.supersonic.chat.mapper;
import com.hankcs.hanlp.seg.common.Term;
import com.tencent.supersonic.knowledge.dictionary.MapResult;
-
import java.util.List;
import java.util.Map;
@@ -11,6 +10,6 @@ import java.util.Map;
*/
public interface MatchStrategy {
- Map> match(String text, List terms, Long detectDomainId);
+ Map> match(String text, List terms, Long detectModelId);
}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java
new file mode 100644
index 000000000..c1f249fc6
--- /dev/null
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelInfoStat.java
@@ -0,0 +1,21 @@
+package com.tencent.supersonic.chat.mapper;
+
+import java.io.Serializable;
+import lombok.Builder;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+@Builder
+public class ModelInfoStat implements Serializable {
+
+ private long modelCount;
+
+ private long metricModelCount;
+
+ private long dimensionModelCount;
+
+ private long dimensionValueModelCount;
+
+}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java
similarity index 59%
rename from chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java
rename to chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java
index 78777b937..b22c573ef 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/DomainWithSemanticType.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/ModelWithSemanticType.java
@@ -7,13 +7,13 @@ import lombok.ToString;
@Data
@ToString
-public class DomainWithSemanticType implements Serializable {
+public class ModelWithSemanticType implements Serializable {
- private Long domain;
+ private Long model;
private SchemaElementType semanticType;
- public DomainWithSemanticType(Long domain, SchemaElementType semanticType) {
- this.domain = domain;
+ public ModelWithSemanticType(Long model, SchemaElementType semanticType) {
+ this.model = model;
this.semanticType = semanticType;
}
}
\ No newline at end of file
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java
index 9134d1541..cd9e7dd31 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryFilterMapper.java
@@ -2,15 +2,20 @@ package com.tencent.supersonic.chat.mapper;
import com.google.common.collect.Lists;
import com.tencent.supersonic.chat.api.component.SchemaMapper;
-import com.tencent.supersonic.chat.api.pojo.*;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SchemaElement;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
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 lombok.extern.slf4j.Slf4j;
-import org.springframework.util.CollectionUtils;
+import com.tencent.supersonic.common.pojo.Constants;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.CollectionUtils;
@Slf4j
public class QueryFilterMapper implements SchemaMapper {
@@ -21,35 +26,35 @@ public class QueryFilterMapper implements SchemaMapper {
@Override
public void map(QueryContext queryContext) {
QueryReq queryReq = queryContext.getRequest();
- Long domainId = queryReq.getDomainId();
- if (domainId == null || domainId <= 0) {
+ Long modelId = queryReq.getModelId();
+ if (modelId == null || modelId <= 0) {
return;
}
SchemaMapInfo schemaMapInfo = queryContext.getMapInfo();
- clearOtherSchemaElementMatch(domainId, schemaMapInfo);
- List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId);
+ clearOtherSchemaElementMatch(modelId, schemaMapInfo);
+ List schemaElementMatches = schemaMapInfo.getMatchedElements(modelId);
if (schemaElementMatches == null) {
schemaElementMatches = Lists.newArrayList();
- schemaMapInfo.setMatchedElements(domainId, schemaElementMatches);
+ schemaMapInfo.setMatchedElements(modelId, schemaElementMatches);
}
addValueSchemaElementMatch(schemaElementMatches, queryReq.getQueryFilters());
}
- private void clearOtherSchemaElementMatch(Long domainId, SchemaMapInfo schemaMapInfo) {
- for (Map.Entry> entry : schemaMapInfo.getDomainElementMatches().entrySet()) {
- if (!entry.getKey().equals(domainId)) {
+ private void clearOtherSchemaElementMatch(Long modelId, SchemaMapInfo schemaMapInfo) {
+ for (Map.Entry> entry : schemaMapInfo.getModelElementMatches().entrySet()) {
+ if (!entry.getKey().equals(modelId)) {
entry.getValue().clear();
}
}
}
private List addValueSchemaElementMatch(List candidateElementMatches,
- QueryFilters queryFilter) {
+ QueryFilters queryFilter) {
if (queryFilter == null || CollectionUtils.isEmpty(queryFilter.getFilters())) {
return candidateElementMatches;
}
for (QueryFilter filter : queryFilter.getFilters()) {
- if (checkExistSameValueSchemaElementMatch(filter, candidateElementMatches)) {
+ if (checkExistSameValueSchemaElementMatch(filter, candidateElementMatches)) {
continue;
}
SchemaElement element = SchemaElement.builder()
@@ -63,7 +68,7 @@ public class QueryFilterMapper implements SchemaMapper {
.frequency(FREQUENCY)
.word(String.valueOf(filter.getValue()))
.similarity(SIMILARITY)
- .detectWord(filter.getName())
+ .detectWord(Constants.EMPTY)
.build();
candidateElementMatches.add(schemaElementMatch);
}
@@ -71,13 +76,13 @@ public class QueryFilterMapper implements SchemaMapper {
}
private boolean checkExistSameValueSchemaElementMatch(QueryFilter queryFilter,
- List schemaElementMatches) {
+ List schemaElementMatches) {
List valueSchemaElements = schemaElementMatches.stream().filter(schemaElementMatch ->
SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType()))
.collect(Collectors.toList());
for (SchemaElementMatch schemaElementMatch : valueSchemaElements) {
if (schemaElementMatch.getElement().getId().equals(queryFilter.getElementID())
- && schemaElementMatch.getWord().equals(String.valueOf(queryFilter.getValue()))) {
+ && schemaElementMatch.getWord().equals(String.valueOf(queryFilter.getValue()))) {
return true;
}
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java
index a04ee3edd..8e1a085dc 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/QueryMatchStrategy.java
@@ -1,10 +1,10 @@
package com.tencent.supersonic.chat.mapper;
import com.hankcs.hanlp.seg.common.Term;
-import com.tencent.supersonic.knowledge.dictionary.MapResult;
+import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.knowledge.dictionary.DictWordType;
+import com.tencent.supersonic.knowledge.dictionary.MapResult;
import com.tencent.supersonic.knowledge.service.SearchService;
-
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
@@ -32,7 +32,7 @@ public class QueryMatchStrategy implements MatchStrategy {
private MapperHelper mapperHelper;
@Override
- public Map> match(String text, List terms, Long detectDomainId) {
+ public Map> match(String text, List terms, Long detectmodelId) {
if (Objects.isNull(terms) || StringUtils.isEmpty(text)) {
return null;
}
@@ -43,10 +43,10 @@ public class QueryMatchStrategy implements MatchStrategy {
List offsetList = terms.stream().sorted(Comparator.comparing(Term::getOffset))
.map(term -> term.getOffset()).collect(Collectors.toList());
- log.debug("retryCount:{},terms:{},regOffsetToLength:{},offsetList:{},detectDomainId:{}", terms,
- regOffsetToLength, offsetList, detectDomainId);
+ log.debug("retryCount:{},terms:{},regOffsetToLength:{},offsetList:{},detectmodelId:{}", terms,
+ regOffsetToLength, offsetList, detectmodelId);
- List detects = detect(text, regOffsetToLength, offsetList, detectDomainId);
+ List detects = detect(text, regOffsetToLength, offsetList, detectmodelId);
Map> result = new HashMap<>();
MatchText matchText = MatchText.builder()
@@ -58,7 +58,7 @@ public class QueryMatchStrategy implements MatchStrategy {
}
private List detect(String text, Map regOffsetToLength, List offsetList,
- Long detectDomainId) {
+ Long detectmodelId) {
List results = Lists.newArrayList();
for (Integer index = 0; index <= text.length() - 1; ) {
@@ -69,18 +69,44 @@ public class QueryMatchStrategy implements MatchStrategy {
int offset = mapperHelper.getStepOffset(offsetList, index);
i = mapperHelper.getStepIndex(regOffsetToLength, i);
if (i <= text.length()) {
- List mapResults = detectByStep(text, detectDomainId, index, i, offset);
- mapResultRowSet.addAll(mapResults);
+ List mapResults = detectByStep(text, detectmodelId, index, i, offset);
+ selectMapResultInOneRound(mapResultRowSet, mapResults);
}
}
-
index = mapperHelper.getStepIndex(regOffsetToLength, index);
results.addAll(mapResultRowSet);
}
return results;
}
- private List detectByStep(String text, Long detectDomainId, Integer index, Integer i, int offset) {
+ private void selectMapResultInOneRound(Set mapResultRowSet, List mapResults) {
+ for (MapResult mapResult : mapResults) {
+ if (mapResultRowSet.contains(mapResult)) {
+ boolean isDeleted = mapResultRowSet.removeIf(
+ entry -> {
+ boolean deleted = getMapKey(mapResult).equals(getMapKey(entry))
+ && entry.getDetectWord().length() < mapResult.getDetectWord().length();
+ if (deleted) {
+ log.info("deleted entry:{}", entry);
+ }
+ return deleted;
+ }
+ );
+ if (isDeleted) {
+ log.info("deleted, add mapResult:{}", mapResult);
+ mapResultRowSet.add(mapResult);
+ }
+ } else {
+ mapResultRowSet.add(mapResult);
+ }
+ }
+ }
+
+ private String getMapKey(MapResult a) {
+ return a.getName() + Constants.UNDERLINE + String.join(Constants.UNDERLINE, a.getNatures());
+ }
+
+ private List detectByStep(String text, Long detectmodelId, Integer index, Integer i, int offset) {
String detectSegment = text.substring(index, i);
Integer oneDetectionSize = mapperHelper.getOneDetectionSize();
// step1. pre search
@@ -100,17 +126,17 @@ public class QueryMatchStrategy implements MatchStrategy {
mapResults = mapResults.stream().sorted((a, b) -> -(b.getName().length() - a.getName().length()))
.collect(Collectors.toCollection(LinkedHashSet::new));
// step4. filter by classId
- if (Objects.nonNull(detectDomainId) && detectDomainId > 0) {
- log.debug("detectDomainId:{}, before parseResults:{}", mapResults);
+ if (Objects.nonNull(detectmodelId) && detectmodelId > 0) {
+ log.debug("detectmodelId:{}, before parseResults:{}", mapResults);
mapResults = mapResults.stream().map(entry -> {
List natures = entry.getNatures().stream().filter(
- nature -> nature.startsWith(DictWordType.NATURE_SPILT + detectDomainId) || (nature.startsWith(
+ nature -> nature.startsWith(DictWordType.NATURE_SPILT + detectmodelId) || (nature.startsWith(
DictWordType.NATURE_SPILT))
).collect(Collectors.toList());
entry.setNatures(natures);
return entry;
}).collect(Collectors.toCollection(LinkedHashSet::new));
- log.info("after domainId parseResults:{}", mapResults);
+ log.info("after modelId parseResults:{}", mapResults);
}
// step5. filter by similarity
mapResults = mapResults.stream()
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java
index 91c7be09b..bf3eb9be9 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/mapper/SearchMatchStrategy.java
@@ -2,10 +2,9 @@ package com.tencent.supersonic.chat.mapper;
import com.google.common.collect.Lists;
import com.hankcs.hanlp.seg.common.Term;
-import com.tencent.supersonic.knowledge.dictionary.MapResult;
import com.tencent.supersonic.knowledge.dictionary.DictWordType;
+import com.tencent.supersonic.knowledge.dictionary.MapResult;
import com.tencent.supersonic.knowledge.service.SearchService;
-
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -25,7 +24,7 @@ public class SearchMatchStrategy implements MatchStrategy {
@Override
public Map> match(String text, List originals,
- Long detectDomainId) {
+ Long detectModelId) {
Map regOffsetToLength = originals.stream()
.filter(entry -> !entry.nature.toString().startsWith(DictWordType.NATURE_SPILT))
@@ -60,10 +59,10 @@ public class SearchMatchStrategy implements MatchStrategy {
List natures = entry.getNatures().stream()
.filter(nature -> !nature.endsWith(DictWordType.ENTITY.getType()))
.filter(nature -> {
- if (Objects.isNull(detectDomainId) || detectDomainId <= 0) {
+ if (Objects.isNull(detectModelId) || detectModelId <= 0) {
return true;
}
- if (nature.startsWith(DictWordType.NATURE_SPILT + detectDomainId)
+ if (nature.startsWith(DictWordType.NATURE_SPILT + detectModelId)
&& nature.startsWith(DictWordType.NATURE_SPILT)) {
return true;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java
index b5fb123dd..f1ab63981 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/SatisfactionChecker.java
@@ -2,22 +2,9 @@ package com.tencent.supersonic.chat.parser;
import com.tencent.supersonic.chat.api.component.SemanticQuery;
-import com.tencent.supersonic.chat.api.pojo.*;
-import com.tencent.supersonic.chat.plugin.PluginParseResult;
-import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery;
-import com.tencent.supersonic.chat.query.rule.RuleSemanticQuery;
-import com.tencent.supersonic.common.pojo.Constants;
-import com.tencent.supersonic.common.pojo.DateConf;
-import com.tencent.supersonic.common.util.JsonUtil;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.utils.Lists;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.util.CollectionUtils;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
/**
* This checker can be used by semantic parsers to check if query intent
@@ -30,86 +17,20 @@ public class SatisfactionChecker {
private static final double LONG_TEXT_THRESHOLD = 0.8;
private static final double SHORT_TEXT_THRESHOLD = 0.5;
private static final int QUERY_TEXT_LENGTH_THRESHOLD = 10;
- public static final double EMBEDDING_THRESHOLD = 0.2;
// check all the parse info in candidate
- public static boolean check(QueryContext queryCtx) {
- for (SemanticQuery query : queryCtx.getCandidateQueries()) {
- if (query instanceof RuleSemanticQuery) {
- if (checkRuleThreshHold(queryCtx.getRequest().getQueryText(), query.getParseInfo())) {
- return true;
- }
- } else if (query instanceof PluginSemanticQuery) {
- if (checkEmbeddingThreshold(query.getParseInfo())) {
- log.info("query mode :{} satisfy check", query.getQueryMode());
- return true;
- }
+ public static boolean check(QueryContext queryContext) {
+ for (SemanticQuery query : queryContext.getCandidateQueries()) {
+ if (checkThreshold(queryContext.getRequest().getQueryText(), query.getParseInfo())) {
+ return true;
}
}
return false;
}
- private static boolean checkEmbeddingThreshold(SemanticParseInfo semanticParseInfo) {
- Object object = semanticParseInfo.getProperties().get(Constants.CONTEXT);
- PluginParseResult pluginParseResult = JsonUtil.toObject(JsonUtil.toString(object), PluginParseResult.class);
- return EMBEDDING_THRESHOLD > pluginParseResult.getDistance();
- }
-
- //check single parse info
- private static boolean checkRuleThreshHold(String text, SemanticParseInfo semanticParseInfo) {
- List schemaElementMatches = semanticParseInfo.getElementMatches();
- if (CollectionUtils.isEmpty(schemaElementMatches)) {
- return false;
- }
- List detectWords = Lists.newArrayList();
- Map detectWordMap = schemaElementMatches.stream()
- .collect(Collectors.toMap(m -> m.getElement().getId(), SchemaElementMatch::getDetectWord,
- (id1, id2) -> id1));
- // get detect word in text by element id in semantic layer
- Long domainId = semanticParseInfo.getDomainId();
- if (domainId != null && domainId > 0) {
- for (SchemaElementMatch schemaElementMatch : schemaElementMatches) {
- if (SchemaElementType.DOMAIN.equals(schemaElementMatch.getElement().getType())) {
- detectWords.add(schemaElementMatch.getDetectWord());
- }
- }
- }
- for (SchemaElementMatch schemaElementMatch : schemaElementMatches) {
- if (SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())) {
- detectWords.add(schemaElementMatch.getDetectWord());
- }
- }
- for (SchemaElementMatch schemaElementMatch : schemaElementMatches) {
- if (SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())) {
- detectWords.add(schemaElementMatch.getDetectWord());
- }
- }
- for (SchemaElement schemaItem : semanticParseInfo.getMetrics()) {
- detectWords.add(
- detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), ""));
- // only first metric
- break;
- }
- for (SchemaElement schemaItem : semanticParseInfo.getDimensions()) {
- detectWords.add(
- detectWordMap.getOrDefault(Optional.ofNullable(schemaItem.getId()).orElse(0L), ""));
- // only first dimension
- break;
- }
- String dateText = Optional.ofNullable(semanticParseInfo.getDateInfo()).orElse(new DateConf()).getText();
- if (StringUtils.isNotBlank(dateText) && !dateText.equalsIgnoreCase(Constants.NULL)) {
- detectWords.add(dateText);
- }
- detectWords.removeIf(word -> !text.contains(word) && !text.contains(StringUtils.reverse(word)));
- //compare the length between detect words and query text
- return checkThreshold(text, detectWords, semanticParseInfo);
- }
-
- private static boolean checkThreshold(String queryText, List detectWords, SemanticParseInfo semanticParseInfo) {
- String detectWordsDistinct = StringUtils.join(new HashSet<>(detectWords), "");
- int detectWordsLength = detectWordsDistinct.length();
+ private static boolean checkThreshold(String queryText, SemanticParseInfo semanticParseInfo) {
int queryTextLength = queryText.length();
- double degree = detectWordsLength * 1.0 / queryTextLength;
+ double degree = semanticParseInfo.getScore() / queryTextLength;
if (queryTextLength > QUERY_TEXT_LENGTH_THRESHOLD) {
if (degree < LONG_TEXT_THRESHOLD) {
return false;
@@ -117,8 +38,8 @@ public class SatisfactionChecker {
} else if (degree < SHORT_TEXT_THRESHOLD) {
return false;
}
- log.info("queryMode:{}, degree:{}, detectWords:{}, parse info:{}",
- semanticParseInfo.getQueryMode(), degree, detectWordsDistinct, semanticParseInfo);
+ log.info("queryMode:{}, degree:{}, parse info:{}",
+ semanticParseInfo.getQueryMode(), degree, semanticParseInfo);
return true;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java
index e054bd9df..87ff3f812 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingBasedParser.java
@@ -1,13 +1,18 @@
package com.tencent.supersonic.chat.parser.embedding;
import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
import com.tencent.supersonic.chat.api.component.SemanticParser;
-import com.tencent.supersonic.chat.api.pojo.*;
+import com.tencent.supersonic.chat.api.pojo.ChatContext;
+import com.tencent.supersonic.chat.api.pojo.ModelSchema;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SchemaElement;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
+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.api.pojo.request.QueryReq;
-import com.tencent.supersonic.chat.parser.SatisfactionChecker;
+import com.tencent.supersonic.chat.parser.ParseMode;
import com.tencent.supersonic.chat.plugin.Plugin;
import com.tencent.supersonic.chat.plugin.PluginManager;
import com.tencent.supersonic.chat.plugin.PluginParseResult;
@@ -17,18 +22,20 @@ import com.tencent.supersonic.chat.service.PluginService;
import com.tencent.supersonic.chat.service.SemanticService;
import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.util.ContextUtils;
-import java.util.*;
-import java.util.stream.Collectors;
import com.tencent.supersonic.semantic.api.query.enums.FilterOperatorEnum;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
import org.springframework.util.CollectionUtils;
@Slf4j
public class EmbeddingBasedParser implements SemanticParser {
- private final static double THRESHOLD = 0.2d;
-
@Override
public void parse(QueryContext queryContext, ChatContext chatContext) {
EmbeddingConfig embeddingConfig = ContextUtils.getBean(EmbeddingConfig.class);
@@ -36,109 +43,15 @@ public class EmbeddingBasedParser implements SemanticParser {
return;
}
log.info("EmbeddingBasedParser parser query ctx: {}, chat ctx: {}", queryContext, chatContext);
- Set domainIds = getDomainMatched(queryContext);
String text = queryContext.getRequest().getQueryText();
- if (!CollectionUtils.isEmpty(domainIds)) {
- for (Long domainId : domainIds) {
- List schemaElementMatches = getMatchedElements(queryContext, domainId);
- String textReplaced = replaceText(text, schemaElementMatches);
- List embeddingRetrievals = recallResult(textReplaced, hasCandidateQuery(queryContext));
- Optional pluginOptional = choosePlugin(embeddingRetrievals, domainId);
- log.info("domain id :{} embedding result, text:{} embeddingResp:{} ",domainId, textReplaced, embeddingRetrievals);
- pluginOptional.ifPresent(plugin -> buildQuery(plugin, embeddingRetrievals, domainId, textReplaced, queryContext, schemaElementMatches));
- }
- } else {
- List embeddingRetrievals = recallResult(text, hasCandidateQuery(queryContext));
- Optional pluginOptional = choosePlugin(embeddingRetrievals, null);
- pluginOptional.ifPresent(plugin -> buildQuery(plugin, embeddingRetrievals, null, text, queryContext, Lists.newArrayList()));
- }
+ List embeddingRetrievals = recallResult(text);
+ choosePlugin(embeddingRetrievals, queryContext);
}
- private void buildQuery(Plugin plugin, List embeddingRetrievals,
- Long domainId, String text,
- QueryContext queryContext, List schemaElementMatches) {
- Map embeddingRetrievalMap = embeddingRetrievals.stream()
- .collect(Collectors.toMap(RecallRetrieval::getId, e -> e, (value1, value2) -> value1));
- log.info("EmbeddingBasedParser text: {} domain: {} choose plugin: [{} {}]",
- text, domainId, plugin.getId(), plugin.getName());
- PluginSemanticQuery pluginQuery = QueryManager.createPluginQuery(plugin.getType());
- SemanticParseInfo semanticParseInfo = buildSemanticParseInfo(domainId, plugin, text,
- queryContext.getRequest(), embeddingRetrievalMap, schemaElementMatches);
- semanticParseInfo.setQueryMode(pluginQuery.getQueryMode());
- pluginQuery.setParseInfo(semanticParseInfo);
- queryContext.getCandidateQueries().add(pluginQuery);
- }
-
- private Set getDomainMatched(QueryContext queryContext) {
- Long queryDomainId = queryContext.getRequest().getDomainId();
- if (queryDomainId != null && queryDomainId > 0) {
- return Sets.newHashSet(queryDomainId);
- }
- return queryContext.getMapInfo().getMatchedDomains();
- }
-
- private SemanticParseInfo buildSemanticParseInfo(Long domainId, Plugin plugin, String text, QueryReq queryReq,
- Map embeddingRetrievalMap,
- List schemaElementMatches) {
- SchemaElement schemaElement = new SchemaElement();
- schemaElement.setDomain(domainId);
- schemaElement.setId(domainId);
- SemanticParseInfo semanticParseInfo = new SemanticParseInfo();
- semanticParseInfo.setElementMatches(schemaElementMatches);
- semanticParseInfo.setDomain(schemaElement);
- double distance = Double.parseDouble(embeddingRetrievalMap.get(plugin.getId().toString()).getDistance());
- double score = text.length() * (1 - distance);
- Map properties = new HashMap<>();
- PluginParseResult pluginParseResult = new PluginParseResult();
- pluginParseResult.setPlugin(plugin);
- pluginParseResult.setRequest(queryReq);
- pluginParseResult.setDistance(distance);
- properties.put(Constants.CONTEXT, pluginParseResult);
- semanticParseInfo.setProperties(properties);
- semanticParseInfo.setScore(score);
- fillSemanticParseInfo(semanticParseInfo);
- setEntity(domainId, semanticParseInfo);
- return semanticParseInfo;
- }
-
- private List getMatchedElements(QueryContext queryContext, Long domainId) {
- SchemaMapInfo schemaMapInfo = queryContext.getMapInfo();
- List schemaElementMatches = schemaMapInfo.getMatchedElements(domainId);
- if (schemaElementMatches == null) {
- return Lists.newArrayList();
- }
- QueryReq queryReq = queryContext.getRequest();
- QueryFilters queryFilters = queryReq.getQueryFilters();
- if (queryFilters == null || CollectionUtils.isEmpty(queryFilters.getFilters())) {
- return schemaElementMatches;
- }
- Map element = queryFilters.getFilters().stream()
- .collect(Collectors.toMap(QueryFilter::getElementID, QueryFilter::getValue, (v1, v2) -> v1));
- return schemaElementMatches.stream().filter(schemaElementMatch ->
- SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())
- || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType())
- || SchemaElementType.ENTITY.equals(schemaElementMatch.getElement().getType()))
- .filter(schemaElementMatch ->
- !element.containsKey(schemaElementMatch.getElement().getId()) || (
- element.containsKey(schemaElementMatch.getElement().getId()) &&
- element.get(schemaElementMatch.getElement().getId()).toString()
- .equalsIgnoreCase(schemaElementMatch.getWord())
- ))
- .collect(Collectors.toList());
- }
-
- private void setEntity(Long domainId, SemanticParseInfo semanticParseInfo) {
- SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
- DomainSchema domainSchema = semanticService.getDomainSchema(domainId);
- if (domainSchema != null && domainSchema.getEntity() != null) {
- semanticParseInfo.setEntity(domainSchema.getEntity());
- }
- }
-
- private Optional choosePlugin(List embeddingRetrievals,
- Long domainId) {
+ private void choosePlugin(List embeddingRetrievals,
+ QueryContext queryContext) {
if (CollectionUtils.isEmpty(embeddingRetrievals)) {
- return Optional.empty();
+ return;
}
PluginService pluginService = ContextUtils.getBean(PluginService.class);
List plugins = pluginService.getPluginList();
@@ -148,27 +61,92 @@ public class EmbeddingBasedParser implements SemanticParser {
if (plugin == null) {
continue;
}
- if (domainId == null) {
- return Optional.of(plugin);
- }
- if (!CollectionUtils.isEmpty(plugin.getDomainList()) && plugin.getDomainList().contains(domainId)) {
- return Optional.of(plugin);
+ Pair> pair = PluginManager.resolve(plugin, queryContext);
+ log.info("embedding plugin resolve: {}", pair);
+ if (pair.getLeft()) {
+ List modelList = pair.getRight();
+ if (CollectionUtils.isEmpty(modelList)) {
+ return;
+ }
+ modelList = distinctModelList(plugin, queryContext.getMapInfo(), modelList);
+ for (Long modelId : modelList) {
+ buildQuery(plugin, Double.parseDouble(embeddingRetrieval.getDistance()), modelId, queryContext,
+ queryContext.getMapInfo().getMatchedElements(modelId));
+ }
+ return;
}
}
- return Optional.empty();
}
- public List recallResult(String embeddingText, boolean hasCandidateQuery) {
+ public List distinctModelList(Plugin plugin, SchemaMapInfo schemaMapInfo, List modelList) {
+ if (!plugin.isContainsAllModel()) {
+ return modelList;
+ }
+ boolean noElementMatch = true;
+ for (Long model : modelList) {
+ List schemaElementMatches = schemaMapInfo.getMatchedElements(model);
+ if (!CollectionUtils.isEmpty(schemaElementMatches)) {
+ noElementMatch = false;
+ }
+ }
+ if (noElementMatch) {
+ return modelList.subList(0, 1);
+ }
+ return modelList;
+ }
+
+ private void buildQuery(Plugin plugin, double distance, Long modelId,
+ QueryContext queryContext, List schemaElementMatches) {
+ log.info("EmbeddingBasedParser Model: {} choose plugin: [{} {}]", modelId, plugin.getId(), plugin.getName());
+ PluginSemanticQuery pluginQuery = QueryManager.createPluginQuery(plugin.getType());
+ plugin.setParseMode(ParseMode.EMBEDDING_RECALL);
+ SemanticParseInfo semanticParseInfo = buildSemanticParseInfo(modelId, plugin, queryContext.getRequest(),
+ schemaElementMatches, distance);
+ double score = queryContext.getRequest().getQueryText().length() * (1 - distance);
+ semanticParseInfo.setQueryMode(pluginQuery.getQueryMode());
+ semanticParseInfo.setScore(score);
+ pluginQuery.setParseInfo(semanticParseInfo);
+ queryContext.getCandidateQueries().add(pluginQuery);
+ }
+
+ private SemanticParseInfo buildSemanticParseInfo(Long modelId, Plugin plugin, QueryReq queryReq,
+ List schemaElementMatches, double distance) {
+ if (modelId == null && !CollectionUtils.isEmpty(plugin.getModelList())) {
+ modelId = plugin.getModelList().get(0);
+ }
+ SchemaElement Model = new SchemaElement();
+ Model.setModel(modelId);
+ Model.setId(modelId);
+ SemanticParseInfo semanticParseInfo = new SemanticParseInfo();
+ semanticParseInfo.setElementMatches(schemaElementMatches);
+ semanticParseInfo.setModel(Model);
+ Map properties = new HashMap<>();
+ PluginParseResult pluginParseResult = new PluginParseResult();
+ pluginParseResult.setPlugin(plugin);
+ pluginParseResult.setRequest(queryReq);
+ pluginParseResult.setDistance(distance);
+ properties.put(Constants.CONTEXT, pluginParseResult);
+ semanticParseInfo.setProperties(properties);
+ semanticParseInfo.setScore(distance);
+ fillSemanticParseInfo(semanticParseInfo);
+ setEntity(modelId, semanticParseInfo);
+ return semanticParseInfo;
+ }
+
+ private void setEntity(Long modelId, SemanticParseInfo semanticParseInfo) {
+ SemanticService semanticService = ContextUtils.getBean(SemanticService.class);
+ ModelSchema ModelSchema = semanticService.getModelSchema(modelId);
+ if (ModelSchema != null && ModelSchema.getEntity() != null) {
+ semanticParseInfo.setEntity(ModelSchema.getEntity());
+ }
+ }
+
+ public List recallResult(String embeddingText) {
try {
PluginManager pluginManager = ContextUtils.getBean(PluginManager.class);
EmbeddingResp embeddingResp = pluginManager.recognize(embeddingText);
List embeddingRetrievals = embeddingResp.getRetrieval();
- if(!CollectionUtils.isEmpty(embeddingRetrievals)){
- if (hasCandidateQuery) {
- embeddingRetrievals = embeddingRetrievals.stream()
- .filter(llmRetrieval -> Double.parseDouble(llmRetrieval.getDistance())
Math.abs(Double.parseDouble(o.getDistance())))).collect(Collectors.toList());
embeddingResp.setRetrieval(embeddingRetrievals);
@@ -180,45 +158,22 @@ public class EmbeddingBasedParser implements SemanticParser {
return Lists.newArrayList();
}
- private boolean hasCandidateQuery(QueryContext queryContext) {
- return !CollectionUtils.isEmpty(queryContext.getCandidateQueries());
- }
-
private void fillSemanticParseInfo(SemanticParseInfo semanticParseInfo) {
List schemaElementMatches = semanticParseInfo.getElementMatches();
if (!CollectionUtils.isEmpty(schemaElementMatches)) {
schemaElementMatches.stream().filter(schemaElementMatch ->
- SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())
- || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType()))
+ SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())
+ || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType()))
.forEach(schemaElementMatch -> {
- QueryFilter queryFilter = new QueryFilter();
- queryFilter.setValue(schemaElementMatch.getWord());
- queryFilter.setElementID(schemaElementMatch.getElement().getId());
- queryFilter.setName(schemaElementMatch.getElement().getName());
- queryFilter.setOperator(FilterOperatorEnum.EQUALS);
- queryFilter.setBizName(schemaElementMatch.getElement().getBizName());
- semanticParseInfo.getDimensionFilters().add(queryFilter);
+ QueryFilter queryFilter = new QueryFilter();
+ queryFilter.setValue(schemaElementMatch.getWord());
+ queryFilter.setElementID(schemaElementMatch.getElement().getId());
+ queryFilter.setName(schemaElementMatch.getElement().getName());
+ queryFilter.setOperator(FilterOperatorEnum.EQUALS);
+ queryFilter.setBizName(schemaElementMatch.getElement().getBizName());
+ semanticParseInfo.getDimensionFilters().add(queryFilter);
});
}
}
- protected String replaceText(String text, List schemaElementMatches) {
- if (CollectionUtils.isEmpty(schemaElementMatches)) {
- return text;
- }
- List valueSchemaElementMatches = schemaElementMatches.stream()
- .filter(schemaElementMatch ->
- SchemaElementType.VALUE.equals(schemaElementMatch.getElement().getType())
- || SchemaElementType.ID.equals(schemaElementMatch.getElement().getType()))
- .collect(Collectors.toList());
- for (SchemaElementMatch schemaElementMatch : valueSchemaElementMatches) {
- String detectWord = schemaElementMatch.getDetectWord();
- if (StringUtils.isBlank(detectWord)) {
- continue;
- }
- text = text.replace(detectWord, "");
- }
- return text;
- }
-
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java
index 6a52efead..7ad5c1f8a 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingEntityResolver.java
@@ -1,23 +1,26 @@
package com.tencent.supersonic.chat.parser.embedding;
import com.alibaba.fastjson.JSONObject;
-import com.tencent.supersonic.chat.api.pojo.*;
+import com.tencent.supersonic.chat.api.pojo.ChatContext;
+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.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 java.util.List;
+import java.util.Objects;
+import java.util.Set;
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) {
@@ -25,18 +28,19 @@ public class EmbeddingEntityResolver {
}
- private Long getEntityValue(Long domainId, Long entityElementId, QueryContext queryCtx, ChatContext chatCtx) {
+ 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:{} domain id:{} from query filter :{} ", entityId, domainId, queryFilters);
+ log.info("get entity id:{} model id:{} from query filter :{} ", entityId, modelId, queryFilters);
return entityId;
}
}
- entityId = getEntityValueFromSchemaMapInfo(domainId, queryCtx.getMapInfo(), entityElementId);
- log.info("get entity id:{} from schema map Info :{} ", entityId, JSONObject.toJSONString(queryCtx.getMapInfo()));
+ 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) {
@@ -75,8 +79,8 @@ public class EmbeddingEntityResolver {
}
- private Long getEntityValueFromSchemaMapInfo(Long domainId, SchemaMapInfo schemaMapInfo, Long entityElementId) {
- List schemaElementMatchList = schemaMapInfo.getMatchedElements(domainId);
+ private Long getEntityValueFromSchemaMapInfo(Long modelId, SchemaMapInfo schemaMapInfo, Long entityElementId) {
+ List schemaElementMatchList = schemaMapInfo.getMatchedElements(modelId);
if (CollectionUtils.isEmpty(schemaElementMatchList)) {
return null;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java
index 4966514a9..c11db7c81 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/embedding/EmbeddingResp.java
@@ -1,9 +1,8 @@
package com.tencent.supersonic.chat.parser.embedding;
-import lombok.Data;
-
import java.util.List;
+import lombok.Data;
@Data
public class EmbeddingResp {
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java
index beb862d25..702af0473 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionBasedParser.java
@@ -7,18 +7,20 @@ import com.tencent.supersonic.chat.api.pojo.QueryContext;
import com.tencent.supersonic.chat.api.pojo.SchemaElement;
import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
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.plugin.Plugin;
import com.tencent.supersonic.chat.plugin.PluginManager;
import com.tencent.supersonic.chat.plugin.PluginParseConfig;
import com.tencent.supersonic.chat.plugin.PluginParseResult;
import com.tencent.supersonic.chat.query.QueryManager;
+import com.tencent.supersonic.chat.query.dsl.DSLQuery;
import com.tencent.supersonic.chat.query.plugin.PluginSemanticQuery;
-import com.tencent.supersonic.chat.query.plugin.dsl.DSLQuery;
import com.tencent.supersonic.chat.service.PluginService;
import com.tencent.supersonic.chat.utils.ComponentFactory;
import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.util.ContextUtils;
+import com.tencent.supersonic.common.util.JsonUtil;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
@@ -29,10 +31,9 @@ import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-
-import com.tencent.supersonic.common.util.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -55,21 +56,12 @@ public class FunctionBasedParser implements SemanticParser {
FunctionCallInfoConfig functionCallConfig = ContextUtils.getBean(FunctionCallInfoConfig.class);
PluginService pluginService = ContextUtils.getBean(PluginService.class);
String functionUrl = functionCallConfig.getUrl();
-
if (StringUtils.isBlank(functionUrl) || SatisfactionChecker.check(queryCtx)) {
log.info("functionUrl:{}, skip function parser, queryText:{}", functionUrl,
queryCtx.getRequest().getQueryText());
return;
}
-
- Set matchedDomains = getMatchDomains(queryCtx);
- List functionNames = getFunctionNames(matchedDomains);
- log.info("matchedDomains:{},functionNames:{}", matchedDomains, functionNames);
-
- if (CollectionUtils.isEmpty(functionNames) || CollectionUtils.isEmpty(matchedDomains)) {
- return;
- }
- List functionDOList = getFunctionDO(queryCtx.getRequest().getDomainId());
+ List functionDOList = getFunctionDO(queryCtx.getRequest().getModelId(), queryCtx);
FunctionReq functionReq = FunctionReq.builder()
.queryText(queryCtx.getRequest().getQueryText())
.pluginConfigs(functionDOList).build();
@@ -78,7 +70,6 @@ public class FunctionBasedParser implements SemanticParser {
if (skipFunction(queryCtx, functionResp)) {
return;
}
-
PluginParseResult functionCallParseResult = new PluginParseResult();
String toolSelection = functionResp.getToolSelection();
Optional pluginOptional = pluginService.getPluginByName(toolSelection);
@@ -87,24 +78,26 @@ public class FunctionBasedParser implements SemanticParser {
return;
}
Plugin plugin = pluginOptional.get();
+ plugin.setParseMode(ParseMode.FUNCTION_CALL);
toolSelection = plugin.getType();
functionCallParseResult.setPlugin(plugin);
log.info("QueryManager PluginQueryModes:{}", QueryManager.getPluginQueryModes());
PluginSemanticQuery semanticQuery = QueryManager.createPluginQuery(toolSelection);
- DomainResolver domainResolver = ComponentFactory.getDomainResolver();
-
- Long domainId = domainResolver.resolve(queryCtx, chatCtx, plugin.getDomainList());
- log.info("FunctionBasedParser domainId:{}",domainId);
- if ((Objects.isNull(domainId) || domainId <= 0) && !plugin.isContainsAllDomain()) {
- log.info("domain is null, skip the parse, select tool: {}", toolSelection);
+ ModelResolver ModelResolver = ComponentFactory.getModelResolver();
+ log.info("plugin ModelList:{}", plugin.getModelList());
+ Pair> pluginResolveResult = PluginManager.resolve(plugin, queryCtx);
+ Long modelId = ModelResolver.resolve(queryCtx, chatCtx, pluginResolveResult.getRight());
+ log.info("FunctionBasedParser modelId:{}", modelId);
+ if ((Objects.isNull(modelId) || modelId <= 0) && !plugin.isContainsAllModel()) {
+ log.info("Model is null, skip the parse, select tool: {}", toolSelection);
return;
}
- if (!plugin.getDomainList().contains(domainId) && !plugin.isContainsAllDomain()) {
+ if (!plugin.getModelList().contains(modelId) && !plugin.isContainsAllModel()) {
return;
}
SemanticParseInfo parseInfo = semanticQuery.getParseInfo();
- if (Objects.nonNull(domainId) && domainId > 0){
- parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(domainId));
+ if (Objects.nonNull(modelId) && modelId > 0) {
+ parseInfo.getElementMatches().addAll(queryCtx.getMapInfo().getMatchedElements(modelId));
}
functionCallParseResult.setRequest(queryCtx.getRequest());
Map properties = new HashMap<>();
@@ -112,21 +105,22 @@ public class FunctionBasedParser implements SemanticParser {
parseInfo.setProperties(properties);
parseInfo.setScore(FUNCTION_BONUS_THRESHOLD);
parseInfo.setQueryMode(semanticQuery.getQueryMode());
- SchemaElement domain = new SchemaElement();
- domain.setDomain(domainId);
- domain.setId(domainId);
- parseInfo.setDomain(domain);
+ SchemaElement Model = new SchemaElement();
+ Model.setModel(modelId);
+ Model.setId(modelId);
+ parseInfo.setModel(Model);
queryCtx.getCandidateQueries().add(semanticQuery);
}
- private Set getMatchDomains(QueryContext queryCtx) {
+
+ private Set getMatchModels(QueryContext queryCtx) {
Set result = new HashSet<>();
- Long domainId = queryCtx.getRequest().getDomainId();
- if (Objects.nonNull(domainId) && domainId > 0) {
- result.add(domainId);
+ Long modelId = queryCtx.getRequest().getModelId();
+ if (Objects.nonNull(modelId) && modelId > 0) {
+ result.add(modelId);
return result;
}
- return queryCtx.getMapInfo().getMatchedDomains();
+ return queryCtx.getMapInfo().getMatchedModels();
}
private boolean skipFunction(QueryContext queryCtx, FunctionResp functionResp) {
@@ -144,36 +138,46 @@ public class FunctionBasedParser implements SemanticParser {
return false;
}
- private List getFunctionDO(Long domainId) {
- log.info("user decide domain:{}", domainId);
+ private List getFunctionDO(Long modelId, QueryContext queryContext) {
+ log.info("user decide Model:{}", modelId);
List plugins = PluginManager.getPlugins();
- List functionDOList = plugins.stream().filter(o -> {
- if (o.getParseModeConfig() == null) {
+ List functionDOList = plugins.stream().filter(plugin -> {
+ if (DSLQuery.QUERY_MODE.equalsIgnoreCase(plugin.getType())) {
return false;
}
- if (!CollectionUtils.isEmpty(o.getDomainList())) {//过滤掉没选主题域的插件
- return true;
+ if (plugin.getParseModeConfig() == null) {
+ return false;
}
- if (domainId == null || domainId <= 0L) {
- return true;
- } else {
- return o.getDomainList().contains(domainId);
- }
- }).map(o -> {
- PluginParseConfig functionCallConfig = JsonUtil.toObject(o.getParseModeConfig(),
+ PluginParseConfig pluginParseConfig = JsonUtil.toObject(plugin.getParseModeConfig(),
PluginParseConfig.class);
- return functionCallConfig;
- }).collect(Collectors.toList());
+ if (StringUtils.isBlank(pluginParseConfig.getName())) {
+ return false;
+ }
+ Pair> pluginResolverResult = PluginManager.resolve(plugin, queryContext);
+ log.info("embedding plugin [{}-{}] resolve: {}", plugin.getId(), plugin.getName(), pluginResolverResult);
+ if (!pluginResolverResult.getLeft()) {
+ return false;
+ } else {
+ List resolveModel = pluginResolverResult.getRight();
+ if (modelId != null && modelId > 0) {
+ if (plugin.isContainsAllModel()) {
+ return true;
+ }
+ return resolveModel.contains(modelId);
+ }
+ return true;
+ }
+ }).map(o -> JsonUtil.toObject(o.getParseModeConfig(), PluginParseConfig.class)).collect(Collectors.toList());
log.info("getFunctionDO:{}", JsonUtil.toString(functionDOList));
return functionDOList;
}
- private List getFunctionNames(Set matchedDomains) {
+ private List getFunctionNames(Set matchedModels) {
List plugins = PluginManager.getPlugins();
Set functionNames = plugins.stream()
.filter(entry -> {
- if (!CollectionUtils.isEmpty(entry.getDomainList()) && !CollectionUtils.isEmpty(matchedDomains)) {
- return entry.getDomainList().stream().anyMatch(matchedDomains::contains);
+ if (!CollectionUtils.isEmpty(entry.getModelList()) && !CollectionUtils.isEmpty(matchedModels)) {
+ return entry.getModelList().stream().anyMatch(matchedModels::contains);
}
return true;
}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java
index ef52541e6..ab4fa5a47 100644
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/FunctionReq.java
@@ -1,8 +1,7 @@
package com.tencent.supersonic.chat.parser.function;
-import java.util.List;
-
import com.tencent.supersonic.chat.plugin.PluginParseConfig;
+import java.util.List;
import lombok.Builder;
import lombok.Data;
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java
deleted file mode 100644
index c56508941..000000000
--- a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicDomainResolver.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package com.tencent.supersonic.chat.parser.function;
-
-import com.tencent.supersonic.chat.api.pojo.*;
-import com.tencent.supersonic.chat.api.pojo.request.QueryReq;
-import com.tencent.supersonic.chat.api.component.SemanticQuery;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.*;
-import java.util.stream.Collectors;
-import org.apache.commons.collections.CollectionUtils;
-
-@Slf4j
-public class HeuristicDomainResolver implements DomainResolver {
-
- protected static Long selectDomainBySchemaElementCount(Map domainQueryModes,
- SchemaMapInfo schemaMap) {
- Map domainTypeMap = getDomainTypeMap(schemaMap);
- if (domainTypeMap.size() == 1) {
- Long domainSelect = domainTypeMap.entrySet().stream().collect(Collectors.toList()).get(0).getKey();
- if (domainQueryModes.containsKey(domainSelect)) {
- log.info("selectDomain with only one domain [{}]", domainSelect);
- return domainSelect;
- }
- } else {
- Map.Entry maxDomain = domainTypeMap.entrySet().stream()
- .filter(entry -> domainQueryModes.containsKey(entry.getKey()))
- .sorted((o1, o2) -> {
- int difference = o2.getValue().getCount() - o1.getValue().getCount();
- if (difference == 0) {
- return (int) ((o2.getValue().getMaxSimilarity()
- - o1.getValue().getMaxSimilarity()) * 100);
- }
- return difference;
- }).findFirst().orElse(null);
- if (maxDomain != null) {
- log.info("selectDomain with multiple domains [{}]", maxDomain.getKey());
- return maxDomain.getKey();
- }
- }
- return 0L;
- }
-
- /**
- * to check can switch domain if context exit domain
- *
- * @return false will use context domain, true will use other domain , maybe include context domain
- */
- protected static boolean isAllowSwitch(Map domainQueryModes, SchemaMapInfo schemaMap,
- ChatContext chatCtx, QueryReq searchCtx, Long domainId, List restrictiveDomains) {
- if (!Objects.nonNull(domainId) || domainId <= 0) {
- return true;
- }
- // except content domain, calculate the number of types for each domain, if numbers<=1 will not switch
- Map domainTypeMap = getDomainTypeMap(schemaMap);
- log.info("isAllowSwitch domainTypeMap [{}]", domainTypeMap);
- long otherDomainTypeNumBigOneCount = domainTypeMap.entrySet().stream()
- .filter(entry -> domainQueryModes.containsKey(entry.getKey()) && !entry.getKey().equals(domainId))
- .filter(entry -> entry.getValue().getCount() > 1).count();
- if (otherDomainTypeNumBigOneCount >= 1) {
- return true;
- }
- // if query text only contain time , will not switch
- if (!CollectionUtils.isEmpty(domainQueryModes.values())) {
- for (SemanticQuery semanticQuery : domainQueryModes.values()) {
- if (semanticQuery == null) {
- continue;
- }
- SemanticParseInfo semanticParseInfo = semanticQuery.getParseInfo();
- if (semanticParseInfo == null) {
- continue;
- }
- if (searchCtx.getQueryText() != null && semanticParseInfo.getDateInfo() != null) {
- if (semanticParseInfo.getDateInfo().getText() != null) {
- if (semanticParseInfo.getDateInfo().getText().equalsIgnoreCase(searchCtx.getQueryText())) {
- log.info("timeParseResults is not null , can not switch context , timeParseResults:{},",
- semanticParseInfo.getDateInfo());
- return false;
- }
- }
- }
- }
- }
-
- if (CollectionUtils.isNotEmpty(restrictiveDomains) && !restrictiveDomains.contains(domainId)) {
- return true;
- }
- // if context domain not in schemaMap , will switch
- if (schemaMap.getMatchedElements(domainId) == null || schemaMap.getMatchedElements(domainId).size() <= 0) {
- log.info("domainId not in schemaMap ");
- return true;
- }
- // other will not switch
- return false;
- }
-
- public static Map getDomainTypeMap(SchemaMapInfo schemaMap) {
- Map domainCount = new HashMap<>();
- for (Map.Entry> entry : schemaMap.getDomainElementMatches().entrySet()) {
- List schemaElementMatches = schemaMap.getMatchedElements(entry.getKey());
- if (schemaElementMatches != null && schemaElementMatches.size() > 0) {
- if (!domainCount.containsKey(entry.getKey())) {
- domainCount.put(entry.getKey(), new DomainMatchResult());
- }
- DomainMatchResult domainMatchResult = domainCount.get(entry.getKey());
- Set schemaElementTypes = new HashSet<>();
- schemaElementMatches.stream()
- .forEach(schemaElementMatch -> schemaElementTypes.add(
- schemaElementMatch.getElement().getType()));
- SchemaElementMatch schemaElementMatchMax = schemaElementMatches.stream()
- .sorted((o1, o2) ->
- ((int) ((o2.getSimilarity() - o1.getSimilarity()) * 100))
- ).findFirst().orElse(null);
- if (schemaElementMatchMax != null) {
- domainMatchResult.setMaxSimilarity(schemaElementMatchMax.getSimilarity());
- }
- domainMatchResult.setCount(schemaElementTypes.size());
-
- }
- }
- return domainCount;
- }
-
-
- public Long resolve(QueryContext queryContext, ChatContext chatCtx, List restrictiveDomains) {
- Long domainId = queryContext.getRequest().getDomainId();
- if (Objects.nonNull(domainId) && domainId > 0) {
- if (CollectionUtils.isNotEmpty(restrictiveDomains) && restrictiveDomains.contains(domainId)) {
- return domainId;
- } else {
- return null;
- }
- }
- SchemaMapInfo mapInfo = queryContext.getMapInfo();
- Set matchedDomains = mapInfo.getMatchedDomains();
- if (CollectionUtils.isNotEmpty(restrictiveDomains)) {
- matchedDomains = matchedDomains.stream()
- .filter(matchedDomain -> restrictiveDomains.contains(matchedDomain))
- .collect(Collectors.toSet());
- }
- Map domainQueryModes = new HashMap<>();
- for (Long matchedDomain : matchedDomains) {
- domainQueryModes.put(matchedDomain, null);
- }
- if(domainQueryModes.size()==1){
- return domainQueryModes.keySet().stream().findFirst().get();
- }
- return resolve(domainQueryModes, queryContext, chatCtx,
- queryContext.getMapInfo(),restrictiveDomains);
- }
-
- public Long resolve(Map domainQueryModes, QueryContext queryContext,
- ChatContext chatCtx, SchemaMapInfo schemaMap, List restrictiveDomains) {
- Long selectDomain = selectDomain(domainQueryModes, queryContext.getRequest(), chatCtx, schemaMap,restrictiveDomains);
- if (selectDomain > 0) {
- log.info("selectDomain {} ", selectDomain);
- return selectDomain;
- }
- // get the max SchemaElementType number
- return selectDomainBySchemaElementCount(domainQueryModes, schemaMap);
- }
-
- public Long selectDomain(Map domainQueryModes, QueryReq queryContext,
- ChatContext chatCtx,
- SchemaMapInfo schemaMap, List restrictiveDomains) {
- // if QueryContext has domainId and in domainQueryModes
- if (domainQueryModes.containsKey(queryContext.getDomainId())) {
- log.info("selectDomain from QueryContext [{}]", queryContext.getDomainId());
- return queryContext.getDomainId();
- }
- // if ChatContext has domainId and in domainQueryModes
- if (chatCtx.getParseInfo().getDomainId() > 0) {
- Long domainId = chatCtx.getParseInfo().getDomainId();
- if (!isAllowSwitch(domainQueryModes, schemaMap, chatCtx, queryContext, domainId,restrictiveDomains)) {
- log.info("selectDomain from ChatContext [{}]", domainId);
- return domainId;
- }
- }
- // default 0
- return 0L;
- }
-}
diff --git a/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java
new file mode 100644
index 000000000..4e77a1e4a
--- /dev/null
+++ b/chat/core/src/main/java/com/tencent/supersonic/chat/parser/function/HeuristicModelResolver.java
@@ -0,0 +1,192 @@
+package com.tencent.supersonic.chat.parser.function;
+
+import com.tencent.supersonic.chat.api.component.SemanticQuery;
+import com.tencent.supersonic.chat.api.pojo.ChatContext;
+import com.tencent.supersonic.chat.api.pojo.QueryContext;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementMatch;
+import com.tencent.supersonic.chat.api.pojo.SchemaElementType;
+import com.tencent.supersonic.chat.api.pojo.SchemaMapInfo;
+import com.tencent.supersonic.chat.api.pojo.SemanticParseInfo;
+import com.tencent.supersonic.chat.api.pojo.request.QueryReq;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+
+@Slf4j
+public class HeuristicModelResolver implements ModelResolver {
+
+ protected static Long selectModelBySchemaElementCount(Map ModelQueryModes,
+ SchemaMapInfo schemaMap) {
+ Map