从我离开的地方
我不是那种会对自己的作品产生强烈依恋的人。大约在1620天前(约4.44年)决定离开Redis后,我就再也没有看过Redis的源代码、提交信息或任何与Redis相关的内容。偶尔需要用到Redis时,我只是下载下来编译一下。只需输入“make”,看到多年之后构建Redis依然如此简单,我就感到非常开心。
我的这种抽离并非因为憎恶过去的工作。从长远来看,我的创造性工作变得越来越不重要,而“打理项目”的事务却变得越来越繁重——这种转变许多程序员都能适应,但那不是我所擅长的——不过,离开时我依然享受做Redis相关的事情。然而,我并不认同许多与我同龄人(我现在47岁)所持的观念:认为自己还年轻。我想去做些新事情,尤其是写作。我想多陪陪家人,帮助亲人。我确实需要休息一下。
不过,在“写作的那些年”里(顺便说一句,我现在仍在写作),我常常会回到编程中,把它当作高强度写作间隙的休息方式(写作是我发现的唯一一种比编程累得多的脑力活动):我做了几个嵌入式项目;更多地摆弄神经网络;搭建Telegram机器人:什么都尝试了一点。随性地折腾固然很酷,但久而久之,我感觉自己缺乏一个真正的目标,并且每天都愈发迫切地想重新成为科技世界的一员。与此同时,我看到Redis社区出现了分裂,即便作为旁观者,这也让我有些担忧。
于是我开始想,也许终究我可以在Redis生态中重新扮演一个角色。或许我能够重塑公司对社区的态度。也许我甚至能帮助让Redis核心重新成为新开发的主要焦点。基本上,我可以成为某种“布道者”(我不太喜欢这个头衔,但……你懂的),一方面在公司与社区之间架起桥梁,另一方面也能制作编程演示、发明并阐述新的模式,撰写关于新旧功能的文档、视频和博客文章。那么,新功能的设计呢?我可以从一线人们的实践与困境中学习,将其提炼,并反馈设计思路,以推动Redis的演进。
在纽约的时光
有一天,我12岁的女儿——她是我生命中至关重要的人,以她的聪慧、创造力和爱点亮我的每一天——想在生日时去纽约。我们觉得,是的,这毕竟是个好主意,最近我们度过了非常艰难的几年,那为什么不呢?我的女儿如今已更像个少女而非孩童。于是,在纽约时我想:也许现在正是时候,我可以做一份兼职工作。就在不久前,我在一次视频通话中见到了Redis的新任CEO Rowan Trollope(罗恩·特罗洛普)。我感觉我可以与他合作,调整公司未来与社区的关系以及代码库的发展方向。于是我给他写了一封邮件说:你觉得我能以某种身份回归吗?罗恩·特罗洛普对我的提议表现出了兴趣,我们很快达成了一致。
关于许可证变更
人们会追问我*真正*这么做的动机,是否有我上面所写之外的幕后故事,是否涉及什么协议,或是一大笔钱;是否有什么古怪或不明之处。但有时候事情就是很无聊:1. 是我主动联系的公司,而不是相反。2. 我回归并没有拿到离谱的报酬,并非要利用某种局面——只是正常的薪水(但声明一下:是的,我和以前一样持有Redis的股票期权,不多也不少)。3. 我对Redis更换许可证并没有太大意见;具体来说,我并不认为与社区的裂痕*真正*是因为这个。但既然人们会问起这个非常重要的问题,还是马上把真相全部告诉你们为好。
许可的两难
我几乎一生都在编写开源软件。然而,就像我是个无神论者,但看到他人信仰上帝、如果这能帮助他们度过人生的艰难时我依然感到高兴一样,我也不认为开源是编写软件的唯一方式。当初我在自己作为两位创始人之一的公司背景下开始开发Redis时,我们的代码是闭源的(Redis之所以开源,是因为它被认为不属于核心产品)。我们只是不想让别人复制我们的服务,就这么简单。所以在这方面我并非极端分子——我只在软件设计上极端。
此外,我不认为开放性和许可就只是OSI所定义的那样。我把许可看作一个关于你能做什么、不能做什么的光谱。与此同时,我真的担心大型云服务提供商已经改变了系统软件领域的激励机制。Redis并非唯一更换许可证的项目,实际上它是……一大堆项目中的最后一个。而且我感觉,近年来许多项目甚至根本没有启动,就是因为缺乏清晰的潜在商业模式。所以,Redis的许可证变更并非我的决定,也许我会选择不同的许可证?我不确定,现在远离一线多年、又没有商业压力,再去翻案太容易了。但总体上,我能理解这一选择。
而且,如果你去读新的Redis许可证,当然,它不是BSD,但基本上只要你不把Redis当作服务来出售,你就可以以与之前非常相似的方式和自由度来使用它(我的意思是,你仍然可以修改Redis、再分发它、在你的营利性公司中商业化地免费使用Redis,等等)。你*甚至*仍然可以把Redis当作服务来出售,只要你把所有编排系统都以相同许可证发布(这大概没人会真的去做,但这体现了该许可证的copyleft思路)。许可证的措辞与AGPL几乎相同,只是针对SAAS相关的部分做了修改。所以,没有通过OSI认证?是的,但我不太认同把SSPL称为闭源许可证。
你会说(我能听见):真正的问题是有公司在控制OSS项目的方向!所以最终利益会越来越向公司倾斜,而越来越少顾及用户群体。我很感激外面有许多完全没有公司直接参与(除了外部赞助)的项目,但话说回来,你知道吗?在许多大型项目中,公司的参与实际上减缓了这种偏离正确道路的过程。在Redis的案例中,肯定就是如此。
软件界的罗宾汉
让我们回到过去,回到Redis最早的日子。
当Redis开始流行时,我想找一种方式继续从事它的开发。那是在VMware提出赞助我的工作之前。我开始琢磨商业模式,猜猜是什么?是某种闭源产品的形式,在这样或那样的方式上帮助人们运行Redis。(令人惊讶的是,与这个想法相关的一个仓库至今仍在线,展示着*15*年前的提交:https://github.com/antirez/redis-tools)
我当时准备尝试某种open core(开放核心)模式;我还记得曾考虑对新代码的BSD许可延迟六个月,以给付费用户创造某种优势。现在我不认为我会当个混蛋、跟用户玩什么花招,但如果没有VMware,以及后来更大程度上Redis Labs的支持,我就不可能成为我后来所成为的那种人:一个开源软件的“活罗宾汉”,被一家公司优厚地报酬,却不是为了公司本身的利益,而只是为了实现Redis社区的最大利益。我确信,这比自己拥有一家公司要好得多。
VMware,以及后来的Redis Labs,不只是为我一个人付费。如果你快速浏览一下仓库的贡献历史,会看到历史贡献第二多的是Oran Agra(奥兰·阿格拉)(Redis),然后是Pieter Noordhuis(彼得·诺德赫伊斯)(VMware),依此类推。
所以基本上我认为,12年来专注于用户群体编写的BSD代码是一笔很划算的交易,也是值得高兴的事。而现在对我来说最重要的是,与社区的裂痕并不在于许可,至少主要不在于许可。实际上,新的许可证可以解决其中一部分:现在不再有动力把核心仅仅置于维护模式、而把新开发都放到模块中。有了新许可证,云服务提供商不能再只是复制粘贴Redis代码库拿去售卖而无需任何收入分成(这真的要求过分吗?这本可以避免你最近看到的所有许可证变更,不只是Redis)。有了新许可证,聚光灯可以重新回到Redis核心上,让全世界的开发者手握新的、令人兴奋的功能。让数十位获得良好报酬的人在GitHub仓库中推动有用且文档完善的变更。这也是我想帮助公司做的事情之一,我会努力去做。我们需要让许可证的变更对用户群体和功能产生积极影响:这就是我的想法。
关于AI、LLM与向量索引
但还有更多:Redis开始对开发vector capabilities(向量能力)产生兴趣,总体上也希望支持你能用AI进行的那类编程。现在,我每天都会看Hacker News,看到大量技术人员不喜欢AI和新进展。我还看到很多人甚至懒得深入尝试最新的可用模型(提示:Claude AI独树一帜)却仍将其贬为有点无用。对我而言则不同。我一直热爱神经网络。我在2003年写了我的第一个神经网络库,并被整个概念的强大与酷炫彻底震撼。而现在,在2024年底,我终于在该领域看到了令人难以置信的成果,几年前看起来像科幻小说的东西如今已成为可能:最近Claude AI是我的推理/编辑/编程伙伴。我能够完成比过去多得多的工作。我常常因为AI而做*更多的工作*,但也做得更好。最近我为一家意大利出版社写了一篇科幻短篇,在Claude对其中部分提出批评后,我重写了结尾,创作出了一部好得多的作品(我没有让Claude写故事或情节的任何一行:对AI的出色运用不是让机器去做你能做得更好的事)。
昨天我需要评估对我的向量进行8位quantization(量化)后点积计算能快多少;我告诉Claude我需要一个以特定方式设计的基准测试,两分钟后我就能测试、修改并判断它是否值得。基本上,AI没有取代我,AI通过对我工作的反馈加速了我、提升了我。而且我相信(无论RAG(RAG,检索增强生成)有多流行,它未必是主要应用,也未必最具未来性或最有用,因为模型的上下文正变得越来越大,而且很快主流模型的注意力机制可能具备线性复杂度),抱歉跑题了,我是想说我相信learned embeddings(学习型嵌入)会留存下来,而vector search(向量搜索)属于Redis,原因有几个:首先是因为vector indexes(向量索引)是数据结构,特别是很慢的数据结构,而这类数据结构在内存中可以非常高效地工作。还有,因为我认为我找到了暴露它们的完美API。
在我设计Redis的工作中,我总是表现出一些矛盾的倾向。我总是随时准备对某些看起来与项目完美契合的东西说“不”(命名Lua脚本、哈希字段过期,这些顺便说一下现在都已成为Redis的一部分),但与此同时我又加入了Lua脚本能力——当时看起来简直疯了,在Redis里放一个解释器?!——还有Pub/Sub能力,那时看起来格格不入,然后是streams,甚至还有计算机科学教科书中都不存在的合成数据结构,比如sorted sets。因为对我而言,新功能是否适合Redis取决于两件事:用例和内部设计的契合度。对我来说,Redis是给程序员的乐高,而不是一个“产品”。
向量集合
所以最近我开始思考,sorted sets可以启发一种新的数据类型,其中分数实际上是一个向量。而在与罗恩·特罗洛普洽谈期间,我开始撰写一份设计文档,随后开始为新数据结构实现一个概念验证,从零开始重新实现HNSWs(HNSW,分层可导航小世界)(而不是使用现有库之一,因为我想对每一个细节进行调优),以Redis的方式,嗯,我不确定这最终会如何结束,我仍处于编码的早期阶段,但如果这个提案被接受,也许我最终会再次贡献代码。我实现的这个模块(之后会合并到核心中——目前为了简单起见只是一个模块)实现了直接操作embeddings(嵌入)的新命令。我只给你看一点作为提示:
VSIM top_1000_movies_imdb ELE "The Matrix" WITHSCORES
1) "The Matrix"
2) "0.9999999403953552"
3) "Ex Machina"
4) "0.8680362105369568"
5) "Akira"
6) "0.8635441958904266"
7) "District 9"
8) "0.8631418347358704"
9) "The Martian"
10) "0.8608670234680176"
11) "The Bourne Ultimatum"
12) "0.8599717319011688"
13) "The Bourne Supremacy"
14) "0.8591427505016327"
15) "Blade Runner"
16) "0.8585404753684998"
17) "Metropolis"
18) "0.8572960793972015"
19) "Inception"
20) "0.8521313071250916"所以你有了VSIM、VADD、VCARD,所有显而易见的东西。这完全就是sorted sets的思路,只不过分数是多维的(embeddings!)并且是K-NN匹配。你觉得怎么样?当然,除此之外还有许多实现技巧可以让事情更高效。但目前只是概念验证代码,让我再多做一些。我正在实现threading、dimensionality reduction(降维)、quantization等等许多东西。说实话,相当有趣。
如你所见,这里没有提到hybrid search(混合搜索),这个关于vector stores(向量存储)的最新流行词。这又是Redis的方式:让开发者发挥作用,自行决定权衡:毕竟他们知道自己在建模什么。每个键对应一个vector index,就像程序员过去用sorted sets所做的那样,他们会发明有趣的拆分策略、新的模式、Lua脚本、各种模式以及建模其用例所需的一切。
尽管如此,虽然关联的条目通常可能是一个小字符串或文档ID,但没有什么能阻止它成为更复杂的东西,带有可稍后过滤的元数据(但我会克制)。我只是感觉许多用例其实并不需要复杂的服务端过滤,可以通过预先分区数据来建模。
我非常感兴趣的是,可能会增加一个STORE选项,将结果存储到sorted set中而不是返回给用户,其中分数当然就是相似度。所有这些对效率、可扩展性、使用脚本的能力等方面也会产生复杂而有趣的影响:我希望在接下来的几周和几个月里有机会更多地谈论它。
好了,好了:回到这篇博文的主题。但也许上述内容才是*真正的*重点,即拥有令人兴奋的新想法。
所以,我回来了 🙂
说了这么多,就是想说,我回来了。我觉得现在正是向多年来做出贡献的整个Redis社区郑重道谢的恰当时机。回头见,希望这段旅程还能有更多值得增添的内容。
附言:我在BlueSky上很活跃,如果你想关注这一切的进展。https://bsky.app/profile/antirez.bsky.social
随机一篇博客