实验
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。分阶段进行。
-
参考shot的生成。
这里打算直接复用LLM的baseline中获取启发式方法结果的接口。
单独开一种数据格式专门用于shot?
应该是需要的,实现一个pool用来retrieval. -
retrieval检索阶段。
首先:考虑LLM那篇baseline的方法,即提取出characteristic的余弦相似度。
或者:直接计算不同workload的embedding相似度,O(N)扫一遍所有嵌入,余弦相似排序取top-k。 -
嵌入阶段。
这里先搞清楚,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
- 输入一个.sql池,并用workload_generation.py分割成随机大小子集wl.
- 启发式生成候选索引:使用
magic_mirror。
输入为当前分割后的子集wl,放入custom_workloads/下面。
原始输出是一些包含“workload/预算/对应索引”(每个算法都生成一遍)的文件。 - 在construct阶段,拆解上面的wl,并找到不同预算下的最佳候选索引,组装成demo。这里要注意cross join。
- 返回时寻找对应embed,这里在线做,即推理过程动态加载。要根据id->sql->md5 hash 找到对应的tensor。这里嵌入的方式复用model中加载sql_embedding的方法。
- 实现上可以把llm的baseline作为子模块,在function.py中加一个wrapper。
prompt构建阶段
10.30的待办:
- demo检索已经完成了,但是demo中的索引格式还不能用。重点关注一下
existed indexes和default 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?看一下实现难度。