在专门构建的人工智能数据库时代,像 MariaDB 这样的传统数据库如何重塑自身以保持相关性?在这篇中找出答案。
作为一名在关系数据库系统方面拥有二十多年经验的解决方案架构师,我最近开始探索 MariaDB 的新矢量版本,看看它是否可以解决我们面临的一些人工智能数据挑战。快速浏览一下似乎非常有说服力,尤其是它如何将人工智能魔法直接带入常规数据库设置中。但是,我想用一个简单的用例来测试它,看看它在实践中的表现如何。
在本文中,我将通过运行一个简单的用例来分享我对 MariaDB向量功能的实践经验和观察。具体来说,我将把示例客户评论加载到 MariaDB 中,并执行快速相似性搜索来查找相关评论。
环境设置Python 3.10 或更高版本Docker 桌面我的实验从使用包含矢量功能的 MariaDB最新版本 (11.6)设置Docker容器开始。
# Pull the latest releasedocker pull quay.io/mariadb-foundation/mariadb-devel:11.6-vector-preview# Update passworddocker run -d --name mariadb_vector -e MYSQL_ROOT_PASSWORD= quay.io/mariadb-foundation/mariadb-devel:11.6-vector-preview现在,创建一个表并加载示例客户评论,其中包括每个评论的情绪评分和嵌入。为了生成文本嵌入,我使用SentenceTransformer ,它允许您使用预先训练的模型。具体来说,我决定使用一个名为 paraphrase-MiniLM-L6-v2 的模型,该模型获取我们的客户评论并将其映射到 384 维空间。
import mysql.connectorimport numpy as npfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer('paraphrase-MiniLM-L6-v2')# I already have a database created with a name vectordbconnection = mysql.connector.connect( host="localhost", user="root", 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 reviewsreviews = [ (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 DBfor 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 的矢量功能来查找类似的评论。这更像是在问“其他顾客也说过类似的评论吗? ”。在下面的示例中,我将找到类似于“我非常满意! ”的客户评论的前 2 条评论。为此,我使用最新版本中提供的矢量函数 ( VEC_Distance_Euclidean ) 之一。
# Convert the target customer review into vectortarget_review_embedding = model.encode("I am super satisfied!")# Find top 2 similar reviews using MariaDB's VEC_Distance_Euclidean functioncursor.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 的矢量版将简化某些人工智能驱动的架构。它弥合了传统数据库世界与人工智能工具不断发展的需求之间的差距。在接下来的几个月中,我期待看到这项技术如何成熟以及社区如何在实际应用中采用它。