点击上方蓝字关注我们
最近开始探索 MariaDB 的新矢量版,看看它能否解决我们面临的一些人工智能数据挑战。快速浏览一下似乎很有说服力,尤其是它如何将人工智能的魔力直接带入常规数据库设置中。不过,想通过一个简单的用例对它进行测试,看看它的实际表现如何。在本文中,将通过运行一个简单的用例,分享对 MariaDB 向量功能的实践经验和观察结果。具体来说,将把客户评论样本加载到 MariaDB 中,并执行快速相似性搜索以查找相关评论。
什么是 矢量搜索
语义文本搜索
图像搜索
音乐搜索
生成式人工智能--RAG,检索增强生成
环境设置
Python 3.10 或更高版本
Docker
实验从使用 MariaDB 的最新版本(11.6)(包含向量功能)设置 Docker 容器开始。
# Pull the latest release
docker pull quay.io/mariadb-foundation/mariadb-devel:11.6-vector-preview
# Update password
docker run -d --name mariadb_vector -e MYSQL_ROOT_PASSWORD=<replace_password> quay.io/mariadb-foundation/mariadb-devel:11.6-vector-preview
现在,创建一个表格并载入客户评论样本,其中包括每条评论的情感评分和嵌入。为了生成文本嵌入,使用了 SentenceTransformer,它可以让你使用预先训练好的模型。具体来说,决定使用一个名为 paraphrase-MiniLM-L6-v2 的模型,它能将我们的客户评论映射到 384 维空间中。SentenceTransformer是一个强大的Python库,由UKP实验室开发并维护,旨在简化多语言文本和图像嵌入的创建过程。SentenceTransformer能够将句子或文本转换成固定长度的向量,这些向量可以在高维空间中进行比较,从而判断文本之间的语义相似性。例如,通过计算两个句子嵌入向量之间的余弦相似度,可以量化它们之间的语义接近程度。这一功能在文本匹配、信息检索等领域具有广泛应用。语义搜索通过理解搜索查询的内容来提高搜索的准确性,而不是仅仅依赖于词汇匹配。SentenceTransformer将语料库中的所有条目嵌入到向量空间中,在搜索时,查询也会被嵌入到相同的向量空间中,并从语料库中找到最接近的嵌入。这种基于嵌入的相似性搜索方法能够显著提高搜索结果的准确性和相关性。
import mysql.connector
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 我已经创建了一个名为 vectordb 的数据库
connection = mysql.connector.connect(
host="localhost",
user="root",
password="<password>", # Replace me
database="vectordb"
)
cursor = connection.cursor()
# 创建一个表来存储带有情感评分和嵌入的客户评论。
cursor.execute("""
CREATE TABLE IF NOT EXISTS customer_reviews (
id INT PRIMARY KEY AUTO_INCREMENT,
product_name INT,
customer_review TEXT,
customer_sentiment_score FLOAT,
customer_review_embedding BLOB,
INDEX vector_idx (customer_review_embedding) USING HNSW
) ENGINE=ColumnStore;
""")
# 评论样本
reviews = [
(1, "This product exceeded my expectations. Highly recommended!", 0.9),
(1, "Decent quality, but pricey.", 0.6),
(2, "Terrible experience. The product does not work.", 0.1),
(2, "Average product, ok ok", 0.5),
(3, "Absolutely love it! Best purchase I have made this year.", 1.0)
]
# 将样本评论载入矢量数据库
for product_id, review_text, sentiment_score in reviews:
embedding = model.encode(review_text)
cursor.execute(
"INSERT INTO customer_reviews (product_id, review_text, sentiment_score, review_embedding) VALUES (%s, %s, %s, %s)",
(product_id, review_text, sentiment_score, embedding.tobytes()))
connection.commit()
connection.close()
现在,让我们利用 MariaDB 的矢量功能来查找类似的评论。这更像是在问 "What other customers said similar to this review?与此评论类似的其他客户评论有哪些?在下面的示例中,要找出与客户评论 “I am super satisfied我超级满意!”相似的前 2 条评论。为此,将使用最新版本中的一个矢量函数(VEC_Distance_Euclidean)
# 将目标客户的评论转化为矢量
target_review_embedding = model.encode("I am super satisfied!")
# 使用 MariaDB 的 VEC_Distance_Euclidean 函数查找前 2 条类似评论
cursor.execute("""
SELECT review_text, sentiment_score, VEC_Distance_Euclidean(review_embedding, %s) AS similarity
FROM customer_reviews
ORDER BY similarity
LIMIT %s
""", (target_review_embedding.tobytes(), 2))
similar_reviews = cursor.fetchall()
观察
它易于设置,我们可以将结构化数据(如产品 ID 和情感评分)、非结构化数据(评论文本)及其矢量表示合并到一个表中。它在使用向量操作的同时还能使用 SQL 语法的功能,这让已经熟悉关系数据库的团队更容易上手。以下是该版本支持的矢量函数的完整列表。HNSW 索引提高了目前尝试的较大数据集的相似性搜索查询性能。
性能对比
MariaDB 矢量版 提交 23ecb6ec89a:MariaDB 服务器的本地矢量搜索功能
pgvector commit bb424e96e7: PostgreSQL 的向量相似性搜索扩展
Qdrant 1.5.1, client version 1.5.4: 矢量数据库(不包括二进制量化,因为二进制量化对所用数据集的召回率很低)
RediSearch 2.6.13 commit f966d37: Redis 的查询和索引引擎
Weaviate 3.16.0: 矢量数据库
MariaDB 矢量预览版实现了分层导航小词语(HNSW)算法的改进版本。其搜索性能可与其他矢量搜索实现相媲美,在使用多个连接时,其可扩展性更胜一筹。
MariaDB Vector的性能极具竞争力。在较小的数据集上,在给定的召回率下,MariaDB Vector的qps最高,RediSearch次之;在大型数据集上,MariaDB Vector紧随RediSearch之后。另一方面,MariaDB Vector建立索引的速度比RediSearch快。有趣的是,专门的单用途矢量数据库并没有快多少。它们的搜索速度比 MariaDB Vector 和 RediSearch 都要差。除了在 GIST 数据集上的 Qdrant,其他数据库的索引建立时间也没有提高。
结论
总的来说,印象深刻!MariaDB 矢量版将简化某些人工智能驱动的架构。它在传统数据库世界和不断发展的人工智能工具需求之间架起了一座桥梁。在接下来的几个月里,期待着看到这项技术如何成熟,以及社区如何在实际应用中采用它。