AI

AnythingLLM 使用的向量数据库 LanceDB 探秘

以下信息由 ChatGPT
提供(除了第一个外,其他未严格验证正确性)。

  • LanceDB:轻量级的开源向量数据库,专注于高效的本地和分布式存储与检索。适用于在本地部署中处理嵌入向量的数据。
  • Chroma:开源向量数据库,支持本地存储和云存储。适合快速的开发和集成。
  • Pinecone:商业化的向量数据库,专注于高性能的向量搜索和管理,支持大规模应用,提供 SaaS 服务。
  • Zilliz Cloud:提供基于云的向量数据库解决方案,支持大规模数据管理和处理,适合企业级应用。
  • QDrant:支持高效的向量检索,提供开源和商业化版本,支持多模态数据和大规模检索。
  • Weaviate:强大的向量数据库,支持文本、图像等多模态数据,集成了机器学习和AI服务,适合企业级应用。
  • Milvus:开源的分布式向量数据库,支持大规模的数据存储和查询,广泛应用于人工智能、数据科学等领域。
  • AstraDB:由 DataStax 提供的云服务,专注于分布式数据库,适合需要高可用性和弹性扩展的应用场景。
特性/数据库LanceDBChromaPineconeZilliz CloudQDrantWeaviateMilvusAstraDB
类型开源向量数据库开源向量数据库商业化向量数据库商业化向量数据库开源向量数据库开源向量数据库开源向量数据库商业化向量数据库
存储方式本地文件系统本地文件系统 云存储云端(SaaS)云端服务本地文件系统 云端服务云端服务本地文件系统 云端服务云端服务
数据结构向量表、嵌入向量向量表、嵌入向量向量索引、嵌入向量向量表、嵌入向量向量索引、嵌入向量向量索引、嵌入向量向量索引、嵌入向量向量索引、嵌入向量
查询类型向量检索、聚类、范围查询、过滤查询向量检索、范围查询、过滤查询向量检索、近邻搜索向量检索、聚类、过滤查询、向量搜索向量检索、聚类、过滤查询、范围查询向量检索、聚类、过滤查询、范围查询向量检索、近邻搜索、聚类、过滤查询向量检索、近邻搜索
索引类型Brute-force、HNSW、IVFHNSW、FlatHNSW、IVF、ANNOY、RNSGHNSW、IVF、RNSGHNSW、Flat、IVF、ANNHNSW、IVF、Flat、RNSGHNSW、IVF、RNSG、Flat、AnnoyHNSW、IVF、RNSG、Flat
扩展性可扩展,支持分布式部署单机/分布式部署商业化云端,自动扩展云端自动扩展,支持弹性伸缩可扩展,支持分布式部署分布式扩展支持水平扩展支持水平扩展
多模态支持向量、文档存储、文本支持向量、文本支持向量支持向量、文本、图像等多模态数据支持向量、文本、图像等多模态数据支持向量、文本、图像等多模态数据支持向量、文本、图像等多模态数据支持向量、文本、图像等多模态数据支持
数据类型支持文本、图像、音频文本、图像、音频文本、图像、音频、嵌入文本、图像、视频、音频、嵌入文本、图像、音频、视频文本、图像、音频、视频文本、图像、音频、视频、嵌入文本、图像、音频、视频、嵌入
查询性能优化采用高效的向量索引优化和并行计算向量索引优化、并行查询支持高性能查询优化分布式查询优化,低延迟查询基于HNSW的查询优化、并行查询支持高效查询支持、低延迟高效查询优化、支持大规模数据查询高效查询优化、低延迟、高可用性
语言支持Python、CLIPython、CLIPython、JavaScript、Go、Java等REST API、Python SDK、CLIPython、Rust、Go、JavaScript、Java等Python、Go、GraphQL、REST APIPython、Go、REST APIPython、JavaScript、Java、C++等
集成与生态系统与 LangChain、Haystack 等集成与 FastAPI、LangChain、Haystack 等集成与多种框架和工具集成,如 LangChain、Faiss 等支持与机器学习框架、分析工具集成与FastAPI、LangChain、Haystack等集成与LangChain、Haystack等集成支持与各类应用集成,兼容多种框架与AI工具、应用框架集成支持
高可用性/容错支持分布式和容错架构支持分布式部署高可用,自动容错高可用,分布式容错支持支持高可用性和容错部署支持分布式、高可用性、自动容错高可用、支持容错机制高可用、支持容错机制
数据安全与隐私支持加密、认证和访问控制支持基本的加密和身份验证功能企业级数据安全和隐私保护完善的安全性功能,包括加密、身份验证加密和安全访问控制强加密支持、隐私保护、身份验证支持加密、身份验证和访问控制加密、身份验证、数据访问控制
定价模型免费开源(本地部署)免费开源(本地部署)按需计费(SaaS)按需计费(SaaS)免费开源(本地部署)或按需计费(SaaS)免费开源(本地部署)或按需计费(SaaS)免费开源(本地部署)或按需计费(SaaS)按需计费(SaaS)

