AnythingLLM 使用的向量数据库 LanceDB 探秘
以下信息由 ChatGPT
提供(除了第一个外,其他未严格验证正确性)。
- LanceDB:轻量级的开源向量数据库,专注于高效的本地和分布式存储与检索。适用于在本地部署中处理嵌入向量的数据。
- Chroma:开源向量数据库,支持本地存储和云存储。适合快速的开发和集成。
- Pinecone:商业化的向量数据库,专注于高性能的向量搜索和管理,支持大规模应用,提供 SaaS 服务。
- Zilliz Cloud:提供基于云的向量数据库解决方案,支持大规模数据管理和处理,适合企业级应用。
- QDrant:支持高效的向量检索,提供开源和商业化版本,支持多模态数据和大规模检索。
- Weaviate:强大的向量数据库,支持文本、图像等多模态数据,集成了机器学习和AI服务,适合企业级应用。
- Milvus:开源的分布式向量数据库,支持大规模的数据存储和查询,广泛应用于人工智能、数据科学等领域。
- AstraDB:由 DataStax 提供的云服务,专注于分布式数据库,适合需要高可用性和弹性扩展的应用场景。
特性/数据库 | LanceDB | Chroma | Pinecone | Zilliz Cloud | QDrant | Weaviate | Milvus | AstraDB |
---|---|---|---|---|---|---|---|---|
类型 | 开源向量数据库 | 开源向量数据库 | 商业化向量数据库 | 商业化向量数据库 | 开源向量数据库 | 开源向量数据库 | 开源向量数据库 | 商业化向量数据库 |
存储方式 | 本地文件系统 | 本地文件系统 云存储 | 云端(SaaS) | 云端服务 | 本地文件系统 云端服务 | 云端服务 | 本地文件系统 云端服务 | 云端服务 |
数据结构 | 向量表、嵌入向量 | 向量表、嵌入向量 | 向量索引、嵌入向量 | 向量表、嵌入向量 | 向量索引、嵌入向量 | 向量索引、嵌入向量 | 向量索引、嵌入向量 | 向量索引、嵌入向量 |
查询类型 | 向量检索、聚类、范围查询、过滤查询 | 向量检索、范围查询、过滤查询 | 向量检索、近邻搜索 | 向量检索、聚类、过滤查询、向量搜索 | 向量检索、聚类、过滤查询、范围查询 | 向量检索、聚类、过滤查询、范围查询 | 向量检索、近邻搜索、聚类、过滤查询 | 向量检索、近邻搜索 |
索引类型 | Brute-force、HNSW、IVF | HNSW、Flat | HNSW、IVF、ANNOY、RNSG | HNSW、IVF、RNSG | HNSW、Flat、IVF、ANN | HNSW、IVF、Flat、RNSG | HNSW、IVF、RNSG、Flat、Annoy | HNSW、IVF、RNSG、Flat |
扩展性 | 可扩展,支持分布式部署 | 单机/分布式部署 | 商业化云端,自动扩展 | 云端自动扩展,支持弹性伸缩 | 可扩展,支持分布式部署 | 分布式扩展 | 支持水平扩展 | 支持水平扩展 |
多模态支持 | 向量、文档存储、文本支持 | 向量、文本支持 | 向量支持 | 向量、文本、图像等多模态数据支持 | 向量、文本、图像等多模态数据支持 | 向量、文本、图像等多模态数据支持 | 向量、文本、图像等多模态数据支持 | 向量、文本、图像等多模态数据支持 |
数据类型支持 | 文本、图像、音频 | 文本、图像、音频 | 文本、图像、音频、嵌入 | 文本、图像、视频、音频、嵌入 | 文本、图像、音频、视频 | 文本、图像、音频、视频 | 文本、图像、音频、视频、嵌入 | 文本、图像、音频、视频、嵌入 |
查询性能优化 | 采用高效的向量索引优化和并行计算 | 向量索引优化、并行查询支持 | 高性能查询优化 | 分布式查询优化,低延迟查询 | 基于HNSW的查询优化、并行查询支持 | 高效查询支持、低延迟 | 高效查询优化、支持大规模数据查询 | 高效查询优化、低延迟、高可用性 |
语言支持 | Python、CLI | Python、CLI | Python、JavaScript、Go、Java等 | REST API、Python SDK、CLI | Python、Rust、Go、JavaScript、Java等 | Python、Go、GraphQL、REST API | Python、Go、REST API | Python、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
支持多个工作区对话,每个工作区对应向量数据库中的一个表。这里先看看工作区里上传的文档信息。

然后找到对应的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 DataFrame(
to_pandas()
),并可以通过to_csv()
导出为 CSV。
- 可以将表数据转换为 Pandas DataFrame(
>>> 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()
) 用于在数据库中进行高效的向量查询。
- 索引 (
这里记录数少,没有用索引。