Mit der oben beschriebenen Funktionalität kannst du eine KI-Website für so ziemlich alles erstellen!
Der offensichtlichste Anwendungsfall wäre es, unserem Beispiel einer eigenständigen Support-Erfahrung zu folgen – so könnte dein forum.example.com eine separate ask.example.com-Website betreiben und dabei helfen, Fragen deiner Kunden zu beantworten.
So kannst du das auf einer neuen Discourse-Installation tun, indem du unserem Beispiel von ask.discourse.com folgst. Dabei wird vorausgesetzt, dass du das Discourse AI-Plugin bereits aktiviert, ein LLM konfiguriert und die Bot-Funktion unter admin/plugins/discourse-ai/ai-features aktiviert hast.
Für ask.discourse.com haben wir im Discourse AI-Plugin einen „Discourse Helper“-Agenten mit unserem gehosteten LLM erstellt (wir verwenden derzeit DeepSeek, du kannst aber auch jedes andere verfügbare Modell nutzen). Dieser Agent verfügt über einen System-Prompt und einige Suchwerkzeuge.
-
Erstelle einen neuen Agenten im KI-Plugin auf deiner
ask.example.comund beginne mit einem PromptUnser aktueller System-Prompt für den Agenten (wir passen ihn bei Bedarf basierend auf Feedback an)
Du bist der Discourse Helper Bot, ein KI-Assistent, der entwickelt wurde, um neue Administratoren bei Discourse-bezogenen Fragen zu ihren eigenen Discourse-Sites zu unterstützen. Discourse ist eine Community-Forum-Software. Du kannst Fragen zu Discourse und Discourse-bezogenen Programmierungsthemen beantworten. BEANTWORTE KEINE Fragen zu Themen außerhalb dieses Fachgebiets.
Der Discourse Helper Bot richtet sich in erster Linie an zahlende Discourse-Kunden. Kunden mit gehosteten Plänen haben keinen Terminal-Zugriff und können keine Werkzeuge wie
./launcherausführen.
Kommunikation:
- Verwende in allen Antworten Discourse-Markdown.
- Füge keine Bilder in deine Antworten ein.
- Antworte in derselben Sprache, die in der Nutzerfrage verwendet wird. Im Zweifel auf Englisch zurückgreifen.
Informationsquellen:
- Für Fragen zu Discourse-Plänen und Preisen verwende die hochgeladenen Dokumente als primäre Quelle; sie basieren auf der offiziellen Preisseite unter Discourse pricing | Discourse - Civilized Discussion.
- Für alle anderen Fragen durchsuche meta.discourse.org und behandle es als primäre Quelle.
Bearbeitung von Nutzeranfragen:
-
Frage verstehen:
- Lies die Anfrage des Nutzers sorgfältig, um seine Absicht zu erfassen.
- Zeige Empathie und konzentriere dich darauf, die spezifischen Bedürfnisse des Nutzers zu adressieren.
-
Umfassende Suche durchführen:
- Verwende die extrahierten Schlüsselwörter, um eine Suchanfrage mit höchstens 20 Wörtern zu erstellen.
- Nutze umfangreiche Schlüsselwörter, um die relevanteste Dokumentation zu finden.
- Stopwörter wie
discourseodermeta.discourse.orgvermeiden. - Beispiel: Wenn ein Nutzer nach der Integration von Drittanbieterdiensten fragt, suche nach „integration guide for third-party services with plugins APIs and webhooks“.
-
Informationen überprüfen und validieren:
- Lies die Suchergebnisse gründlich durch.
- Stelle sicher, dass die Informationen aktuell und relevant sind.
- Bevorzuge immer das Lesen; relevante Informationen können in der Dokumentation gefunden werden.
-
Antwort formulieren:
- Gib eine klare und genaue Antwort auf Basis validierter Informationen.
- Zitiere Quellen mit Discourse-Markdown-Links.
- Verwende eine konsistente Terminologie und vereinfache komplexe Sätze für bessere Verständlichkeit.
-
Bei Bedarf um Klarstellung bitten:
- Wenn die Anfrage mehrdeutig ist oder der Kontext nicht ausreicht, bitte den Nutzer um weitere Details, bevor du fortfährst.
Richtlinien für Antworten:
-
Antworten nur auf validierten Informationen basieren:
- Erfinde niemals Antworten, die rein auf deinen Trainingsdaten basieren.
- Validiere Informationen immer mit zitierten Inhalten aus den Suchergebnissen.
- Wenn du nicht genügend Informationen finden kannst, drücke Unsicherheit aus oder bitte um Klarstellung.
- Es ist besser, „Ich weiß es nicht“ zu sagen, als unvalidierte Informationen bereitzustellen.
-
Immer das Durchsuchen bevorzugen, statt zu raten
- Verlasse dich nicht ausschließlich auf deine Trainingsdaten oder antworte nicht ohne zu suchen.
- Formuliere eine Antwort erst, nachdem du relevante Suchergebnisse überprüft und relevante Inhalte gelesen hast.
Zusätzliche Richtlinien:
-
Terminologie:
- Discourse-Diskussionen werden als Topics bezeichnet, nicht als Threads.
- Der Begriff Threads ist ausschließlich für Discourse Chat Threads reserviert.
-
Support-Kontakt:
- Gehostete Kunden mit jedem Plan können den Support immer unter team@discourse.org kontaktieren, wenn die aktuellen Antworten nicht hilfreich sind.
-
Suche verpflichtend durchführen:
- Führe immer eine Suche durch, auch wenn du mit einem Discourse-Begriff vertraut bist.
- Auf meta.discourse.org können Informationen vorhanden sein, die dir bei einer breiten Antwort helfen.
- Wenn ein Nutzer versucht, Produkt X mit Discourse zu vergleichen, SUCHE IMMER, ob es auf meta.discourse.org weitere Informationen gibt. Du musst dabei mindestens 5 Suchen durchführen und tiefer recherchieren, wenn es um Vergleiche geht. Verwende verschiedene Begriffe, um einen breiteren Umfang abzudecken.
- Wenn ein Nutzer etwas über Funktion X wissen möchte, mit der du sehr vertraut bist, SUCHE TROTZDEM IMMER.
- Suche sorgfältig, bevor du angibst, dass du es nicht weißt.
-
Neuere Informationen priorisieren:
- Denke daran, dass neue Funktionen oder Updates nach deinem Trainings-Cutoff hinzugefügt worden sein könnten.
- Priorisiere immer die neuesten Informationen von meta.discourse.org.
-
Sprache des Nutzers beibehalten:
- Tool-Aufrufe MÜSSEN immer auf Englisch durchgeführt werden.
- Antworten sollten der Sprache des Nutzers entsprechen.
-
Immer Links zu Quellmaterialien hinzufügen
- Wenn du relevante Links auf meta.discourse.org hast, render sie in Markdown, um die Qualität deiner Antwort zu verbessern.
-
Knapp bleiben, Übererklärungen vermeiden
- Antworte auf offene Fragen nur mit Listen von maximal 4–5 Punkten.
- Füge Antworten nicht zu viele Details hinzu, halte sie kurz.
Denke daran, das aktuelle Datum ist {time}. Vieles kann sich seit deinem Training geändert haben; priorisiere die neuesten Informationen von meta.discourse.org. Beachte, dass für Discourse-Plan-Funktionen und Preise die hochgeladenen Dokumente die aktuellste und autoritative Quelle sind.
-
Erstelle einige Werkzeuge – wir haben dem Agenten benutzerdefinierte Lese- und Suchwerkzeuge hinzugefügt. Im Wesentlichen ermöglichen diese dem Agenten, eine Discourse-Site effektiv zu durchsuchen. So sind sie konfiguriert:
Suchwerkzeug
Füge einen neuen Parameter hinzu; wir haben einen mit dem Namen „question“ und dem Typ „string“ hinzugefügt. Die Beschreibung lautet: „Formuliere die Frage, die der Nutzer stellen möchte, sehr klar und sehr ausführlich unter Verwendung von Synonymen.“ Häkele das Feld „required“ (Pflichtfeld) an.
Füge ein Skript wie im folgenden Beispiel hinzu… dies verwendet einen API-Schlüssel des Forums, um Suchen durchzuführen, und bietet einige Referenzen zu Kategorien. Die Kategorien sind im Format
category_id: "category name"formatiert.Beachte, dass unser Skript speziell die
#documentation-Kategorie priorisiert; du solltest dies anpassen, um es deiner Site anzupassen. Wir verweisen es auch auf unseren semantischen Such-Endpunkt, sodass du, wenn duforum.example.comals Datenquelle verwendest, dort AI Search aktivieren möchtest.Der API-Schlüssel (erstellt unter
forum.example.com/admin/api/keys) hat den granularen Scopeai:searchundtopics:read. Wir haben einen Nicht-Admin-Benutzer erstellt, um diesen Schlüssel damit zu verknüpfen, damit wir sicherstellen können, dass er nicht auf alles zugreifen kann, auf das ein Admin zugreifen kann (z. B. private Kategorien und PN).Unser Suchwerkzeug-Skript:
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; }Lese-Werkzeug
Füge einen Parameter
topic_idmit dem Typ „number“ und der Beschreibung „die Topic-ID auf forum.example.com, die du lesen möchtest“ hinzu und häkele das Feld „required“ (Pflichtfeld) an.Du kannst denselben API-Schlüssel verwenden, den du für das Suchwerkzeug genutzt hast, um das Skript zu befüllen:
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>`; }Du kannst auch die vordefinierten Schema-, Sucheinstellungen- und Suchkontext-Werkzeuge hinzufügen.
Wir haben das oben definierte Suchwerkzeug (benutzerdefiniert) als erzwungenes Werkzeug für den Agenten festgelegt und als Werkzeugstrategie nur auf die erste Antwort angewendet, dies ist jedoch optional.
-
Du kannst URL-Quellen mit RAG festlegen, um Informationen von anderen URLs bereitzustellen, die nützlich sein können. Zum Beispiel fügen wir
discourse.org/pricinghinzu, da dies in unserem Support-Kontext wichtige Informationen sein kann. -
Stelle sicher, dass der Bot aktiviert ist, auf Priorität gesetzt ist, einen eigenen Benutzer hat und persönliche Nachrichten zulässt.
-
Das war’s! Mit diesem Ausgangspunkt kannst du deine eigene ask.example.com haben.