بوت الذكاء الاصطناعي - أدوات مخصصة

:bookmark: يشرح هذا الدليل كيفية إنشاء أدوات الذكاء الاصطناعي المخصصة وتهيئتها ودمجها داخل إضافة Discourse AI، مما يتيح للمسؤولين توسيع إمكانيات الروبوت باستخدام وظائف JavaScript المعرفة من قبل المستخدم.

:person_raising_hand: مستوى المستخدم المطلوب: مسؤول

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

ملخص

تغطي هذه الوثائق ما يلي:

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

إنشاء أداة ذكاء اصطناعي مخصصة جديدة

لإنشاء أداة ذكاء اصطناعي جديدة:

  1. انتقل إلى لوحة المسؤول > الإضافات (Plugins) > الذكاء الاصطناعي لـ Discourse (Discourse AI) > الأدوات (Tools)
  2. انقر على “أداة جديدة” (New Tool) (يمكنك استخدام الإعدادات المسبقة الموجودة للتعرف على الخيارات)
  3. املأ الحقول التالية:
    • الاسم (Name): اسم الأداة كما يتم تقديمه إلى نموذج اللغة الكبير (LLM)
    • الوصف (Description): وصف الأداة كما يتم تقديمه إلى نموذج اللغة الكبير (LLM)
    • الملخص (Summary): ملخص لما تفعله الأداة للمساعدة في توفيرها للمستخدمين (يتم عرضها في التفاصيل)
    • المعلمات (Parameters): عرّف المدخلات التي تحتاجها أداتك كما يتم تقديمها إلى نموذج اللغة الكبير (LLM)
    • الكود (Script): كود JavaScript الذي يشغل أداتك
  4. انقر على “حفظ” (Save)

تهيئة أكواد الأدوات

واجهات برمجة التطبيقات المتاحة

