跳转到内容

💭 常见问题

本节涵盖了一些在使用LanceDB时可能遇到的常见问题和情况。

LanceDB是开源的吗?

是的,LanceDB是一个基于Apache 2.0许可证的开源向量数据库。我们还提供无服务器SaaS解决方案LanceDB Cloud,采用商业许可证。

Lance与LanceDB有什么区别?

Lance 是一个专为AI设计的现代列式数据格式,采用Rust 🦀编写。它非常适合构建搜索引擎、特征存储,以及作为需要高性能IO和混洗操作的大规模机器学习训练任务的基础。该格式还原生支持存储、查询和检查深度嵌套数据(如机器人技术领域的数据)以及大型二进制对象(如图像、点云等)。

LanceDB是基于Lance构建的向量数据库,它利用底层优化的存储格式来构建高效的基于磁盘的索引,为语义搜索和检索应用提供支持,涵盖从RAG到问答机器人再到推荐系统等多种场景。

为什么要发明另一种数据格式而不是使用Parquet?

正如我们在题为“Lance,一种现代列式数据格式”的演讲中所提到的,Parquet及其衍生的其他表格格式已经相当陈旧(Parquet已有10多年历史),特别是在向量随机访问方面。我们需要一种能够平衡复杂权衡的数据格式,以处理涉及向量的数据洗牌、扫描、OLAP和大型数据集过滤等操作,而我们对Parquet的大量实验表明,它无法为现代机器学习提供足够的性能水平。我们的基准测试显示,Lance在随机访问方面比Parquet快达1000倍,这证明了我们为AI创建新数据格式的决定是合理的。

为何选择Rust语言开发?🦀

我们相信Rust生态系统已达到主流成熟度,未来几年Rust将成为数据和机器学习领域的重要基础。性能、延迟和可靠性对向量数据库至关重要,而使用Rust构建使我们能够借助其安全性保证更快地迭代和发布更新。Lance(数据格式)和LanceDB(数据库)都完全采用Rust编写。我们还提供Python、JavaScript和Rust客户端库来与数据库交互。

LanceDB 开源版与LanceDB云服务有何区别?

LanceDB OSS是一个嵌入式(进程内)解决方案,可作为您LLM和RAG应用的首选向量存储。它可以嵌入到现有应用后端中,或与现有机器学习和数据工程管道一起在进程内使用。

LanceDB Cloud 是一个无服务器解决方案 —— 数据库和数据都存储在云端,我们通过远程客户端管理应用端的可扩展性,无需管理任何基础设施。

LanceDB的两种版本都受益于极快的Lance数据格式,并建立在相同的开源基础之上。

LanceDB 有何独特之处?

LanceDB是少数我们相信能在浏览器或通过边缘函数开启全新LLM驱动应用类别的嵌入式向量数据库之一。Lance的多模态特性允许您一次性存储原始数据、元数据和嵌入向量,这与通常只存储嵌入向量和元数据的其他解决方案不同。

支撑我们存储系统的Lance数据格式还通过Apache Arrow提供了真正的零拷贝访问能力,并能与众多其他数据格式(如Pandas、Polars、Pydantic)实现无缝互操作,同时具备自动数据版本控制和数据管理功能,无需额外基础设施支持。

LanceDB能处理多大的数据集?

LanceDB及其底层数据格式Lance专为处理海量数据(数百TB级别)而设计。我们目前合作的客户经常对超过2亿个向量执行操作,并且我们正快速迈向十亿级及更大规模,这些都能通过我们的基于磁盘的索引高效处理,无需您承担高昂成本。

不。LanceDB即使在暴力kNN搜索场景下也极其快速(得益于其基于磁盘的索引),在合理范围内。我们的基准测试显示,计算10万对1000维向量耗时不到20毫秒。对于约10万条记录的小型数据集或可接受约100毫秒延迟的应用场景,通常不需要ANN索引。

对于大规模(超过100万)或更高维度的向量,创建ANN索引是有益的。详情请参阅ANN索引部分。

是的,LanceDB通过Tantivy支持全文搜索(FTS)。我们当前的FTS集成仅支持Python,我们的目标是在未来版本中将其下推到Rust层,以便为Python、JavaScript和Rust客户端提供更强大的搜索功能。请关注Github issue以获取最新进展。

如何加速数据插入?

强烈建议通过批量插入(例如使用Python中的Pandas DataFrames或字典列表)来加速大型数据集的插入操作。逐条插入记录速度较慢,并可能导致性能不佳,因为每次插入都会在磁盘上创建一个新的数据片段。批量插入允许LanceDB创建更大的片段(及其关联的清单文件),这些片段在读写时效率更高。

使用索引时需要设置优化因子吗?

是的。LanceDB使用PQ(Product Quantization,乘积量化)技术来压缩向量,并在使用近似最近邻(ANN)索引时加速搜索。然而,由于PQ是一种有损压缩算法,它在减小索引大小的同时往往会降低召回率。为了解决这种权衡,我们引入了一个称为精炼(refinement)的过程。常规流程通过操作压缩后的PQ向量来计算距离。精炼因子(rf)是一个乘数,它会获取与给定查询最相似的top-k个PQ向量,然后获取rf * k完整向量,并计算它们与查询向量之间的原始向量距离,最后根据这些分数重新排序top-k结果。

例如,如果您正在检索前10个结果并将refine_factor设置为25,LanceDB将获取250个最相似的向量(根据PQ),然后基于这些250个向量的完整向量重新计算距离,并根据它们的分数重新排序。这可以显著提高召回率,只需增加少量的延迟成本(通常为几毫秒),因此建议您在部署解决方案之前将refine_factor设置为5-50之间的任何值,并测量其对延迟的影响。

如何在保持低延迟的同时提高IVF-PQ召回率?

使用IVF-PQ索引时,查询时的召回率与延迟之间存在权衡关系。您可以通过增加探测次数和refine_factor参数来提高召回率。我们在GIST-1M数据集上的基准测试表明,在大多数系统上使用约50次探测和50的refine_factor值,可以在10毫秒延迟内实现大于0.95的召回率。当然,这取决于具体的数据集,您可以对自己的数据进行快速敏感性研究。更多基准测试详情请参阅我们的博客文章

如何连接到MinIO?

MinIO支持与S3兼容的API。要连接到MinIO实例,您需要:

  • 将环境变量 AWS_ENDPOINT 设置为您的 MinIO API 的 URL
  • 设置环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 为您的MinIO凭证
  • 调用 lancedb.connect("s3://minio_bucket_name")

在哪里可以找到LanceDB的基准测试数据?

请参考这篇文章查看最新的基准测试结果。

LanceDB 在实际应用中能管理多少数据而不影响性能?

我们的目标是在约100-500亿行和约10-30TB数据量上实现良好性能。

LanceDB是否支持并发操作?

LanceDB能够很好地处理并发读取,并且可以水平扩展。主要限制在于您选择的存储层的扩展能力。对于写入操作,我们支持并发写入,但过多的并发写入可能会导致写入失败,因为写入器重试提交的次数是有限的

使用LanceDB进行多进程处理

对于多进程处理,您可能不应使用fork,因为lance内部是多线程的,而fork与多线程配合效果不佳。Refer to this discussion