AI向量数据库LanceDB
作者:微信文章01LanceDB是什么
LanceDB 是AI 原生多模态数据湖产品,采用自研的开源数据格式Lance,以解决传统数据格式在大规模非结构化数据场景中的局限性,已被多家AI 公司,如Runway 和Midjourney 等采纳。 LanceDB 在存储后端方面提供了多种选择,以满足用户在成本、延迟、可扩展性和可靠性方面的不同需求。
LanceDB 是开发人员构建生产就绪搜索和生成式 AI 应用程序的首选,包括电子商务搜索、推荐系统、RAG(检索增强生成)和自主代理。
LanceDB 作为一个矢量数据库,原生地将矢量与多种数据模式(文本、图像、视频、音频)一起存储,作为统一的数据存储,无需单独的数据库来管理源数据。
支持如下几种部署方式和版本:
嵌入式: LanceDB OSS数据库是一个在您的应用程序中运行的库,使其能够在多个远程存储选项(例如 S3)之上简单且廉价地实现。
无服务器: LanceDB Cloud 是一个完全托管的无服务器矢量数据库,可以根据您的存储或搜索需求自动扩展,从而消除基础设施管理开销。
托管: LanceDB Enterprise 提供专用的企业级部署,具有高级安全性、合规性功能以及对关键任务 AI 应用程序的专门支持。
02LanceDB的安装和应用
LanceDB 推荐使用 Python 3.8 或更高版本。pandas软件包是可选的,但建议用于数据操作。
pip3 install lancedbpip3 install pandas
本地使用嵌入式版本
import lancedburi = "data/test-lancedb"db = lancedb.connect(uri)# 如果数据库不存在,会自动创建
创建表
data = [ {"vector": , "name": "Gandalf", "level": 99, "role": "Wizard"}, {"vector": , "name": "Aragorn", "level": 85, "role": "Ranger"}, {"vector": , "name": "Gimli", "level": 70, "role": "Dwarf"},]df = pd.DataFrame(data)table = db.create_table("my_table", data=df)
#创建一个空表schema = pa.schema()table2 = db.create_table("empty_table", schema=schema)
查看库中的表列表和查看表数据
print(db.table_names())tbl = db.open_table("my_table")
#全量查看数据print(tbl.search().to_pandas())
#按条件筛选数据result = tbl.search().select(["vector","name"]).where("name = 'Lisi'").limit(5).to_pandas()print(result)
表中添加数据
tbl.add([{"vector": , "name": "Lisi", "level": 99, "role": "Wizard"}])
删除表中记录
tbl.delete('name = "Gandalf"')
删除表
db.drop_table("my_table") 使用完整SQL查询是仅在LanceDB Enterprise中可用的预览功能
03 向量搜索
向量搜索是一种基于向量表示(称为嵌入)来搜索相似项的技术。它也被称为相似性搜索、最近邻搜索或近似最近邻搜索。
原始数据(例如文本、图像、音频等)通过嵌入模型转换为嵌入,然后存储在 LanceDB 等向量数据库中。为了进行大规模相似性搜索,需要在存储的嵌入上创建索引,以便快速查找。
3.1 关于度量
支持一下几种:
l2:欧氏距离,默认度量
cosine:余弦相似度, 适用于非标准化向量。
dot 点积, 用于已归一化的向量可获得最佳性能。
hamming 汉明距离,仅适用于以压缩 uint8 数组形式存储的二进制向量。
tbl.search(np.random.random((1536))).distance_type("cosine").limit(10).to_list()
3.2 ANN索引进行向量搜索
如果要搜索的准确度,执行暴力搜索是一种好的选择,基本上就是对所有的向量进行相似度计算,然后返回最相似的向量,相当于 kNN 搜索。
kNN 和每个向量都做距离计算,计算量比较大,所以需要使用 ANN 搜索,ANN 搜索是一种基于树的搜索方法,使用树结构来存储向量,然后通过树的搜索来找到最相似的向量。对于速度比完美召回率更重要的大规模应用,请使用 ANN 搜索。LanceDB 使用近似最近邻算法快速提供结果,而无需检查数据集中的每个向量。
LanceDB 设计上就是为 ANN (Approximate Nearest Neighbor, 近似最近邻) 搜索而生的,只有在您手动创建了 ANN 索引之后,LanceDB 才会使用 ANN 算法进行搜索。否则,它会执行效率低但准确率 100% 的暴力搜索。
索引创建依赖以下几种参数:
1.索引类型:IVF_PQ,默认索引类型,针对高维向量进行优化;IVF_HNSW_SQ,将 IVF 聚类与 HNSW 图相结合,以提高搜索质量
2. metrics:默认为l2,其他可用为cosine或dot。当使用cosine相似性时,距离范围从 0(相同向量)到 2(最大不相似)
3. num_partitions:索引 IVF 部分中的分区数。此数字通常用于确定每个分区的特定向量数量。
4. num_sub_vectors:乘积量化 (PQ) 期间将创建的子向量的数量。此数量通常根据所需的召回率和向量的维数来选择。
下面是一个完成的ANN向量搜索的例子:
data = pd.DataFrame({ "id": range(1000), "text": , "category": , "vector": })tbl = db.create_table("ann_table", data=data, mode="overwrite")tbl.create_index( metric="cosine", # 设置距离度量,例如 "cosine", "l2", "dot" index_type="IVF_PQ",# 使用 ANN 索引类型 # num_partitions=64, # (可选)调整分区数,影响召回率和速度 # num_sub_vectors=16 # (可选)调整子向量数,影响压缩率 replace=True # 如果已经存在同名索引,则替换它)query_vector = np.random.rand(128).astype(np.float32).tolist()tbl.search(query_vector) .where("category = 'Category 2'") .limit(5) .to_pandas()3.3 暴力搜索
1. 无索引的暴力搜索
当您需要保证 100% 的召回率时,请选择暴力搜索,通常用于较小的数据集,查询速度并非主要考虑因素。系统会扫描表中的每个向量,并计算精确的距离以找到精确的最近邻。
tbl.search(np.random.random((1536))).limit(3).to_list()
2. 绕过向量索引搜索
通过对所有向量执行详尽搜索,获取精确的、符合实际的结果。系统通过bypass_vector_index不依赖近似方法,而是直接将您的查询与表中的每个向量进行比较,从而确保 100% 的召回率,但会增加查询时间。代价是性能较慢
table.search(embedding).bypass_vector_index().limit(5).to_pandas()04为什么说LanceDB是AI向量数据库
4.1 基于Lance格式存储
LanceDB 是构建在 Lance 格式之上的。Lance 格式是 Apache Arrow 生态系统中的一种新的、开源的列式数据格式,它专门针对以下 AI 数据的特性进行优化。https://github.com/lancedb/lance
Lance 的主要特点包括:
高性能随机访问:比 Parquet 快 100 倍,且不牺牲扫描性能。
向量搜索:在几毫秒内找到最近的邻居,并将 OLAP 查询与向量搜索相结合。
零拷贝、自动版本控制:无需额外的基础设施即可管理数据版本。
生态系统集成: Apache Arrow、Pandas、Polars、DuckDB、Ray、Spark 等。
4.2 ANN 搜索和混合检索
LanceDB 的主要功能是服务于 AI 检索需求:
高性能 ANN 索引: 支持如 IVF_PQ 和 IVF_HNSW_SQ 等高性能的近似最近邻(ANN)索引,确保在查询数十亿向量时仍能保持毫秒级的延迟。
混合搜索 (Hybrid Search): 允许同时进行向量相似性搜索(语义匹配)和基于 SQL/FTS(全文搜索)的元数据过滤(精确匹配)。这对于 RAG(检索增强生成)系统至关重要,能够确保结果既相关又符合业务逻辑。
可以通过数据库完成图片视频检索,图片或视频帧首先通过多模态模型(如 CLIP)转化为高维的嵌入向量。这些向量存储在 Lance 表的 vector 列中。LanceDB 在 vector 列上构建ANN索引(如 IVF-PQ、HNSW)来实现图片或视频检索。
4.3 嵌入式架构和易用性
LanceDB 采用嵌入式(Serverless/In-Process)架构,消除了传统数据库服务器的运维成本,这与 AI/ML 开发者的工作流高度吻合:
本地优先: 数据库与应用在同一进程中运行,安装简单,使用方便,无需单独部署和管理服务器。
开发到生产的平滑过渡: 相同的代码可以在本地运行(嵌入式)或指向云端服务(LanceDB Cloud),方便开发者快速原型设计和扩展。
4.4 生态系统集成
它与主流的 AI/ML 工具链无缝集成:
LangChain / LlamaIndex: 作为向量存储后端,直接支持 RAG 工作流。
Pandas / Polars / PyArrow: 由于基于 Apache Arrow,与数据科学中常用的数据帧库之间的数据交换是零拷贝的,性能极高。
LanceDB 的设计理念是从零开始,专为解决AI嵌入和检索的痛点而打造,因此它被称为 AI向量数据库,而不是一个通用的数据库加入了向量功能。
页:
[1]