Retrieval-Augmented Generation (RAG)

کاهش انحراف جاسازی در RAG

سیستم‌های تولید تقویت‌شده با بازیابی (RAG) موجودیت‌های ایستا نیستند؛ آن‌ها بر اساس کیفیت لایه بازیابی خود زنده می‌مانند یا از بین می‌روند. یکی از ظریف‌ترین اما مخرب‌ترین تهدیدها برای این لایه انحراف جاسازی است. با رشد مجموعه داده، به‌روزرسانی نسخه‌های مدل یا تغییر معنای اسناد، روابط هندسی بین بردارهای ذخیره‌شده می‌تواند تضعیف شده و منجر به بازیابی نامرتبط و پاسخ‌های توهمی شود. این راهنما استراتژی‌های فنی را برای حفظ یکپارچگی برداری در محیط‌های پویا بررسی می‌کند.

درک انحراف جاسازی

انحراف جاسازی زمانی رخ می‌دهد که نمایش اسناد جدید یا به‌روزشده در فضای برداری از اسناد قبلاً ذخیره‌شده فاصله بگیرد، حتی اگر معنای معنایی آن‌ها مشابه باقی بماند. این امر می‌تواند به دلایل زیر رخ دهد:

  • به‌روزرسانی مدل: ارتقا از نسخه A به نسخه B Sentence-Transformer کل فضای برداری را تغییر می‌دهد.
  • جابه‌جایی مجموعه داده: اسناد جدید واژگان یا مفاهیم جدیدی را معرفی می‌کنند که مرکز هندسی فضای برداری را جابه‌جا می‌کنند.
  • تغییرات پیش‌پردازش: تغییر استراتژی‌های تکه‌تکه کردن (Chunking) یا تکنیک‌های نرمال‌سازی، نحوه نگاشت متن به بردارها را تغییر می‌دهد.

استراتژی ۱: شاخص‌های برداری نسخه‌بندی شده

راه‌حل مقاوم‌ترین این است که شاخص‌های برداری را مانند نسخه‌های کد در نظر بگیرید. هرگز بردارهای موجود را بازنویسی نکنید. به جای آن، برای هر نسخه مدل یا پیش‌پردازش، پارتیشن‌های جدیدی از شاخص ایجاد کنید.


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))

استراتژی ۲: نقاط لنگر و نرمال‌سازی

اگر مجبور به استفاده از یک شاخص واحد هستید (مثلاً به دلیل محدودیت منابع)، مکانیزمی برای «تشخیص انحراف» با استفاده از نقاط لنگر پیاده‌سازی کنید. مجموعه کوچکی از اسناد مرجع پایدار (لنگرها) را که نماینده مفاهیم اصلی هستند انتخاب کنید. به طور منظم شباهت بین این لنگرها و جاسازی‌های فعلی آن‌ها را با جاسازی‌های تاریخی آن‌ها محاسبه کنید.


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)

استراتژی ۳: خط لوله‌های جاسازی مجدد پیوسته

جاسازی مجدد را در خط لوله CI/CD خود یکپارچه کنید. هنگامی که به‌روزرسانی مدل فعال شد، یک شغل پس‌زمینه را برای جاسازی مجدد فقط دلتا (اسناد جدید/تغییر یافته) در نسخه جدید شاخص زمان‌بندی کنید. در طول دوره گذار، از استراتژی نوشتن دوتایی (dual-write) استفاده کنید، جایی که درخواست‌ها از هر دو شاخص قدیمی و جدید با امتیازهای وزن‌دار ارائه می‌شوند و وزن به طور تدریجی به شاخص جدید منتقل می‌شود زیرا اعتماد افزایش می‌یابد.

نتیجه‌گیری

انحراف جاسازی یک پیامد اجتناب‌ناپذیر سیستم‌های RAG پویا است، اما قابل مدیریت است. با پذیرش شاخص‌های نسخه‌بندی شده، پیاده‌سازی تشخیص انحراف مبتنی بر لنگر و خودکارسازی خط لوله‌های جاسازی مجدد، می‌توانید اطمینان حاصل کنید که لایه بازیابی شما یکپارچه و قابل اعتماد باقی می‌ماند. فضای برداری خود را با همان دقتی که با اسکیما پایگاه داده خود رفتار می‌کنید، مدیریت کنید—آن را پایش کنید، نسخه‌بندی کنید و قبل از استقرار تست کنید.

Share: