作为一个在关系型数据库系统领域拥有超过二十年的解决方案架构师,我最近开始探索MariaDB的新版本——Vector Edition,看看它是否能解决我们面临的一些AI数据挑战。初看起来,它非常有说服力,尤其是它能够将AI的魔力直接带入到常规的数据库设置中。然而,我还是想通过一个简单的用例来测试它的实际表现。
在这篇文章中,我将分享我在实践中关于MariaDB的向量功能的经验和观察,通过运行一个简单的用例。具体来说,我将把示例客户评论加载到MariaDB中,并执行快速相似性搜索以找到相关的评论。
环境设置
我的实验从使用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维的空间中。
import mysql.connector
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# I already have a database created with a name vectordb
connection = mysql.connector.connect(
host="localhost",
user="root",
password="<password>", # Replace me
database="vectordb"
)
cursor = connection.cursor()
# Create a table to store customer reviews with sentiment score and embeddings.
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;
""")
# Sample reviews
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)
]
# Load sample reviews into vector DB
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的向量功能来寻找类似的评论。这就像是在问“其他顾客有哪些评论与这条评论相似?”。在下面的例子中,我将找到与客户评论“我非常满意!”最相似的前两条评论。为此,我使用了最新版本中可用的向量函数之一(VEC_Distance_Euclidean
)。
# Convert the target customer review into vector
target_review_embedding = model.encode("I am super satisfied!")
# Find top 2 similar reviews using MariaDB's VEC_Distance_Euclidean function
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 的 Vector Edition 印象深刻!它将简化某些 AI 驱动的架构。它架起了传统数据库世界和 AI 工具不断发展的需求之间的桥梁。在接下来的几个月里,我期待看到这项技术如何成熟以及社区如何在实际应用中采用它。
Source:
https://dzone.com/articles/mariadb-vector-edition-hands-on-review