Vector Databases

Weaviate متعدد المستأجرين RAG: أمان على مستوى الصفوف والفهارس المعزولة

بناء أنظمة توليد المعزز بالاسترجاع (RAG) لمنصات SaaS المؤسسية يطرح تحديًا فريدًا: عزل البيانات. على عكس التطبيقات أحادية المستأجر، تتطلب البيئات متعددة المستأجرين حدودًا صارمة بين العملاء. على الرغم من أن Weaviate يوفر تعدد المستأجرين الأصلي، فإن فصل المقاطع حسب المستأجر وحده غالبًا ما يكون غير كافٍ للأمان المؤسسي. تستكشف هذه المقالة كيفية دمج الفهارس المعزولة في Weaviate مع أمان على مستوى الصفوف (RLS) على مستوى التطبيق لإنشاء معمارية RAG آمنة وقابلة للتوسع.

فهم تعدد المستأجرين في Weaviate

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

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

تنفيذ أمان على مستوى الصفوف عبر التصفية بالميتاداتا

عادةً ما يتم فرض RLS في Weaviate من خلال التصفية بالميتاداتا. من خلال وضع علامة على كل متجه بسمات إضافية مثل department (القسم)، أو role (الدور)، أو project_id (معرّف المشروع)، يمكنك تقييد المستندات التي يمكن للمستخدم استرجاعها. على سبيل المثال، قد يرى "مدير المالية" فقط المستندات الموسومة بـ department: finance (القسم: المالية)، بينما يرى "المهندس" department: engineering (القسم: الهندسة).

إليك كيفية هيكلة بياناتك لدعم RLS:

import weaviate
import json

client = weaviate.Client("http://localhost:8080")

# Define a document with RLS-relevant metadata
document = {
    "title": "Q3 Financial Report",
    "content": "Detailed analysis of Q3 earnings...",
    "tenant": "acme-corp",
    "department": "finance",
    "clearance_level": "senior"
}

# Add to Weaviate with the appropriate tenant context
client.data_object.create(
    data=doc,
    collection="RAG_Documents",
    tenant="acme-corp"
)

بناء خط أنابيب الاستعلام الآمن

عند تنفيذ استعلام RAG، يجب تطبيق طبقتين من التصفية: عزل المستأجر وأمان على مستوى الصفوف. يجب أن يعترض طبقة التطبيق سياق المستخدم ويبني استعلام التصفية ديناميكيًا.

def secure_rag_query(client, user_context, query_text):
    tenant = user_context["tenant"]
    department = user_context["department"]
    
    # Construct the filter for RLS
    rls_filter = {
        "where": {
            "path": ["department"],
            "operator": "Equal",
            "valueText": department
        }
    }

    # Perform the hybrid search with tenant and filter
    results = client.query.get(
        collection="RAG_Documents",
        properties=["title", "content"],
        limit=5
    ).with_tenant(tenant).with_where_filter(rls_filter).with_nearest_neighbor(
        query_text
    ).do()

    return results

أفضل الممارسات للنشر المؤسسي

أولاً، لا تثق أبدًا بفلاتر جانب العميل. افرض دائمًا RLS على جانب الخادم باستخدام عميل Weaviate بلغة Python أو Go. ثانيًا، استخدم تسميات متسقة لمعرّفات المستأجرين لتجنب التعارضات. ثالثًا، راقب زمن استجابة الاستعلامات، حيث يمكن أن تؤثر الفلاتر المعقدة على الأداء؛ فكّر في حساب التضمينات مسبقًا للمجموعات الفرعية المصفّفة إذا لزم الأمر. أخيرًا، نفّذ التسجيل (Logging) لتتبع المستندات التي يصل إليها المستخدمون لأغراض الامتثال التدقيقي.

الخلاصة

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

Share: