بناء قاعدة بيانات متجهية باستخدام FAISS وPostgreSQL

Share:
درس تقني متقدم ⏱ ٦٠ دقيقة قراءة © بوابة الذكاء الاصطناعي ٢٠٢٦-٠٦-٢٥

تعلم كيفية بناء قاعدة بيانات متجهية عالية الأداء باستخدام أحدث إصدارات FAISS وPostgreSQL لتطبيقات الذكاء الاصطناعي، مما يتيح عمليات البحث عن التشابه بكفاءة ويعزز سير العمل في الذكاء الاصطناعي.

المتطلبات الأساسية

  • FAISS v١.١٤.٠ مع امتدادات cuVS
  • PostgreSQL ١٨ مع pgvector v٠.٩.٠
  • فهم أساسي للذكاء الاصطناعي وقواعد البيانات المتجهية
  • Python ٣.١٠ أو أعلى
  • CUDA ١٢.٨ لتسريع GPU
  • مفاتيح API لمصادر البيانات إذا كانت مطلوبة

ما الذي نبنيه

في هذا الدرس، سنقوم ببناء نظام قاعدة بيانات متجهية قوي قادر على دعم تطبيقات الذكاء الاصطناعي التي تتطلب قدرات بحث متجهية سريعة وفعالة. من خلال دمج FAISS للبحث عن التشابه المتجهي وPostgreSQL مع pgvector لإدارة البيانات العلائقية، سيقوم النظام بالتعامل بكفاءة مع البيانات عالية الأبعاد وإجراء عمليات البحث الدلالي. هذا الإعداد مفيد بشكل خاص للتطبيقات مثل محركات التوصية ومحركات البحث الدلالي وحلول الذكاء الاصطناعي الأخرى التي تتطلب استرجاع سريع للعناصر المتشابهة من مجموعات البيانات الكبيرة.

النتيجة النهائية ستكون نظامًا يمكنه فهرسة والبحث عبر ملايين المتجهات بكفاءة، مستفيدًا من تسريع GPU لتحسين الأداء. سيمكن ذلك نماذج الذكاء الاصطناعي من تنفيذ عمليات مثل مطابقة التشابه والاسترجاع الدلالي مع تقليل التأخير وزيادة الدقة.

من خلال دمج المبادرات الإقليمية مثل رؤية السعودية ٢٠٣٠ والاستراتيجية الوطنية للذكاء الاصطناعي في الإمارات، يمكن لهذا الإعداد تعزيز البنية التحتية للذكاء الاصطناعي في دول مجلس التعاون الخليجي بشكل كبير، ودعم الشركات المحلية والمشاريع الحكومية في تحقيق أهداف التحول الرقمي الخاصة بها.

الإعداد والتثبيت

نحتاج إلى تثبيت المكتبات اللازمة وإعداد بيئتنا لدعم العمليات المتجهية على كل من CPU وGPU. يتضمن ذلك إعداد FAISS مع دعم GPU، وPostgreSQL مع امتداد pgvector، والمكتبات اللازمة لـ Python لمعالجة البيانات والتفاعل مع API.

pip install faiss-gpu==1.14.0
pip install psycopg2-binary
pip install numpy
pip install pandas

بالإضافة إلى ذلك، تأكد من تثبيت PostgreSQL وتمكين امتداد pgvector. قد تحتاج إلى وصول إداري لتثبيت الامتدادات على قاعدة بيانات PostgreSQL الخاصة بك.

CREATE EXTENSION IF NOT EXISTS vector;

يمكن إدارة متغيرات البيئة باستخدام ملف `.env` لتتبع بيانات اعتماد قاعدة البيانات ومفاتيح API بشكل آمن.

DB_HOST=localhost
DB_PORT=5432
DB_USER=yourusername
DB_PASSWORD=yourpassword
DB_NAME=yourdbname

الخطوة ١: إعداد قاعدة بيانات PostgreSQL

أولاً، سنقوم بتكوين قاعدة بيانات PostgreSQL لتخزين البيانات المتجهية. يتضمن ذلك إنشاء جدول مع عمود مصمم خصيصًا لحفظ البيانات المتجهية، باستخدام امتداد pgvector.

import psycopg2

connection = psycopg2.connect(
    host="localhost",
    database="yourdbname",
    user="yourusername",
    password="yourpassword"
)

cursor = connection.cursor()

create_table_query = '''
CREATE TABLE IF NOT EXISTS products (
    id SERIAL PRIMARY KEY,
    name TEXT,
    description TEXT,
    embedding VECTOR(300) -- Assuming 300 dimensions for embeddings
);
'''

cursor.execute(create_table_query)
connection.commit()

cursor.close()
connection.close()

يقوم هذا الكود بالاتصال بقاعدة بيانات PostgreSQL الخاصة بك وإنشاء جدول باسم `products` مع عمود `VECTOR` لتخزين التضمينات. يشير `VECTOR(300)` إلى أن كل متجه سيكون له ٣٠٠ بُعد، وهو أمر شائع لبعض النماذج المدربة مسبقًا مثل BERT.

الخطوة ٢: إعداد البيانات وتوليد التضمينات

بعد ذلك، سنقوم بإعداد بياناتنا وتوليد التضمينات باستخدام نموذج مدرب مسبقًا. سيتم تخزين هذه التضمينات في قاعدة بيانات PostgreSQL الخاصة بنا لاسترجاعها لاحقًا.

import numpy as np
import pandas as pd
from transformers import AutoTokenizer, AutoModel

# Load pre-trained model tokenizer and model
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')

def generate_embedding(text):
    inputs = tokenizer(text, return_tensors='pt')
    outputs = model(**inputs)
    # Use the mean pooling of the last hidden state as the embedding
    return outputs.last_hidden_state.mean(dim=1).squeeze().detach().numpy()

# Sample data
data = pd.DataFrame({
    'name': ['Product 1', 'Product 2'],
    'description': ['This is a great product.', 'Another excellent choice.']
})

# Generate embeddings
data['embedding'] = data['description'].apply(generate_embedding)

يستخدم هذا السكربت نموذج BERT لتوليد تضمينات ذات ٣٠٠ بُعد لوصف المنتجات. نطبق تقنية التجميع المتوسط على الحالة المخفية الأخيرة للحصول على تمثيل متجه بحجم ثابت لكل وصف.

الخطوة ٣: إدخال التضمينات في قاعدة البيانات

مع جاهزية التضمينات لدينا، الخطوة التالية هي إدخالها في قاعدة بيانات PostgreSQL. يتضمن ذلك تحويل مصفوفة numpy إلى تنسيق قائمة متوافق مع الإدخال في SQL.

def insert_embeddings_to_db(data):
    connection = psycopg2.connect(
        host="localhost",
        database="yourdbname",
        user="yourusername",
        password="yourpassword"
    )
    cursor = connection.cursor()

    insert_query = '''
    INSERT INTO products (name, description, embedding)
    VALUES (%s, %s, %s)
    '''
    for _, row in data.iterrows():
        cursor.execute(insert_query, (row['name'], row['description'], row['embedding'].tolist()))
    
    connection.commit()
    cursor.close()
    connection.close()

# Insert data into the database
insert_embeddings_to_db(data)

تقوم هذه الوظيفة بالتكرار عبر DataFrame، وإدخال كل صف في قاعدة البيانات. يتم تحويل التضمينات إلى قوائم لتتناسب مع تنسيق الإدخال المتوقع لنوع `VECTOR` في PostgreSQL.

⚠️ خطأ شائع: تأكد من أن أبعاد التضمينات الخاصة بك تتطابق مع ما هو محدد في عمود `VECTOR` في PostgreSQL. الأبعاد غير المتطابقة ستؤدي إلى أخطاء أثناء الإدخال.

اختبار تنفيذك

للتحقق من أن إعدادنا يعمل، سنقوم بإجراء بحث عن التشابه باستخدام التضمينات المدخلة. يتضمن ذلك استعلام قاعدة البيانات للعثور على العناصر الأكثر تشابهًا بناءً على التشابه المتجهي.

def search_similar_products(query_embedding, top_k=5):
    connection = psycopg2.connect(
        host="localhost",
        database="yourdbname",
        user="yourusername",
        password="yourpassword"
    )
    cursor = connection.cursor()

    search_query = '''
    SELECT id, name, description, embedding  %s AS distance
    FROM products
    ORDER BY distance ASC
    LIMIT %s;
    '''
    cursor.execute(search_query, (query_embedding.tolist(), top_k))
    results = cursor.fetchall()

    cursor.close()
    connection.close()
    return results

# Example query embedding
query_embedding = generate_embedding("Looking for a great product.")
similar_products = search_similar_products(query_embedding)
print(similar_products)

تبحث هذه الوظيفة عن أفضل `k` منتجات مشابهة عن طريق حساب المسافة الكونية بين تضمين الاستعلام والتضمينات المخزنة. يتم ترتيب النتائج حسب التشابه، حيث تظهر المنتجات الأكثر تشابهًا أولاً.

ما الذي يجب بناؤه بعد ذلك

بعد إكمال هذا الدرس، فكر في توسيع مشروعك بالميزات التالية:

  • دمج واجهة ويب باستخدام إطار عمل مثل React أو Next.js للسماح للمستخدمين بالتفاعل مع وظيفة البحث مباشرة.
  • تعزيز نظام التوصية عن طريق دمج بيانات سلوك المستخدم وحلقات التغذية الراجعة لتحسين الدقة بمرور الوقت.
  • تحسين الأداء عن طريق تجربة أنواع فهرسة مختلفة في FAISS، مثل IVF أو HNSW، للتعامل مع مجموعات البيانات الأكبر بكفاءة أكبر.
Share:

هل كان هذا الشرح مفيداً؟