LanceDB 嵌入式向量库¶
为什么要学 LanceDB¶
LanceDB 是一个开源的嵌入式向量数据库,无需服务器即可运行,数据直接存储在本地或对象存储(S3)中。它基于 Lance 列式数据格式,天然支持多模态数据(文本、图像、视频的向量和原始数据共存),并且可以直接与 Pandas/Arrow 集成。对于需要零运维、低成本的向量搜索场景(桌面应用、边缘计算、小团队项目),LanceDB 是理想选择。
核心概念¶
| 概念 | 白话解释 | 用途 |
|---|---|---|
| Table | 表 | 存储数据的基本单位 |
| Lance Format | 列式存储格式 | 高效存储向量和元数据 |
| Embedding Function | 嵌入函数 | 自动将数据转为向量 |
| Index (IVF_PQ) | 近似最近邻索引 | 大数据量时加速搜索 |
| FTS Index | 全文搜索索引 | 关键词搜索能力 |
| Versioning | 数据版本控制 | 类似 Git 的数据版本管理 |
安装配置¶
安装¶
无需额外配置¶
LanceDB 是嵌入式数据库,不需要启动服务器,直接在代码中使用:
import lancedb
# 连接到本地目录
db = lancedb.connect("./my_lancedb")
# 连接到 S3
db = lancedb.connect("s3://my-bucket/lancedb")
快速上手¶
创建表和添加数据¶
import lancedb
import numpy as np
db = lancedb.connect("./demo_db")
# 方式1:从字典列表创建
data = [
{"text": "Python入门教程", "vector": np.random.rand(128).tolist(), "category": "python"},
{"text": "Rust性能优化", "vector": np.random.rand(128).tolist(), "category": "rust"},
{"text": "Go并发编程", "vector": np.random.rand(128).tolist(), "category": "go"},
]
table = db.create_table("articles", data)
# 方式2:从 Pandas DataFrame 创建
import pandas as pd
df = pd.DataFrame(data)
table = db.create_table("articles_v2", df)
搜索¶
# 向量搜索
query_vec = np.random.rand(128).tolist()
results = table.search(query_vec).limit(5).to_pandas()
print(results[["text", "_distance"]])
# 带过滤条件
results = (
table.search(query_vec)
.where("category = 'python'")
.limit(5)
.to_pandas()
)
使用嵌入函数(自动向量化)¶
from lancedb.embeddings import get_registry
from lancedb.pydantic import LanceModel, Vector
# 注册嵌入函数
embed_func = get_registry().get("sentence-transformers").create(
name="all-MiniLM-L6-v2"
)
# 定义模型
class Article(LanceModel):
text: str = embed_func.SourceField()
vector: Vector(embed_func.ndims()) = embed_func.VectorField()
category: str
# 创建表
table = db.create_table("auto_embed", schema=Article)
# 添加数据(自动计算向量)
table.add([
{"text": "Python 是最流行的编程语言", "category": "python"},
{"text": "Rust 保证内存安全", "category": "rust"},
])
# 搜索(自动将查询文本转为向量)
results = table.search("编程语言推荐").limit(3).to_pandas()
进阶用法¶
创建 ANN 索引¶
# 对大表创建 IVF_PQ 索引
table.create_index(
metric="cosine",
num_partitions=256, # IVF 分区数
num_sub_vectors=96, # PQ 子向量数
index_type="IVF_PQ"
)
# 搜索时使用索引
results = (
table.search(query_vec)
.nprobes(20) # 搜索的分区数(越大越精确)
.refine_factor(10) # 精化因子
.limit(10)
.to_pandas()
)
全文搜索¶
# 创建 FTS 索引
table.create_fts_index("text")
# 全文搜索
results = table.search("Python 教程", query_type="fts").limit(5).to_pandas()
# 混合搜索(向量 + 全文)
results = (
table.search("Python 编程", query_type="hybrid")
.limit(5)
.to_pandas()
)
数据更新¶
# 添加更多数据
table.add([
{"text": "新文章", "vector": [...], "category": "new"}
])
# 更新
table.update(
where="category = 'draft'",
values={"category": "published"}
)
# 删除
table.delete("category = 'deprecated'")
# 合并(优化存储)
table.compact_files()
table.cleanup_old_versions()
版本管理¶
# 查看版本
versions = table.list_versions()
for v in versions:
print(f"Version {v['version']}: {v['timestamp']}")
# 回退到特定版本
table.checkout(version=3)
# 恢复到最新
table.checkout_latest()
多模态数据¶
from lancedb.pydantic import LanceModel, Vector
import PIL.Image
class ImageDoc(LanceModel):
image_uri: str
image: bytes # 原始图像数据
vector: Vector(512) # CLIP 向量
caption: str
# 存储图像及其向量
table = db.create_table("images", schema=ImageDoc)
# 使用 CLIP 模型进行跨模态搜索
# 用文本搜索图像
results = table.search("a sunset over the ocean").limit(5).to_pandas()
与 LangChain 集成¶
from langchain_community.vectorstores import LanceDB
from langchain_openai import OpenAIEmbeddings
vectorstore = LanceDB.from_texts(
texts=["文本1", "文本2", "文本3"],
embedding=OpenAIEmbeddings(),
connection=db,
table_name="langchain_docs"
)
docs = vectorstore.similarity_search("查询", k=3)
常见问题¶
Q: 与 SQLite 比较?¶
- SQLite 是通用关系数据库,LanceDB 是专门的向量数据库
- LanceDB 针对向量搜索优化,列式存储更适合 AI 工作负载
- 两者都是嵌入式、零运维
Q: 适合多大规模?¶
单表可处理数百万到上千万行。超大规模建议使用 LanceDB Cloud 或切换到 Qdrant/Weaviate。
Q: 数据格式是否开放?¶
是的,Lance 是开放格式,可以直接用 PyArrow/Pandas 读取,不会被锁定。
Q: 如何处理并发访问?¶
LanceDB 使用 Copy-on-Write 机制,支持多读单写。对于多写场景需要应用层面加锁或使用 LanceDB Cloud。
Q: 与 Chroma 的区别?¶
- LanceDB:嵌入式、列式存储、支持 S3、多模态、版本控制
- Chroma:也可嵌入式但更常用 Client-Server、API 更简洁
参考资源¶
- GitHub:https://github.com/lancedb/lancedb
- 文档:https://lancedb.github.io/lancedb/
- Lance 格式:https://github.com/lancedb/lance
- 示例:https://github.com/lancedb/lancedb/tree/main/examples
- LanceDB Cloud:https://cloud.lancedb.com/