作为一个终日以代码为伴的码农,防止不了会接触到各种代码提醒工具,然而呢,用久了之后会发现他们都有个共同点,那就是 模型微小 ,动辄几百兆;并且模型大必然须要更多的计算,同样会导致电脑内存占用高,风扇呼呼的转,工夫久了逐步会发现电脑存储不够用了,电脑变卡了等等问题。
那么,有没有一款轻量化的代码提醒插件?或者说,如何实现一款轻量化的代码提醒插件呢?
上面我会从 模型抉择、模型实现、模型优化三个方面 来介绍咱们在代码智能提醒方面的一些实际。
模型抉择
如何掂量一个模型的成果是好还是不好呢?
咱们首先建设了根本的模型掂量体系,见下图。
咱们会从举荐的 准确性 、 完整性 、 连续性 、 性能 、 个性化 以及 智能性 六个维度去综合评估一个模型的优劣。之后,咱们会进一步欠缺这个体系,使之可能零碎残缺的评测模型的成果。
实际中,咱们选取了 GPT- 2 模型和基于 markov 的 n -gram 统计模型进行比照。
比照发现,GPT- 2 模型在 准确性 和完整性 方面体现优异,然而在 性能 方面,因为模型较大,举荐一次耗时较久,(这里咱们试了起码参数的版本,训练之后模型在 500M 左右,举荐一次大略须要 10S),因为临时没找到模型压缩的办法,只能临时放弃。
另一个 n -gram 模型,在测试后发现,它在 继续举荐 和性能 方面体现优异,模型大小仅有 40M,但也并非完满,在 准确性 和完整性 方面体现的不是很好。
在实践中,咱们发现,举荐耗时在毫秒级别可能使用户顺畅无妨碍的编写上来,多于 1s,则会让用户的输出产生进展。基于此咱们临时选取 n -gram 作为咱们的举荐模型。
模型实现
上面介绍一下 n -gram 模型的基本原理以及咱们的实现。
首先,n-gram 模型基于马尔可夫链的假如,即:以后这个词呈现的概率仅仅跟后面几个无限的词相干。以最简略的 n = 2 为例,即 下一个词呈现的概率仅跟之前 一个 词相干,基于这个思维,咱们将大量代码进行切分,这样咱们失去了很多的二元组,这里能够应用单词的呈现次数代表概率。这样,咱们依据一个词就能够失去一个不同概率分布的举荐列表,而后每次都以以后词进行举荐,就能够产生继续一直的举荐了。切分的成果参考这张图
以下是模型训练和产生举荐的大抵流程。
模型优化
在实在利用中,仅仅有这些是远远不够的。模型只是其中一部分,更多的应该是在利用过程中,根据实践经验和用户的反馈,对模型进行一直调优:
- 比方,在理论利用中,基于同一个上下文,咱们个别会同时产生基于 n =3,n= 4 等等不通粒度的举荐,咱们会给不通粒度赋予不同的权重,而后联合概率进行筛选和排序,并且依据实际效果以及咱们的反馈体系,对权重进行断优化,确保产生最佳成果的举荐。
- 另外,为了让举荐更加个性化,咱们的模型须要具备实时训练的能力,即用户的输出在产生举荐的同时,还要参加模型的增量训练,并依据用户理论的抉择对模型进行调优,确保模型的准确性和个性化,大抵流程图如下
- 还有,为了失去更加轻量的模型,咱们对语料库也进行了精简,比方,在初始模型中,咱们对呈现概率极低的语料进行了删减,放弃模型的笨重和高效,同时因为具备实时训练的能力,确保这个操作不会影响到举荐的准确率。
结语
当然,目前的这些对于一个笨重好用的代码提醒来说是远远不够的,以后咱们正在尝试欠缺模型的掂量体系,并且在尝试更多轻量的语言模型,心愿给用户提供完满的体验。
原文链接
本文为阿里云原创内容,未经容许不得转载。