MariaDB Vector

  • 一个由 MariaDB 基金会指导、与 MariaDB 服务器社区共同构建的项目。主要贡献者 – MariaDB Corporation, MariaDB 基金会, Amazon
  • 在关系数据库中实现快速向量搜索。
  • 保持技术栈简单,无需使用专门的数据存储。

MariaDB Vector 现已在 11.7 RC 版本中提供!

MariaDB Vector 在 MariaDB 中带来了向量相似度搜索功能。向量相似度搜索是基于距离函数在数据库中存储和查找向量的通用问题。

本项目在 MariaDB 中引入了专门的语法以及一种新的索引类型,以实现快速搜索向量。

11.7 RC 版本中有哪些功能

有一个专用的 VECTOR 数据类型和一种专门的 VECTOR 索引类型。索引算法是 HNSW 的修改版本。

CREATE TABLE products (
    name varchar(128),
    description varchar(2000),
    embedding VECTOR(4) NOT NULL,  # Make sure the dimensions match your AI model's output
    VECTOR INDEX (embedding) M=6 DISTANCE=euclidean)
ENGINE=InnoDB;

向量距离函数

# Euclidean distance
VEC_DISTANCE_EUCLIDEAN(embedding, Vec_FromText('[0.1, 0.4, 0.5, 0.3, 0.2]'))

实用向量函数

VEC_FromText('[...]')  # JSON array of floats.
VEC_ToText(<vector-bytes>)

插入向量

INSERT INTO products (name, description, embedding)
VALUES ('Coffee Machine',
        'Built to make the best coffee you can imagine',
        VEC_FromText('[0.3, 0.5, 0.2, 0.1]'))

向量搜索

SELECT p.name, p.description
FROM products AS p
ORDER BY VEC_DISTANCE_EUCLIDEAN(p.embedding,
                      VEC_FromText('[0.3, 0,5, 0.1, 0.3]'))
LIMIT 10

如果 SELECT 查询包含 ORDER BY VEC_DISTANC_EUCLIDEAN(或 VEC_DISTANC_COSINE)子句和 LIMIT 子句,MariaDB 优化器会进行调优以利用向量索引。

MariaDB Vector 性能

MariaDB Vector 预览版实现了分层可导航小世界 (HNSW) 算法的修改版本。其搜索性能与其他向量搜索实现相当,并且在使用多个连接时在可伸缩性方面表现更佳。

单线程查询性能(向上向右表示更好)
多线程查询性能(向上向右表示更好)

完整的基准测试集可在以下链接找到
https://mariadb.com/resources/blog/how-fast-is-mariadb-vector/


演示文稿

总体介绍

技术介绍

使用 MariaDB Vector 开发 AI 优先应用

FOSDEM 会议上的评论

概览

对企业:用例

  • 推荐系统
    • 基于用户偏好和行为构建个性化产品推荐。
    • 以自然语言与用户互动,而不是“搜索查询”。
  • 相似度搜索
    • 实现强大的搜索功能,以查找相似的图像、文档或多媒体内容。
    • 利用自己的文档构建自己的技术专家(问答系统)。
    • 在您的商店中找到相关产品,无需手动进行标记。
  • 机器学习
    • 存储和检索用于机器学习模型的数据的向量表示。
    • 轻松实现聚类,快速获取最近的数据点。

对开发者:如何使用 MariaDB Vector

ALTER TABLE data ADD COLUMN embedding VECTOR(100);
  • 创建一个专门的向量索引。
CREATE VECTOR INDEX vec_index ON data (embedding);
  • 添加数据时,请您的模型生成向量嵌入并将其与文档一起存储。
INSERT INTO data (document, embedding) VALUES (
  '...a document...',
  '...a vector with embeddings...');
  • 对于任何用户提示,首先让您的模型生成嵌入,并在 ORDER BY 子句中使用它(结合与索引匹配的适当距离函数)。
SELECT * FROM data WHERE document_owner_id=1234
ORDER BY VEC_DISTANCE_COSINE(embedding, '...embeddings...') LIMIT 10
  • 这将为您找到与用户提示最相似的 10 个文档。

对贡献者:代码是如何开发的

MariaDB 基金会负责协调

  • 我们设定方向
  • 我们定义规范以匹配社区需求
  • 我们根据技术价值评估贡献
  • 我们确保在 buildbot.mariadb.org 上进行完整的 CI/CD
  • 我们推广用例
  • 我们布道并创建 MariaDB 学习工具

MariaDB 服务器社区负责开发

  • MariaDB plc 负责向量索引的创建和搜索代码
  • MariaDB plc 负责其他核心基础设施代码
  • 众多科技巨头贡献了开发者资源和技术输入:Amazon, Alibaba, Google, Microsoft, Automattic, PlanetScale, Acronis, Crayon, Wikimedia Foundation
  • 个人社区贡献者开发替代搜索算法
  • 贡献者在联合测试和基准测试中协同工作

文档

  • 向量文档
  • 团队

    MariaDB 基金会

    MariaDB Corporation

    贡献者

    项目技术描述

    为什么需要向量相似度搜索?

    向量搜索对于任何希望构建 AI 功能的应用都非常重要。基本用例是根据自由形式的用户查询查找相关文档。
    为了理解其工作原理,我们需要定义几个概念

    向量嵌入 (Vector embedding)
    向量嵌入是一种将词语、短语或文档表示为实数密集向量的方法。具有相似含义或上下文的词语或短语将具有相似的向量表示。

    用于嵌入的大型语言模型 (LLM)
    大型语言模型 (LLMs) 是强大的神经网络模型,在大量文本数据上进行训练,以学习语言的模式、结构和意义,并输出向量嵌入。

    向量距离
    向量距离是用于量化两个向量嵌入之间相似性或不相似性的度量。常用的度量距离包括:余弦相似度、欧氏距离。

    需要注意的一点是,不能混合使用来自不同模型的嵌入,因为生成的嵌入的关键属性是它们之间的相对距离。这个距离会因模型而异。每个模型都有其优点和缺点,您需要测试不同的策略才能找到最适合您的一种。

    用户体验

    现在我们假设我们有一个销售各种消费电器的网店。利用向量嵌入创建 AI 搜索功能的最简单流程如下:

    • 对于商店库存中的每个产品,将产品名称和描述连接起来,并发送到嵌入 LLM 以生成一个向量嵌入。将生成的向量作为附加列存储在与产品相同的行中。
    • 将用户输入作为字符串。例如:“一台带有奶泡器和研磨器的浓缩咖啡机,可以直接连接水源,并配有专用的牛奶容器。”
    • 通过相同的嵌入 LLM 处理用户输入,以生成向量嵌入。
    • 使用以下形式的 SQL 查询检索最接近的前 10 个匹配项
    SELECT name, description
    FROM products p
    ORDER BY VEC_DISTANCE_EUCLIDEAN(p.embedding,                     Vec_FromString(<embedding-from-user-query>))
    LIMIT 10

    本项目旨在通过使用近似最近邻搜索来优化最后一个查询的性能。