LanceDB
外部形态

我配置时选择向量数据库用的是LanceDB

AnythingLLM 配置向量数据库

AnythingLLM
支持多个工作区对话,每个工作区对应向量数据库中的一个表。这里先看看工作区里上传的文档信息。

然后找到对应的LanceDB
存储目录:C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\lancedb
。为了方便查看Lancedb
目录结构,我使用WSL
子系统去访问这个目录。

(python3.9.5) mq@OBPILOT:~/python/lancedb$ tree
.
└── oceanbase.lance
    ├── _latest.manifest
    ├── _transactions
    │   ├── 0-5c8157f5-e9c8-4bea-b46d-09a5edfb5aa6.txn
    │   ├── 1-641e0385-d77c-4baa-97fe-f7f61932cf72.txn
    │   ├── 2-8fc1f46f-66f0-4509-b182-67d382327f62.txn
    │   ├── 3-a63a6a1b-7c54-4c1d-ac9c-01bc1307c5eb.txn
    │   ├── 4-6ee1f48a-5be2-460a-8833-9cb18b772777.txn
    │   ├── 5-644ca307-e404-4191-93ad-54824e65e66b.txn
    │   ├── 6-0afddaf0-931c-4207-b923-909919a4209f.txn
    │   └── 7-3a8290fd-35c6-4ef7-9953-eedfdf759ecf.txn
    ├── _versions
    │   ├── 1.manifest
    │   ├── 2.manifest
    │   ├── 3.manifest
    │   ├── 4.manifest
    │   ├── 5.manifest
    │   ├── 6.manifest
    │   ├── 7.manifest
    │   └── 8.manifest
    └── data
        ├── 052f78e2-c563-4cb8-98d2-94c984e985d9.lance
        ├── 10c47d3c-bb92-4fec-b2e5-c72911daf348.lance
        ├── 35d9cea3-7be1-4da7-a53b-18a39a31b885.lance
        ├── 37650fe0-ab74-461a-8d22-3b841aeeed17.lance
        ├── 7d5a7f2c-5407-4494-aa37-92d04d6a4ced.lance
        ├── 8852f575-6c98-4b9e-8dd4-c806276045cc.lance
        ├── 8cbb3bd9-b30e-4b15-8d79-27dacf041779.lance
        └── ed306eae-f028-403b-875b-7f711a283bf9.lance

查阅了一下 LanceDB
的文件目录类型介绍如下。

