向量数据库之Lancedb学习记录

这篇具有很好参考价值的文章主要介绍了向量数据库之Lancedb学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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下载模型,对于内网环境不太友好。文章来源地址https://www.toymoban.com/news/detail-852581.html

到了这里,关于向量数据库之Lancedb学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio 学习记录-数据库

    目录 SQL的基本语法 1.数据定义语言 2.数据操纵语言 数据库管理器 SQLiteDatabase 数据库帮助器 SQLiteOpenHelper 优化记住密码功能         本文介绍Android的数据库存储方式-SQLite的使用方法,包括:SQLite用到了哪些SQL语法,如何使用数据库管理器操纵SQLite,如何使用数据库帮助器

    2024年02月07日
    浏览(51)
  • OB数据库基础知识(学习记录)

    目录 OB业务场景 公司使用理由: 常见 bootstrap 失败原因 常见OBD 部署 失败原因 Grafana  查看集群资源由各个节点的聚合情况  OB创建租户 表分组的场景 mysqldump到处数据库schema,数据库数据,表数据 数据同步框架 DATAX obdumper使用注意事项 obdumper调优 obloader使用注意事项  什么

    2024年02月14日
    浏览(37)
  • mongoDB非关系型数据库学习记录

    MongoDB是一个 基于分布式文件存储的数据库 ,官方地址https://www.mongodb.com/ 数据库(DataBase)是按照数据结构来组织、存储和管理数据的 应用程序 数据库的主要作用就是管理数据,对数据进行增©、删(d)、改(u)、查® 相比于纯文件管理数据,数据库管理数据有如下特点: 速度更快 扩展

    2024年02月04日
    浏览(42)
  • 什么是向量数据库?向量数据库工作原理?向量数据库解决方案?

    向量数据库是一种专门用于存储和处理向量数据的数据库系统。向量数据是指具有多维度属性的数据,例如图片、音频、视频、自然语言文本等。传统的关系型数据库通常不擅长处理向量数据,因为它们需要将数据映射成结构化的表格形式,而向量数据的维度较高、结构复杂

    2024年02月15日
    浏览(55)
  • Django的数据库配置、生成(创建)过程、写入数据、查看数据的学习过程记录

    在文件:\\\"E:Python_projectP_001myshop-testmyshopmyshopsettings.py\\\"中写入以下数据库的配置信息: 上面的代码比较好理解,就是对于语句: django.db.backends.mysql 作一些说明: 在Django中, \\\'django.db.backends.mysql\\\' 是一个数据库后端引擎的路径,用于指定使用MySQL作为数据库的后端。数据库后

    2024年02月12日
    浏览(49)
  • 《向量数据库指南》:向量数据库Pinecone如何集成数据湖

    目录 为什么选择Databricks? 为什么选择Pinecone? 设置Spark集群 环境设置 将数据集加载到分区中 创建将文本转换为嵌入的函数 将UDF应用于数据 更新嵌入 摘要 使用Databricks和Pinecone在规模上创建和索引向量嵌入

    2024年02月15日
    浏览(37)
  • 《向量数据库指南》——宏观解读向量数据库Milvus Cloud

    宏观解读向量数据库 如今,强大的机器学习模型配合 Milvus 等向量数据库的模式已经为电子商务、推荐系统、语义检索、计算机安全、制药等领域和应用场景带来变革。而对于用户而言,除了足够多的应用场景,向量数据库还需要具备更多重要的特性,包括: 可灵活扩展、支

    2024年02月07日
    浏览(45)
  • 《向量数据库》——向量数据库Milvus Cloud 和Dify比较

    Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈,在此前已支持丰富多元的大型语言模型的接入,除了 OpenAI、Anthropic、Azure OpenAI、Hugging face、Replicate 等全球顶尖模型及模型托管平台,也完成了国内主流的各大模型支持(如文心一言、智谱 AI 等)。 而 Zilliz Cloud  和 Milvus 则是

    2024年02月08日
    浏览(59)
  • 《向量数据库指南》:向量数据库Pinecone如何集成LangChain (一)

    目录 LangChain中的检索增强 建立知识库 欢迎使用Pinecone和LangChain的集成指南。本文档涵盖了将高性能向量数据库Pinecone与基于大型语言模型(LLMs)构建应用程序的框架LangChain集成的步骤。   Pinecone使开发人员能够基于向量相似性搜索构建可扩展的实时推荐和搜索系统。另一方

    2024年02月15日
    浏览(37)
  • 《向量数据库指南》——开源框架NVIDIA Merlin & 向量数据库Milvus

    推荐系统 pipeline 中至关重要的一环便是为用户检索并找到最相关的商品。为了实现这一目标,通常会使用低维向量(embedding)表示商品,使用数据库存储及索引数据,最终对数据库中数据进行近似最近邻(ANN)搜索。这些向量表示是通过深度学习模型获取的,而这些深度学习

    2024年02月05日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包