一个您只需要的Python向量数据库 - 不多不少。
vectordb
是一个Python风格的向量数据库,提供全面的CRUD(创建、读取、更新、删除)操作和强大的可扩展性选项,包括分片和复制。它可以轻松部署在各种环境中,从本地到本地服务和云端。vectordb
提供您所需要的一切 - 不多不少。它体现了有效的Python设计而不过度工程,成为一个精简而强大的解决方案,满足您的所有需求。
vectordb
利用DocArray强大的检索能力和Jina的可扩展性、可靠性和服务能力。神奇之处在于:DocArray作为驱动向量搜索逻辑的引擎,而Jina保证高效和可扩展的索引服务。这种协同效应culminates在一个强大yet用户友好的向量数据库体验中 - 这就是vectordb
。
安装
pip install vectordb
在本地开始使用vectordb
- 首先使用DocArray数据类语法定义一个文档模式:
from docarray import BaseDoc
from docarray.typing import NdArray
class ToyDoc(BaseDoc):
text: str = ''
embedding: NdArray[128]
- 选择一个预构建的数据库(如
InMemoryExactNNVectorDB
或HNSWVectorDB
),并应用模式:
from docarray import DocList
import numpy as np
from vectordb import InMemoryExactNNVectorDB, HNSWVectorDB
# 指定您的工作空间路径
db = InMemoryExactNNVectorDB[ToyDoc](workspace='./workspace_path')
# 索引一系列具有随机嵌入的文档
doc_list = [ToyDoc(text=f'toy doc {i}', embedding=np.random.rand(128)) for i in range(1000)]
db.index(inputs=DocList[ToyDoc](doc_list))
# 执行搜索查询
query = ToyDoc(text='query', embedding=np.random.rand(128))
results = db.search(inputs=DocList[ToyDoc]([query]), limit=10)
# 打印匹配结果
for m in results[0].matches:
print(m)
由于我们发出了单个查询,results
只包含一个元素。最近邻搜索结果方便地存储在.matches
属性中。
将vectordb
作为服务开始使用
vectordb
设计为易于作为服务提供,支持gRPC
、HTTP
和Websocket
通信协议。
服务器端
在服务器端,您可以按如下方式启动服务:
with db.serve(protocol='grpc', port=12345, replicas=1, shards=1) as service:
service.block()
此命令在端口12345
上启动vectordb
作为服务,使用gRPC
协议,有1
个副本和1
个分片。
客户端
在客户端,您可以使用以下命令访问服务:
from vectordb import Client
# 实例化连接到服务器的客户端。实际使用时,将0.0.0.0替换为服务器IP地址。
client = Client[ToyDoc](address='grpc://0.0.0.0:12345')
# 执行搜索查询
results = client.search(inputs=DocList[ToyDoc]([query]), limit=10)
这允许您执行搜索查询,直接从远程vectordb
服务接收结果。
在Jina AI Cloud上托管vectordb
您可以无缝地将您的vectordb
实例部署到Jina AI Cloud,确保从任何位置访问您的数据库。
首先,将您的数据库实例或类嵌入到Python文件中:
# example.py
from docarray import BaseDoc
from vectordb import InMemoryExactNNVectorDB
db = InMemoryExactNNVectorDB[ToyDoc](workspace='./vectordb') # 注意`db`是我们想要服务的实例
if __name__ == '__main__':
# 重要:确保使用__main__守卫保护此部分代码
with db.serve() as service:
service.block()
接下来,按照以下步骤部署您的实例:
-
如果您还没有,请注册一个Jina AI Cloud账户。
-
使用
jc
命令行登录您的Jina AI Cloud账户:
jc login
- 部署您的实例:
vectordb deploy --db example:db
从客户端连接
部署后,使用vectordb
客户端访问分配的端点:
from vectordb import Client
# 将ID替换为上面截图中显示的已部署DB的ID
c = Client(address='grpcs://ID.wolf.jina.ai')
使用jcloud管理您部署的实例
然后,您可以使用jc
命令列出、暂停、恢复或删除已部署的数据库:
jcloud list ID
jcloud pause ID
或 jcloud resume ID
jcloud remove ID
高级主题
什么是向量数据库?
向量数据库作为嵌入的复杂存储库,捕捉不同对象之间语义相似性的本质。这些数据库促进了跨多种多模态数据类型的相似性搜索,为信息检索开辟了一个新时代。通过提供上下文理解和丰富生成结果,向量数据库大大提高了语言学习模型(LLM)的性能和实用性。这凸显了它们在数据科学和机器学习应用程序发展中的关键作用。
CRUD支持
vectordb
中的本地库使用和客户端-服务器交互共享相同的API。这提供了index
、search
、update
和delete
功能:
index
: 接受一个DocList
进行索引。search
: 接受一个包含批量查询的DocList
或单个查询的BaseDoc
。它返回单个或多个结果,每个结果都有按相关性排序的matches
和scores
属性。delete
: 接受一个DocList
,用于从索引中删除文档。只需要id
属性,因此请确保跟踪已索引的ID
,以便在需要时删除文档。update
: 接受一个DocList
,用于更新索引中的文档。update
操作将用输入文档的属性和负载替换具有相同索引的已索引文档。
服务端点配置
您可以使用以下参数提供 vectordb
服务并从客户端访问:
- protocol: 服务协议。可以是
gRPC
、HTTP
、websocket
或它们的组合,以列表形式提供。默认为gRPC
。 - port: 服务访问端口。可以是每个提供的协议的端口列表。默认为 8081。
- workspace: VectorDB 持久化所需数据的路径。默认为 '.'(当前目录)。
扩展您的数据库
在提供或部署 Vector 数据库时,您可以使用 vectordb
设置两个扩展参数:
- Shards: 数据分片数量。这可以提高延迟,因为
vectordb
确保文档只在一个分片中索引。搜索请求会发送到所有分片,并合并结果。 - Replicas: 数据库副本数量。
vectordb
使用 RAFT 算法在每个分片的副本之间同步索引。这增加了服务可用性和搜索吞吐量,因为多个副本可以并行响应更多搜索请求,同时允许 CRUD 操作。注意:在 JCloud 部署中,副本数量设置为 1。我们正在努力在云端启用复制功能。
向量搜索配置
以下是每种 VectorDB
类型的参数:
InMemoryExactNNVectorDB
这个数据库对嵌入执行穷举搜索,配置选项有限:
workspace
: 持久化所需数据的文件夹。
InMemoryExactNNVectorDB[MyDoc](workspace='./vectordb')
InMemoryExactNNVectorDB[MyDoc].serve(workspace='./vectordb')
HNSWVectorDB
这个数据库使用来自 HNSWLib 的 HNSW(分层可导航小世界)算法进行近似最近邻搜索。它提供了几个配置选项:
workspace
: 指定存储和持久化所需数据的目录。
此外,HNSWVectorDB 提供了一组配置,可以调整最近邻搜索算法的性能和准确性。这些配置的详细描述可以在 HNSWLib README 中找到:
space
: 指定用于空间的相似度度量(选项有 "l2"、"ip" 或 "cosine")。默认为 "l2"。max_elements
: 设置索引的初始容量,可以动态增加。默认为 1024。ef_construction
: 这个参数控制索引构建过程中的速度/准确性权衡。默认为 200。ef
: 这个参数控制查询时间/准确性权衡。默认为 10。M
: 这个参数定义图中的最大出站连接数。默认为 16。allow_replace_deleted
: 如果设置为True
,允许用新添加的元素替换已删除的元素。默认为False
。num_threads
: 设置在index
和search
操作期间使用的默认线程数。默认为 1。
命令行界面
vectordb
包含一个简单的 CLI,用于提供和部署您的数据库:
描述 | 命令 |
---|---|
在本地提供您的数据库服务 | vectordb serve --db example:db |
在 Jina AI Cloud 上部署您的数据库 | vectordb deploy --db example:db |
功能
-
用户友好界面: 使用
vectordb
,简单就是关键。其直观的界面设计适合不同专业水平的用户。 -
极简设计:
vectordb
包含所有必要功能,没有不必要的复杂性。它确保从本地到服务器和云部署的无缝过渡。 -
完整的 CRUD 支持: 从索引和搜索到更新和删除,
vectordb
涵盖了所有 CRUD 操作。 -
数据库即服务: 利用
vectordb
的 gRPC、HTTP 和 Websocket 协议能力。它使您能够高效地提供数据库服务并进行插入或搜索操作。 -
可扩展性: 体验
vectordb
强大的部署能力,包括分片和复制等强大的可扩展性功能。通过分片提高服务延迟,而复制增强可用性和吞吐量。 -
云部署: 使用 Jina AI Cloud 在云中部署您的服务变得轻而易举。更多部署选项即将推出!
-
无服务器能力:
vectordb
可以在云中以无服务器模式部署,确保根据您的需求实现最佳资源利用和数据可用性。 -
多种 ANN 算法:
vectordb
提供多种近似最近邻(ANN)算法的实现。以下是当前提供的选项,更多集成即将推出:- InMemoryExactNNVectorDB(精确 NN 搜索):实现简单的最近邻算法。
- HNSWVectorDB(基于 HNSW):利用 HNSWLib
路线图
Vector Database 的未来一片光明,我们有宏大的计划!以下是我们目前正在开发的功能预览:
- 更多 ANN 搜索算法:我们的目标是支持更广泛的 ANN 搜索算法。
- 增强过滤能力:我们正在努力增强我们的 ANN 搜索解决方案,以支持高级过滤。
- 可定制性:我们的目标是使
vectordb
高度可定制,让 Python 开发者能够轻松地根据自己的特定需求调整其行为。 - 扩展无服务器容量:我们正在努力提高
vectordb
在云中的无服务器容量。虽然我们目前支持在 0 到 1 个副本之间扩展,但我们的目标是将其扩展到 0 到 N 个副本。 - 扩展部署选项:我们正在积极努力促进
vectordb
在各种云平台上的部署,提供广泛的选择。
需要 vectordb
的帮助吗?对使用它感兴趣但需要某些功能来满足您的独特需求?请随时与我们联系。加入我们的 Discord 社区,与我们和其他社区成员交流。
贡献
VectorDB 项目由 Jina AI 支持,并根据 Apache-2.0 许可。我们非常感谢社区的贡献!如果您有新功能或改进的想法,我们很乐意听取您的意见。我们一直在寻找使 vectordb
更加用户友好和有效的方法。