实验

1. 推理阶段的few-shot

首先考虑一下prompt的构成

如何把shot加入到prompt中?

这里参考一下baseline的方法。

LLM方法中的prompt构成:固定的指令+转化后的demo示例+转化后要处理的workload。对齐为characteristic的格式化标识。

推荐哪些shot?

查看一下index_selection_evaluator是如何适配到LLM baseline的,从而用启发式生成最好的标签。

添加shot具体的构造?

在线prompt的生成阶段。
单独加一段,再以组合embedding的方式放进去,或者格式化一种新的embedding,还是类似baseline拆解出来characteristic,但是受限于context还是要做embed。

尝试了LLM中的few-shot测试。

这里忘记了联合训练时的projector,要求SQL嵌入和column嵌入。也就并不适合用他们的fewshot的prompt结构。

所以尝试修改我们的在线prompt构建阶段以进行few-shot。分阶段进行。

  1. 参考shot的生成。
    这里打算直接复用LLM的baseline中获取启发式方法结果的接口。
    单独开一种数据格式专门用于shot?
    应该是需要的,实现一个pool用来retrieval.

  2. retrieval检索阶段。
    首先:考虑LLM那篇baseline的方法,即提取出characteristic的余弦相似度。
    或者:直接计算不同workload的embedding相似度,O(N)扫一遍所有嵌入,余弦相似排序取top-k。

  3. 嵌入阶段。
    这里先搞清楚,projector是如何与大模型结合的。
    因为projector的特殊,所以对于shot中的SQL也要做embedding,但是index最好直接用自然语言表征。
    所以这里的retrieval阶段也必须是不可见的,不能像baseline中显式拆解开直接当作prompt。

也就是对于推理阶段的一个workload:
构造在线prompt时,除了原始的文本转换之外,要做retrieval->先把workload拆开,对齐成pool中表征的形式,从而retrieval->得到retrieval的结果,sql用embedding的形式放入prompt,index用自然语言->构造结束。

1.1移植过程:

这里记录把baseline的方法迁移到我们的模型做few shot。

demo construction阶段

demo 持久化格式

demo余弦相似匹配时,首先会检索metadata,如果命中直接索引到

metadata

相当于缓存余弦匹配信息。
这里不关注细节,characterize和uncharacterize的过程对于prompt的构建是不可见的。

完整demo信息

这里关注"workload_id“:"{benchmark}_workload_{id}"用来索引到初始的子集wl。

以及索引信息的表征:CREATE/DROP INDEX的语句,这里要考虑在哪个阶段把语句转化为最基础的索引形式(table(column,...))?在refine阶段之后就可以了,此时已经准备好了wl与对应的标签,其实只需要返回wl包含的sql和标签,不再需要characteristics,同样也不需要重新执行CREATE/DROP INDEX。这时候用类似微调时的格式包装好,后面在推理的在线prompt生成时,根据sql找到对应的embed,再以自然语言的形式把索引放进去就行了。

构建pipeline

  1. 输入一个.sql池,并用workload_generation.py分割成随机大小子集wl.
  2. 启发式生成候选索引:使用magic_mirror
    输入为当前分割后的子集wl,放入custom_workloads/下面。
    原始输出是一些包含“workload/预算/对应索引”(每个算法都生成一遍)的文件。
  3. 在construct阶段,拆解上面的wl,并找到不同预算下的最佳候选索引,组装成demo。这里要注意cross join。
  4. 返回时寻找对应embed,这里在线做,即推理过程动态加载。要根据id->sql->md5 hash 找到对应的tensor。这里嵌入的方式复用model中加载sql_embedding的方法。
  5. 实现上可以把llm的baseline作为子模块,在function.py中加一个wrapper。

prompt构建阶段

10.30的待办:

  • demo检索已经完成了,但是demo中的索引格式还不能用。重点关注一下existed indexesdefault used indexes的区别。看看怎么样提取出来能直接返回的索引格式。最好是json格式的table-column映射。
  • 返回之后,思考在大模型的哪个阶段导入retriever。目前的想法是,在to_prompt函数,增加一个布尔开关:是否启用few-shot。以决定是否加载retriever类的返回值。这样也可以让后面 few shot sft的情况复用。开关暂时先不暴露,如果后面想加入到运行参数也比较简单。
  • 以及考虑如何将tensor填充进去。参考一下之前是直接在占位符的位置载入embed。。

2. 训练阶段的few-shot

3. dsb的差表现

数据库的特征:tapas表格嵌入再看一遍论文。sample_count的scale影响?区分PRICE和几个专用负载数据集。
workload的特征:要不要再做提取?
还是因为context的限制?

4. 用训练后的模型在LLM的baseline上测试

是为了测试zero-shot到few-shot的迁移能力。

这里考虑一下projector对于context的影响,以及sft格式与LLM中在线prompt完全不同的影响。

5.重新打标

意外发现之前生成的监督数据标签质量不够好。重新用RL的方法生成标签看看。
按说是sota的rl方法SWIRL表现也不比启发式好多少。

storage budget问题

导师也考虑到这个问题。所以要实现一个工具,用来给所有label排序,按delta cost/delta storage进行排序。都按虚拟值计算。这个工具要不要内嵌进SWIRL?看一下实现难度。