الفرق بين الفلاتر والجدران

أنت تقوم ببناء وكيل ذكاء اصطناعي (AI agent) لديه صلاحية الوصول إلى بياناتك. لديك خياران للأمان: يمكنك تصفية البيانات (filter)، أو وضع جدار حولها (wall).

التصفية تعني أن استعلامك يعيد صفوفاً معينة فقط. وضع الجدار يعني أن الوكيل لا يمكنه الوصول إلى الصفوف المخفية على الإطلاق.

يبدو الأمران متشابهين حتى يحدث خطأ ما.

قمت مؤخراً ببناء نظام لتحويل 1.2 مليون كلمة إلى قاعدة معرفية. استخدمت Supabase لإدارة البيانات. أردت أن يرى وكلاء الذكاء الاصطناعي الخاصون بي المحتوى العام فقط.

استخدمت عرض Postgres (view) قياسياً لتصفية البيانات:

CREATE VIEW public_seeds AS
  SELECT * FROM moments
  WHERE visibility = 'public'
    AND is_canonical = true;

يبدو هذا صحيحاً، لكنه يحتوي على خلل جسيم. افتراضياً، يتم تشغيل عرض Postgres بصلاحيات المالك، وليس الشخص الذي يستدعيه. غالباً ما يمتلك مالك العرض صلاحيات وصول كاملة. وهذا يعني أن سياسات أمان مستوى الصف (RLS) الخاصة بك لا تنطبق على العرض.

أنت لم تبنِ جداراً، بل بنيت فلتراً.

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

حل Postgres 15 هذه المشكلة باستخدام خيار security_invoker.

عندما تضبط security_invoker على true ، يتم تشغيل العرض بصلاحيات الدور المستدعي (calling role). هذا يجبر العرض على الامتثال لسياسات RLS الخاصة بك، وبذلك يصبح العرض بوابة هيكلية.

الطريقة الصحيحة:

CREATE VIEW public_seeds
  WITH (security_invoker = true)
AS
  SELECT * FROM moments
  WHERE visibility = 'public'
    AND is_canonical = true;

الآن أصبح الجدار هيكلياً. حتى لو كتب مطور استعلاماً سيئاً أو عملية ربط (join)، فإن سياسة RLS ستحمي الجدول.

"هذا لا ينبغي أن يحدث" تعتمد على عمل كل شيء بشكل مثالي. "هذا لا يمكن أن يحدث" تعتمد على بنيتك التحتية.

عندما تبني من أجل الذكاء الاصطناعي، يجب أن تصمم لمنع ما "لا يمكن" أن يحدث.

ثلاثة أشياء يجب التحقق منها في إعداداتك:

المصدر: https://dev.to/chadtdyar/the-difference-between-this-shouldnt-happen-and-this-cannot-happen-in-ai-content-pipelines-1g0p

مجتمع تعليمي اختياري: https://t.me/GyaanSetuAi