最完整LanceDB入门指南:从安装到向量搜索实战

最完整LanceDB入门指南:从安装到向量搜索实战

【免费下载链接】lancedb Developer-friendly, serverless vector database for AI applications. Easily add long-term memory to your LLM apps! 【免费下载链接】lancedb 项目地址: https://gitcode.com/gh_mirrors/la/lancedb

你是否正在构建AI应用时遇到以下问题:需要高效存储和搜索海量向量数据?寻找一个既简单易用又具备生产级性能的向量数据库?LanceDB正是为解决这些问题而生。本文将带你从安装开始,逐步掌握LanceDB的核心功能,最终完成一个向量搜索实战案例。读完本文后,你将能够:

  • 在本地或云端环境安装和配置LanceDB
  • 创建数据库和数据表,插入和管理数据
  • 理解向量搜索的基本原理和实现方式
  • 构建高效的向量索引以提升搜索性能
  • 完成一个完整的向量搜索应用案例

什么是LanceDB

LanceDB是一个开发者友好的无服务器向量数据库(Vector Database),专为AI应用设计。它基于Lance列式格式构建,提供快速、可扩展且具备生产就绪能力的向量搜索功能。你可以轻松存储、索引和搜索PB级的多模态数据和向量。

LanceDB架构

LanceDB支持多种部署方式:

  • 嵌入到现有后端应用中(如Django、Flask、Node.js或FastAPI应用)
  • 直接从客户端应用(如Jupyter notebook)用于分析工作负载
  • 部署为远程无服务器数据库

LanceDB部署方式

安装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)搜索。

KNN搜索

暴力搜索方法对于大于几十万向量的数据集来说不可扩展,因为查询延迟随数据集大小线性增长。这就是近似最近邻(ANN)算法的用武之地。

近似最近邻(ANN)搜索

近似最近邻(ANN)算法不执行对整个数据库的穷举搜索,而是使用索引来缩小搜索空间,从而显著减少查询延迟。其代价是结果不保证是查询的真正最近邻,但对于大多数用例通常"足够好"。

LanceDB使用IVF-PQ(Inverted File with Product Quantization)作为其主要索引方法,这是一种基于磁盘的高效索引结构。

IVF-PQ索引结构

IVF-PQ索引由两部分组成:

  1. 倒排文件(IVF):将向量空间划分为多个聚类,每个向量分配给一个聚类
  2. 乘积量化(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与多种流行工具和框架集成:

  • LangChainLangChain集成
  • LlamaIndexLlamaIndex集成
  • Apache-Arrow:原生支持Arrow格式
  • Pandas/Polars:支持DataFrame直接导入导出
  • DuckDB:支持SQL查询

LanceDB生态系统

总结与展望

LanceDB是一个功能强大、易于使用的向量数据库,为AI应用提供高效的向量搜索能力。本文介绍了LanceDB的安装、基本操作、核心概念和实战案例。通过LanceDB,你可以轻松构建具有长期记忆能力的LLM应用。

后续你可以探索更多高级功能:

要了解更多信息,请参阅:

希望本指南能帮助你快速上手LanceDB,构建出色的AI应用!

【免费下载链接】lancedb Developer-friendly, serverless vector database for AI applications. Easily add long-term memory to your LLM apps! 【免费下载链接】lancedb 项目地址: https://gitcode.com/gh_mirrors/la/lancedb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值