halo2 vectordb
1.0.0
可验证的向量相似性查询在授权的矢量数据库上查询。
该项目旨在使用零知识证明获得可验证的向量数据库的概念验证。我们大量使用了Awesome ZkFixedPointChip,该ChippointChip可以使用Halo2-Lib进行固定点算术。
您需要安装生锈:
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh然后,您可以克隆此存储库并使用其中的芯片:
git clone https://github.com/erhant/halo2-vectordb.git
cd halo2-vectordb我们实施两个芯片,一个用于HALO2中的距离指标,另一个用于基本矢量数据库操作。
DistanceChip DistanceChip提供的距离指标可以在两个相等长度的向量上运行。预计将使用FixedPointChip策略对矢量元素进行量化。实施以下距离指标:
euclidean_distance计算两个向量之间的欧几里得距离。manhattan_distance计算两个向量之间的曼哈顿距离。hamming_distance计算两个向量之间的一个减锤相似性。cosine_distance计算两个向量之间的一个减去余弦相似性。VectorDBChip VectorDBChip在一组向量上实现了基本矢量数据库功能。与DistanceChip类似,它需要一个FixedPointChip才能超过量化值。它揭示了以下功能:
nearest_vector采用一组向量和查询向量,并找到与给定距离函数最相似的向量。它还返回一个指标(即指示结果向量索引的一列编码向量),该指标可以在以后的步骤中使用。merkle_commitment采用了一组向量,并使用带有Poseidon Hashes的Merkle树致力于它们。如果给定的集合不包含两个元素的功率,则它将在其余的叶子上添加零。在我们的情况下,我们只需要整个向量或根本不需要,因此我们不关心致力于向量内的要素。因此,我们首先将整个矢量放置,然后将其视为叶子节点。kmeans采用一组向量,一个K常数来确定质心数量和I常数以确定迭代次数。 K-均值通常是一种迭代算法,当质心不再更新时终止;但是,在ZK电路中不可能进行这种控制流。因此, I参数确定固定数量的迭代。我们还具有特征FixedPointVectorInstructions及其对FixedPointChip策略的实现,这是简单的实用程序函数,以量化和去除向量。
可以在demo_test上找到一个示范性的测试套件:
K质心和集群。K centroids&clusters以及K+2 Merkle根。f64 Rust实现准确。通过以下一个来运行示例:
# demonstrate distance computations
LOOKUP_BITS=12 cargo run --example distances --
--name distances -k 13 mock
# example merkle commitment to vectors
LOOKUP_BITS=12 cargo run --example merkle --
--name merkle -k 13 mock
# exhaustively find the similar vector & commit to the database
LOOKUP_BITS=12 cargo run --example query --
--name query -k 13 mock
# compute centroids
LOOKUP_BITS=15 cargo run --example kmeans --
--name kmeans -k 16 mock您可以通过--input <input-name>选项提供特定的输入。
进行测试:
cargo test一些测试利用Jégou等人的ANN_SIFT_10K数据集。可以在colpus-texmex下载。该数据集128维向量。在我们的测试文件夹中, common模块公开了两个函数以读取这些向量:
read_vectors_from_disk采用路径和维度(在这种情况下为128),并从数据集中读取.fvec文件,并返回一个f32值的单个向量。该单个矢量由所有矢量元素组成,组成。select_from_vectors获取该向量和索引列表,仅返回所选向量。