0

为 Bloop 语义代码搜索提供支持

Qdrant 团队

·

2023 年 2 月 28 日

Powering Bloop semantic code search

bloop 成立于 2021 年初,是首批解决代码库语义搜索的公司之一。快速、可靠的向量搜索数据库是语义搜索引擎的核心组件,bloop 对现有解决方案进行了调查,甚至考虑自行构建。他们发现 Qdrant 是最有力的竞争者,现在已在生产环境中使用。

本文旨在为那些打算将语义搜索引入新领域并希望了解 Qdrant 是否适合其用例的人提供指导。

关于 bloop

bloop 是一款快速代码搜索引擎,它将语义搜索、正则表达式搜索和精确代码导航整合到一个可在本地运行的轻量级桌面应用程序中。它帮助开发人员理解和导航大型代码库,使他们能够发现内部库、重用代码并避免依赖膨胀。bloop 的聊天界面以简单的语言解释复杂的概念,让工程师们花更少的时间爬梳代码来理解它的作用,而将更多时间用于发布功能和修复 bug。

bloop 的使命是让软件工程师自主工作,而语义代码搜索是这一愿景的基石。该项目由一群 Rust 和 Typescript 工程师以及机器学习研究人员维护。它利用了许多著名的新兴技术,例如 TauritantivyQdrantAnthropic

关于 Qdrant

Qdrant 是一个用 Rust 编写的开源向量搜索数据库。它部署为 API 服务,提供最近邻高维向量的搜索。借助 Qdrant,嵌入或神经网络编码器可以转化为功能完备的应用程序,用于匹配、搜索、推荐以及更多解决方案,以充分利用非结构化数据。它易于使用、部署和扩展,速度极快且同时准确。

Qdrant 于 2021 年由 Andre Zayarni 和 Andrey Vasnetsov 在柏林创立,其使命是利用先进且高性能的 向量相似性 搜索技术为下一代人工智能应用提供支持。他们的旗舰产品是向量搜索数据库,以开源 https://github.com/qdrant/qdrant 或托管云解决方案 https://cloud.qdrant.io/ 的形式提供。

问题

首先,什么是语义搜索?它通过比较含义来查找相关信息,而不是简单地测量查询和文档之间的文本重叠。我们通过比较**嵌入**来比较含义——这些是由神经网络生成的文本的向量表示。每个文档的嵌入表示潜在空间中的一个位置,因此要搜索,您需要嵌入查询并查找其在该空间中最接近的文档向量。

为什么语义搜索对代码如此有用?作为工程师,我们经常不知道或忘记找到所需内容所需的精确术语。语义搜索使我们无需知道确切的术语即可找到事物。例如,如果工程师想了解“哪个库用于支付处理?”,语义代码搜索引擎将能够检索包含“Stripe”或“PayPal”的结果。传统的词法搜索引擎则不能。

这个问题的特殊之处在于,**解决方案的有用性随着代码库的大小而增加**——如果你只有一个代码文件,你将能够快速搜索它,但你很容易在数千,更不用说数百万行代码中迷失。一旦代码库达到一定规模,单个工程师就不可能阅读每一行代码,因此导航大型代码库变得极其繁琐。

在软件工程中,我们总是要处理复杂性。已经开发了允许我们将代码模块化、抽象化并编译成库以供重用的编程语言、框架和工具。然而,我们仍然会遇到限制:抽象仍然存在漏洞,尽管在减少偶然复杂性方面取得了巨大进步,但我们所解决的问题中仍然存在大量的内在复杂性1,随着软件吞噬世界,需要解决的复杂性增长已经超出了我们控制它的能力。语义代码搜索帮助我们驾驭这些不可避免的复杂系统。

但语义搜索不应以速度为代价。即使搜索像 Rust 这样庞大的代码库(拥有超过 280 万行代码!),搜索也应感觉瞬时完成。Qdrant 在使用合理资源的同时为 bloop 提供了出色的语义搜索性能,因此他们可以处理并发搜索请求。

结果

bloop 对 Qdrant 融入其语义代码搜索引擎的方式非常满意:即使对于大型代码库,它也表现出色且可靠。它使用 Rust 编写(!),并提供了易于集成的 qdrant-client crate。简而言之,Qdrant 帮助 bloop 的代码搜索保持快速、准确和可靠。

脚注


  1. 偶然复杂性是源于我们流程和工具的弱点而产生的复杂性,而内在复杂性是我们在试图描述,更不用说解决问题时所面临的复杂性。 ↩︎

免费开始使用 Qdrant

开始使用