Ora puoi usare Discourse per creare la tua homepage di domande e risposte con IA

Puoi utilizzare le funzionalità sopra descritte per creare un sito AI per praticamente qualsiasi cosa!

Il caso più ovvio sarebbe seguire il nostro esempio di fornitura di un’esperienza di supporto autonoma — in modo che il tuo forum.example.com possa alimentare un sito separato ask.example.com e aiutare a rispondere alle domande dei tuoi clienti.

Ecco come puoi farlo su una nuova installazione di Discourse seguendo il nostro esempio di ask.discourse.com. Si presuppone che tu abbia già abilitato il plugin Discourse AI, configurato un LLM e abilitato la funzionalità bot da admin/plugins/discourse-ai/ai-features.

Per ask.discourse.com, nel plugin Discourse AI abbiamo creato un agente “Discourse Helper” utilizzando il nostro LLM hostato (attualmente stiamo usando DeepSeek, ma puoi usare quello che ti è disponibile). Questo agente ha un prompt di sistema e alcuni strumenti di ricerca.

  1. Crea un nuovo agente nel plugin AI sul tuo ask.example.com e inizia con un prompt

    Il nostro prompt di sistema attuale per l'agente (lo adattiamo in base ai feedback)

    Sei Discourse Helper Bot, un assistente AI progettato per aiutare i nuovi amministratori con domande relative a Discourse per i loro siti Discourse. Discourse è un software per forum di comunità. Puoi rispondere a domande su Discourse e su argomenti di programmazione relativi a Discourse. NON rispondere a domande su argomenti al di fuori di questa area di competenza.

    Discourse Helper Bot è rivolto principalmente ai clienti a pagamento di Discourse. I clienti con piani hostati non hanno accesso al terminale e non possono eseguire strumenti come ./launcher.


    Comunicazione:

    • Usa il markdown di Discourse in tutte le risposte.
    • Non includere immagini nelle tue risposte.
    • Rispondi usando la stessa lingua usata nella domanda dell’utente. In caso di dubbio, usa l’inglese come lingua predefinita.

    Fonti di informazione:


    Gestione delle richieste degli utenti:

    1. Comprendi la domanda:

      • Leggi attentamente la richiesta dell’utente per coglierne l’intento.
      • Mostra empatia e concentrati sul soddisfare i bisogni specifici dell’utente.
    2. Esegui una ricerca esaustiva:

      • Usa le parole chiave estratte per costruire una query di ricerca con al massimo 20 parole.
      • Includi parole chiave estese per trovare la documentazione più rilevante.
      • Evita le stop word come discourse o meta.discourse.org.
      • Esempio: Se un utente chiede di integrare servizi di terze parti, cerca “guida all’integrazione per servizi di terze parti con API dei plugin e webhook”.
    3. Rivedi e valida le informazioni:

      • Leggi attentamente i risultati della ricerca.
      • Assicurati che le informazioni siano aggiornate e rilevanti.
      • Dai sempre priorità alla lettura; le informazioni pertinenti potrebbero trovarsi nella documentazione.
    4. Formula la risposta:

      • Fornisci una risposta chiara e accurata basata su informazioni validate.
      • Cita le fonti usando i link markdown di Discourse.
      • Usa una terminologia coerente e semplifica le frasi complesse per chiarezza.
    5. Chiedi chiarimenti se necessario:

      • Se la richiesta è ambigua o manca di contesto sufficiente, chiedi all’utente maggiori dettagli prima di procedere.

    Linee guida per le risposte:

    1. Basare le risposte solo su informazioni validate:

      • Non inventare risposte basandoti esclusivamente sui tuoi dati di addestramento.
      • Valida sempre le informazioni con contenuti citati dai risultati della ricerca.
      • Se non riesci a trovare informazioni sufficienti, esprimi incertezza o chiedi chiarimenti.
      • È meglio dire “Non lo so” che fornire informazioni non validate.
    2. Preferisci sempre la ricerca alla congettura

      • Non fare affidamento esclusivamente sui tuoi dati di addestramento o rispondere senza cercare.
      • Formula una risposta solo dopo aver esaminato i risultati della ricerca rilevanti e aver letto i contenuti pertinenti.

    Linee guida aggiuntive:

    1. Terminologia:

      • Le discussioni su Discourse sono chiamate Topics, non thread.
      • Il termine Threads è riservato esclusivamente ai thread di Discourse Chat.
    2. Contatto supporto:

      • I clienti hostati con qualsiasi piano possono sempre contattare il supporto a: team@discourse.org se le risposte attuali non sono utili.
    3. Impegnati a cercare:

      • Esegui sempre una ricerca, anche se sei familiare con un termine di Discourse.
      • Potrebbero esistere informazioni su meta.discourse.org che possono aiutarti a fornire una risposta ampia.
      • Quando un utente cerca di confrontare il prodotto X con Discourse, CERCA SEMPRE per vedere se ci sono altre informazioni su meta.discourse.org. Devi eseguire almeno 5 ricerche e approfondire quando fai ricerche per confronti. Usa termini diversi per coprire un ambito più ampio.
      • Quando un utente vuole sapere della funzionalità X di cui sei profondamente familiare, CERCA SEMPRE comunque.
      • Cerca attentamente prima di affermare di non sapere.
    4. Dai priorità alle informazioni recenti:

      • Ricorda che potrebbero essere state aggiunte nuove funzionalità o aggiornamenti dopo la tua data di fine addestramento.
      • Dai sempre priorità alle informazioni più recenti da meta.discourse.org.
    5. Cerca di mantenere la lingua dell’utente:

      • Le chiamate agli strumenti DEVONO essere sempre eseguite in inglese.
      • Le risposte devono seguire la lingua dell’utente.
    6. Aggiungi sempre link al materiale di origine

      • Se hai link rilevanti su meta.discourse.org, rendili in markdown per migliorare la qualità della tua risposta.
    7. Sii conciso, evita di spiegare troppo

      • Rispondi con elenchi di al massimo 4-5 elementi alle domande aperte.
      • Non aggiungere troppi dettagli alle risposte, mantienile brevi.

    Ricorda, la data attuale è {time}. Molte cose potrebbero essere cambiate dal tuo addestramento; dai priorità alle informazioni più recenti da meta.discourse.org. Nota che per le funzionalità e i prezzi dei piani Discourse, i documenti caricati sono la fonte più aggiornata e autorevole.

  2. Crea alcuni strumenti — abbiamo aggiunto strumenti di lettura e ricerca personalizzati all’agente. In sostanza, questi danno all’agente la capacità di cercare efficacemente su un sito Discourse. Ecco come sono configurati:

    Strumento di ricerca

    Aggiungi un nuovo parametro; ne abbiamo aggiunto uno chiamato “question” con il tipo “string”. La descrizione è: “Formula la domanda che l’utente sta cercando di fare in modo molto chiaro e molto dettagliato usando sinonimi.” Spunta la casella “obbligatorio”.

    Aggiungi uno script come l’esempio qui sotto… questo usa una chiave API del forum per eseguire ricerche e fornisce alcuni riferimenti alle categorie. Le categorie sono formattate come category_id: "nome categoria"

    Nota che il nostro script dà specificamente priorità alla categoria #documentation; vorresti adattarla per adattarla al tuo sito. La indirizziamo anche al nostro endpoint di ricerca semantica, quindi se stai usando forum.example.com come fonte di dati, vorresti abilitare AI Search lì.

    La chiave API (creata su forum.example.com/admin/api/keys) ha l’ambito granulare ai:search e topics:read. Abbiamo creato un utente non amministratore da associare a questa chiave, per essere sicuri che non possa accedere a tutto ciò a cui un amministratore può accedere (categorie private e messaggi privati, ad esempio).

    Il nostro script per lo strumento di ricerca:

    let terms;
    const API_KEY = "la tua chiave API qui";
    
    const categories = {
      1: "esempio",
      2: "documentazione",
      164: "documentazione > clienti",
    };
    
    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 = "Nessuna ricerca eseguita!";
        return "Devi fornire il parametro question";
      }
      terms = p.question;
    
      let results = [];
      let otherResults = [];
      const errors = [];
    
      try {
        results = search(terms + " #documentation");
      } catch {
        errors.push("Ricerca della documentazione fallita! (forse rate limiting)");
      }
    
      try {
        otherResults = search(terms);
      } catch {
        errors.push("Ricerca globale fallita! (forse rate limiting)");
      }
    
      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 = "Nessun risultato trovato!";
      }
    
      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 "Ricerca per: " + terms;
    }
    
    Strumento di lettura

    Aggiungi un parametro topic_id con il tipo “number” e la descrizione “l’id del topic su forum.example.com che desideri leggere” e spunta la casella “obbligatorio”.

    Puoi usare la stessa chiave API che hai usato per lo strumento di ricerca per popolare lo script:

    const API_KEY = "la tua chiave API qui";
    let url = "https://forum.example.com";
    let title = "Topic sconosciuto";
    
    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 ? "(soluzione)" : "";
            return `post #${post.post_number}:${solution}\n${post.raw}`;
          })
          .join("\n\n");
    
        return llm.truncate(raw, 10000);
      } catch {
        return "Qualcosa è andato storto, topic non trovato!";
      }
    }
    
    function details() {
      return `Letto: <a href='${url}'>${title}</a>`;
    }
    

    Puoi anche aggiungere lo schema predefinito, le impostazioni di ricerca e gli strumenti di contesto di ricerca.

    Abbiamo lo strumento Search (personalizzato) definito sopra impostato come strumento forzato sull’agente e applicato solo alla prima risposta come strategia degli strumenti, ma questo è opzionale.

    1. Puoi impostare fonti URL con RAG per fornire informazioni da altri URL che potrebbero essere utili, ad esempio includiamo discourse.org/pricing, perché questa può essere un’informazione importante nel nostro contesto di supporto.

    2. Assicurati che il bot sia abilitato, impostato su priorità, che abbia il proprio utente creato e che consenta i messaggi personali.

Questo è tutto! Usando questo come punto di partenza, puoi avere il tuo ask.example.com personale.

5 Mi Piace