最完整LanceDB入门指南:从安装到向量搜索实战
你是否正在构建AI应用时遇到以下问题:需要高效存储和搜索海量向量数据?寻找一个既简单易用又具备生产级性能的向量数据库?LanceDB正是为解决这些问题而生。本文将带你从安装开始,逐步掌握LanceDB的核心功能,最终完成一个向量搜索实战案例。读完本文后,你将能够:
- 在本地或云端环境安装和配置LanceDB
- 创建数据库和数据表,插入和管理数据
- 理解向量搜索的基本原理和实现方式
- 构建高效的向量索引以提升搜索性能
- 完成一个完整的向量搜索应用案例
什么是LanceDB
LanceDB是一个开发者友好的无服务器向量数据库(Vector Database),专为AI应用设计。它基于Lance列式格式构建,提供快速、可扩展且具备生产就绪能力的向量搜索功能。你可以轻松存储、索引和搜索PB级的多模态数据和向量。
LanceDB支持多种部署方式:
- 嵌入到现有后端应用中(如Django、Flask、Node.js或FastAPI应用)
- 直接从客户端应用(如Jupyter notebook)用于分析工作负载
- 部署为远程无服务器数据库
安装LanceDB
LanceDB提供多种编程语言的SDK,包括Python、TypeScript和Rust。以下是各语言的安装方法:
Python安装
pip install lancedb
对于预览版(包含最新功能和修复):
pip install --pre --extra-index-url https://pypi.fury.io/lancedb/ lancedb
TypeScript安装
npm install @lancedb/lancedb
注意:使用Webpack打包
@lancedb/lancedb应用时,需要在next.config.js中配置排除webpack处理:/** @type {import('next').NextConfig} */ module.exports = ({ webpack(config) { config.externals.push({ '@lancedb/lancedb': '@lancedb/lancedb' }) return config; } })
Yarn用户还需要手动安装'apache-arrow':
yarn add apache-arrow
Rust安装
cargo add lancedb
安装前需要先安装protobuf:
- macOS:
brew install protobuf - Ubuntu/Debian:
sudo apt install -y protobuf-compiler libssl-dev
连接数据库
安装完成后,首先需要连接到LanceDB数据库。LanceDB会自动创建不存在的目录(包括父目录)。
Python连接
import lancedb
# 设置数据库路径
db_path = "./my_lancedb"
# 连接数据库
db = lancedb.connect(db_path)
异步API:
import lancedb
# 设置数据库路径
db_path = "./my_lancedb"
# 异步连接数据库
db = await lancedb.connect_async(db_path)
TypeScript连接
import * as lancedb from "@lancedb/lancedb";
// 连接数据库
const db = await lancedb.connect("data/sample-lancedb");
Rust连接
use lancedb::connection::Connect;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let db = lancedb::connect("data/sample-lancedb").await?;
Ok(())
}
创建数据表
连接数据库后,下一步是创建数据表。LanceDB支持从初始数据创建表或创建空表并指定 schema。
从初始数据创建表
Python示例
# 准备数据
data = [
{"vector": [3.1, 4.1, 5.9], "b": "foo", "c": 1.0},
{"vector": [2.7, 1.8, 2.8], "b": "bar", "c": 2.0},
]
# 创建表
table = db.create_table("my_table", data)
也可以直接传入pandas DataFrame:
import pandas as pd
df = pd.DataFrame(data)
table = db.create_table("my_table", df)
TypeScript示例
const data = [
{ id: 1, vector: [0.1, 0.3], item: "foo", price: 10.0 },
{ id: 2, vector: [3.9, 0.5], item: "bar", price: 20.0 },
];
const table = await db.createTable("my_table", data);
创建空表
有时你可能需要先创建空表,之后再添加数据。这时需要指定表的schema。
Python示例
from lancedb.schema import Schema, Field
schema = Schema([
Field("vector", "fixed_size_list(float32, 3)"),
Field("b", "string"),
Field("c", "float32")
])
table = db.create_table("my_table", schema=schema)
LanceDB还支持使用Pydantic定义schema,使处理LanceDB表和数据更加容易。详细信息请参见表指南。
数据操作
添加数据
创建表后,可以随时向表中添加更多数据:
Python示例
# 添加数据
more_data = [
{"vector": [1.0, 2.0, 3.0], "b": "baz", "c": 3.0},
{"vector": [4.0, 5.0, 6.0], "b": "qux", "c": 4.0},
]
table.add(more_data)
TypeScript示例
const moreData = [
{ id: 3, vector: [1.0, 2.0], item: "baz", price: 30.0 },
{ id: 4, vector: [4.0, 5.0], item: "qux", price: 40.0 },
];
await table.add(moreData);
查询数据
LanceDB支持多种查询方式,包括向量搜索、全文本搜索和SQL查询。
向量搜索基础
向量搜索是LanceDB的核心功能。以下是一个基本的向量搜索示例:
Python示例
# 向量搜索
query_vector = [3.1, 4.1, 5.9]
results = table.search(query_vector).limit(2).to_pandas()
print(results)
TypeScript示例
const results = await table.search([0.1, 0.3]).limit(20).toArray();
console.log(results);
创建向量索引
默认情况下,LanceDB对数据集执行暴力扫描以找到K个最近邻(KNN)。对于包含超过50K向量的表,建议创建ANN索引以提高搜索性能。
Python示例
# 创建索引
table.create_index(
metric="L2", # 距离度量,可选L2、cosine或dot
num_partitions=256, # IVF分区数
num_sub_vectors=96, # PQ子向量数
)
TypeScript示例
await table.createIndex({
metric: "L2",
numPartitions: 256,
numSubVectors: 96,
});
为什么需要手动创建索引? LanceDB不自动创建ANN索引有两个原因:首先,它针对基于磁盘的索引进行了优化,以实现真正快速的检索;其次,数据和查询工作负载可能非常多样化,因此没有一刀切的索引配置。LanceDB提供了许多参数来微调索引大小、查询延迟和准确性。
删除数据
使用表的delete()方法可以从表中删除行。要选择要删除的行,请提供一个与元数据列匹配的过滤器。
Python示例
# 删除价格大于20的行
table.delete("price > 20")
删除表
使用数据库的drop_table()方法可以永久删除表:
Python示例
# 删除表
db.drop_table("my_table")
向量搜索原理
向量数据库基础
向量数据库是一种专门用于存储和搜索向量数据的数据库。原始数据(文本、图像、音频等)通过嵌入模型转换为嵌入向量,然后存储在向量数据库中。为了实现大规模的相似性搜索,需要在存储的嵌入向量上创建索引,然后使用该索引执行快速查找。
暴力搜索
最简单的向量搜索方法是执行暴力搜索,不使用索引,计算查询向量与数据库中所有向量之间的距离,返回前k个最近的向量。这相当于向量空间中的k近邻(kNN)搜索。
暴力搜索方法对于大于几十万向量的数据集来说不可扩展,因为查询延迟随数据集大小线性增长。这就是近似最近邻(ANN)算法的用武之地。
近似最近邻(ANN)搜索
近似最近邻(ANN)算法不执行对整个数据库的穷举搜索,而是使用索引来缩小搜索空间,从而显著减少查询延迟。其代价是结果不保证是查询的真正最近邻,但对于大多数用例通常"足够好"。
LanceDB使用IVF-PQ(Inverted File with Product Quantization)作为其主要索引方法,这是一种基于磁盘的高效索引结构。
IVF-PQ索引由两部分组成:
- 倒排文件(IVF):将向量空间划分为多个聚类,每个向量分配给一个聚类
- 乘积量化(PQ):将高维向量压缩为低维表示,减少存储和计算成本
实战案例:文本相似性搜索
下面我们将构建一个完整的文本相似性搜索应用,使用LanceDB存储文本嵌入向量并执行相似性搜索。
步骤1:准备环境和数据
首先安装必要的依赖:
pip install lancedb sentence-transformers pandas
步骤2:创建嵌入函数
我们使用Sentence-Transformers库创建文本嵌入:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def embed_text(text):
return model.encode(text).tolist()
步骤3:准备数据并插入LanceDB
import lancedb
import pandas as pd
# 连接数据库
db = lancedb.connect("text_db")
# 示例文本数据
data = [
{"text": "The quick brown fox jumps over the lazy dog", "category": "animals"},
{"text": "A group of lions is called a pride", "category": "animals"},
{"text": "Python is a popular programming language", "category": "technology"},
{"text": "LanceDB is a fast vector database", "category": "technology"},
{"text": "The Eiffel Tower is located in Paris", "category": "travel"},
{"text": "Sushi is a traditional Japanese dish", "category": "food"},
{"text": "Machine learning is a subset of artificial intelligence", "category": "technology"},
{"text": "The Great Barrier Reef is the world's largest coral reef system", "category": "nature"},
]
# 转换为DataFrame并添加嵌入向量
df = pd.DataFrame(data)
df["vector"] = df["text"].apply(embed_text)
# 创建表
table = db.create_table("text_embeddings", df, mode="overwrite")
# 创建索引
table.create_index(metric="cosine")
步骤4:执行相似性搜索
# 查询文本
query = "What is a vector database?"
query_vector = embed_text(query)
# 执行搜索
results = table.search(query_vector).limit(3).to_pandas()
# 显示结果
print("查询文本:", query)
print("\n相似文本:")
for i, row in results.iterrows():
print(f"{i+1}. {row['text']} (类别: {row['category']}, 相似度: {1 - row['_distance']:.4f})")
进阶功能
混合搜索
LanceDB支持混合搜索,结合向量搜索和SQL过滤:
# 搜索技术类别中与查询相似的文本
results = table.search(query_vector).where("category = 'technology'").limit(2).to_pandas()
全文本搜索
LanceDB还支持全文本搜索,可以与向量搜索结合使用:
# 全文本搜索示例
results = table.search().where("text LIKE '%database%'").limit(2).to_pandas()
多模态搜索
LanceDB支持多模态数据搜索,可同时处理文本、图像等多种数据类型。有关多模态搜索的更多信息,请参见多模态搜索示例。
生态系统集成
LanceDB与多种流行工具和框架集成:
- LangChain:LangChain集成
- LlamaIndex:LlamaIndex集成
- Apache-Arrow:原生支持Arrow格式
- Pandas/Polars:支持DataFrame直接导入导出
- DuckDB:支持SQL查询
总结与展望
LanceDB是一个功能强大、易于使用的向量数据库,为AI应用提供高效的向量搜索能力。本文介绍了LanceDB的安装、基本操作、核心概念和实战案例。通过LanceDB,你可以轻松构建具有长期记忆能力的LLM应用。
后续你可以探索更多高级功能:
- 自定义嵌入函数:自定义嵌入函数指南
- 索引调优:IVF-PQ索引指南
- 云部署:LanceDB云服务
要了解更多信息,请参阅:
- 官方文档:docs/src/index.md
- 示例代码:docs/src/examples/
- API参考:docs/src/api_reference.md
希望本指南能帮助你快速上手LanceDB,构建出色的AI应用!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考











