在推荐或者搜索场景中,高质量的召回都是很有必要的,有时候ann搜索算法(Approximate Nearest Neighbor)可以帮助我们实现这一个功能
ngt是yahoo日本团队基于graph和tree做的的ann搜索工具,地址:https://github.com/yahoojapan/NGT
它实现了onng/pnng的算法,对应的论文
onng: https://arxiv.org/abs/1810.07355
pnng: https://www.aclweb.org/anthology/P16-1214.pdf
- 看上面的benchmark,它是可以保持优势的
- github上维护比较勤,代码的质量比较高
- ngt还有一个兄弟开源代码仓, ngtd,也就是ngt的server版本,主要开发语言是go,调用ngt提供的cgo binding,这个对于算法的工程化非常有用,因为c++的后端开发成本还是有点高的
ngtd这里不展开讲,因为它跟算法相关的不多,这里主要讲ngt以及go调用ngt的binding
step1:
安装ngt
https://github.com/yahoojapan/NGT/releases
我用的是1.9.1
下载后解压,
ngt的依赖很少,很容易就安装成功了,注意可能需要sudo权限
step2:
安装gongt https://github.com/yahoojapan/gongt
step3
验证安装
随机生成128维的数据,生成100k条数据,生成索引,然后做10次ann搜索,看看耗时
由于用的是随机数,这里不验证准确性
测试代码
输出