두 decades에 이르기까지 관계型 데이터베이스 시스템에 대한 경험이 있는 솔루션 아키텍처로서, 最近 MariadB의 새로운 벡터 版을 실험하기 시작했습니다. 이를 사용해 AI 데이터 도전에 대한 some of the solutions 를 찾을 수 있는지 여부를 확인하는 것입니다. 素早く 보는 것으로 convincing appeared, 특히 AI의 魔力를 일반적인 데이터 베이스 세팅에 바로 가져가는 것이었습니다. 그러나, 실제적으로 어떻게 performs 하는지 확인하기 위해 simplicity use case에 대한 실험을 해봐야 합니다.
이 글에서는, MariaDB의 벡터 기능에 대한 제 직접적인 경험과 관찰을 share 하将通过 simple use case를 실행하여 여러분과 공유하고자 합니다. 특히, MariaDB로 sample customer reviews를 로딩하고 빠른 유사성 search를 수행하여 관련된 reviews를 찾는 것입니다.
환경 세팅
제 실험은 MariaDB의 最新的 发布 (11.6)를 사용하여 Docker 컨테이너 설정으로 시작되었습니다. 이는 vector capabilities를 包含하고 있습니다.
# 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
現在,생성하고 그 안에 감정 스코어과 각 리뷰에 대한 embedding을 넣을 테이블을 만듭니다. 텍스트 嵌入(embedding)을 생성하기 위해서는 SentenceTransformer
를 사용하였으며, 이를 사용하면 이전 훈련된 모델을 사용할 수 있습니다. 그리고, 저는 리뷰를 384차 dimensional space로 매핑하는 paraphrase-MiniLM-L6-v2
모델을 사용하게 결정했습니다.
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의 vector 기능을 利用하여 유사한 리뷰를 찾을 것입니다. 이것은 “이 리뷰와 유사한 다른 고객이 어떤 말했는지 찾아주세요“와 같은 것입니다. 아래 예에서는 가장 유사한 2개의 리뷰를 찾을 것입니다. 이를 하기 위해서는 가장 최근 릴리스에서 사용 가능한 vect function(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()
관찰
- 이 세트의 구조화 데이터 (如火 Product IDs와 감정 스코어), 불구조化 데이터 (리뷰 텍스트), 그리고 그들의 vector 표현을 單独 테이블에 조합할 수 있습니다.
- SQL 문법과 vector 操作을 동시에 사용할 수 있는 것을 좋아하며, 이렇게 관련 데이터 베이스를 이미 famililar해진 团队合作에게 더 쉽게 되는 것을 좋아합니다. 이번 릴리스에서 지원하는 vector functions의 compete list입니다.
- HNSW index는 저는 이번에 시도한 것 중 더 큰 데이터셋에 대한 유사성 search query의 성능을 향상시켰습니다.
결론
전체적으로 인상적이에요! MariaDB의 Vector Edition은 AI-driver Architecture를 간단하게 만들 것입니다. 이것은 전통적인 데이터베이스 세계와 AI 도구의 발전하는 수요사이의 沟을 架け고 있습니다. 이번 달 내내 이 기술이 어떻게 성장하고 社群이 실제 세계적인 응용에서 이를 어떻게 채택하는지 기대하고 있어요.
Source:
https://dzone.com/articles/mariadb-vector-edition-hands-on-review