当您开发生成性人工智能应用程序时,通常会在基础设施中引入三个额外组件:嵌入器、LLM和向量数据库。
然而,如果您使用的是MariaDB,就不需要引入额外的数据库及其自己的SQL方言——甚至更糟糕——其专有API。自MariaDB版本11.7(和MariaDB Enterprise Server 11.4)以来,您可以简单地将嵌入(或向量)存储在任意表的任何列中——无需让您的应用程序变得数据库多语种。
“在宣布MariaDB Server的向量搜索预览后,向量搜索功能现已添加到MariaDB Community Server 11.7版本中,” 写道Ralf Gebhardt,MariaDB的MariaDB Server产品经理。此版本包括一种新数据类型(VECTOR
)、向量索引和一组用于向量操作的函数。
为什么在生成性人工智能应用程序中需要向量?
向量在生成式人工智能应用中是必需的,因为它们将复杂含义嵌入到一个紧凑的固定长度的数字数组(向量)中。这在检索增强生成(或RAG)的背景下更为明显。这种技术允许您从来源(API、文件、数据库)中提取相关数据,以增强AI模型输入,使用这些通常是业务私有的数据。
由于您的数据来源可能非常庞大,您需要一种方法来找到相关片段,考虑到当前的AI模型具有有限的上下文窗口 – 您不能简单地将所有数据添加到提示中。通过创建数据块并将这些数据块通过称为嵌入器的特殊AI模型运行,您可以生成向量并使用接近搜索技术来查找相关信息,以附加到提示。
例如,接受来自推荐聊天机器人用户的以下输入:
I need a good case for my iPhone 15 pro.
由于您的AI模型未经过训练,不包含在线商店产品信息的确切数据,您需要在发送提示给模型之前检索最相关的产品及其信息。
为此,您将用户的原始输入发送给一个嵌入器,并获得一个向量,稍后可以使用该向量获取最接近的,比如10个产品与用户输入相关。一旦获取了这些信息(我们稍后将看到如何在MariaDB中实现此操作),您可以将增强提示发送给您的AI模型:
I need a good case for my iPhone 15 pro. Which of the following products better suit my needs?
1. ProShield Ultra Case for iPhone 15 Pro - $29.99: A slim, shock-absorbing case with raised edges for screen protection and a sleek matte finish.
2. EcoGuard Bio-Friendly Case for iPhone 15 Pro - $24.99: Made from 100% recycled materials, offering moderate drop protection with an eco-conscious design.
3. ArmorFlex Max Case for iPhone 15 Pro - $39.99: Heavy-duty protection with military-grade durability, including a built-in kickstand for hands-free use.
4. CrystalClear Slim Case for iPhone 15 Pro - $19.99: Ultra-thin and transparent, showcasing the phone's design while providing basic scratch protection.
5. LeatherTouch Luxe Case for iPhone 15 Pro - $49.99: Premium genuine leather construction with a soft-touch feel and an integrated cardholder for convenience.
这将导致使用您自己数据的AI预测。
为向量存储创建表
在MariaDB中存储向量,请使用新的VECTOR
数据类型。例如:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
在这个例子中,embedding
列可以容纳一个2048维的向量。你必须匹配你生成的嵌入器所产生的维度数量。
创建向量索引
为了提高读取性能,重要的是为你的向量列添加索引。这可以加快相似性搜索。你可以在创建表时定义索引,如下所示:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
为了更好的控制,你可以指定数据库服务器将用于构建索引的距离函数,以及MariaDB所使用的M 值来自分层可导航的小世界(HNSW)算法。例如:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
请查看文档以获取有关这些配置的更多信息。
插入向量
当你通过嵌入器传递数据(文本、图像、音频)时,你会得到一个向量。通常,这是一系列以JSON格式存储的数字数组。要将此向量插入MariaDB表中,你可以使用VEC_FromText
函数。例如:
INSERT INTO products (name, embedding)
VALUES
("Alarm clock", VEC_FromText("[0.001, 0, ...]")),
("Cow figure", VEC_FromText("[1.0, 0.05, ...]")),
("Bicycle", VEC_FromText("[0.2, 0.156, ...]"));
请记住,插入的向量必须具有在CREATE TABLE
语句中定义的正确维度数量。
相似性搜索(比较向量)
在RAG应用程序中,您将用户输入发送到一个嵌入器以获得一个向量。然后,您可以查询与该向量更接近的数据库记录。更接近的向量代表语义上相似的数据。在撰写本文时,MariaDB有两个可以用于相似性或接近性搜索的距离函数:
VEC_DISTANCE_EUCLIDEAN
:计算两个向量之间的直线距离。最适合从原始、未标准化数据导出的向量或空间分离直接与相似性相关的场景,比如比较位置或数值特征。然而,对于高维度或标准化嵌入,它效果较差,因为它对向量幅度的差异敏感。VEC_DISTANCE_COSINE
:衡量向量之间的角度差异。适用于比较标准化的嵌入,特别是在文本或文档检索等语义应用中。它擅长捕捉含义或上下文中的相似性。
请记住,使用上述函数进行相似性搜索仅是近似的,且高度依赖于计算向量的质量,因此也依赖于使用的嵌入器的质量。
以下示例查找与给定向量最相似的前10个产品($user_input_vector
应替换为嵌入器返回的实际向量,该向量是用户输入的)。
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
VEC_DISTANCE_COSINE
和 VEC_DISTANCE_EUCLIDEAN
函数接收两个向量。在之前的示例中,其中一个向量是根据用户输入计算得出的向量,另一个是 products
表中每条记录对应的向量。
一个实际示例
我准备了一个实际示例,使用 Java 并且没有 AI 框架,以便您真正理解利用 MariaDB 的向量搜索能力创建生成式 AI 应用程序的过程。您可以在 GitHub 上找到代码。
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb