论文的实验框架要改很多地方。
几个已经确定的改动方向是:
-
SQL生成阶段直接按模板生成,这里的模板不是参数占位,而是指对于表和列名称的扰动。这样来屏蔽掉SQL的语义信息,因为索引推荐必须是与数据库-查询语义都无关的。
-
对比学习。这里则是在SFT阶段,加入对比学习损失项,相同模板损失小,不同模板损失大。
-
RL。这里RL不再作为label refinement,而是直接作为模型训练的阶段。考虑如何加入现有的框架流程。其实主要是reward的设计。
-
数据分布嵌入。这里的数据分布应该完全嵌入数据分布情况,不受语义和值类型影响,要对列归一化到纯粹的分布。此外,如果能考虑多列的相互作用会更好。
考虑第1个改动。
扰动应该放在workload解析和prompt生成之间的地方。现有的sql生成模板是对参数化的占位,同时,label生成不影响对训练数据的解析。所以扰动的表列名映射应该放到监督数据解析之后。
这里还有个重要的问题,就是如何处理嵌入。嵌入应该是放在扰动映射之后的阶段,但是现在的嵌入都是在训练和推理之外合成的,也就是不是在线的。这里sql与col的嵌入处理应该是不同的,sql嵌入应该必须是表列扰动后的sql文本做的嵌入,col的嵌入则要根据原始表列名寻找,否则要重新嵌入。这里col的嵌入就直接跳过扰动先用原始表列名索引到,并加载出来。
现在的一个问题是,LLM是否会根据列分布的特征来辨认出来这个列?如果会的话,那么仍然存在共现误差,即LLM记住列分布与列的对应关系。