(improvement)(headless)Introduce side_information to the prompt and exemplar.

This commit is contained in:
jerryjzhang
2024-07-18 11:29:07 +08:00
parent f30c74c18f
commit 2eac301076
16 changed files with 128 additions and 165 deletions

View File

@@ -6,7 +6,9 @@ import com.tencent.supersonic.chat.server.pojo.ExecuteContext;
import com.tencent.supersonic.chat.server.service.MemoryService;
import com.tencent.supersonic.chat.server.util.ResultFormatter;
import com.tencent.supersonic.common.pojo.QueryColumn;
import com.tencent.supersonic.common.pojo.SqlExemplar;
import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.response.QueryResult;
@@ -39,13 +41,18 @@ public class SqlExecutor implements ChatQueryExecutor {
if (queryResult.getQueryState().equals(QueryState.SUCCESS)
&& queryResult.getQueryMode().equals(LLMSqlQuery.QUERY_MODE)) {
SqlExemplar exemplar = JsonUtil.toObject(JsonUtil.toString(
executeContext.getParseInfo().getProperties()
.get(SqlExemplar.PROPERTY_KEY)), SqlExemplar.class);
MemoryService memoryService = ContextUtils.getBean(MemoryService.class);
memoryService.createMemory(ChatMemoryDO.builder()
.agentId(executeContext.getAgent().getId())
.status(MemoryStatus.PENDING)
.question(executeContext.getQueryText())
.s2sql(executeContext.getParseInfo().getSqlInfo().getParsedS2SQL())
.dbSchema(buildSchemaStr(executeContext.getParseInfo()))
.question(exemplar.getQuestion())
.sideInfo(exemplar.getSideInfo())
.dbSchema(exemplar.getDbSchema())
.s2sql(exemplar.getSql())
.createdBy(executeContext.getUser().getName())
.updatedBy(executeContext.getUser().getName())
.createdAt(new Date())
@@ -98,36 +105,4 @@ public class SqlExecutor implements ChatQueryExecutor {
return queryResult;
}
public String buildSchemaStr(SemanticParseInfo parseInfo) {
String tableStr = parseInfo.getDataSet().getName();
StringBuilder metricStr = new StringBuilder();
StringBuilder dimensionStr = new StringBuilder();
parseInfo.getMetrics().stream().forEach(
metric -> {
metricStr.append(metric.getName());
if (StringUtils.isNotEmpty(metric.getDescription())) {
metricStr.append(" COMMENT '" + metric.getDescription() + "'");
}
if (StringUtils.isNotEmpty(metric.getDefaultAgg())) {
metricStr.append(" AGGREGATE '" + metric.getDefaultAgg().toUpperCase() + "'");
}
metricStr.append(",");
}
);
parseInfo.getDimensions().stream().forEach(
dimension -> {
dimensionStr.append(dimension.getName());
if (StringUtils.isNotEmpty(dimension.getDescription())) {
dimensionStr.append(" COMMENT '" + dimension.getDescription() + "'");
}
dimensionStr.append(",");
}
);
String template = "Table: %s, Metrics: [%s], Dimensions: [%s]";
return String.format(template, tableStr, metricStr, dimensionStr);
}
}

View File

@@ -35,6 +35,7 @@ public class MemoryReviewTask {
+ "2.ALWAYS recognize `数据日期` as the date field.\n"
+ "#Question: %s\n"
+ "#Schema: %s\n"
+ "#SideInfo: %s\n"
+ "#SQL: %s\n"
+ "#Response: ";
@@ -52,7 +53,8 @@ public class MemoryReviewTask {
.forEach(m -> {
Agent chatAgent = agentService.getAgent(m.getAgentId());
if (Objects.nonNull(chatAgent) && chatAgent.enableMemoryReview()) {
String promptStr = String.format(INSTRUCTION, m.getQuestion(), m.getDbSchema(), m.getS2sql());
String promptStr = String.format(INSTRUCTION, m.getQuestion(), m.getDbSchema(),
m.getSideInfo(), m.getS2sql());
Prompt prompt = PromptTemplate.from(promptStr).apply(Collections.EMPTY_MAP);
keyPipelineLog.info("MemoryReviewTask reqPrompt:{}", promptStr);

View File

@@ -20,11 +20,14 @@ public class ChatMemoryDO {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("agent_id")
private Integer agentId;
@TableField("question")
private String question;
@TableField("agent_id")
private Integer agentId;
@TableField("side_info")
private String sideInfo;
@TableField("db_schema")
private String dbSchema;

View File

@@ -102,6 +102,7 @@ public class MemoryServiceImpl implements MemoryService {
exemplarService.storeExemplar(embeddingConfig.getMemoryCollectionName(memory.getAgentId()),
SqlExemplar.builder()
.question(memory.getQuestion())
.sideInfo(memory.getSideInfo())
.dbSchema(memory.getDbSchema())
.sql(memory.getS2sql())
.build());
@@ -113,6 +114,7 @@ public class MemoryServiceImpl implements MemoryService {
exemplarService.removeExemplar(embeddingConfig.getMemoryCollectionName(memory.getAgentId()),
SqlExemplar.builder()
.question(memory.getQuestion())
.sideInfo(memory.getSideInfo())
.dbSchema(memory.getDbSchema())
.sql(memory.getS2sql())
.build());

View File

@@ -11,8 +11,12 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
public class SqlExemplar {
public static final String PROPERTY_KEY = "sql_exemplar";
private String question;
private String sideInfo;
private String dbSchema;
private String sql;

View File

@@ -120,10 +120,10 @@ public class LLMRequestService {
public LLMResp runText2SQL(LLMReq llmReq) {
SqlGenStrategy sqlGenStrategy = SqlGenStrategyFactory.get(llmReq.getSqlGenType());
String modelName = llmReq.getSchema().getDataSetName();
String dataSet = llmReq.getSchema().getDataSetName();
LLMResp result = sqlGenStrategy.generate(llmReq);
result.setQuery(llmReq.getQueryText());
result.setModelName(modelName);
result.setDataSet(dataSet);
return result;
}

View File

@@ -2,6 +2,7 @@ package com.tencent.supersonic.headless.chat.parser.llm;
import com.tencent.supersonic.common.pojo.Constants;
import com.tencent.supersonic.common.jsqlparser.SqlValidHelper;
import com.tencent.supersonic.common.pojo.SqlExemplar;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.chat.query.QueryManager;
import com.tencent.supersonic.headless.chat.query.llm.LLMSemanticQuery;
@@ -35,6 +36,13 @@ public class LLMResponseService {
Map<String, Object> properties = new HashMap<>();
properties.put(Constants.CONTEXT, parseResult);
properties.put("type", "internal");
SqlExemplar exemplar = SqlExemplar.builder()
.question(queryCtx.getQueryText())
.sideInfo(parseResult.getLlmResp().getSideInfo())
.dbSchema(parseResult.getLlmResp().getSchema())
.sql(parseResult.getLlmResp().getSqlOutput())
.build();
properties.put(SqlExemplar.PROPERTY_KEY, exemplar);
parseInfo.setProperties(properties);
parseInfo.setScore(queryCtx.getQueryText().length() * (1 + weight));
parseInfo.setQueryMode(semanticQuery.getQueryMode());

View File

@@ -34,13 +34,15 @@ public class OnePassSCSqlGenStrategy extends SqlGenStrategy {
+ "1.ALWAYS use `数据日期` as the date field."
+ "2.ALWAYS specify date filter using `>`,`<`,`>=`,`<=` operator."
+ "3.ALWAYS calculate the absolute date range by yourself."
+ "4.DO NOT include date filter in the where clause if not explicitly expressed in the question."
+ "4.DO NOT include date filter in the where clause if not explicitly expressed in the `Question`."
+ "5.ONLY respond with the converted SQL statement.\n"
+ "#Exemplars:\n{{exemplar}}"
+ "#Question:{{question}} #Schema:{{schema}} #SQL:";
+ "#Question:{{question}} #Schema:{{schema}} #SideInfo:{{information}} #SQL:";
@Override
public LLMResp generate(LLMReq llmReq) {
LLMResp llmResp = new LLMResp();
llmResp.setQuery(llmReq.getQueryText());
//1.recall exemplars
keyPipelineLog.info("OnePassSCSqlGenStrategy llmReq:\n{}", llmReq);
List<List<SqlExemplar>> exemplarsList = promptHelper.getFewShotExemplars(llmReq);
@@ -48,49 +50,51 @@ public class OnePassSCSqlGenStrategy extends SqlGenStrategy {
//2.generate sql generation prompt for each self-consistency inference
Map<Prompt, List<SqlExemplar>> prompt2Exemplar = new HashMap<>();
for (List<SqlExemplar> exemplars : exemplarsList) {
Prompt prompt = generatePrompt(llmReq, exemplars);
llmReq.setDynamicExemplars(exemplars);
Prompt prompt = generatePrompt(llmReq, llmResp);
prompt2Exemplar.put(prompt, exemplars);
}
//3.perform multiple self-consistency inferences parallelly
Map<Prompt, String> prompt2Output = new ConcurrentHashMap<>();
Map<String, Prompt> output2Prompt = new ConcurrentHashMap<>();
prompt2Exemplar.keySet().parallelStream().forEach(prompt -> {
keyPipelineLog.info("OnePassSCSqlGenStrategy reqPrompt:\n{}", prompt.toUserMessage());
ChatLanguageModel chatLanguageModel = getChatLanguageModel(llmReq.getModelConfig());
Response<AiMessage> response = chatLanguageModel.generate(prompt.toUserMessage());
String result = response.content().text();
prompt2Output.put(prompt, result);
output2Prompt.put(result, prompt);
keyPipelineLog.info("OnePassSCSqlGenStrategy modelResp:\n{}", result);
}
);
//4.format response.
Pair<String, Map<String, Double>> sqlMapPair = ResponseHelper.selfConsistencyVote(
Lists.newArrayList(prompt2Output.values()));
LLMResp llmResp = new LLMResp();
llmResp.setQuery(promptHelper.buildAugmentedQuestion(llmReq));
llmResp.setDbSchema(promptHelper.buildSchemaStr(llmReq));
Lists.newArrayList(output2Prompt.keySet()));
llmResp.setSqlOutput(sqlMapPair.getLeft());
//TODO: should use the same few-shot exemplars as the one chose by self-consistency vote
llmResp.setSqlRespMap(ResponseHelper.buildSqlRespMap(exemplarsList.get(0), sqlMapPair.getRight()));
List<SqlExemplar> usedExemplars = prompt2Exemplar.get(output2Prompt.get(sqlMapPair.getLeft()));
llmResp.setSqlRespMap(ResponseHelper.buildSqlRespMap(usedExemplars, sqlMapPair.getRight()));
return llmResp;
}
private Prompt generatePrompt(LLMReq llmReq, List<SqlExemplar> fewshotExampleList) {
StringBuilder exemplarsStr = new StringBuilder();
for (SqlExemplar exemplar : fewshotExampleList) {
String exemplarStr = String.format("#Question:%s #Schema:%s #SQL:%s\n",
exemplar.getQuestion(), exemplar.getDbSchema(), exemplar.getSql());
exemplarsStr.append(exemplarStr);
private Prompt generatePrompt(LLMReq llmReq, LLMResp llmResp) {
StringBuilder exemplars = new StringBuilder();
for (SqlExemplar exemplar : llmReq.getDynamicExemplars()) {
String exemplarStr = String.format("#Question:%s #Schema:%s #SideInfo:%s #SQL:%s\n",
exemplar.getQuestion(), exemplar.getDbSchema(),
exemplar.getSideInfo(), exemplar.getSql());
exemplars.append(exemplarStr);
}
String dataSemanticsStr = promptHelper.buildSchemaStr(llmReq);
String questionAugmented = promptHelper.buildAugmentedQuestion(llmReq);
String dataSemantics = promptHelper.buildSchemaStr(llmReq);
String sideInformation = promptHelper.buildSideInformation(llmReq);
llmResp.setSchema(dataSemantics);
llmResp.setSideInfo(sideInformation);
Map<String, Object> variable = new HashMap<>();
variable.put("exemplar", exemplarsStr);
variable.put("question", questionAugmented);
variable.put("schema", dataSemanticsStr);
variable.put("exemplar", exemplars);
variable.put("question", llmReq.getQueryText());
variable.put("schema", dataSemantics);
variable.put("information", sideInformation);
// use custom prompt template if provided.
PromptConfig promptConfig = llmReq.getPromptConfig();

View File

@@ -73,6 +73,23 @@ public class PromptHelper {
linkingListStr, currentDataStr, termStr, priorExts);
}
public String buildSideInformation(LLMReq llmReq) {
List<LLMReq.ElementValue> linkedValues = llmReq.getLinking();
String currentDate = llmReq.getCurrentDate();
String priorExts = llmReq.getPriorExts();
List<String> priorLinkingList = new ArrayList<>();
for (LLMReq.ElementValue value : linkedValues) {
String fieldName = value.getFieldName();
String fieldValue = value.getFieldValue();
priorLinkingList.add("" + fieldValue + "‘是一个‘" + fieldName + "");
}
String currentDataStr = "当前的日期是" + currentDate;
String linkingListStr = String.join("", priorLinkingList);
String termStr = buildTermStr(llmReq);
return String.format("%s;%s;%s;%s", linkingListStr, currentDataStr, termStr, priorExts);
}
public String buildSchemaStr(LLMReq llmReq) {
String tableStr = llmReq.getSchema().getDataSetName();
StringBuilder metricStr = new StringBuilder();

View File

@@ -10,9 +10,11 @@ public class LLMResp {
private String query;
private String modelName;
private String sideInfo;
private String dbSchema;
private String dataSet;
private String schema;
private String sqlOutput;

View File

@@ -356,4 +356,7 @@ alter table s2_agent add column `prompt_config` text COLLATE utf8_unicode_ci DEF
alter table s2_agent add `model_config` text null;
--20240710
alter table s2_agent add `enable_memory_review` tinyint DEFAULT 0;
alter table s2_agent add `enable_memory_review` tinyint DEFAULT 0;
--20240718
alter table s2_chat_memory add `side_info` TEXT DEFAULT NULL COMMENT '辅助信息';

View File

@@ -89,6 +89,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_memory` (
`agent_id` INT ,
`db_schema` TEXT ,
`s2_sql` TEXT ,
`side_info` TEXT ,
`status` char(10) ,
`llm_review` char(10) ,
`llm_comment` TEXT,

View File

@@ -142,6 +142,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_config` (
CREATE TABLE IF NOT EXISTS `s2_chat_memory` (
`id` INT NOT NULL AUTO_INCREMENT,
`question` varchar(655) COMMENT '用户问题' ,
`side_info` TEXT COMMENT '辅助信息' ,
`agent_id` INT COMMENT '助理ID' ,
`db_schema` TEXT COMMENT 'Schema映射' ,
`s2_sql` TEXT COMMENT '大模型解析SQL' ,

View File

@@ -1,92 +1,62 @@
[
{
"question": "比较jackjchen和robinlee在超音数的访问次数 (补充信息:'jackjchen'‘是一个’用户名‘,’ 'robinlee'是一个用户名。当前的日期是2020-12-01) ",
"question": "比较jackjchen和robinlee在超音数的访问次数",
"sideInfo": "'jackjchen'是一个'用户名''robinlee'是一个'用户名'。当前的日期是2020-12-01",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 用户名, 访问次数 FROM 超音数产品 WHERE 用户名 IN ('jackjchen', 'robinlee')"
},
{
"question": "超音数近12个月访问人数 按部门 (补充信息:。当前的日期是2022-11-06) ",
"question": "超音数近12个月访问人数 按部门",
"sideInfo": "当前的日期是2022-11-06",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门, 数据日期, 访问人数 FROM 超音数产品 WHERE 数据日期 >= '2021-11-06' AND 数据日期 <= '2022-11-06'"
},
{
"question": "超音数美术部、技术研发部的访问时长 (补充信息:'美术部'‘是一个’部门‘,’ '技术研发部'是一个部门。当前的日期是2023-04-21) ",
"question": "超音数美术部、技术研发部的访问时长",
"sideInfo": "'美术部'‘是一个’部门‘,’ '技术研发部'是一个部门。当前的日期是2023-04-21",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门, 访问时长 FROM 超音数产品 WHERE 部门 IN ('美术部', '技术研发部')"
},
{
"question": "近3天海田飞系MPPM结算播放份额 (补充信息:'海田飞系'是一个严选版权归属系。当前的日期是2023-08-21) ",
"question": "近3天海田飞系MPPM结算播放份额",
"sideInfo": "'海田飞系'是一个'严选版权归属系'。当前的日期是2023-08-21",
"dbSchema": "Table: 严选, Columns = [\"严选版权归属系\", \"付费模式\", \"结算播放份额\", \"付费用户结算播放份额\", \"数据日期\"]",
"sql": "SELECT 严选版权归属系, 结算播放份额 FROM 严选 WHERE 严选版权归属系 = '海田飞系' AND 数据日期 >= '2023-08-19' AND 数据日期 <= '2023-08-21' "
},
{
"question": "对比近7天翻唱版和纯音乐的歌曲播放量 (补充信息:'纯音乐'‘是一个’语种‘,’ '翻唱版'是一个歌曲版本。当前的日期是2023-05-22) ",
"question": "对比近7天翻唱版和纯音乐的歌曲播放量",
"sideInfo": "'纯音乐'是一个'语种''翻唱版'是一个'歌曲版本'。当前的日期是2023-05-22",
"dbSchema": "Table: 歌曲库, Columns = [\"是否潮流人歌曲\", \"C音歌曲ID\", \"C音歌曲MID\", \"歌曲名\", \"歌曲版本\", \"语种\", \"歌曲类型\", \"翻唱类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"结算播放量\", \"运营播放量\", \"付费用户结算播放量\", \"历史累计结算播放量\", \"运营搜播量\", \"结算搜播量\", \"运营完播量\", \"运营推播量\", \"近7日复播率\", \"日均搜播量\", \"数据日期\"]",
"sql": "SELECT 歌曲版本, 语种, 结算播放量 FROM 歌曲库 WHERE 歌曲版本 = '翻唱版' AND 语种 = '纯音乐' AND 数据日期 >= '2023-05-16' AND 数据日期 <= '2023-05-22' "
},
{
"question": "对比一下陈拙悬、孟梅琦、赖媚韵的粉丝数 (补充信息:'1527896'是一个MPPM歌手ID '1565463'是一个MPPM歌手ID '2141459'是一个MPPM歌手ID。当前的日期是2023-05-31) ",
"question": "对比一下陈拙悬、孟梅琦、赖媚韵的粉丝数",
"sideInfo": "'1527896'是一个'MPPM歌手ID''1565463'是一个'MPPM歌手ID''2141459'是一个'MPPM歌手ID'。当前的日期是2023-05-31",
"dbSchema": "Table: 艺人库, Columns = [\"上下架状态\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"活跃区域\", \"年龄\", \"歌手才能\", \"歌手风格\", \"粉丝数\", \"潮音粉丝数\", \"超声波粉丝数\", \"推博粉丝数\", \"超声波歌曲数\", \"在架歌曲数\", \"超声波分享数\", \"独占歌曲数\", \"超声波在架歌曲评论数\", \"有播放量歌曲数\", \"数据日期\"]",
"sql": "SELECT 歌手名, 粉丝数 FROM 艺人库 WHERE 歌手名 IN ('陈拙悬', '孟梅琦', '赖媚韵')"
},
{
"question": "播放量大于1万的歌曲有多少 (补充信息:。当前的日期是2023-07-31) ",
"question": "播放量大于1万的歌曲有多少",
"sideInfo": "当前的日期是2023-07-31",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 结算播放量 > 10000"
},
{
"question": "超音数访问时长小于1小时且来自美术部的用户是哪些 (补充信息:'美术部'是一个部门。当前的日期是2023-07-31) ",
"question": "超音数访问时长小于1小时且来自美术部的用户是哪些",
"sideInfo": "'美术部'是一个部门。当前的日期是2023-07-31",
"dbSchema": "Table: 超音数产品, Columns = [\"用户名\", \"部门\", \"模块\", \"访问时长\", \"访问次数\", \"访问人数\", \"数据日期\"]",
"sql": "SELECT 用户名 FROM 超音数产品 WHERE 部门 = '美术部' AND 访问时长 < 1"
},
{
"question": "超音数pv最高的用户有哪些 (补充信息:。当前的日期是2023-08-31) ",
"question": "超音数pv最高的用户有哪些",
"sideInfo": "当前的日期是2023-08-31",
"dbSchema": "Table: 超音数产品, Columns = [\"用户名\", \"部门\", \"模块\", \"访问时长\", \"访问次数\", \"访问人数\", \"数据日期\"]",
"sql": "SELECT 用户名 FROM 超音数产品 ORDER BY 访问次数 DESC LIMIT 1"
},
{
"question": "近90天袁亚伟播放量平均值是多少 (补充信息:'152789226'是一个MPPM歌手ID。当前的日期是2023-08-31) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT AVG(结算播放量) FROM 艺人库 WHERE 歌手名 = '袁亚伟' AND 数据日期 >= '2023-06-02' AND 数据日期 <= '2023-08-31' "
},
{
"question": "周倩倩近7天结算播放量总和是多少 (补充信息:'199509'是一个MPPM歌手ID。当前的日期是2023-08-31) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT SUM(结算播放量) FROM 艺人库 WHERE 歌手名 = '周倩倩' AND 数据日期 >= '2023-08-15' AND 数据日期 <= '2023-08-31' "
},
{
"question": "超音数访问次数大于1k的部门是哪些 (补充信息:。当前的日期是2023-09-14) ",
"question": "超音数访问次数大于1k的部门是哪些",
"sideInfo": "当前的日期是2023-09-14",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门 FROM 超音数产品 WHERE 访问次数 > 1000"
},
{
"question": "陈亿训唱的所有的播放量大于20k的孤勇者有哪些 (补充信息:'199509'是一个MPPM歌手ID '1527123'是一个MPPM歌曲ID。当前的日期是2023-09-18) ",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"MPPM歌手ID\", \"歌曲版本\", \"歌曲类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 结算播放量 > 20000 AND 歌手名 = '陈亿训' AND 歌曲名 = '孤勇者'"
},
{
"question": "周洁轮去年发布的歌曲有哪些 (补充信息:'23109'是一个MPPM歌手ID。当前的日期是2023-09-18) ",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"歌曲版本\", \"歌手名\", \"歌曲类型\", \"发布时间\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发布时间 >= '2023-01-01' AND 发布时间 <= '2023-12-31' AND 歌手名 = '周洁轮'"
},
{
"question": "我想要近半年签约的播放量前十的歌手有哪些 (补充信息:。当前的日期是2023-09-11) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"签约日期\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT 歌手名 FROM 艺人库 WHERE 数据日期 >= '2023-03-15' AND 数据日期 <= '2023-09-11' ORDER BY 结算播放量 DESC LIMIT 10"
},
{
"question": "最近一年发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2022-08-13' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
},
{
"question": "今年以来发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2023-01-01' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
},
{
"question": "2023年以来发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:'514129144'是一个MPPM歌曲ID。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2023-01-01' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
}
]

View File

@@ -88,6 +88,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_memory` (
`question` varchar(655) ,
`agent_id` INT ,
`db_schema` TEXT ,
`side_info` TEXT ,
`s2_sql` TEXT ,
`status` char(10) ,
`llm_review` char(10) ,

View File

@@ -1,92 +1,62 @@
[
{
"question": "比较jackjchen和robinlee在超音数的访问次数 (补充信息:'jackjchen'‘是一个’用户名‘,’ 'robinlee'是一个用户名。当前的日期是2020-12-01) ",
"question": "比较jackjchen和robinlee在超音数的访问次数",
"sideInfo": "'jackjchen'是一个'用户名''robinlee'是一个'用户名'。当前的日期是2020-12-01",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 用户名, 访问次数 FROM 超音数产品 WHERE 用户名 IN ('jackjchen', 'robinlee')"
},
{
"question": "超音数近12个月访问人数 按部门 (补充信息:。当前的日期是2022-11-06) ",
"question": "超音数近12个月访问人数 按部门",
"sideInfo": "当前的日期是2022-11-06",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门, 数据日期, 访问人数 FROM 超音数产品 WHERE 数据日期 >= '2021-11-06' AND 数据日期 <= '2022-11-06'"
},
{
"question": "超音数美术部、技术研发部的访问时长 (补充信息:'美术部'‘是一个’部门‘,’ '技术研发部'是一个部门。当前的日期是2023-04-21) ",
"question": "超音数美术部、技术研发部的访问时长",
"sideInfo": "'美术部'‘是一个’部门‘,’ '技术研发部'是一个部门。当前的日期是2023-04-21",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门, 访问时长 FROM 超音数产品 WHERE 部门 IN ('美术部', '技术研发部')"
},
{
"question": "近3天海田飞系MPPM结算播放份额 (补充信息:'海田飞系'是一个严选版权归属系。当前的日期是2023-08-21) ",
"question": "近3天海田飞系MPPM结算播放份额",
"sideInfo": "'海田飞系'是一个'严选版权归属系'。当前的日期是2023-08-21",
"dbSchema": "Table: 严选, Columns = [\"严选版权归属系\", \"付费模式\", \"结算播放份额\", \"付费用户结算播放份额\", \"数据日期\"]",
"sql": "SELECT 严选版权归属系, 结算播放份额 FROM 严选 WHERE 严选版权归属系 = '海田飞系' AND 数据日期 >= '2023-08-19' AND 数据日期 <= '2023-08-21' "
},
{
"question": "对比近7天翻唱版和纯音乐的歌曲播放量 (补充信息:'纯音乐'‘是一个’语种‘,’ '翻唱版'是一个歌曲版本。当前的日期是2023-05-22) ",
"question": "对比近7天翻唱版和纯音乐的歌曲播放量",
"sideInfo": "'纯音乐'是一个'语种''翻唱版'是一个'歌曲版本'。当前的日期是2023-05-22",
"dbSchema": "Table: 歌曲库, Columns = [\"是否潮流人歌曲\", \"C音歌曲ID\", \"C音歌曲MID\", \"歌曲名\", \"歌曲版本\", \"语种\", \"歌曲类型\", \"翻唱类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"结算播放量\", \"运营播放量\", \"付费用户结算播放量\", \"历史累计结算播放量\", \"运营搜播量\", \"结算搜播量\", \"运营完播量\", \"运营推播量\", \"近7日复播率\", \"日均搜播量\", \"数据日期\"]",
"sql": "SELECT 歌曲版本, 语种, 结算播放量 FROM 歌曲库 WHERE 歌曲版本 = '翻唱版' AND 语种 = '纯音乐' AND 数据日期 >= '2023-05-16' AND 数据日期 <= '2023-05-22' "
},
{
"question": "对比一下陈拙悬、孟梅琦、赖媚韵的粉丝数 (补充信息:'1527896'是一个MPPM歌手ID '1565463'是一个MPPM歌手ID '2141459'是一个MPPM歌手ID。当前的日期是2023-05-31) ",
"question": "对比一下陈拙悬、孟梅琦、赖媚韵的粉丝数",
"sideInfo": "'1527896'是一个'MPPM歌手ID''1565463'是一个'MPPM歌手ID''2141459'是一个'MPPM歌手ID'。当前的日期是2023-05-31",
"dbSchema": "Table: 艺人库, Columns = [\"上下架状态\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"活跃区域\", \"年龄\", \"歌手才能\", \"歌手风格\", \"粉丝数\", \"潮音粉丝数\", \"超声波粉丝数\", \"推博粉丝数\", \"超声波歌曲数\", \"在架歌曲数\", \"超声波分享数\", \"独占歌曲数\", \"超声波在架歌曲评论数\", \"有播放量歌曲数\", \"数据日期\"]",
"sql": "SELECT 歌手名, 粉丝数 FROM 艺人库 WHERE 歌手名 IN ('陈拙悬', '孟梅琦', '赖媚韵')"
},
{
"question": "播放量大于1万的歌曲有多少 (补充信息:。当前的日期是2023-07-31) ",
"question": "播放量大于1万的歌曲有多少",
"sideInfo": "当前的日期是2023-07-31",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 结算播放量 > 10000"
},
{
"question": "超音数访问时长小于1小时且来自美术部的用户是哪些 (补充信息:'美术部'是一个部门。当前的日期是2023-07-31) ",
"question": "超音数访问时长小于1小时且来自美术部的用户是哪些",
"sideInfo": "'美术部'是一个部门。当前的日期是2023-07-31",
"dbSchema": "Table: 超音数产品, Columns = [\"用户名\", \"部门\", \"模块\", \"访问时长\", \"访问次数\", \"访问人数\", \"数据日期\"]",
"sql": "SELECT 用户名 FROM 超音数产品 WHERE 部门 = '美术部' AND 访问时长 < 1"
},
{
"question": "超音数pv最高的用户有哪些 (补充信息:。当前的日期是2023-08-31) ",
"question": "超音数pv最高的用户有哪些",
"sideInfo": "当前的日期是2023-08-31",
"dbSchema": "Table: 超音数产品, Columns = [\"用户名\", \"部门\", \"模块\", \"访问时长\", \"访问次数\", \"访问人数\", \"数据日期\"]",
"sql": "SELECT 用户名 FROM 超音数产品 ORDER BY 访问次数 DESC LIMIT 1"
},
{
"question": "近90天袁亚伟播放量平均值是多少 (补充信息:'152789226'是一个MPPM歌手ID。当前的日期是2023-08-31) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT AVG(结算播放量) FROM 艺人库 WHERE 歌手名 = '袁亚伟' AND 数据日期 >= '2023-06-02' AND 数据日期 <= '2023-08-31' "
},
{
"question": "周倩倩近7天结算播放量总和是多少 (补充信息:'199509'是一个MPPM歌手ID。当前的日期是2023-08-31) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT SUM(结算播放量) FROM 艺人库 WHERE 歌手名 = '周倩倩' AND 数据日期 >= '2023-08-15' AND 数据日期 <= '2023-08-31' "
},
{
"question": "超音数访问次数大于1k的部门是哪些 (补充信息:。当前的日期是2023-09-14) ",
"question": "超音数访问次数大于1k的部门是哪些",
"sideInfo": "当前的日期是2023-09-14",
"dbSchema": "Table: 超音数产品, Columns = [\"部门\", \"模块\", \"用户名\", \"访问次数\", \"访问人数\", \"访问时长\", \"数据日期\"]",
"sql": "SELECT 部门 FROM 超音数产品 WHERE 访问次数 > 1000"
},
{
"question": "陈亿训唱的所有的播放量大于20k的孤勇者有哪些 (补充信息:'199509'是一个MPPM歌手ID '1527123'是一个MPPM歌曲ID。当前的日期是2023-09-18) ",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"MPPM歌手ID\", \"歌曲版本\", \"歌曲类型\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 结算播放量 > 20000 AND 歌手名 = '陈亿训' AND 歌曲名 = '孤勇者'"
},
{
"question": "周洁轮去年发布的歌曲有哪些 (补充信息:'23109'是一个MPPM歌手ID。当前的日期是2023-09-18) ",
"dbSchema": "Table: 歌曲库, Columns = [\"歌曲名\", \"歌曲版本\", \"歌手名\", \"歌曲类型\", \"发布时间\", \"MPPM歌曲ID\", \"是否严选窄口径歌曲\", \"是否严选宽口径歌曲\", \"是否潮流人歌曲\", \"超声波歌曲ID\", \"C音歌曲ID\", \"C音歌曲MID\", \"结算播放量\", \"运营播放量\", \"分享量\", \"收藏量\", \"运营搜播量\", \"结算搜播量\", \"拉新用户数\", \"拉活用户数\", \"分享率\", \"结算播放份额\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发布时间 >= '2023-01-01' AND 发布时间 <= '2023-12-31' AND 歌手名 = '周洁轮'"
},
{
"question": "我想要近半年签约的播放量前十的歌手有哪些 (补充信息:。当前的日期是2023-09-11) ",
"dbSchema": "Table: 艺人库, Columns = [\"播放量层级\", \"播放量单调性\", \"播放量方差\", \"播放量突增类型\", \"播放量集中度\", \"歌手名\", \"歌手等级\", \"歌手类型\", \"歌手来源\", \"签约日期\", \"MPPM潮流人等级\", \"结算播放量\", \"运营播放量\", \"历史累计结算播放量\", \"有播放量歌曲数\", \"历史累计运营播放量\", \"付费用户结算播放量\", \"结算播放量占比\", \"运营播放份额\", \"免费用户结算播放占比\", \"完播量\", \"数据日期\"]",
"sql": "SELECT 歌手名 FROM 艺人库 WHERE 数据日期 >= '2023-03-15' AND 数据日期 <= '2023-09-11' ORDER BY 结算播放量 DESC LIMIT 10"
},
{
"question": "最近一年发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2022-08-13' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
},
{
"question": "今年以来发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2023-01-01' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
},
{
"question": "2023年以来发行的歌曲中有哪些在近7天播放超过一千万的 (补充信息:'514129144'是一个MPPM歌曲ID。当前的日期是2023-08-12) ",
"dbSchema": "Table: 歌曲库, Columns = [\"发行日期\", \"歌曲语言\", \"歌曲来源\", \"歌曲流派\", \"歌曲名\", \"歌曲版本\", \"歌曲类型\", \"发行时间\", \"数据日期\"]",
"sql": "SELECT 歌曲名 FROM 歌曲库 WHERE 发行日期 >= '2023-01-01' AND 发行日期 <= '2023-08-12' AND 数据日期 >= '2023-08-06' AND 数据日期 <= '2023-08-12' AND 结算播放量 > 10000000"
}
]