allanpichardo/mysql-vector

在 MySQL 上原生执行矢量操作

2.0.1 2024-07-08 03:55 UTC

This package is auto-updated.

Last update: 2024-09-08 04:23:39 UTC


README

概述

VectorTable 类是一个 PHP 实现,旨在简化在 MySQL 数据库中存储、检索和比较高维向量的过程。此类利用 MySQL JSON 数据类型和自定义余弦相似度函数 (COSIM) 来高效地进行向量比较。

搜索性能

向量的二进制量化是在将其插入数据库时进行的,以优化搜索速度并重新排序以提高准确性。然而,此库仅适用于小型数据集(小于 1,000,000 个向量)。对于大型数据集,建议使用专用矢量数据库,例如 Qdrant

搜索基准(384 维向量)

特性

  • 使用 JSON 数据类型在 MySQL 数据库中存储向量。
  • 使用自定义 MySQL 函数计算向量之间的余弦相似度。
  • 归一化向量并处理向量操作,如插入、删除和搜索。
  • 支持向量量化以优化搜索操作。
  • 原生 PHP 支持使用 BGE 嵌入模型 生成文本嵌入。

需求

  • PHP 8.0 或更高版本。
  • MySQL 5.7 或更高版本,支持 JSON 数据类型和存储函数。
  • PHP 的 MySQLi 扩展。

安装

  1. 确保 PHP 和 MySQL 已安装在您的系统上并正确配置。

  2. 使用 Composer 安装库。

    composer require allanpichardo/mysql-vector

用法

初始化矢量表

导入 VectorTable 类并使用 MySQLi 连接、表名和向量维度创建一个新实例。

use MHz\MysqlVector\VectorTable;


$mysqli = new mysqli("hostname", "username", "password", "database");
$tableName = "my_vector_table";
$dimension = 384;
$engine = 'InnoDB';

$vectorTable = new VectorTable($mysqli, $tableName, $dimension, $engine);

在 MySQL 中设置矢量表

如果矢量表不存在,initialize 方法将在 MySQL 中创建矢量表。如果 COSIM 函数不存在,此方法还将创建它。

$vectorTable->initialize();

插入和管理向量

// Insert a new vector
$vector = [0.1, 0.2, 0.3, ..., 0.384];
$vectorId = $vectorTable->upsert($vector);

// Update an existing vector
$vectorTable->upsert($vector, $vectorId);

// Delete a vector
$vectorTable->delete($vectorId);

计算余弦相似度

// Calculate cosine similarity between two vectors
$similarity = $vectorTable->cosim($vector1, $vector2);

搜索相似向量

使用余弦相似度标准执行与给定向量相似的向量搜索。参数 topN 指定返回的最大相似向量数。

// Find vectors similar to a given vector
$similarVectors = $vectorTable->search($vector, $topN);

文本嵌入

Embedder 类使用 BGE 嵌入模型 计算 384 维文本嵌入。第一次实例化 Embedder 类时,将自动安装 ONNX 运行时。输入文本的最大长度为 512 个字符。如果输入文本长度超过 512 个字符,Embedder 类将自动截断输入文本到 512 个字符。

use MHz\MysqlVector\Nlp\Embedder;

$embedder = new Embedder();

// Calculate the embeddings for a batch of text
$texts = ["Hello world!", "This is a test."];
$embeddings = $embedder->embed($texts);

print_r($embeddings[0][0]); // [0.1, 0.2, 0.3, ..., 0.384]
print_r($embeddings[1][0]); // [0.1, 0.2, 0.3, ..., 0.384]

贡献

欢迎对此项目的贡献。请确保您的代码遵守现有的编码标准,并包含适当的测试。

许可证

MIT 许可证