Retrieval-Augmented Generation (RAG)

التخفيف من انحراف التضمين في أنظمة RAG

أنظمة التوليد المعزز بالاسترجاع (RAG) ليست كيانات ثابتة؛ بل تعتمد حياتها وموتها على جودة طبقة الاسترجاع. أحد أكثر التهديدات دقةً وتدميرًا لهذه الطبقة هو انحراف التضمين. مع نمو قاعدة البيانات، وتحديث إصدارات النماذج، أو تغيّر الدلالات الوثائقية، يمكن أن تتدهور العلاقات الهندسية بين المتجهات المخزنة، مما يؤدي إلى استرجاع غير ذي صلة واستجابات هالوسينية. تستكشف هذه الدليل استراتيجيات تقنية للحفاظ على اتساق المتجهات في البيئات الديناميكية.

فهم انحراف التضمين

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

  • تحديثات النموذج: الترقية من إصدار A إلى B لمحوّل الجمل (Sentence-Transformer) يغيّر فضاء المتجهات بأكمله.
  • انزياح قاعدة البيانات: المستندات الجديدة تقدم مفردات أو مفاهيم جديدة، مما يزيح مركز فضاء المتجهات.
  • تغييرات ما قبل المعالجة: تغيير استراتيجيات التقطيع أو تقنيات التطبيع يغيّر كيفية خرائط النص إلى متجهات.

الاستراتيجية 1: فهارس متجهات بإصدارات

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


import chromadb
from datetime import datetime

# Initialize client
client = chromadb.PersistentClient(path="./chroma_db")

def create_versioned_index(collection_name, model_version, embedding_fn):
    """
    Creates a new collection for a specific model version.
    Existing data is NOT modified, ensuring consistency for legacy queries.
    """
    versioned_name = f"{collection_name}_v{model_version}"
    
    # Check if collection exists
    if versioned_name not in client.list_collections():
        # Configure cosine similarity for consistent distance metrics
        client.create_collection(
            name=versioned_name,
            metadata={"hnsw:space": "cosine", "model_version": model_version, "created_at": datetime.utcnow().isoformat()}
        )
        print(f"Created new index: {versioned_name}")
    else:
        print(f"Index {versioned_name} already exists.")
    
    return client.get_collection(versioned_name)

# Usage example
# col_v1 = create_versioned_index("docs", "1.0.0", lambda x: embed_v1(x))
# col_v2 = create_versioned_index("docs", "2.0.0", lambda x: embed_v2(x))

الاستراتيجية 2: نقاط الارتكاز والتطبيع

إذا كان عليك استخدام فهرس واحد (مثلاً، بسبب قيود الموارد)، فقم بتنفيذ آلية "كشف الانحراف" باستخدام نقاط ارتكاز. اختر مجموعة صغيرة ومستقرة من المستندات المرجعية (نقاط الارتكاز) التي تمثل المفاهيم الأساسية. احسب بانتظام التشابه بين هذه النقاط الارتكازية وتضميناتها الحالية مقابل تضميناتها التاريخية.


import numpy as np

def check_drift(anchor_embeddings_current, anchor_embeddings_history, threshold=0.05):
    """
    Compares cosine similarity of anchor points between current and historical embeddings.
    """
    # Normalize vectors
    current_norm = anchor_embeddings_current / np.linalg.norm(anchor_embeddings_current, axis=1, keepdims=True)
    history_norm = anchor_embeddings_history / np.linalg.norm(anchor_embeddings_history, axis=1, keepdims=True)
    
    # Calculate pairwise cosine similarity
    similarities = np.dot(current_norm, history_norm.T)
    
    # Average similarity across all anchors
    avg_similarity = np.mean(similarities)
    
    if avg_similarity < (1 - threshold):
        raise Exception(f"Embedding Drift Detected: Avg Similarity {avg_similarity:.4f} below threshold {1-threshold}")
    else:
        print(f"Drift Check Passed: Avg Similarity {avg_similarity:.4f}")

# Example:
# current_anchors = get_embeddings(anchor_texts, model_version="v2")
# history_anchors = get_embeddings(anchor_texts, model_version="v1")
# check_drift(current_anchors, history_anchors)

الاستراتيجية 3: خطوط أنابيب إعادة التضمين المستمرة

دمج إعادة التضمين في خط CI/CD الخاص بك. عند تشغيل تحديث النموذج، جدول مهمة خلفية لإعادة تضمين الدلتا فقط (المستندات الجديدة/المعدلة) في إصدار الفهرس الجديد. استخدم استراتيجية الكتابة المزدوجة خلال فترة الانتقال، حيث تُقدَّم الاستعلامات من كلا الفهرسين القديم والجديد مع درجات مرجحة، مع إزاحة الوزن تدريجياً نحو الفهرس الجديد مع نمو الثقة.

خاتمة

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

Share: