Discourse AI - آثار الويب

ما هي عناصر الذكاء الاصطناعي (AI Artifacts)؟

عناصر الذكاء الاصطناعي هي أدوات قوية تتيح للمستخدمين إنشاء وتضمين والتفاعل مع مكونات ويب ديناميكية مباشرة داخل منشور في Discourse. يمكن أن تحتوي هذه المكونات على HTML و CSS و JavaScript مخصصة، مما يتيح مجموعة متنوعة من حالات الاستخدام مثل:

  • تضمين اختبارات تفاعلية أو نماذج.
  • تصور البيانات باستخدام رسوم بيانية غنية وحركات متحركة.
  • دمج تطبيقات أو أدوات ويب خفيفة الوزن.
  • أداة لتعلم أطر عمل الويب ومكتبات JavaScript والمزيد.

تعزز عناصر الذكاء الاصطناعي منشورات Discourse بسلاسة من خلال إضافة التفاعلية مع ضمان تجربة تصفح آمنة.


إعدادات الموقع

يمكن للمسؤولين تكوين عدة إعدادات:

1. تمكين الميزة

  • الإعداد: discourse_ai_enabled
    • تأكد من تمكين هذا الإعداد العالمي لكي تعمل عناصر الذكاء الاصطناعي.

2. أوضاع الأمان

  • الإعداد: ai_artifact_security
    • الخيارات:
      • disabled: تعطيل نظام العناصر.
      • lax: تظهر العناصر تلقائيًا في المنشورات دون الحاجة إلى تفاعل من المستخدم.
      • hybrid: تتطلب العناصر عادةً نقرة للتشغيل، لكن يمكن لمؤلفي المنشورات إضافة data-ai-artifact-autorun إلى كود التضمين لجعل عناصر معينة تعمل فورًا.
      • strict: يجب على المستخدمين تفعيل العناصر صراحةً في متصفحاتهم بالنقر على زر “عرض” أو “تشغيل”. يُوصى بهذا الإعداد للبيئات الحريصة على الأمان (افتراضي).

3. وصول منشئ العناصر

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

استخدام عناصر الذكاء الاصطناعي في المنشورات

يتم إنشاء العناصر تلقائيًا بواسطة وكيل منشئ العناصر عند الطلب.

تم إنشاء العنصر أعلاه باستخدام GPT-4o ومكتبة anime.js

بمجرد إنشائها، تكون خاصة بك وبوكيل منشئ العناصر. يمكن للمستخدمين القادرين على مشاركة محادثات الذكاء الاصطناعي (أولئك الذين ينتمون إلى ai bot public sharing allowed groups) أيضًا جعل العنصر عامًا عن طريق مشاركة المحادثة.

بمجرد المشاركة، يمكنك استخدام كود HTML التالي لعرضه في منشور:

<div class="ai-artifact" data-ai-artifact-version="3" data-ai-artifact-id="71"></div>

(حيث يمثل الإصدار ومعرف العنصر نسختك المؤرشفة)

اعتبارات الأمان

نظرًا لأن عناصر الذكاء الاصطناعي يمكنها تنفيذ HTML و CSS و JavaScript مخصصة، فقد طبقت Discourse ضوابط أمان قوية:

1. العزل في إطارات iFrames

  • يتم عرض العناصر داخل حاويات iframe معزولة مع سمات sandbox لتقييد العمليات غير الآمنة المحتملة مثل:
    • تنفيذ الأكواد عبر المواقع (Cross-site scripting).
    • الوصول إلى مواقع أو واجهات برمجة تطبيقات خارجية.

2. سياسة أمان المحتوى (CSP)

3. وضع الأمان

  • الوضع الصارم: يُوصى به للبيئات التي لا تُعتبر فيها العناصر موثوقة بالكامل. سيحتاج المستخدمون إلى تفعيل العناصر يدويًا في متصفحاتهم قبل عرضها.

4. الوصول والأذونات

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

5. حدود الطول

  • يتم تحديد حجم HTML و CSS و JavaScript في العنصر بحد أقصى 64 كيلوبايت لكل منها. يضمن هذا أن تظل المكونات خفيفة ولا تشكل عبئًا على المستخدمين أو الأنظمة.

تخزين العناصر

يمكن لعناصر الويب تخزين بيانات لكل مستخدم بشكل اختياري. للقيام بذلك، قم بتلميح منشئ العنصر بـ “استخدم تخزين المستخدم” أو ما شابه.

يسمح هذا النظام بتخزين أزواج المفاتيح والقيم:

  • خاصة (مرئية للمسؤولين والمستخدمين المحددين فقط)
  • عامة (مرئية لجميع المستخدمين بما في ذلك المجهولين)

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

للتحكم في التخزين، يمكنك استخدام الإعدادات المخفية:

  • ai_artifact_kv_value_max_length (قد تكون العناصر الافتراضية 5000 حرف أو أقل)
  • ai_artifact_max_keys_per_user_per_artifact (افتراضي 100)

الأسئلة الشائعة

من يمكنه إنشاء عناصر الذكاء الاصطناعي؟

افتراضيًا، يمكن فقط لمستخدمي الطاقم (مثل المسؤولين أو المشرفين) إنشاء العناصر من خلال وكيل منشئ العناصر. يبسط هذا الوكيل عملية تصميم أدوات ويب تفاعلية باستخدام HTML و CSS و JavaScript.

ماذا يحدث إذا نقرت على عنصر؟

  • في وضع lax، تظهر العناصر تلقائيًا.
  • في وضع hybrid، تتطلب العناصر عادةً نقرة، لكنها يمكن أن تعمل تلقائيًا إذا تضمن التضمين data-ai-artifact-autorun.
  • في وضع strict، يؤدي النقر على زر “تشغيل” إلى تفعيل العنصر والسماح له بالتحميل في متصفحك.

هل عناصر الذكاء الاصطناعي آمنة؟

نعم. تعمل عناصر الذكاء الاصطناعي في بيئات خاضعة لرقابة صارمة:

  • معزولة ولا يمكنها التفاعل مع تطبيق Discourse أو سياق المستخدم مباشرة، إلا عبر رسائل iframe.
  • يمنحك الوضع الصارم التحكم في التفعيل.
  • العناصر خاصة افتراضيًا؛ تحتاج إلى مشاركتها بنشاط لمنح الوصول العالمي.

هل يمكنني رؤية كود المصدر للعناصر؟

نعم. عندما يقوم Discourse AI بتوليد العناصر، سيشمل ذلك كود HTML الكامل و CSS و JavaScript.

ما هي نماذج اللغة الكبيرة (LLMs) المدعومة؟

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

لقد شهدنا نتائج جيدة مع o3 و Anthropic Claude Sonnet 3.7 - 4.0 و GPT-4.1 و Gemini Pro 2.5 والمزيد. بشكل عام، ستؤدي النماذج الأكثر تقدمًا أداءً أفضل.

هناك جانب كبير من التجربة والخطأ في إنشاء العناصر، والتجربة هي المفتاح.

23 إعجابًا

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

أعتقد أنه إذا قمت بإضافة المجموعة إلى الرسائل الخاصة بالبوت فقد ينجح الأمر؟

إعجاب واحد (1)

سأقوم بتجربته والإبلاغ عن النتائج هنا. لدي حالة استخدام متخصصة تتطلب أن تكون القطع الأثرية متاحة فقط لمجموعة واحدة في فئة خاصة واحدة

إعجاب واحد (1)

لذلك قمت بوضع علامة على روبوت Web Artifact Creator في موضوع جديد في فئة خاصة يمكن للمجموعة الوصول إليها حتى يتمكن من إنشاء قطعة أثرية لا يمكنني أنا وتلك المجموعة المحددة رؤيتها. ومع ذلك، فإن نافذة iframe للقطعة الأثرية تعرض فقط الرسالة الافتراضية “عذرًا! هذه الصفحة غير موجودة أو خاصة.” التي تظهر عندما لا يمتلك المستخدم حق الوصول إلى صفحة معينة.

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

لذا ربما يكون هذا خطأ؟

استعلام SQL الخاص بي
-- [params]
-- int :artifact_id = 22

WITH artifact_info AS (
  SELECT 
    a.id,
    a.user_id as creator_id,
    a.post_id,
    p.topic_id,
    t.category_id,
    t.archetype,
    c.read_restricted,
    t.title as topic_title
  FROM ai_artifacts a
  LEFT JOIN posts p ON a.post_id = p.id
  LEFT JOIN topics t ON p.topic_id = t.id
  LEFT JOIN categories c ON t.category_id = c.id
  WHERE a.id = :artifact_id
),
users_with_access AS (
  -- Creator always has access
  SELECT 
    ai.creator_id as user_id,
    'Creator' as access_reason
  FROM artifact_info ai
  
  UNION
  
  -- Users with access to private messages
  SELECT 
    tau.user_id,
    'Private Message Access' as access_reason
  FROM artifact_info ai
  JOIN topic_allowed_users tau ON ai.topic_id = tau.topic_id
  WHERE ai.archetype = 'private_message'
  
  UNION
  
  -- Group members with access to private messages
  SELECT 
    gu.user_id,
    'Private Message Group Access' as access_reason
  FROM artifact_info ai
  JOIN topic_allowed_groups tag ON ai.topic_id = tag.topic_id
  JOIN group_users gu ON tag.group_id = gu.group_id
  WHERE ai.archetype = 'private_message'
  
  UNION
  
  -- Users with access to restricted categories
  SELECT 
    gu.user_id,
    'Category Group Access' as access_reason
  FROM artifact_info ai
  JOIN category_groups cg ON ai.category_id = cg.category_id
  JOIN group_users gu ON cg.group_id = gu.group_id
  WHERE ai.read_restricted = true
    AND ai.archetype != 'private_message'
    AND cg.permission_type IN (1, 2) -- full access or create/reply/see
  
  UNION
  
  -- All users if topic is public (not restricted and not private message)
  SELECT 
    u.id as user_id,
    'Public Access' as access_reason
  FROM artifact_info ai
  CROSS JOIN users u
  WHERE (ai.read_restricted = false OR ai.read_restricted IS NULL)
    AND (ai.archetype != 'private_message' OR ai.archetype IS NULL)
    AND u.active = true
)

SELECT 
  u.id as user_id,
  u.username,
  u.name,
  u.trust_level,
  uwa.access_reason,
  ai.topic_title
FROM users_with_access uwa
JOIN users u ON uwa.user_id = u.id
CROSS JOIN artifact_info ai
WHERE u.active = true
ORDER BY u.username