跳转至

LanceDB 嵌入式向量库

为什么要学 LanceDB

LanceDB 是一个开源的嵌入式向量数据库,无需服务器即可运行,数据直接存储在本地或对象存储(S3)中。它基于 Lance 列式数据格式,天然支持多模态数据(文本、图像、视频的向量和原始数据共存),并且可以直接与 Pandas/Arrow 集成。对于需要零运维、低成本的向量搜索场景(桌面应用、边缘计算、小团队项目),LanceDB 是理想选择。


核心概念

概念白话解释用途
Table存储数据的基本单位
Lance Format列式存储格式高效存储向量和元数据
Embedding Function嵌入函数自动将数据转为向量
Index (IVF_PQ)近似最近邻索引大数据量时加速搜索
FTS Index全文搜索索引关键词搜索能力
Versioning数据版本控制类似 Git 的数据版本管理

安装配置

安装

pip install lancedb

# 带嵌入模型支持
pip install "lancedb[embeddings]"

无需额外配置

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/