يمكن لأكواد أدواتك الوصول إلى واجهات برمجة التطبيقات التالية:

  1. طلبات HTTP:

    http.get(url, options)
    http.post(url, options)
    http.put(url, options)
    http.patch(url, options)
    http.delete(url, options)
    

    استخدم هذه للتفاعل مع الخدمات الخارجية. يمكنك استخدام options لتحديد رؤوس HTTP والنص الأساسي:

    http.get(url, { headers: { "Authorization": "Bearer key" } })
    http.post(url, { headers: { "Content-Type": "application/json" }, body: { key: "value" } })
    http.patch(url, { headers: { "Authorization": "Bearer key" }, body: "some body" })
    http.delete(url, { headers: { "Authorization": "Bearer key" } })
    http.put(url, { headers: { "Authorization": "Bearer key" }, body: "some body" })
    

    تعيد جميع طرق HTTP القيمة { status: number, body: string }.

  2. تكامل نموذج اللغة الكبير (LLM):

    llm.truncate(text, length)
    

    يقوم بقص النص إلى طول رمز محدد بناءً على أداة الترميز الخاصة بنموذج اللغة الكبير (LLM) المُكوَّن.

    llm.generate(prompt, options)
    

    يولد نصًا باستخدام نموذج اللغة الكبير (LLM) المُكوَّن. يمكن أن يكون المطالب (prompt) سلسلة نصية بسيطة أو كائنًا منظمًا مثل { messages: [{ type: "system", content: "..." }, { type: "user", content: "..." }] }. تتضمن الخيارات json: true لطلب إخراج JSON وتحليله تلقائيًا، بالإضافة إلى temperature و top_p و max_tokens و stop_sequences.

  3. تكامل الرفع المخصص (RAG)

    index.search(query, { filenames: ["file.pdf"], limit: 10 })
    

    يبحث في أجزاء مستندات RAG المفهرسة المرفقة بهذه الأداة. يُرجع Array<{ fragment: string, metadata: string | null }> مرتبة حسب الصلة. الحد الافتراضي هو 10، والحد الأقصى 200.

    index.getFile(filename)
    

    يسترد المحتوى الكامل لملف RAG مُحمَّل باسمه الدقيق. يُرجع النص الكامل أو null إذا لم يتم العثور عليه.

  4. دعم الرفع (Upload)

    upload.create(filename, base_64_content)
    

    ينشئ عملية رفع جديدة. يُرجع { id: number, url: string, short_url: string }.

    upload.getUrl(shortUrl)
    

    بالنظر إلى عنوان URL قصير (مثل upload://12345)، فإنه يُرجع عنوان URL الكامل المناسب لشبكة توصيل المحتوى (CDN).

    upload.getBase64(uploadIdOrShortUrl, maxPixels)
    

    يجلب المحتوى المشفر بـ base64 لعملية رفع موجودة. يقبل معرف الرفع (رقم) أو عنوان URL قصير (سلسلة). معلمة maxPixels اختيارية لتغيير حجم الصورة تلقائيًا (الافتراضي: 10,000,000).

  5. التحكم في سلسلة التنفيذ (Execution chain control)

    chain.setCustomRaw(raw)
    

    يحدد المحتوى الخام النهائي لمنشور الروبوت ويوقف سلسلة تنفيذ الأداة. مفيد للأدوات التي تنشئ المحتوى النهائي بالكامل (مثل أدوات إنشاء الصور).

  6. إدارة الأسرار (Secrets management)

    secrets.get(alias)
    

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

    const apiKey = secrets.get("my_api_key");
    
  7. تكامل Discourse

    يمكن للأدوات التفاعل مباشرة مع بيانات Discourse:

    discourse.baseUrl              // عنوان URL الأساسي للموقع
    discourse.search(params)       // إجراء بحث في Discourse
    discourse.getPost(post_id)     // الحصول على تفاصيل المنشور (بما في ذلك المحتوى الخام)
    discourse.getTopic(topic_id)   // الحصول على تفاصيل الموضوع (العلامات، الفئة، إلخ.)
    discourse.getUser(id_or_username)  // الحصول على تفاصيل المستخدم
    discourse.createTopic(params)  // إنشاء موضوع جديد
    discourse.createPost(params)   // إنشاء منشور/رد جديد
    discourse.editPost(post_id, raw, options)    // تعديل محتوى المنشور
    discourse.editTopic(topic_id, updates, options) // تعديل خصائص الموضوع (العلامات، الفئة، الرؤية)
    discourse.createChatMessage(params) // إرسال رسالة دردشة
    discourse.createStagedUser(params)  // إنشاء مستخدم مرحلي
    discourse.getAgent(name)       // الحصول على وكيل ذكاء اصطناعي آخر (مع طريقة respondTo)
    discourse.updateAgent(name, updates) // تحديث تكوين وكيل ذكاء اصطناعي
    discourse.getCustomField(type, id, key)      // قراءة حقل مخصص على المنشور/الموضوع/المستخدم
    discourse.setCustomField(type, id, key, value) // تعيين حقل مخصص على المنشور/الموضوع/المستخدم
    
  8. كائن السياق (Context object)

    يوفر كائن context معلومات حول مكان تشغيل الأداة:

    • سياق محادثة الروبوت: context.post_id، context.topic_id، context.private_message، context.participants، context.username، context.user_id
    • سياق الدردشة: context.message_id، context.channel_id، context.username
    • سياق الأتمتة: context.post_id، context.topic_id، context.username، context.user_id، context.feature_name، context.feature_context
    • الخصائص المشتركة: context.site_url، context.site_title، context.site_description

الدوال المطلوبة

يجب أن ينفذ الكود الخاص بك:

  • invoke(params): الدالة الرئيسية التي يتم تنفيذها عند استدعاء الأداة

وقد ينفذ بشكل اختياري:

  • details(): تُرجع سلسلة نصية (يمكن أن تتضمن HTML أساسي) تصف تنفيذ الأداة، تُعرض في واجهة الدردشة
  • customSystemMessage(): يتم استدعاؤها أثناء تجميع المطالبات (وليس أثناء استدعاء الأداة). تُرجع سلسلة نصية مضافة إلى المطالبة النظامية، أو null/undefined للتخطي. لديها وصول إلى الكائنات context و discourse و index.

مثال على الكود:

function invoke(params) {
  let result = http.get("https://api.example.com/data?query=" + params.query);
  return JSON.parse(result.body);
}

function details() {
  return "Fetched data from Example API";
}

القيود والأمان

  • مهلة التنفيذ: مهلة افتراضية تبلغ 2000 مللي ثانية لوقت معالجة الكود. يتوقف المؤقت أثناء طلبات HTTP الخارجية (http.*) ومكالمات نموذج اللغة الكبير (llm.generate)، لذلك يتم احتساب وقت المعالجة الخاص بالكود فقط.
  • الذاكرة: حد أقصى 10 ميغابايت لـ V8 heap.
  • طلبات HTTP: حد أقصى 20 طلبًا لكل تنفيذ أداة.
  • بيئة معزولة (Sandboxed Environment): يتم تشغيل الأكواد في بيئة JavaScript V8 مقيدة (عبر MiniRacer). لا يوجد وصول إلى متغيرات المتصفح العامة، أو نظام ملفات المضيف، أو مكتبات جانب الخادم. يتم توجيه طلبات الشبكة عبر الواجهة الخلفية لـ Discourse.

اختبار أداتك

يجب عليك اختبار أي أداة تبنيها للتأكد من أن النتائج التي سيتم تزويد نموذج اللغة الكبير (LLM) بها تتوافق مع توقعاتك.

دمج الأدوات مع شخصيات الذكاء الاصطناعي

لإضافة أداتك المخصصة إلى شخصية الذكاء الاصطناعي:

  1. انتقل إلى لوحة المسؤول > الإضافات (Plugins) > الذكاء الاصطناعي لـ Discourse (Discourse AI) > الشخصيات (Personas)
  2. قم بتحرير شخصية موجودة أو إنشاء واحدة جديدة
  3. في قسم “الأدوات” (Tools)، سترى أدواتك المخصصة مدرجة جنبًا إلى جنب مع الأدوات المدمجة
  4. حدد أداتك المخصصة لإضافتها إلى الشخصية

الأدوات المخصصة قيد العمل

بمجرد تزويد نموذج اللغة الكبير (LLM) بالأداة المخصصة، يمكنه استخدامها لتعزيز المحادثة.

استكشاف الأخطاء وإصلاحها

إذا لم تعمل أداتك كما هو متوقع:

  1. استخدم واجهة الاختبار للتأكد من أنها تتصرف كما هو متوقع لمدخلاتك.
  2. تأكد من أن مجموعتك ضمن ai_bot_debugging_allowed_groups. يتمتع أعضاء هذه المجموعة بوصول كامل إلى نصوص محادثات الروبوت؛ يمكنك عرض سجلات الذكاء الاصطناعي هناك.
  3. إذا كان هناك أي شيء غير متوقع يحدث، قم بزيارة https://SITENAME/logs للتحقق من وجود أخطاء.

موارد إضافية

Discourse AI - AI bot

AI bot - Agents

14 إعجابًا

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

على سبيل المثال، أحصل على نتائج مثل:

فهم اتخاذ القرار من خلال استراتيجيات البوكر AI

maiki:

أنشئ بطاقة معلومات للعبة Breath of the Wild.

gpt-4o:

إليك بطاقة معلومات للعبة “The Legend of Zelda: Breath of the Wild”:


العنوان: The Legend of Zelda: Breath of the Wild
المطور: Nintendo
الناشر: Nintendo
تاريخ الإصدار: 3 مارس 2017
المنصات: Nintendo Switch, Wii U
النوع: أكشن-مغامرات
الوضع: لاعب واحد

ملخص:
تدور أحداث اللعبة في عالم مفتوح شاسع، حيث يتحكم اللاعبون في Link، الذي يستيقظ من سبات عميق لهزيمة Calamity Ganon وإنقاذ مملكة Hyrule. تشيد اللعبة ببيئتها الغامرة، مما يسمح للاعبين بالاستكشاف والتفاعل بحرية مع العالم وأنظمته.

الجوائز:
فازت اللعبة بالعديد من الجوائز، بما في ذلك العديد من جوائز لعبة العام، لتصميمها المبتكر وعالمها الواسع وطريقة لعبها الساحرة.

مزيد من المعلومات: Wikidata Entry


تشتهر “Breath of the Wild” بإعادة تعريف ألعاب العالم المفتوح وتقديم تجربة آسرة تشجع على الاستكشاف والاكتشاف.

maiki:

نفس الشيء بالنسبة لـ Animal Crossing: New Horizons.

gpt-4o:

إليك بطاقة معلومات للعبة “Animal Crossing: New Horizons”:


العنوان: Animal Crossing: New Horizons
المطور: Nintendo
الناشر: Nintendo
تاريخ الإصدار: 20 مارس 2020
المنصة: Nintendo Switch
النوع: محاكاة اجتماعية
الوضع: لاعب واحد، متعدد اللاعبين

ملخص:
في هذه اللعبة الساحرة للمحاكاة الاجتماعية، يلعب اللاعبون دور شخصية قابلة للتخصيص تنتقل إلى جزيرة مهجورة بعد شراء حزمة من Tom Nook. تسمح اللعبة بالاستكشاف في الوقت الفعلي، وجمع الموارد، والصياغة، والتخصيص، مما يعزز تجربة لعب مجتمعية ومريحة.

الجوائز:
حظيت اللعبة بالثناء لحرية الإبداع وتوقيت إصدارها، وحصلت على جوائز لعبة العام ومساهماتها في الألعاب الاجتماعية خلال الوباء العالمي.

مزيد من المعلومات: Wikidata Entry


أصبحت “Animal Crossing: New Horizons” ظاهرة ثقافية، تم الاحتفاء بها لميزاتها الاجتماعية الجذابة وطريقة لعبها المخففة للتوتر في الأوقات الصعبة.

maiki:

طريق طويل من شيكاغو

gpt-4o:

إليك بطاقة معلومات لكتاب “A Long Way from Chicago”:


العنوان: A Long Way from Chicago
المؤلف: Richard Peck
سنة النشر: 1998
النوع: خيال تاريخي، يافعين
ISBN: 978-0141303529

ملخص:
هذه الرواية الحائزة على جائزة Newbery Honor هي سلسلة من القصص القصيرة التي تسجل الرحلات الصيفية السنوية لـ Joey وشقيقته Mary Alice من شيكاغو إلى بلدة ريفية في إلينوي لزيارة جدتهما الكبيرة Grandma Dowdel خلال أواخر العشرينات والثلاثينات من القرن الماضي. يقدم كل فصل حلقة مسلية ومؤثرة تلقي دروسًا في الحياة في ظل الكساد الكبير.

الجوائز:
حصل الكتاب على جائزة Newbery Honor في عام 1999 ويحتفى به لفكاهته وعمقه وتصويره للحياة الريفية الأمريكية في أوائل القرن العشرين.

مزيد من المعلومات: Wikidata Entry


يحظى هذا الكتاب بالتقدير لقصصه الحنينية والمؤثرة، التي تجسد جوهر الروابط العائلية والأوقات الأبسط.

maiki:

التفكير في الرهانات

gpt-4o:

لقد وجدت سابقًا إدخال Wikidata لـ “Thinking in Bets”، لكنني غير قادر على استرداد تفاصيل محددة أخرى مباشرة من Wikidata في الوقت الحالي. ومع ذلك، إليك بطاقة موجزة بناءً على المعلومات المتاحة:


العنوان: Thinking in Bets: Making Smarter Decisions When You Don’t Have All the Facts
المؤلف: Annie Duke
سنة النشر: 2018
النوع: غير خيالي، اتخاذ القرار، علم النفس
ISBN: 978-0735216358

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

مزيد من المعلومات: Wikidata Entry


للحصول على رؤى مفصلة، قد ترغب في التحقق من موارد أو قواعد بيانات إضافية تتعلق بمنشورات الكتب.


حسنًا، هذا جيد، لكن لاحظت هذا الوصف…

… وأتساءل: هل يجب أن أبني مطالباتي بالإشارة مباشرة إلى تلك الأدوات، للاستخدام الفعال؟

نهجي العام في كتابة المطالبات هو التحسين بمرور الوقت ثم التمسك بنمط سلوك أرغب في أن تتبناه أدوات الذكاء الاصطناعي. ومع ذلك، إذا كان بإمكاني إضافة تعليمات محددة حول، على سبيل المثال، متى يتم البحث عن كيان Wikidata، ومتى يتم سرد جميع المطالبات لكيان معين (واجهتا برمجة تطبيقات مختلفتان)، فأعتقد أنني أستطيع تحسين سير العمل بأكمله كما أقصده… :star_struck:

4 إعجابات

بالتأكيد، يعد شرح الأداة بوضوح وتقديم أمثلة في موجه النظام أمرًا مفيدًا.

إعجابَين (2)

هل من الممكن في أداة مخصصة إدراج مفتاح واجهة برمجة التطبيقات (API) ومشروع OpenAI من إعدادات المسؤول؟

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

يمكنك إجراء استدعاءات REST من أداة مخصصة وتحديد جميع رؤوس الطلب

إعجابَين (2)

أدركت ذلك للتو… آسف على هذا الخطأ السخيف

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

لقد قمت بتحميل بعض المستندات إلى شخصية، وقد قامت بإنشاء التضمينات (embeddings) وهي الآن قادرة على إجراء بحث دلالي عليها. ولكن في بعض الحالات، لا يكون البحث الدلالي مثاليًا، لذلك أود تحسينه وإجراء بحث هجين، على سبيل المثال، الاحتفاظ بما هو موجود بالفعل وإضافة بحث الكلمات المفتاحية. في الوقت الحالي، إذا أردت القيام بذلك، يجب عليّ كتابة أداة مخصصة، أليس كذلك؟
أعلم أنه يمكنني ببساطة نشر المستندات كمواضيع (topics) وبعد ذلك ستعمل بشكل مباشر مع بحث Discourse الأصلي، ولكن هذا ليس خيارًا حاليًا.

أواجه خطأ في مخطط الأداة (tool schema error) عند إضافة أداة مخصصة بمعامل من نوع مصفوفة (array parameter). يظهر الخطأ عند بدء المحادثة:

{
“error”: {
“code”: 400,
“message”: “* GenerateContentRequest.tools[0].function_declarations[3].parameters.properties[properties].items: missing field.\n”,
“status”: “INVALID_ARGUMENT”
}
}

ما جربته:

  • أنشأت أداة مخصصة بمعامل اسمه properties ونوعه array.
  • واجهة المستخدم لقائمة المعاملات لا تسمح بتحديد العناصر (items).
  • قمت بتصدير/استيراد ملف JSON كامل للأداة يتضمن items: { type: “string” } للحقل properties.
  • بعد الاستيراد، يستمر الخطأ بمجرد تمكين الأداة لشخصية (persona). إذا أزلت الأداة، يعمل الروبوت.

المتوقع:

إما أن تسمح واجهة المستخدم لقائمة المعاملات بتحديد أنواع عناصر المصفوفة، أو أن يحترم الاستيراد حقل items بحيث يتم التحقق من صحة المخطط (schema validation).

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

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