allanpichardo / mysql-vector
在 MySQL 上原生执行矢量操作
2.0.1
2024-07-08 03:55 UTC
Requires
- php: >=8.0
- ext-ctype: *
- ext-iconv: *
- ext-intl: *
- ext-mbstring: *
- ext-mysqli: *
- ankane/onnxruntime: ^0.2.1
- bdelespierre/php-kmeans: ^2.2
- symfony/polyfill-ctype: ^1.28
- symfony/polyfill-iconv: ^1.28
- symfony/polyfill-intl-normalizer: ^1.28
- symfony/polyfill-mbstring: ^1.28
Requires (Dev)
- phpunit/phpunit: ^9.5
Replaces
- symfony/polyfill-ctype: ^1.28
- symfony/polyfill-iconv: ^1.28
- symfony/polyfill-intl-normalizer: ^1.28
- symfony/polyfill-mbstring: ^1.28
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 扩展。
安装
-
确保 PHP 和 MySQL 已安装在您的系统上并正确配置。
-
使用 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 许可证