VectorDBBench是一款由Zilliz开源的向量数据库基准测试工具,通过模拟真实的生成式AI应用情况,精准评估和选择最合适的向量数据库。
VDBBench设计理念
VDBBench解决的主要问题:传统基准测试和生产环境的严重脱节。
过时的数据集:许多传统测试仍在使用SIFT(128维)或GloVe等老旧数据集,而OpenAI或Cohere模型生成的向量维度通常在768到3072维之间。
过于简化的测试情况:传统测试通常在数据完全静态、索引预先建好的“理想状态”下进行。但真实的生产环境是 "边写边读" 的,数据在持续不断地流入。
片面的性能指标:很多测试只关注平均延迟或峰值QPS(每秒查询率),但掩盖了真实用户体验到的异常延迟(P95/P99延迟)以及在高并发下系统的持续吞吐能力。
VDBBench的每个功能设计都为了弥补这些差距,保证你的POC(概念验证)结果能真实反映数据库在生产环境中的表现。
安装和环境配置
系统要求
Python 3.11 或更高版本
约 2-3 小时的完整设置和测试时间
安装步骤
安装工具包:你可以根据测试需求,选择安装不同的版本:
bash
# 仅安装基础框架和Milvus客户端
pip install vectordb-bench
# 安装所有支持的数据库客户端(用于全面对比)
pip install vectordb-bench[all]
# 安装特定数据库客户端(如 Elasticsearch)
pip install vectordb-bench[elastic]
启动 Web 界面:安装完成后,在终端执行以下命令:
bash
init_bench
控制台会显示本地访问地址,通常在 http://localhost:8000,用浏览器打开即可。
准备自定义数据集
使用自己的业务数据让VDBBench发挥威力。VDBBench要求数据以特定结构的Parquet文件提供。
数据集文件构成
train.parquet:用于插入数据库,构建向量集合,向量ID (id) + 向量数据 (vector, float32列表)
test.parquet:用于发起查询的向量集合,向量ID (id) + 向量数据 (vector)
neighbors.parquet:查询向量的"标准答案",每个查询ID对应的Top K个最近邻ID
scalar_labels.parquet:用于过滤测试的元数据标签,向量ID对应的标量标签(如品类、颜色)
数据格式转换
你的原始数据可能是CSV或NPY格式,需要转换为VDBBench要求的格式。
CSV 输入格式示例:
如果你的向量数据存储在CSV中,格式可能如下:
csv
id,emb,label
1,"[0.12, 0.56, 0.89, ...]",A
2,"[0.33, 0.48, 0.90, ...]",B
2. NPY 输入格式示例:
如果你的数据是纯向量矩阵:
python
import numpy as np
vectors = np.random.rand(10000, 768).astype('float32')
np.save("vectors.npy", vectors)
自动化转换脚本:
手动转换格式、计算Ground Truth非常繁琐。你可以使用以下Python脚本一键完成转换:
bash
python convert_to_vdb_format.py \
--train data/train.csv \ # 训练数据路径
--test data/test.csv \ # 测试数据路径
--out datasets/custom \ # 输出目录
--topk 10 # 计算Top K近邻
这个脚本会自动处理格式转换、数据集拆分,并利用FAISS库计算准确的Ground Truth。
转换脚本的主要依赖:
bash
pip install numpy pandas faiss-cpu
执行基准测试
完成数据准备后,你就可以通过Web界面或命令行进行测试了。
通过 Web 界面运行(推荐)
这是最直观的方式,流程如下:
选择测试数据库:在界面中选择你想要测试的一个或多个向量数据库(如 Milvus, Elasticsearch, pgvector 等)。
配置连接参数:填写所选数据库的连接信息,如主机地址、端口、认证信息等。
选择测试案例:VDBBench 提供了多种测试情况,你需要根据目标进行选择:
静态集合:测量数据完全导入并建立索引后的纯查询性能。系统维护期、历史数据查询。
过滤搜索:测试结合元数据过滤(如"颜色=红色")的向量搜索性能。电商中的组合筛选、个性化推荐。
流式情况:在持续写入新数据的同时,进行并发查询,测量系统稳定性。实时推荐、金融风控等"边写边读"的动态环境。
设置任务标签并运行:给本次测试一个唯一的标识,然后启动测试。
通过命令行运行
对于自动化或特定情况,也可以使用命令行。例如,在测试Hologre 时的命令如下:
bash
NUM_PER_BATCH=100000 vectordbbench hologreshgraph \
--host <hologres_endpoint> \
--port <port> \
--user '<username>' --password <password> \
--database <db_name> \
--case-type Performance768D10M \
--num-concurrency 1,60,70,75,80,90,95,100,105,110,115,120
如果多次重复跑性能测试,可以在命令后加上 --skip-drop-old --skip-load 参数来跳过重复的数据导入过程,节省时间。
测试结果
测试完成后,VDBBench 提供了丰富的可视化和数据报告。关注以下测试指标:
吞吐量和延迟:
QPS (Queries Per Second):系统每秒处理的查询数量。关注其在不同并发下的最大值和稳定性,而非短暂峰值。
P95 / P99 延迟:95% 或 99% 的查询所能达到的最慢延迟。这比平均延迟更重要,因为它直接影响了最差情况下的用户体验。
准确度:
召回率 (Recall):查询结果中正确近邻的数量占总实际近邻数量的比例。没有准确率的速度是毫无意义的,必须结合召回率来评估性能。
系统资源:
CPU/内存使用率:了解系统在不同负载下的资源消耗情况。
索引构建时间和资源消耗:索引的构建效率直接影响系统的维护成本和可用性。
常见问题
从简单开始:初次测试时,可以先使用静态集合测试,保证基本功能正常,再逐步进行更复杂的过滤和流式测试。
并发测试策略:VDBBench会通过逐步增加并发量来测试数据库的极限,这有助于你找到系统的最大可持续QPS,并观察高并发下延迟的增长曲线。
环境一致性:保证测试客户端(运行VDBBench的机器)和数据库服务器处于相同的网络环境(如相同的VPC、可用区),排除网络对结果的干扰。
安装失败:请首先确认Python版本为 3.11 或更高。
数据导入错误:检查你的Parquet文件格式是否严格符合要求,特别是ID列的数据类型和向量列的数组格式。
连接失败:核对数据库的连接信息(主机、端口、密码),并确保网络可达。
测试中断或报错:可以尝试降低并发数或减少测试数据量,判断是否是数据库实例资源达到上限所致。