脸书为了让开发者可以快速找到需要功能的程序代码片段,开发了新的程序代码搜索工具NCS(Neural Code Search),开发者可以直接使用自然语言进行程序代码搜索。
NCS使用GitHub存储库当作训练数据库,以热门开发者论坛Stack Overflow上的问题进行搜索,而模型可以正确回答诸如“如何隐藏Android屏幕键盘?”以及“如何删除整个文件夹以及内容?”等问题,回传相关的程序代码片段。
NCS是一种结合自然语言以及信息搜索技术的应用,脸书提到,不少开发者的需求,早就已经存在于大型程序代码存储库其中,因此可以使用自然语言描述问题,直接从程序代码库中得到答案,将能加快开发工作。NCS还附有扩展组件UNIF,当有足够的监督式数据,便能使用这个扩展组件进行监督式训练,以改进模型的性能。
NCS模型以嵌入(Embedding)的方式截取程序语义,也就是说,经过适当地计算,语义相似的程序代码实体在矢量空间会相当靠近,像是(下图)隐藏或是关闭Android屏幕键盘的问题,即便两个功能程序代码不同,但是在矢量空间相当靠近。
脸书以这个概念构建NCS模型,在构建模型的阶段,每个程序代码片段都会被嵌入到矢量空间中,而在执行查询的时候,用户的查询会被映射到同一个矢量空间中,矢量的距离是估计程序代码片段和查询相关的程度。
GitHub存储库中的程序代码,被当作训练NCS模型的数据,在Stack Overflow上评估NCS的性能,脸书把Stack Overflow上的标题作为查询,并把答案中的程序代码当成是解答,然后评量NCS对查询的回应,出现在Stack Overflow解答前1、前5以及前10的次数。在创建的287个问题中,NCS的回答出现在前10的有175个问题,相当是整个数据集的60%,其中前5的有136个问题,回答就跟问题的最佳解答相同的有83题。
最近脸书在搜索程序代码研究进行了不少研究,在不久前才刚发布了程序代码推荐工具Aroma,让开发者以程序代码搜程序代码的方式,针对相同问题,探索其他更好的解决方式。