/path/to/dataset: -- 数据库表目录
    data/*.lance  -- 数据行目录和文件
    _transactions -- 数据行版本对应的事务信息
    _versions/*.manifest -- 数据行摘要说明(版本)
    _indices/{UUID-*}/index.idx -- 二级索引以及索引子目录.
    _deletions/*.{arrow,bin} -- 删除的文件

LanceDB
内部形态

LanceDB
没有专门的客户端工具,但是提供了 Python
接口访问。


以下是 LanceDB Python 接口的一些常用方法的表格展示。这些方法帮助用户进行数据库的连接、表操作、查询以及数据导入导出等操作。

  • 连接与表操作:
    • 使用 lancedb.connect()
      连接到数据库,并通过 open_table()
      打开表。
>>> import lancedb
>>> import argparse
>>> import sys
>>> uri="./lancedb"
>>> db = lancedb.connect(uri)
>>> table = db.open_table("oceanbase")
>>> df = table.to_pandas()
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 19 entries, 0 to 18
Data columns (total 12 columns):
 #   Column                Non-Null Count  Dtype
---  ------                --------------  -----
 0   id                    19 non-null     object
 1   url                   19 non-null     object
 2   title                 19 non-null     object
 3   docAuthor             19 non-null     object
 4   description           19 non-null     object
 5   docSource             19 non-null     object
 6   chunkSource           19 non-null     object
 7   published             19 non-null     object
 8   wordCount             19 non-null     float64
 9   token_count_estimate  19 non-null     float64
 10  text                  19 non-null     object
 11  vector                19 non-null     object
dtypes: float64(2), object(10)
memory usage: 1.9+ KB

上面可以看到表oceanbase
的结构,其中最后一列就是向量值。

  • 可以进行基本的数据操作,如 插入 (insert()
    )、查询 (query()
    )、删除 (delete()
    )、更新 (update()
    ) 等。
import numpy as np
query_vector = np.random.rand(1024)
results = table.search(query_vector).limit(5).to_pandas()
>>> print(results.shape)
(5, 13)
>>> print(results.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 13 columns):
 #   Column                Non-Null Count  Dtype
---  ------                --------------  -----
 0   id                    5 non-null      object
 1   url                   5 non-null      object
 2   title                 5 non-null      object
 3   docAuthor             5 non-null      object
 4   description           5 non-null      object
 5   docSource             5 non-null      object
 6   chunkSource           5 non-null      object
 7   published             5 non-null      object
 8   wordCount             5 non-null      float64
 9   token_count_estimate  5 non-null      float64
 10  text                  5 non-null      object
 11  vector                5 non-null      object
 12  _distance             5 non-null      float32
dtypes: float32(1), float64(2), object(10)
memory usage: 628.0+ bytes
None
>>> print(results[['url','title','wordCount','_distance']])
                                                 url                          title  wordCount   _distance
0  file://C:\Users\MQ\AppData\Roaming\anythingllm...       第二章:OB 存储引擎高级技术_V3.0.pdf      170.0  594.922180
1  file://C:\Users\MQ\AppData\Roaming\anythingllm...  第七章 OB 迁移(OMS)、备份与恢复_V3.0.pdf      207.0  606.666443
2  file://C:\Users\MQ\AppData\Roaming\anythingllm...      第一章:OB 分布式架构高级技术_V3.0.pdf      444.0  609.626831
3  file://C:\Users\MQ\AppData\Roaming\anythingllm...     第八章:OB 运维、监控与异常处理_V3.0.pdf     1049.0  609.655029
4  file://C:\Users\MQ\AppData\Roaming\anythingllm...         第四章:OB SQL 调优_V3.0.pdf     2808.0  614.424438

查询用的方法是 search
,是近似距离搜索。所以查询结果集的结构里最后一列是向量距离。

貌似 LanchDB``Python
接口并不支持 query()
方法。

>>> query_vector = np.random.rand(1024).tolist()
>>> top_k = 5
>>> results = table.query("SELECT * FROM oceanbase WHERE vector <=> ?", params=(query_vector, top_k))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'LanceTable' object has no attribute 'query'
  • 数据转换与导出:
    • 可以将表数据转换为 Pandas DataFrameto_pandas()
      ),并可以通过 to_csv()
      导出为 CSV。
>>> df.to_csv('output.csv', index=False)
>>> results[['url','title','wordCount','_distance']].to_csv('results.csv',index=True)

查看外部results.csv
内容,默认以逗号(,
)分隔。

(python3.9.5) mq@OBPILOT:~/python$ more results.csv
,url,title,wordCount,_distance
0,file://C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\hotdir\第二章:OB 存储引擎高级技术_V3.0.pdf,第二章:OB 存储引擎高级技术_V3.0.pdf,170.0,594.9222
1,file://C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\hotdir\第七章 OB 迁移(OMS)、备份与恢复_V3.0.pdf,第七章 OB 迁移(OMS)、备份与恢复_V3.0.pdf,207.0,606.66644
2,file://C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\hotdir\第一章:OB 分布式架构高级技术_V3.0.pdf,第一章:OB 分布式架构高级技术_V3.0.pdf,444.0,609.62683
3,file://C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\hotdir\第八章:OB 运维、监控与异常处理_V3.0.pdf,第八章:OB 运维、监控与异常处理_V3.0.pdf,1049.0,609.655
4,file://C:\Users\MQ\AppData\Roaming\anythingllm-desktop\storage\hotdir\第四章:OB SQL 调优_V3.0.pdf,第四章:OB SQL 调优_V3.0.pdf,2808.0,614.42444
  • 索引与查询:
    • 索引 (create_index()
      和 drop_index()
      ) 用于加速查询,支持多种索引类型(如 HNSW)。
    • 搜索 (search()
      ) 用于在数据库中进行高效的向量查询。

这里记录数少,没有用索引。

AI相关的一切

留言

您的邮箱地址不会被公开。 必填项已用 * 标注