• 文章
  • 谷歌编程之夏 2023 - Qdrant 向量数据库的多边形地理过滤器
返回 Qdrant 内部机制

谷歌编程之夏 2023 - Qdrant 向量数据库的多边形地理过滤器

Zein Wen

·

2023年10月12日

Google Summer of Code 2023 - Polygon Geo Filter for Qdrant Vector Database

引言

您好,我是 Zein Wen,是 Qdrant 2023 年谷歌编程之夏的参与者。我有幸与一位出色的导师 Arnaud Gourlay 合作,改进 Qdrant 地理多边形过滤器。这项新功能允许用户使用多边形来精确筛选查询结果。作为地理过滤器系列(包含半径和矩形过滤器)的最新成员,这项增强功能有望在查询地理数据时提供更大的灵活性,开启有趣的新用例。

项目概述

A Use Case of Geo Filter

地理过滤器的一个用例 (https://traveltime.com/blog/map-postcode-data-catchment-area)

由于 Qdrant 是一个强大的查询向量数据库,它为机器学习驱动的应用(如推荐系统)提供了巨大的潜力。然而,仅凭向量查询可能无法始终满足用户需求。考虑一个场景:您正在寻找餐厅推荐;您想要的不仅仅是餐厅列表,而是您附近区域内的餐厅。这时地理过滤器就派上用场了,它通过加入额外的过滤条件来增强查询。直到现在,Qdrant 的地理过滤选项仅限于圆形和矩形,这可能与现实世界中复杂多样的边界不符。正是这个场景促使用户提出了功能请求,我们认为这是一个值得解决的好功能,因为它为地理相关查询引入了更大的能力。

技术挑战

1. 地理几何计算

Geo Space Basic Concept

地理空间基础概念

在内部,地理过滤器并非逐个测试每个地理位置,因为这会消耗大量计算资源。相反,我们创建了一个地理哈希层,它将世界划分为矩形。当为 Qdrant 条目创建空间索引时,它会根据条目的位置将其分配给相应的地理哈希。

在查询过程中,我们首先识别满足过滤器的所有潜在地理哈希,然后检查这些哈希内的位置候选者。完成此搜索涉及两个关键的几何计算:

  1. 确定多边形是否与矩形相交
  2. 确定点是否位于多边形内。
Geometry Computation Testing

几何计算测试

尽管我们有一个地理 crate(一个 Rust 库)提供了这些计算的 API,但我们深入研究了底层的算法,并验证了它们的准确性。这促使我们进行了广泛的测试和可视化来确定其正确性。除了评估当前的 crate,我们还发现有多种算法可用于这些计算。我们投入时间探索了不同的方法,例如卷绕数算法和射线投射算法,以理解它们之间的区别,并为未来的改进铺平道路。

通过这个过程,我提高了快速掌握不熟悉概念的能力。此外,我还需要发展分析策略来剖析这些概念并从中得出有意义的结论。这段经历对我扩展解决问题的工具箱来说是宝贵的。

2. Proto 和 JSON 格式设计

我们花费了相当大的精力来设计这项新功能的 ProtoBuf 和 JSON 接口。这部分组件直接暴露给用户,因此需要一个一致且用户友好的接口,这反过来有助于提升用户体验并在未来减少代码修改。

最初,考虑到 GeoJSON 作为许多地理相关 API 的标准,我们曾考虑让我们的接口与之对齐。然而,我们很快意识到 GeoJSON 定义几何图形的方式与我们现有用于点半径和矩形过滤器的 JSON 和 ProtoBuf 坐标定义差异很大。因此,我们优先考虑了 API 级别的一致性和用户体验,选择将新的多边形定义与我们所有现有的定义对齐。

此外,我们曾计划在多边形过滤器之外,单独开发一个多重多边形过滤器。然而,经过仔细考虑,我们认识到,对于我们的用例而言,多边形过滤器可以实现与多重多边形过滤器相同的效果。这种关系类似于我们目前处理多个圆形或矩形的方式。因此,我们认为多重多边形过滤器是多余的,并且会给 API 引入不必要的复杂性。

做这项工作让我认识到在现实世界解决方案中权衡遵循既定标准和优先考虑用户体验的挑战。这也是理解专注于开发用户真正需要的功能,而不过度投入精力的重要性。

成果

1. 深入钻研的能力 导航不熟悉的代码库、概念、API 和技术是开发者面临的普遍挑战。参与 GSoC 对我来说,就像从安全的游泳池一头扎进了广阔的海洋。在这段过渡时期,我的导师的支持是无价的。他给了我很多独立深入探索我从未涉足过的领域的机会。我现在已经不再害怕未知的技术领域,无论是陌生的代码、技术,还是特定领域的概念。我对自己一步步学习并运用它们创造出我所构想的事物充满了信心。

2. 始终将用户放在首位 我学到的另一个重要教训是考虑用户体验及其特定用例的重要性。尽管开发有时可能涉及迭代过程,但直接影响用户的每个方面都必须以同理心对待和执行。忽视这一点不仅可能导致功能错误,还会因不一致和混乱而侵蚀用户的信任,从而导致他们不再使用我的成果。

3. 勇于表达和有效沟通 最后,在开发过程中,遇到不同意见是很常见的。保持开放的态度接受他人的想法至关重要,同时也要坚定地清晰表达自己的观点。这有助于促进富有成效的讨论,并最终提升开发过程的质量。

总结

入选 2023 年谷歌编程之夏,并与 Arnaud 和其他 Qdrant 工程师以及所有社区成员合作,这真是一种荣幸。我非常感谢那些投入时间和精力审查我的代码、参与关于替代方案和设计选择的讨论以及在需要时提供帮助的人们。通过这些互动,我亲身体验了开源的本质和鼓励协作的文化。这次经历不仅让我第一次为实际产品编写 Rust 代码,也为我打开了通向精彩开源世界的大门。

毫无疑问,我渴望继续与这个社区一起成长,并为提升产品的新功能和增强贡献力量。我也成为了 Qdrant 的支持者,向科技行业的许多同事和朋友介绍了这个项目。我很高兴看到新的用户和贡献者从我的圈子中涌现!

如果您想尝试我的成果,请阅读文档,然后注册一个免费的云账户或下载 Docker 镜像。我期待看到人们如何在他们自己的应用中使用我的成果!

此页面是否有帮助?

感谢您的反馈! 🙏

很抱歉听到这个消息。 😔 您可以在 GitHub 上编辑此页面,或创建 GitHub issue。