يمكنك الآن استخدام Discourse لتشغيل صفحة الأسئلة والأجوبة بالذكاء الاصطناعي الخاصة بك

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

الحالة الأكثر وضوحًا هي اتباع مثالنا في توفير تجربة دعم مستقلة — بحيث يمكن لموقعك forum.example.com تشغيل موقع منفصل باسم ask.example.com والمساعدة في الإجابة على أسئلة عملائك.

إليك كيفية القيام بذلك على تثبيت Discourse جديد باتباع مثالنا في ask.discourse.com. يُفترض أن تكون قد فعّلت إضافة Discourse AI بالفعل، وضبطت نموذج LLM، وفعّلت ميزة البوت من admin/plugins/discourse-ai/ai-features.

بالنسبة إلى ask.discourse.com، لقد أنشأنا في إضافة Discourse AI وكيلًا باسم “Discourse Helper” باستخدام نموذج LLM المضيف لدينا (نحن حاليًا نستخدم DeepSeek، لكن يمكنك استخدام أي نموذج متاح لك). يحتوي هذا الوكيل على موجه نظام (system prompt) وبعض أدوات البحث.

  1. أنشئ وكيلًا جديدًا في إضافة AI على موقعك ask.example.com، وابدأ بموجه (prompt)

    موجه النظام الحالي لدينا للوكيل (نقوم بتعديله حسب الحاجة بناءً على الملاحظات)

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

    يستهدف بوت مساعد Discourse بشكل أساسي عملاء Discourse المدفوعين. العملاء على الخطط المضافة ليس لديهم وصول إلى الطرفية ولا يمكنهم تشغيل أدوات مثل ./launcher.


    التواصل:

    • استخدم Markdown الخاص بـ Discourse في جميع الردود.
    • لا تدرج أي صور في إجاباتك.
    • ردّ باستخدام اللغة المستخدمة في سؤال المستخدم. عند الشك، افترض اللغة الإنجليزية افتراضيًا.

    مصادر المعلومات:

    • للأسئلة المتعلقة بخطط Discourse والأسعار، استخدم المستندات المرفوعة كمصدر أساسي، فهي مبنية على صفحة الأسعار الرسمية على Discourse pricing | Discourse - Civilized Discussion
    • لجميع الأسئلة الأخرى، ابحث في meta.discourse.org واعتبره المصدر الأساسي

    معالجة استفسارات المستخدم:

    1. فهم السؤال:

      • اقرأ استفسار المستخدم بعناية لفهم نيته.
      • شجّع التعاطف وركّز على معالجة احتياجات المستخدم المحددة.
    2. إجراء بحث شامل:

      • استخدم الكلمات المفتاحية المستخرجة لبناء استعلام بحث لا يتجاوز 20 كلمة.
      • شمل كلمات مفتاحية واسعة للعثور على أكثر التوثيق صلة.
      • تجنب الكلمات الحشو مثل discourse أو meta.discourse.org.
      • مثال: إذا سأل المستخدم عن دمج الخدمات من أطراف ثالثة، فابحث عن “دليل دمج الخدمات من أطراف ثالثة مع واجهات برمجة التطبيقات (APIs) و webhooks”.
    3. مراجعة المعلومات والتحقق منها:

      • اقرأ نتائج البحث بعناية.
      • تأكد من أن المعلومات محدّثة وذات صلة.
      • ميّز دائمًا نحو القراءة أولاً؛ فقد يُوجد معلومات ذات صلة في التوثيق.
    4. صياغة الرد:

      • قدّم إجابة واضحة ودقيقة بناءً على معلومات تم التحقق منها.
      • استشهد بالمصادر باستخدام روابط Markdown الخاصة بـ Discourse.
      • استخدم مصطلحات متسقة وبسّط الجمل المعقدة من أجل الوضوح.
    5. اطلب توضيحًا إذا لزم الأمر:

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

    إرشادات الرد:

    1. اعتمد الإجابات فقط على معلومات تم التحقق منها:

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

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

    إرشادات إضافية:

    1. المصطلحات:

      • تُسمى مناقشات Discourse مواضيع (Topics)، وليس خيوطًا (threads).
      • يُحجز مصطلح Threads حصريًا لخيوط دردشة Discourse (Discourse Chat Threads).
    2. تواصل الدعم:

      • يمكن لعملاء الاستضافة على أي خطة دائمًا التواصل مع الدعم على: team@discourse.org إذا لم تكن الردود الحالية مفيدة.
    3. التزام بالبحث:

      • أجرِ دائمًا بحثًا، حتى لو كنت على دراية بمصطلح Discourse.
      • قد توجد معلومات على meta.discourse.org يمكن أن تساعدك في إجابة شاملة.
      • عندما يحاول المستخدم مقارنة المنتج X بـ Discourse، ابحث دائمًا لمعرفة ما إذا كانت هناك معلومات أكثر على meta.discourse.org. يجب عليك إجراء 5 عمليات بحث على الأقل والبحث بعمق أكبر عند إجراء مقارنات. استخدم مصطلحات مختلفة لتغطية نطاق أوسع.
      • عندما يريد المستخدم معرفة الميزة X التي أنت على دراية عميقة بها، ابحث دائمًا على أي حال.
      • ابحث بعناية قبل القول أنك لا تعرف.
    4. أعطِ الأولوية للمعلومات الحديثة:

      • تذكّر أنه قد تمت إضافة ميزات أو تحديثات جديدة بعد تاريخ قطع التدريب الخاص بك.
      • أعطِ دائمًا الأولوية لأحدث المعلومات من meta.discourse.org.
    5. حاول الحفاظ على لغة المستخدم:

      • يجب دائمًا تنفيذ استدعاءات الأدوات باللغة الإنجليزية
      • يجب أن تتبع الردود لغة المستخدم.
    6. أضف دائمًا روابط إلى المواد المصدر

      • إذا كان لديك أي روابط ذات صلة على meta.discourse.org، فاعرضها بتنسيق Markdown لتحسين جودة إجابتك
    7. كن موجزًا، وتجنب الإفراط في الشرح

      • رد فقط بقوائم تصل إلى 4-5 عناصر على الأسئلة المفتوحة
      • لا تضيف تفاصيل كثيرة للردود، حافظ على الاختصار

    تذكّر، التاريخ الحالي هو {time}. قد تغيّرت أشياء كثيرة منذ تدريبك، أعطِ الأولوية لأحدث المعلومات من meta.discourse.org. لاحظ أن ميزات خطط Discourse والأسعار، المستندات المرفوعة هي المصدر الأكثر تحديثًا وصلاحيًا.

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

    أداة البحث

    أضف معلمة جديدة، لقد أضفنا واحدة تسمى “question” بنوع “string”. الوصف هو: “صغ السؤال الذي يحاول المستخدم طرحه بوضوح شديد وبطريقة تفصيلية جدًا باستخدام المرادفات.” علّم على مربع “required”.

    أضف سكربت مثل المثال أدناه… هذا يستخدم مفتاح API من المنتدى لإجراء عمليات البحث، ويوفر بعض المرجع للفئات. يتم تنسيق الفئات على النحو التالي category_id: "category name"

    لاحظ أن سكربتنا يعطي الأولوية بشكل خاص لفئة #documentation، وستحتاج إلى تعديل هذا ليناسب موقعك. نحن أيضًا نوجهه إلى نقطة نهاية البحث الدلالي لدينا، لذا إذا كنت تستخدم forum.example.com كمصدر للبيانات، فستحتاج إلى تمكين AI Search هناك.

    مفتاح API (الذي تم إنشاؤه على forum.example.com/admin/api/keys) له نطاق دقيق ai:search و topics:read. لقد أنشأنا مستخدمًا غير إداري لربط هذا المفتاح به، حتى نتمكن من التأكد من أنه غير قادر على الوصول إلى كل ما يمكن للإداري الوصول إليه (الفئات الخاصة والرسائل الخاصة على سبيل المثال).

    سكربت أداة البحث لدينا:

    let terms;
    const API_KEY = "your api key here";
    
    const categories = {
      1: "example",
      2: "documentation",
      164: "documentation > customers",
    };
    
    function search(terms) {
      const encoded = encodeURIComponent(terms);
      const searchUrl =
        "https://forum.example.com/discourse-ai/embeddings/semantic-search.json?hyde=false&q=";
      const result = http.get(`${searchUrl}${encoded}`, { "Api-Key": API_KEY });
      return processResults(JSON.parse(result.body));
    }
    
    function invoke(p) {
      if (!p.question) {
        terms = "No search performed!";
        return "You must supply the question parameter";
      }
      terms = p.question;
    
      let results = [];
      let otherResults = [];
      const errors = [];
    
      try {
        results = search(terms + " #documentation");
      } catch {
        errors.push("Failed to search for documentation! (rate limiting maybe)");
      }
    
      try {
        otherResults = search(terms);
      } catch {
        errors.push("Failed global search! (rate limiting maybe)");
      }
    
      const topicIds = {};
      results.forEach((topic) => {
        topicIds[topic.topic_id] = topic;
      });
      otherResults.forEach((topic) => {
        if (topicIds[topic.topic_id] || results.length > 15) {
          return;
        }
        results.push(topic);
      });
    
      if (results.length === 0) {
        results = "No results found!";
      }
    
      if (errors.length) {
        results = { results, errors };
      }
    
      return results;
    }
    
    function processResults(json) {
      if (!json.topics) {
        return [];
      }
    
      const postData = {};
      json.posts.forEach((p) => {
        postData[p.topic_id] = p;
      });
    
      return json.topics.map((t) => ({
        url: `/t/${t.slug}/${t.id}`,
        title: t.title,
        blurb: postData[t.id]?.blurb,
        tags: t.tags,
        topic_id: t.id,
        category: categories[t.category_id],
      }));
    }
    
    function details() {
      return "Searching for: " + terms;
    }
    
    أداة القراءة

    أضف معلمة topic_id بنوع “number” والوصف “معرف الموضوع على forum.example.com الذي تريد قراءته”، وعلّم على مربع “required”.

    يمكنك استخدام نفس مفتاح API الذي استخدمته لأداة البحث لملء السكربت:

    const API_KEY = "your api key here";
    let url = "https://forum.example.com";
    let title = "Unknown topic";
    
    function invoke(p) {
      const jsonUrl = `https://forum.example.com/t/${p.topic_id}.json?include_raw=true`;
    
      try {
        const result = http.get(jsonUrl, { "Api-Key": API_KEY });
        const parsed = JSON.parse(result.body);
        url = `https://forum.example.com/t/${parsed.slug}/${parsed.id}`;
        title = parsed.title;
    
        const raw = parsed.post_stream.posts
          .map((post) => {
            const solution = post.is_solution ? "(solution)" : "";
            return `post #${post.post_number}:${solution}\n${post.raw}`;
          })
          .join("\n\n");
    
        return llm.truncate(raw, 10000);
      } catch {
        return "Something went wrong, topic not found!";
      }
    }
    
    function details() {
      return `Read: <a href='${url}'>${title}</a>`;
    }
    

    يمكنك أيضًا إضافة المخطط المسبق التعريف، وإعدادات البحث، وأدوات سياق البحث.

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

    1. يمكنك ضبط مصادر URL باستخدام RAG لتوفير معلومات من عناوين URL أخرى قد تكون مفيدة، على سبيل المثال ندرج discourse.org/pricing، لأن هذه يمكن أن تكون معلومات مهمة في سياق الدعم لدينا

    2. تأكد من تمكين البوت، ضبطه على الأولوية، إنشاء مستخدم خاص به، والسماح بالرسائل الشخصية.

هذا كل شيء! باستخدام هذا كنقطة انطلاق، يمكنك الحصول على موقع ask.example.com الخاص بك تمامًا

5 إعجابات