简介

Lancedb是一个用于人工智能的开源矢量数据库,旨在存储、管理、查询和检索大规模多模式数据的嵌入。Lancedb的核心是用Rust编写的,并构建在Lance之上,专为高性能 ML 工作负载和快速随机访问而设计。

快速开始

安装

pip install lancedb

目前0.6.8需要pyarrow-12.0.0及以上,亲测15.0会报错。

创建客户端

import lancedb
import pandas as pd
import pyarrow as pa uri = "data/sample-lancedb"
db = lancedb.connect(uri)
# 异步客户端
#async_db = await lancedb.connect_async(uri)

与Chroma不同,lancedb没有服务端-客户端模式。支持同步和异步客户端,看起来异步客户端更新较快,从官方文档来看没发现使用上的区别。

创建一张表

data = [
{"vector": [3.1, 4.1], "item": "foo", "price": 10.0},
{"vector": [5.9, 26.5], "item": "bar", "price": 20.0},
] tbl = db.create_table("my_table", data=data)

如果表名已经存在,则会报错。如果希望覆盖已经创建的同名表,可以添加mode='overwrite'参数。

tbl = db.create_table("my_table", data=data, mode='overwrite')

如果不希望覆盖已经创建的同名表,而直接打开的话,可以添加exist_ok=True参数。

tbl = db.create_table("my_table", data=data, exist_ok=True)

创建一张空表

schema = pa.schema([pa.field("vector", pa.list_(pa.float32(), list_size=2))])
tbl = db.create_table("empty_table", schema=schema)

类似SQL语法,先创建一张空表,插入数据可以放到后面进行。

添加数据

# 直接添加数据
data = [
{"vector": [1.3, 1.4], "item": "fizz", "price": 100.0},
{"vector": [9.5, 56.2], "item": "buzz", "price": 200.0},
]
tbl.add(data) # 添加df数据帧
df = pd.DataFrame(data)
tbl.add(data)

查找数据

# Synchronous client
tbl.search([100, 100]).limit(2).to_pandas()

通过向量来查找相似的向量。默认情况下没有对向量创建索引,因此是全表暴力检索。官方推荐数据量超过50万以上才需要创建索引,否则全表暴力检索的延迟也在可以接受的范围之内。(明明就是没实现,还说的冠冕堂皇。。)

删除数据

tbl.delete('item = "fizz"')

类似SQL语法中的WHERE声明,需要指定字段和对应的值。

修改数据

table.update(where='item = "fizz"', values={"vector": [10, 10]})

类似SQL语法中的UPDATE声明,需要指定字段和对应的值。

删除表

db.drop_table("my_table")

查看所有表

print(db.table_names())
tbl = db.open_table("my_table")

table_names可以返回该数据库中已经创建的所有表,使用open_table可以打开对应的表。

高级用法

数据类型

多种数据类型

除了直接添加数据和添加df数据帧之外,lancedb还支持用pyarrow创建schema和添加数据。

import pyarrow as pa
schema = pa.schema(
[
pa.field("vector", pa.list_(pa.float16(), 2)),
pa.field("text", pa.string())
]
)

lancedb直接float16数据类型,这就比chromadb有存储优势了。

自定义数据类型

from lancedb.pydantic import Vector, LanceModel

class Content(LanceModel):
movie_id: int
vector: Vector(128)
genres: str
title: str
imdb_id: int @property
def imdb_url(self) -> str:
return f"https://www.imdb.com/title/tt{self.imdb_id}"

LanceModel是pydantic.BaseModel的子类,主要就是实现了Vector数据类型的定义,避免手动创建schema中vector的定义,只需要指定维度即可。

复合数据类型

class Document(BaseModel):
content: str
source: str class NestedSchema(LanceModel):
id: str
vector: Vector(1536)
document: Document tbl = db.create_table("nested_table", schema=NestedSchema, mode="overwrite")

索引

创建IVF_PQ索引

tbl.create_index(num_partitions=256, num_sub_vectors=96)

lancedb支持创建倒排索引的乘积量化。num_partitions是索引中的分区数,默认值是行数的平方根。num_sub_vectors是子向量的数量,默认值是向量的维度除以16。

使用GPU创建

accelerator="cuda"
# accelerator="mps"

支持CUDA的GPU或者Apple的MPS加速

使用索引加速近似查找

tbl.search(np.random.random((1536))) \
.limit(2) \
.nprobes(20) \
.refine_factor(10) \
.to_pandas()

nprobes是探针数量,默认为20,增加探针数量则会提高查找的精度并相应增加计算耗时。refine_factor是一个粗召的数量,用于读取额外元素并重新排列,以此来提高召回。

向量化模型

内置向量模型

import lancedb
from lancedb.pydantic import LanceModel, Vector
from lancedb.embeddings import get_registry model = get_registry().get("sentence-transformers").create(name="BAAI/bge-small-en-v1.5", device="cpu") class Words(LanceModel):
text: str = model.SourceField() # 指定这个字段为需要模型进行向量化的字段
vector: Vector(model.ndims()) = model.VectorField() # 指定这个字段为模型向量化的结果 table = db.create_table("words", schema=Words)
table.add(
[
{"text": "hello world"},
{"text": "goodbye world"}
]
) query = "greetings"
actual = table.search(query).limit(1).to_pydantic(Words)[0]
print(actual.text)

官方支持了多种sentence-transformers的向量化模型。用上述方法调用内置模型需要指定模型的SourceField和VectorField。

