42个版本 (4个重大更改)
0.4.10 | 2024年2月13日 |
---|---|
0.4.7 | 2024年1月31日 |
0.4.2 | 2023年12月30日 |
0.3.8 | 2023年11月19日 |
0.1.19 | 2023年7月27日 |
#47 in 数据库实现
每月下载量173次
在heapswap中使用
150KB
3K SLoC
LanceDB Rust
LanceDB Rust SDK,一个无服务器的向量数据库。
更多信息请访问:https://lancedb.com/
lib.rs
:
VectorDB (LanceDB) -- 适用于AI应用的、友好的无服务器向量数据库
LanceDB 是一个开源的向量搜索数据库,使用持久化存储,极大地简化了嵌入检索、过滤和管理。
LanceDB 的关键特性包括
- 无需管理服务器的生产级向量搜索。
- 存储、查询和过滤向量、元数据和多模态数据(文本、图像、视频、点云等)。
- 支持向量相似度搜索、全文搜索和SQL。
- 原生Rust、Python、Javascript/Typescript支持。
- 零拷贝、自动版本控制,无需额外基础设施即可管理数据版本。
- 在构建向量索引时支持GPU[^note]。
- 与LangChain 🦜️🔗、LlamaIndex 🦙、Apache-Arrow、Pandas、Polars、DuckDB 等生态系统集成正在进行中。
[^note]: 仅在Python SDK中。
入门指南
LanceDB 在进程内运行,要在您的Rust项目中使用它,请在您的 Cargo.toml
中添加以下内容
cargo install vectordb
快速入门
Rust API 还未稳定,请预期会有重大更改。
连接到数据库。
use vectordb::connect;
let db = connect("data/sample-lancedb").await.unwrap();
LanceDB 接受不同形式的数据库路径
/path/to/database
- 文件系统上的本地数据库。s3://bucket/path/to/database 或
gs://bucket/path/to/database - 云对象存储上的数据库
db://dbname
- Lance Cloud
您还可以使用 ConnectOptions
来配置数据库连接。
use vectordb::{connect_with_options, ConnectOptions};
let options = ConnectOptions::new("data/sample-lancedb")
.index_cache_size(1024);
let db = connect_with_options(&options).await.unwrap();
LanceDB 使用 arrow-rs 来定义架构、数据类型和数组本身。它将 FixedSizeList<Float16/Float32>
列视为向量列。
有关更多详细信息,请参阅 LanceDB 文档。
创建表
要创建表,您需要提供一个 arrow_schema::Schema
和一个 arrow_array::RecordBatch
流。
use arrow_schema::{DataType, Schema, Field};
use arrow_array::{RecordBatch, RecordBatchIterator};
let schema = Arc::new(Schema::new(vec![
Field::new("id", DataType::Int32, false),
Field::new("vector", DataType::FixedSizeList(
Arc::new(Field::new("item", DataType::Float32, true)), 128), true),
]));
// Create a RecordBatch stream.
let batches = RecordBatchIterator::new(vec![
RecordBatch::try_new(schema.clone(),
vec![
Arc::new(Int32Array::from_iter_values(0..1000)),
Arc::new(FixedSizeListArray::from_iter_primitive::<Float32Type, _, _>(
(0..1000).map(|_| Some(vec![Some(1.0); 128])), 128)),
]).unwrap()
].into_iter().map(Ok),
schema.clone());
db.create_table("my_table", Box::new(batches), None).await.unwrap();
创建向量索引(IVF_PQ)
tbl.create_index(&["vector"])
.ivf_pq()
.num_partitions(256)
.build()
.await
.unwrap();
打开表并运行搜索
let results = table
.search(&[1.0; 128])
.execute_stream()
.await
.unwrap()
.try_collect::<Vec<_>>()
.await
.unwrap();
依赖关系
~83MB
~1.5M SLoC