seq搜索引擎优化至少包括那几步?( 博文基线模型原理如何实现semanticsearch?|模型)
优采云 发布时间: 2021-11-18 20:20seq搜索引擎优化至少包括那几步?(
博文基线模型原理如何实现semanticsearch?|模型)
重现基线模型
我们选择重现的模型是 Hamel 模型。
图片来源和参考博文
基线模型原理
如何实现语义搜索?我们需要创建一个代码空间和语言空间共享的向量空间,如下图
通过将代码和自然语言映射到这个向量空间,可以比较{text, code}的相似度,选择相似度最高的那个进行匹配。所以当我们输入自然语言文本进行代码搜索时,我们将语言片段转换为共享空间中的向量,然后从代码构建的向量数据库中寻找最相似的进行匹配并返回。
概述
整个过程可以分为五个步骤:
预处理
数据预处理,从数据库中提取代码(函数)、文档字符串和代码路径。通过代码创建词汇表,将代码转化为向量,然后作为编码器的输入。docstring 是代码的注释,词汇表也被转换成向量作为监督训练编码器的标签。保存代码路径以查找源代码的索引,并在匹配成功时将其返回给用户。
代码编码器
这里使用了Seq2Seq模型,采用了教师强制的训练策略。什么是老师强迫?RNN 模型通常使用前 T-1 步的输出作为输入来预测下一步 T,但教师强制策略使用前 T-1 步的 Ground Truth 作为当前输入。
Seq2Seq模型采用Encoder和decoder结构,使用GRU构建。
句子(文本)编码器
使用 fast.ai 中的 AMD_LSTM 模型,输入文档字符串以训练和预测句子中的下一个单词。训练好的模型被转移到编码的短语或句子中。什么是 AMD_LSTM 模型?AMD_LSTM 是目前最先进的语言模型之一,在字符模型方面也取得了突出的成功。一个简单的描述就是它使用了一些正则化方法、DropConnect 策略和 NT-SGD 优化器来改进传统的 LSTM 网络,使其具有更好的泛化语言能力。
代码到发送编码器
在预训练的 Seq2Seq 模型的基础上,以上一步训练的语言模型的代码向量作为输入,输出作为监督,对之前的代码编码器进行微调,将代码向量映射到共享空间。
模型的优缺点
这个模型实现了代码语义搜索,取得了不错的效果,但是每一步的过程都尽可能的简化了(作者也在博客中调整了这一点)。
机型优势
该模型的优点之一是为codeSearch的任务提供了一个整体框架,即将code和docstring编码到同一个向量空间进行比较,完成搜索。另一个是该模型不仅可以应用于代码语义搜索,还可以自然地扩展到其他搜索或匹配,例如只需要映射到一个向量空间。
型号缺点
缺点,首先是非常耗时和计算资源,感觉这个模型还是比较大的。二是有很多的简化和改进,比如不用的代码本身就很有条理,直接把代码当成自然语言处理。
模型再现结果
我们复现的是Semantic Code Search项目,主要参考博客How To Create Natural Language Semantic Search For Arbitrary Objects With Deep Learning
环境配置
由于项目环境配置过程比较复杂,我们使用了作者推荐的Docker容器:hamelsmu/ml-gpu。我们的机器配置,硬件是12核Intel Core i9 CPU,2个NVIDIA RTX 2080 Ti,系统是Ubuntu 16.04,CUDA版本是10.1,使用Python3.6。
数据准备
从BigQuery下载数据,数据格式如下图所示:
使用AST库存,首先将数据解析成(code, docstring)对,结果如下:
<p>将上表中pair项中的数据展开为function_name、lineno等,然后对数据进行去重,根据是否有docstring(至少3个字)对数据进行划分,然后对数据进行划分用docstring根据