自定义向量模型

from lancedb.embeddings import register
from lancedb.util import attempt_import_or_raise @register("sentence-transformers")
class SentenceTransformerEmbeddings(TextEmbeddingFunction):
name: str = "all-MiniLM-L6-v2"
# set more default instance vars like device, etc. def __init__(self, **kwargs):
super().__init__(**kwargs)
self._ndims = None def generate_embeddings(self, texts):
return self._embedding_model().encode(list(texts), ...).tolist() def ndims(self):
if self._ndims is None:
self._ndims = len(self.generate_embeddings("foo")[0])
return self._ndims @cached(cache={})
def _embedding_model(self):
return sentence_transformers.SentenceTransformer(name)
from lancedb.pydantic import LanceModel, Vector

registry = EmbeddingFunctionRegistry.get_instance()
stransformer = registry.get("sentence-transformers").create() class TextModelSchema(LanceModel):
vector: Vector(stransformer.ndims) = stransformer.VectorField()
text: str = stransformer.SourceField() tbl = db.create_table("table", schema=TextModelSchema) tbl.add(pd.DataFrame({"text": ["halo", "world"]}))
result = tbl.search("world").limit(5)

官方提供了模板用于自定义模型,但是我觉得直接调用模型进行向量化表示更直接吧,这样感觉有点追求格式化的统一了。

总结

与Chromadb对比,没有服务端模式,全部在客户端完成,虽然官方声称有云原生的版本,但感觉大部分场景下可能都不需要放在云上,感觉这一款产品会更加轻量化。

此外,创建表的时候没有默认的向量化模型,感觉对开发者可能更加灵活一些,相比之下Chromadb默认会从HuggingFace下载模型,对于内网环境不太友好。

向量数据库之Lancedb学习记录的更多相关文章

  1. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  2. UWP学习记录7-设计和UI之控件和模式4

    UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...

  3. [Django]模型学习记录篇--基础

    模型学习记录篇,仅仅自己学习时做的记录!!! 实现模型变更的三个步骤: 修改你的模型(在models.py文件中). 运行python manage.py makemigrations ,为这些修改创 ...

  4. 在Ubuntu Server下搭建LAMP环境学习记录

    更新于2015/6/16日,因图片地址失效,请在此地址查看:http://note.youdao.com/share/?id=1c249ae6dc6150cbf692adec67b23a33& ...

  5. [ZHUAN]Flask学习记录之Flask-SQLAlchemy

    From: http://www.cnblogs.com/agmcs/p/4445583.html 各种查询方式:http://www.360doc.com/content/12/0608/11/93 ...

  6. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  7. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  8. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

  9. 我的Spring学习记录(五)

    在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...

  10. mondb 常用命令学习记录

    mondb 常用命令学习记录 一.MongoDB 下载安装 MongoDB官网 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制 ...

随机推荐

  1. FastGithub.UI64位中文版V2.1.4绿色版 - 软件推荐

    推荐理由 相对于改hosts,这个更好用 FastGithub.UI64位中文版V2.1.4绿色版 https://www.cr173.com/soft/670733.html

  2. ACS 构词法 + 44个后缀 记忆方法

    抖音号:九词君-不用语法学好英语

  3. be动词 系动词 连缀动词 Linking Verb

    be动词 系动词 连缀动词 Linking Verb be 原型 am 第一人称单数形式 is 第三人称单数形式 are 第二人称单数和复数形式 been 过去分词 being 现在分词 was 第一 ...

  4. 关于hashCode和equals重写

    规则 只要重写equals,就必须重写hashCode. 用Set存储对象或者用对象作为Map的键时,必须重写hashCode.也就是说,当需要用对象的哈希值来判断对象是否相等时必须重写hashCod ...

  5. linux下find命令根据系统时间查找文件用法

    find 命令有几个用于根据您系统的时间戳搜索文件的选项.这些时间戳包括 mtime 文件内容上次修改时间 atime 文件被读取或访问的时间 ctime 文件状态变化时间 mtime 和 atime ...

  6. 数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台

    数字孪生,是一种利用物理模型.传感器数据.运行历史等信息,在虚拟空间中构建实体对象或系统的精确映射,从而实现对其全生命周期的仿真.优化和管理的技术.数字孪生可以应用于各个领域,如工业制造.智慧城市.医 ...

  7. 程序员必须了解的 10个免费 Devops 工具

    哈喽大家好,我是咸鱼. 近年来,DevOps 已经成为一门将软件开发 (Dev) 与 IT 运维 (Ops) 相融合的重要学科,目的是为了缩短软件的开发生命周期并提供高质量软件的持续交付. 这篇文章整 ...

  8. 记录:Openlayers6.5 实现轨迹回放

    这篇分享我记录到的一个案例,废话不多说,上代码 import Feature from 'ol/Feature' import LineString from 'ol/geom/LineString' ...

  9. spring boot @Scheduled

    例子 @EnableScheduling @Component public class Job { /** * 每秒执行一次 */ @Scheduled(cron = "0/1 * * * ...

  10. Ubuntu系统部署springcloud+nacos遇到的问题。

    1,部署上的jar包运行正常,但是通过浏览器不能访问,telnet +IP+端口连接不通.小皮面板访问后台接口也是不通但是小皮面板可以通过浏览器访问.具体问题暂未解决. 2,改用docker部署,将j ...