一面之猿网
让这个世界,因为我,有一点点的不一样
Why Caiss —— 谈谈我为什么要做Caiss

大家好,我是Chunel,一个不会写代码的纯序员。今天,想跟大家聊聊我为什么要做这套智能搜索解决方案:caiss,并分享过程中一些有意思的事情。

image.png

起因

今年5月的一天,我上一家公司的一个好朋友给我打电话,问我之前做的ANN(Approximate Nearest Neighbor)算法组件,是否支持某个功能。我说支持。我当时做的时候,特意优化了算法的这一部分,就是感觉今后会被用到。然后用我残存的记忆,描述了一下应该如何使用。

过了几天,再次跟朋友聊到这事的时候,他说,他们已经考虑转用某大公司的开源解决方案了。原因是一方面有大公司的背书,会显得更加可靠;另一方面他的领导觉得我都不在了,如果继续使用我留下的内容,今后万一出了什么问题,也不好找人快速定位和支持。哈哈,前同事有问题,我从来都是尽力支持的好嘛🐶

自己做的东西将被逐步替换,多少有点遗憾。我一直觉得,在当今深度学习当道的背景下,ANN是必不可少的算法技术。无论是做以图搜图,人脸识别还是问答系统,基本上都绕不开它。我了解过 faissmilvusvearch 等开源方案,必须承认,他们做的很好、很专业,而且还有一些功能和很cool的技术,我还没能get到。但给我的感觉就是,在使用的时候,Python上手很方便。可提到C++嘛,因为环境问题,我至今没有跑通过任何一个工程。

我既然懂一些算法和工程方面的知识,为什么不做一点东西,支持和帮助其他需要这些功能的开发者,特别是C++的开发者呢?相关经验,我有;功能、性能和稳定性,我可以不断优化;说到大公司的背书,难道有我司大么[理直气壮的手动狗头]

过程

讲真,我不是那种很喜欢做长期规划的人。很多事情是说干就干,然后边干边改进的。于是,5月中旬开始,我基本上把所有周末休息的时间都用在上面了。

我平日的工作,虽然不是像外界传的996这么凶残,但也比较充实和忙碌,周中基本上是没时间做的。而我又想早点拿出来点能用的东西。所以刚开始的时候,我基本上就是每个周五和周六晚上连续两个通宵coding,第二天早上6点睡到中午12点,然后起来继续搞。

比较有意思的是,有一个周日的下午,一个老朋友约我出来玩。我们坐在星巴克,我点了一杯果汁。他问我,今天怎么不喝咖啡了。我说,今天我已经喝过三杯咖啡了🙄

就这样,过了一个多月,第一个版本跑通并自测结束了。当时我觉得,已经比我在上一家公司做的好很多了,可能这就是我在新公司的一点进步吧。但我还有很多想法,想继续实现。于是,接下来的几个月,我又在caiss中加入了很多实用且有意思的功能,比如:对Mac/Linux/Windows系统的兼容,针对自定义距离的支持,高并发和加速计算的引入,增加了对众多主流编程语言(C/C++,Python,Java,C#)的支持,加入了通过sql语法进行crud的功能等。为的就是能让大家更好的接入和使用起来。

期间,我还通过阿里云的ECS服务器,部署了基于caiss的服务,对外提供英文相似词语搜索的能力。并且注册了 杭州名猿网,作为caiss的交流论坛。有点蹭上海名媛们热度的嫌疑,目的除了#姐姐,我不想努力了#之外,就是为了促进大家更方便的交流,高效做事,共同提高。

过程中也得到了一些朋友的支持,在这里就不一一提及和感谢了,毕竟要请客吃饭的,已经请过了。不过,我要特别感谢我的女神,因为在这期间,她基本上不回我微信,给我留了足够多时间用来开发,哈哈。

现状

目前,caiss已经可以较好完成基于向量或者标签的快速相似搜索功能,也提供了大量的demo帮助大家快速接入,而且已经在支持几家公司(其中,还有来自漂亮国的公司哦)的相关业务了。源码开放在我个人的github上:caiss源码地址。我还邀请了两个道上朋友,帮忙进行开发和测试的工作,一起朝着积极的方向发展。

如果让我写一些相比于其他解决方案,我推荐caiss的理由的话,我想,如果您需要自己构建服务,或者是想开发一些本地类似语义认知的软件的话,我推荐您用caiss。因为它是一套本地非服务化的解决方案,没有网络调用耗时,并且上手非常简单,功能也很强大。而且,您完全可以基于它和一些其他的相关组件,开发属于自己的功能更丰富的搜索推荐服务和应用。

还有,就是如果现在的你,在ANN算法方面是小白,根本没有听说过kdtree,nsg,hnsw或者annoy这些算法,我更推荐你使用caiss。因为它在训练和查询的过程中,完全屏蔽了复杂算法原理和对应的参数调优的流程。你可以直接设定优化目标(比如:准确率 > 98%),它就会在不断的训练过程中,自动帮你拟合合适的参数,直至达到目标。至于这其中算法的理论和实现,我想,你可以在实现功能之后,再自行选择,到底是白piao,还是先上车后补票嘛😁

image.png

规划

现在,我已经不会通宵去肝代码了,毕竟剩下的头发不多了。不过我还是在休息的时间,继续更新和维护caiss的功能。比如现在在做的多词查询,可以有效的减少调用次数,从而进一步降低耗时。同时,我还想过把caiss做成分布式的。比如,我们通过类似sql语句: [ select * from CaissModelA join CaissModelB where word like 'water' ],就能在不同的服务器的不同caiss模型中,快速搜到到跟 "water" 相关的信息,并智能合并,那将是一件多酷的事情。

希望大家有空的时候,也可以多多交流,多提意见。我也会一如既往的,在我有空的时候,提供一些能力范围内的支持和帮助。如果您对此很感兴趣,也期待跟您合作,一起把它做的更好。

					  					[2020.10.18 by Chunel]

个人信息

微信: ChunelFeng
邮箱: chunel@foxmail.con
github地址: https://github.com/ChunelFeng