八种适用于AI智能体的免费向量数据库对比:容量限制、适配性及权衡因素。
对比了八款提供免费版本的向量数据库在智能体内存方面的表现:容量限制、部署适配性、并发处理能力,以及哪款最适合您环境中的人工智能智能体。
当人们在预算有限的情况下构建智能体时,总有八种向量数据库会被反复提及:VectorAI DB Community Edition、Qdrant、Weaviate、Milvus、ChromaDB、LanceDB、pgvector以及Pinecone。这些数据库最初都是免费使用的。但这与真正的大规模免费服务不同,也与需要在任何能运行智能体的地方部署的服务有所区别。
智能体对向量存储的依赖程度远高于单一RAG流程。它们的内存会在多次会话中不断被写入和读取。因此,你需要了解这些内存是否能在重启后依然存在、请求并发时的响应时间表现如何,以及该引擎是否能够在连接不稳定或不存在的设备上与智能体一同运行。
免费套餐无法满足所有需求。要了解在真实并发负载下的延迟表现,通常需要足够强大的付费套餐来生成这样的负载。不过,免费套餐确实能显示出各供应商的底线,有些限制甚至在编写代码之前就排除了某些选择。某项服务会在14天后删除闲置集群;另一项则没有自托管版本,因此如果数据无法离开用户的基础设施,该服务就不适用。下方的每项服务都会明确说明其限制,这样你就可以将数据库与自己的部署环境匹配,并了解需要放弃哪些功能。各项限制、上限和价格经常变动,因此在做出决定之前,请务必在各供应商的定价页面上确认最新数值。
评估标准
共从八个方面对八种数据库进行了对比,这些方面尤其与代理程序相关。
- 免费套餐的类型。可完全自主托管且无向量数量限制,或是带有存储或向量数量限制的托管型免费方案,又或者是仅提供库功能而非数据库的功能。
- 适用的内存模式。数据库使得哪种代理内存设计更为容易实现。
- 负载下的延迟表现。当多个代理请求同时到达时的响应情况。
- 本地部署的可行性。是否可以完全在自有服务器上运行而无需依赖云服务。
- 超出免费套餐后的限制。功能出现故障或开始产生费用的临界点。
目前大多数已发布的对比研究都针对RAG或推荐系统这类工作负载,这类系统中数据库负责处理无状态请求,并且基于固定的文档集进行重建。而智能体则有所不同,因为它们能够在不同会话之间积累记忆。存储系统需要持久化保存状态而不仅仅是响应查询,这也就决定了哪些权衡是可接受的。
八款产品逐一介绍
1. VectorAI DB社区版
VectorAI DB是一种由用户自行运行的向量数据库,设计上可在开发人员的笔记本电脑上以及离线生产环境中实现完全一致的功能。
免费版本。社区版为自托管模式,向量数量上限为5,000个,这是该版本的最小限制。据称,单独的30天试用版可将这一上限提升至100万个。该版本以单个Docker容器形式提供,无需Kubernetes、etcd或对象存储等外部依赖。其开发者公布了基准测试结果,称在64 GB的机器上处理1000万个768维向量时,每秒可处理约745次查询,且在相同硬件上相比Milvus和Qdrant Local的性能优势可达22倍。但这只是厂商的宣传数据:它描述的是处理1000万个向量的付费版本的性能,而非5,000个向量的免费版本。
适用于以下情况:代理需要前往数据实际存储的位置,而非云服务提供商的数据中心所在处:物理隔离的环境、严格的数据驻留规定、NVIDIA Jetson和Raspberry Pi等边缘硬件,或是那些云数据输出本身就存在问题的场景。该供应商提供了针对用户构建的应用程序的合规配置方案,但这与免费版本附带的认证不同。
内存模式。边缘设备和离线代理所需的内存,以及通用意义上的持久内存。数据会先存储到磁盘上,重启后再读取回来;而在无法使用Kubernetes的情况下,仅通过一个容器来运行程序,正是让离线及物理隔离环境下的使用变得可行的关键。
缺点。你必须自行托管,没有别的选择。与 Pinecone 或 Qdrant Cloud 不同,不存在免费的托管云服务,因此那些不想让任何人来运营服务器的团队应该考虑其他方案。
# VectorAI DB -- basic similarity search.
from actian_vectorai import VectorAIClient, VectorParams, Distance
with VectorAIClient("localhost:6574") as client:
client.collections.create(
"agent_memory",
vectors_config=VectorParams(size=768, distance=Distance.Cosine),
)
client.points.upsert(
"agent_memory",
points=[{"id": 1, "vector": [0.1] * 768, "payload": {"text": "example memory"}}],
)
results = client.points.search(
"agent_memory",
query_vector=[0.1] * 768,
limit=5,
)
2. Qdrant
Qdrant 是一种用 Rust 编写的开源向量数据库。你可以自行托管它,无需担心向量数量限制,也可以在 Qdrant Cloud 上运行。
免费套餐:在自备的硬件上运行,Qdrant 完全免费且没有使用上限(遵循 Apache 2.0 协议)。在 Qdrant Cloud 上,免费套餐提供单个节点,配备半个 vCPU、1 GB 内存和 4 GB 存储空间,大致足以存储一百万个 768 维度的向量。
适用场景:当你需要在生产环境中实现快速、带过滤条件的检索,并且需要 Python、TypeScript、Rust、Go、Java 和 .NET 等语言的客户端库时,该数据库非常合适。
内存机制:支持持久化存储代理内存。通过负载过滤与向量搜索相结合的方式,代理可以存储包含用户信息、会话信息及时间戳等元数据的记忆体,然后在查询时获取经过过滤的子集。
缺点。免费云方案虽然可用,但内存限制在1 GB。自托管则可突破此限制,但需要自行负责集群的运行与监控工作。查询延迟还会随数据集大小和过滤条件的复杂度而变化,因此需以实际工作负载进行测试。
# Qdrant -- basic similarity search.
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct
client = QdrantClient(url="http://localhost:6333")
client.create_collection(
collection_name="agent_memory",
vectors_config=VectorParams(size=768, distance=Distance.COSINE),
)
client.upsert(
collection_name="agent_memory",
points=[PointStruct(id=1, vector=[0.1] * 768, payload={"text": "example memory"})],
)
results = client.query_points(
collection_name="agent_memory",
query=[0.1] * 768,
limit=5,
)
在 Qdrant 上自托管代理内存是目前已被验证的有效方案。但对于与外部网络隔绝的环境,缺点在于仍需自行维护所有基础设施。
3. Weaviate
Weaviate 是一款开源向量数据库,每个查询都内置混合搜索功能,可将密集向量与 BM25 关键词匹配相结合。
免费层级。在 BSD-3 许可协议下,自托管版 Weaviate 可免费使用且无使用限制。其云服务目前提供14天的沙箱试用,之后则需要付费,具体条款请查看定价页面。
适用于需要将关键词匹配与语义相似度结合的查询场景。例如,某个代理需同时匹配精确的实体名称和模糊的概念来检索记忆。Weaviate 通过 REST 和 GraphQL API 提供此类混合工作流功能。
记忆模式。混合检索内存。将BM25与向量结合使用,是选择Weaviate而非纯向量引擎进行信息检索的主要原因,尤其是当记忆需要同时依赖概念和精确术语时。
缺点。对于托管使用而言,免费试用期限有限,并非永久方案。自行托管可以避免这一问题,但由于HNSW图完全存储在RAM中,内存成本会随数据量增加而上升。
# Weaviate -- basic similarity search.
import weaviate
from weaviate.classes.config import Configure
from weaviate.classes.query import MetadataQuery
client = weaviate.connect_to_local()
memories = client.collections.create(
name="AgentMemory",
vector_config=Configure.Vectors.self_provided(),
)
memories.data.insert(
properties={"text": "example memory"},
vector=[0.1] * 768,
)
response = memories.query.near_vector(
near_vector=[0.1] * 768,
limit=5,
return_metadata=MetadataQuery(distance=True),
)
client.close()
那些必须在资源受限的边缘硬件上运行、而非依赖始终在线的云集群的代理程序,将很难在仅靠RAM存储的情况下容纳完整的索引。
4. Milvus
Milvus是一款开源的分布式引擎,专为处理数十亿级向量数据集而设计。
免费版本:可自行下载运行,没有向量数量限制(遵循Apache 2.0许可协议)。它还提供两种简化模式:适用于本地使用的Milvus Lite,以及仅支持单节点的Standalone模式。对于需要高可用性的生产环境,则需采用分布式架构,此时会用到Kubernetes、etcd以及MinIO之类的对象存储系统。对于超大规模的数据集,它还支持GPU加速的索引构建功能。
适合以下场景:当知识库中的向量数量达到数亿级甚至更多时,且您希望选择十余种不同的索引类型,从而针对不同数据集调整检索效果与处理速度。
内存模式。具备大规模的持久化存储能力。当数据量成为拖慢内存存储速度的因素时,这种模式能发挥作用;但若压力来自多个会话或边缘部署场景,则并不适用。
缺点。运营成本较高。分布式模式并不适合用于小型项目,多节点扩展会带来极大的复杂性,而且也不适用于边缘设备或资源受限的硬件环境。
# Milvus -- basic similarity search.
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
client.create_collection(collection_name="agent_memory", dimension=768)
client.insert(
collection_name="agent_memory",
data={"id": 1, "vector": [0.1] * 768, "text": "example memory"},
)
results = client.search(
collection_name="agent_memory",
data=[[0.1] * 768],
limit=5,
)
如果需要更轻量级的方案,在决定使用基于 Kubernetes 的架构进行向量搜索之前,请务必仔细权衡。
5. ChromaDB
ChromaDB 是一种开源向量存储库,可嵌入到您自己的进程中,几乎无需任何配置。
免费层级。无论是在 Python 进程中嵌入使用,还是作为独立的 Docker 容器运行,它都是免费的且没有向量存储限制。项目官网称其不提供托管的云服务,但或许现在已经有了相关服务,建议查看项目网站确认。
适用于代理场景的情况是在尚未建立任何基础设施时,快速在内存层进行实验,测试分块大小、检索设置及提示词等参数。
内存模式。工作记忆。适用于单个智能体进程内的短暂或发展阶段的记忆存储,但作为多个智能体实例同时使用的长期存储时性能较差。
缺点。其在大规模生产环境中尚未得到验证。由于图结构的删除操作成本高昂,且HNSW结构只会持续增长,因此删除数据并不会缩小索引规模;碎片问题会一直存在,直到对索引进行压缩或重建。那些不断添加和移除记忆的智能体最终需要自行处理这些清理工作,同时还受限于单个节点的容量以及手动恢复的限制。
# ChromaDB -- basic similarity search.
import chromadb
client = chromadb.PersistentClient(path="./agent_memory")
collection = client.get_or_create_collection(name="agent_memory")
collection.add(
ids=["1"],
embeddings=[[0.1] * 768],
documents=["example memory"],
)
results = collection.query(
query_embeddings=[[0.1] * 768],
n_results=5,
)
当多个智能体实例需要共享同一个内存存储时,嵌入式模型往往是首先耗尽资源的。通常的解决方案是使用多进程连接的独立服务器,而非置于单个Python进程内部的方案。
6. LanceDB
LanceDB是开源且嵌入式的:它在对象存储中的文件上运行,完全不需要服务器进程。
免费层级。自托管或嵌入式的LanceDB在Apache 2.0许可下可免费使用,且没有向量数量限制。而托管型的无服务器LanceDB Cloud当时处于私有测试阶段,撰写本文时还需要配套应用程序,因此自托管是唯一可靠的方案。
适用于以下场景:当智能体在边缘设备上运行,或处于数据科学工作流中且无法承受跨网络访问独立数据库的延迟时,同时希望该存储与流程中的其他组件位于同一文件系统中。
内存模式。 边缘环境下的独立内存。这种嵌入式、无服务器的设计非常适合那些无法与数据库进程保持稳定连接的代理。
缺点。 虽然这种嵌入式模型使其在边缘环境中表现优异,但也会在并发场景下成为限制因素。多代理系统通常会有多个进程同时向同一张表写入数据,而这正是进程内存储最难以处理的工作负载。在最终确定方案之前,请先测试这种场景。
# LanceDB -- basic similarity search.
import lancedb
db = lancedb.connect("./agent_memory")
table = db.create_table(
"agent_memory",
data=[{"id": 1, "vector": [0.1] * 768, "text": "example memory"}],
)
results = table.search([0.1] * 768).limit(5).to_list()
7. pgvector
pgvector 是 PostgreSQL 的一个扩展,它让您现有的数据库具备基于向量相似度进行搜索的功能,因此无需更换系统,只需在原有 Postgres 上添加该扩展即可。
免费层级。该扩展完全免费且为开源代码。已经为 Postgres 支付费用的用户可以免费使用它;而没有 Postgres 的用户则必须引入整个关系型数据库才能实现向量搜索功能。
适用于以下场景:当应用程序已经在 Postgres 上运行,且不希望再增加额外的内存存储时。
内存存储模式。持久化内存存储在主数据库内部。与专用引擎相比,它的优势在于具备事务一致性,因为内存中的写入操作会与应用程序的关系行一同提交。
缺点。专为向量数据库设计的方案在处理大规模过滤查询时表现更佳;对于隔离环境或边缘部署而言,除非你也准备在那里运行完整的 Postgres 实例,否则这种方案并不实用。
# pgvector -- basic similarity search.
import psycopg
from pgvector.psycopg import register_vector
conn = psycopg.connect("dbname=agent_memory")
register_vector(conn)
conn.execute("CREATE EXTENSION IF NOT EXISTS vector")
conn.execute(
"CREATE TABLE IF NOT EXISTS memories (id bigserial PRIMARY KEY, "
"text text, embedding vector(768))"
)
conn.execute(
"INSERT INTO memories (text, embedding) VALUES (%s, %s)",
("example memory", [0.1] * 768),
)
results = conn.execute(
"SELECT text FROM memories ORDER BY embedding <-> %s LIMIT 5",
([0.1] * 768,),
).fetchall()
如果你的工作负载需要 pgvector 无法达到的性能上限,那就不得不完全放弃 Postgres 模型,这正是需要权衡的代价。
8. Pinecone
Pinecone 是一种托管式的无服务器服务,无法自行部署。
免费套餐。 Starter 套餐提供 2 GB 的索引存储空间,最多可创建五个索引,每月允许两百万次写入操作和一百万次读取操作,所有资源均限制在单个 AWS 区域(us-east-1)且仅适用于一个项目。目前并未公布向量数据的限制,这意味着存储空间会最先达到上限。
适用于以下场景:在原型设计阶段不希望有任何服务在后台运行,并且愿意将代理程序的内存完全托管在第三方基础设施上。
内存模式。在原型设计阶段会占用内存。免费套餐仅适用于测试和小规模项目,无法满足实际应用中智能体日益增长的长期数据存储需求。
缺点。对于智能体而言,存储容量上限并非主要问题,真正的问题在于没有自托管选项。如果数据必须存储在自身的基础设施中,那么无论免费套餐多么慷慨,Pinecone都不适合使用。
# Pinecone -- basic similarity search.
from pinecone import Pinecone, ServerlessSpec
import os
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
pc.create_index(
name="agent-memory",
dimension=768,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
while not pc.describe_index("agent-memory").status["ready"]:
pass
index = pc.Index("agent-memory")
index.upsert(vectors=[("1", [0.1] * 768, {"text": "example memory"})])
results = index.query(vector=[0.1] * 768, top_k=5)
对于那些因各种限制而完全无法使用云服务的部署场景,纯云端数据库根本不是可行选项。
如何决策
应按以下顺序进行决策:部署位置、当前已运行的系统,以及系统的规模发展。
首先考虑部署位置,因为只有这一因素才能彻底否决某个选择。仅存在于云端的数据库无法部署在物理隔离的环境中,而当法规要求数据必须留在原地时,任何免费方案都无法改变这一结论。存储容量上限只不过是一个需要后期付费提升的数值而已。
有两个因素不在上述顺序之中。如果您的系统中已经使用了 Postgres,那么无论在何处部署,pgvector 都能帮您省去搭建第二个数据库的麻烦。如果您需要处理数十亿个向量的规模,Milvus 是从一开始就为这类需求设计的解决方案。而如果您只是处于原型开发阶段,可以先在本地使用 ChromaDB,等到真正需要时再转向托管式服务。
对于本地部署、隔离环境或边缘计算场景,可行的选择主要是那些可自行托管的方案,即 VectorAI DB、Qdrant、Milvus、LanceDB 和 pgvector,具体选择则取决于规模需求、并发处理要求以及您的团队能够承担的运维工作量。