LangChain教程:LanceDB向量数据库

介绍

LangChain 与 LanceDB 的搭配 非常适配轻量级、高性能、易部署的向量检索场景,尤其是 Python 生态下的 RAG、数据分析、实时数据更新场景。LanceDB 作为基于 Lance 格式的开源向量数据库,天生适配 Pandas/Polars 等数据分析工具,与 LangChain 集成后,既保留了 LangChain 的 RAG 生态能力,又能发挥 LanceDB 轻量、快速、支持数据版本化的优势。

优势

对比 Milvus、Chroma、FAISS 等向量库,这套组合的核心亮点:

优势点 具体说明
极致轻量化 无需部署服务,纯 Python 库(pip install lancedb),数据存储为本地文件(.lance 格式),开箱即用
高性能 基于 Lance 列存格式,向量检索速度接近 FAISS,且支持过滤检索、增量更新(比 FAISS 灵活)
数据生态兼容 原生支持 Pandas/Polars/DataFrame,可直接将分析后的数据转为向量入库,适配数据+向量融合场景
版本化与可回溯 支持数据版本管理,可回溯历史版本的向量数据,适合需要数据迭代的场景
LangChain 深度集成 LangChain 提供 LanceDB 向量存储类,API 与其他向量库(Milvus/Chroma)一致,学习成本低
支持混合检索 可同时基于向量相似度 + 结构化条件(如时间、来源)过滤检索,适配复杂业务规则

安装依赖

pip 安装

pip install lancedb

poetry 安装

poetry add lancedb

常用方法

LangChain 对 LanceDB 的封装遵循统一的 VectorStore 接口,核心方法与 Milvus/Chroma 一致:

方法 用途 示例关键参数
from_documents() 从 Document 列表创建表并入库 documents(文档列表)、embedding(嵌入模型)、connection(LanceDB 连接)
from_texts() 从纯文本列表创建表并入库 texts(文本列表)、metadatas(元数据列表)
similarity_search() 基础语义检索 query(查询文本)、k(返回数量)、where(元数据过滤条件)
similarity_search_with_score() 检索并返回分数 同 similarity_search()
add_documents() 追加文档数据 documents(新增文档列表)
delete() 删除数据 ids(文档ID列表)

例子

from langchain_community.vectorstores import LanceDB
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_core.documents import Document
import lancedb
import os

# ---------------------- 1. 初始化配置 ----------------------
# 设置阿里云灵积 API Key
os.environ["DASHSCOPE_API_KEY"] = "你的API Key"
# 初始化嵌入模型
embeddings = DashScopeEmbeddings(model="text-embedding-v2")

# ---------------------- 2. 初始化 LanceDB 连接 ----------------------
# 方式1:内存模式(临时测试,重启丢失)
# db_conn = lancedb.connect(":memory:")
# 方式2:本地文件模式(持久化,推荐)
db_conn = lancedb.connect("./lancedb_data")  # 数据存储到本地 lancedb_data 目录

# ---------------------- 3. 准备数据 ----------------------
docs = [
    Document(page_content="LanceDB 是轻量级向量数据库,支持列存和版本化", metadata={"source": "LanceDB 官网", "type": "技术文档"}),
    Document(page_content="LangChain 集成 LanceDB 实现语义检索,适配 Python 生态", metadata={"source": "LangChain 文档", "type": "集成指南"}),
    Document(page_content="LanceDB 原生支持 Pandas DataFrame,可直接入库分析数据", metadata={"source": "实战教程", "type": "使用技巧"})
]

# ---------------------- 4. 数据入库 ----------------------
# 方式1:从 Document 列表入库(推荐,带元数据)
db = LanceDB.from_documents(
    documents=docs,
    embedding=embeddings,
    connection=db_conn,  # LanceDB 连接对象
    table_name="langchain_lancedb_demo"  # 自定义表名(类似 Milvus 的集合名)
)

# 方式2:从纯文本列表入库
# texts = ["文本1", "文本2"]
# db = LanceDB.from_texts(texts=texts, embedding=embeddings, connection=db_conn, table_name="demo")

# ---------------------- 5. 核心检索操作 ----------------------
# 5.1 基础语义检索
query = "LanceDB 如何与 Python 数据工具配合?"
similar_docs = db.similarity_search(query=query, k=2)
print("=== 基础检索结果 ===")
for i, doc in enumerate(similar_docs):
    print(f"{i+1}. 文本:{doc.page_content} | 来源:{doc.metadata['source']}")

# 5.2 检索并返回相似度分数
docs_with_score = db.similarity_search_with_score(query=query, k=2)
print("\n=== 带分数的检索结果 ===")
for doc, score in docs_with_score:
    print(f"文本:{doc.page_content} | 相似度:{score:.4f}")

# 5.3 按元数据过滤检索(混合检索)
filtered_docs = db.similarity_search(
    query=query,
    k=1,
    where={"type": "使用技巧"}  # 仅检索类型为「使用技巧」的内容
)
print("\n=== 过滤后的检索结果 ===")
print(f"文本:{filtered_docs[0].page_content}")

# ---------------------- 6. 追加数据 ----------------------
new_docs = [
    Document(page_content="LanceDB 支持向量数据版本回滚,适合迭代开发", metadata={"source": "进阶教程", "type": "高级特性"})
]
db.add_documents(documents=new_docs)
print(f"\n追加后数据总量:{db.table.count_rows()}")

缺点

  1. 大规模数据支持弱:适合中小体量数据(10万条以内),超大规模数据(百万/亿级)不如 Milvus/PGVector 高效;
  2. 分布式部署缺失:仅支持单机模式,无集群部署能力,不适合高并发、分布式的生产场景;
  3. 生态成熟度略低:对比 Milvus/Chroma,社区插件、集成案例较少,小众问题可能需看源码解决;
  4. 检索算法单一:主要支持 ANN 检索(HNSW),无 Milvus 丰富的索引类型(如 IVF_FLAT、DISKANN 等)。

适用场景 vs 不适用场景

✅ 推荐使用场景

  • Python 生态下的轻量级 RAG 应用(如本地知识库、小体量问答系统);
  • 数据分析 + 向量检索融合的场景(如基于 Pandas 分析后的数据做语义检索);
  • 需要数据版本化、增量更新的向量库场景;
  • 快速原型开发、本地测试、低资源部署环境(如边缘设备)。

❌ 不推荐使用场景

  • 大规模向量数据(百万级以上)的生产环境;
  • 需要分布式部署、高并发访问的场景;
  • 对检索算法多样性要求高的场景(如需要自定义索引)。

总结

  1. LangChain + LanceDB 是轻量级、易部署、适配 Python 数据生态的优质组合,适合中小体量 RAG 场景和数据+向量融合分析场景;
  2. 核心优势是轻量化、与 Pandas/Polars 兼容、支持版本化,核心局限是不支持分布式和大规模数据;
  3. 用法上与 Milvus/Chroma 高度一致,学习成本低,是本地开发、小体量生产的优选方案(替代 FAISS/Chroma)。

原文出处:/show_1GW2rVZxYRgt.html