عند تطوير تطبيقات الذكاء الاصطناعي التوليدي، عادةً ما تقوم بإدخال ثلاثة مكونات إضافية إلى بنيتك التحتية: مُدخل، ونموذج لغوي كبير، وقاعدة بيانات متجهات.
ومع ذلك، إذا كنت تستخدم MariaDB، فلا تحتاج إلى إدخال قاعدة بيانات إضافية مع لهجتها SQL الخاصة بها — أو الأسوأ من ذلك — واجهتها البرمجية الخاصة. منذ إصدار MariaDB 11.7 (و MariaDB Enterprise Server 11.4) يمكنك ببساطة تخزين متجهاتك (أو متجهاتك) في أي عمود من أي جدول — لا حاجة لجعل تطبيقاتك متعددة اللغات في قواعد البيانات.
“بعد الإعلان عن معاينة البحث المتجهي في خادم MariaDB، تمت إضافة قدرة البحث المتجهي الآن إلى إصدار خادم MariaDB Community 11.7،” يكتب رالف غيب هاردت، مدير المنتج لخادم MariaDB في MariaDB. يشمل ذلك نوع بيانات جديد (VECTOR
)، وفهرس متجه، ومجموعة من الدوال لمعالجة المتجهات.
لماذا تعتبر المتجهات ضرورية في تطبيقات الذكاء الاصطناعي التوليدي؟
تحتاج الناقلات في تطبيقات الذكاء الاصطناعي الإنشائي لأنها تضم معانٍ معقدة في مصفوفة ثابتة المقاس والمدمجة من الأرقام (ناقلة). يكون هذا أكثر وضوحًا في سياق تحسين إنتاج الاسترجاع (أو RAG). تتيح هذه التقنية لك جلب البيانات ذات الصلة من مصادرك (واجهات برمجة التطبيقات، الملفات، قواعد البيانات) لتعزيز إدخال نموذج الذكاء الاصطناعي بالبيانات المحمولة، التي غالبًا ما تكون خاصة بالأعمال.
نظرًا لأن مصادر البيانات الخاصة بك يمكن أن تكون ضخمة، تحتاج إلى طريقة للعثور على الأجزاء ذات الصلة، مع الأخذ في الاعتبار أن نماذج الذكاء الاصطناعي الحالية لديها نافذة سياقية محدودة — لا يمكنك ببساطة إضافة جميع بياناتك إلى إشارة. من خلال إنشاء شظايا من البيانات وتشغيل هذه الشظايا من البيانات من خلال نموذج ذكاء اصطناعي خاص يسمى ناقل، يمكنك إنشاء نواتج واستخدام تقنيات البحث في القرب للعثور على المعلومات ذات الصلة ليتم إلحاقها بإشارة.
على سبيل المثال، نأخذ الإدخال التالي من مستخدم في روبوت دردشة التوصيات:
I need a good case for my iPhone 15 pro.
نظرًا لأن نموذج الذكاء الاصطناعي الخاص بك لم يتم تدريبه بالبيانات الدقيقة التي تحتوي على معلومات المنتجات في متجرك على الإنترنت، عليك جلب المنتجات الأكثر صلة ومعلوماتها قبل إرسال الإشارة إلى النموذج.
لهذا، ترسل الإدخال الأصلي من المستخدم إلى ناقل وتحصل على ناقل يمكنك استخدامه لاحقًا للحصول على أقرب 10 منتجات، على سبيل المثال، إلى إدخال المستخدم. بمجرد الحصول على هذه المعلومات (وسنرى كيفية القيام بذلك باستخدام MariaDB في وقت لاحق)، يمكنك إرسال الإشارة المحسنة إلى نموذج الذكاء الاصطناعي الخاص بك:
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.
وهذا ينتج في توقعات الذكاء الاصطناعي التي تستخدم بياناتك الخاصة.
إنشاء جداول لتخزين النواتج
لتخزين النواقل في 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)
);
للحصول على تحكم أكبر، يمكنك تحديد وظيفة المسافة التي سيستخدمها خادم قاعدة البيانات لإنشاء الفهرس، بالإضافة إلى M القيمة لل العوالم الصغيرة الهرمية القابلة للتصفح (HNSW) الخوارزمية المستخدمة من قبل MariaDB. على سبيل المثال:
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 ودون استخدام أي أطر ذكاء اصطناعي حتى تتمكن من فهم عملية إنشاء تطبيقات الذكاء الاصطناعي التوليدية مع الاستفادة من قدرات بحث المتجهات في MariaDB. يمكنك العثور على الكود على GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb