Anpassung des KI-Zusammenfassers für nicht-englische Sprachen

Hallo, ich benutze lokal google/gemma-3-4b mit dem neuesten Discourse. Das Modell bedient einige Sprachen gut. Wenn ich es über die API oder LM Studio teste, liefert es die Zusammenfassung in der Sprache, in der ich es anfordere.

Discourse fasst derzeit immer auf Englisch zusammen. Die folgenden Schritte beschreiben, wie die Sprache der Zusammenfassung (nicht-Englisch) fest kodiert wird.


Wichtig! Ihre Änderungen gehen bei der nächsten Neuerstellung verloren.
Die fest kodierten Zeilen finden Sie unten in zwei Dateien. Die Datenbankwerte aus der Tabelle ai_personas werden nicht verwendet (Juli 2025). Für diejenigen, die mit Nicht-Produktionsumgebungen arbeiten, können Sie Ihre Muttersprache fest kodieren:

  1. Melden Sie sich per SSH bei Ihrem Server an.

  2. Kopieren Sie die fest kodierte Datei summarize.rb aus dem Container in das Dateisystem des Hosts:

    sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb ./summarize.rb
    
  3. Bearbeiten Sie nun die Datei und ersetzen Sie den englischen System-Prompt durch die gewünschte Sprache:

    Zusammenfassung
           system_prompt = <<~TEXT
           You are a summarization bot.
           You effectively summarise any text.
           You condense it into a shorter version.
           You understand and generate Discourse forum markdown.
           Try generating links as well the format is #{topic.url}/POST_NUMBER. eg: [ref](#{topic.url}/77)
           TEXT
    
           user_prompt = <<~TEXT
             Guidance: #{guidance}
             You are summarizing the topic: #{topic.title}
             Summarize the following in 400 words:
    
             #{text}
           TEXT
    

    Ergebnis, zum Beispiel:

           system_prompt = <<~TEXT
           Вы — бот, выполняющий суммаризацию текста.
           Вы умеете эффективно сокращать текст до ключевых мыслей.
           Вы понимаете и умеете генерировать разметку Markdown в Discourse.
           При необходимости добавляйте ссылки в формате: #{topic.url}/POST_NUMBER, например: [ссылка](#{topic.url}/77)
           TEXT
    
           user_prompt = <<~TEXT
             Руководство: #{guidance}
             Вы суммаризуете топик: #{topic.title}
             Пожалуйста, предоставь ответ на русском языке.
             В ответе используй 400 слов:
    
             #{text}
           TEXT
    
  4. Machen Sie als Nächstes dasselbe für die zweite Datei:

    sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/summarizer.rb ./summarizer.rb
    

    Bearbeiten:

    Hinweis: Sie können die Sprache des Originaltextes überschreiben:

    - Используйте русский язык, несмотря на язык оригинала исходного текста.
    
    Zusammenfassung
         <<~PROMPT.strip
           You are an advanced summarization bot that generates concise, coherent summaries of provided text.
           You are also capable of enhancing an existing summaries by incorporating additional posts if asked to.
    
           - Only include the summary, without any additional commentary.
           - You understand and generate Discourse forum Markdown; including links, _italics_, **bold**.
           - Maintain the original language of the text being summarized.
           - Aim for summaries to be 400 words or less.
           - Each post is formatted as "<POST_NUMBER> <USERNAME> <MESSAGE>"
           - Cite specific noteworthy posts using the format [DESCRIPTION]({resource_url}/POST_NUMBER)
           - Example: links to the 3rd and 6th posts by sam: sam ([#3]({resource_url}/3), [#6]({resource_url}/6))
           - Example: link to the 6th post by jane: [agreed with]({resource_url}/6)
           - Example: link to the 13th post by joe: [joe]({resource_url}/13)
           - When formatting usernames use [USERNAME]({resource_url}/POST_NUMBER)
    
           Format your response as a JSON object with a single key named "summary", which has the summary as the value.
           Your output should be in the following format:
             <output>
               {"summary": "xx"}
             </output>
    
           Where "xx" is replaced by the summary.
         PROMPT
       end
    
    ...
           [
             "Here are the posts inside <input></input> XML tags:\n\n<input>1) user1 said: I love Mondays 2) user2 said: I hate Mondays</input>\n\nGenerate a concise, coherent summary of the text above maintaining the original language.",
             {
               summary:
                 "Two users are sharing their feelings toward Mondays. [user1]({resource_url}/1) hates them, while [user2]({resource_url}/2) loves them.",
             }.to_json,
           ],
    

    Ergebnis:

            <<~PROMPT.strip
           Вы являетесь продвинутым ботом для составления краткого содержания, который генерирует краткие, связные выдержки из предоставленного текста.
           Вы также можете дополнить существующее резюме, добавив дополнительные сообщения, если вас попросят.
    
           - Включайте только краткую сводку, без каких-либо дополнительных комментариев.
           - Вы понимаете и создаете разметку Markdown на форуме Discourse, включая ссылки, _курсив_, **жирный_текст**.
           - Используйте русский язык, несмотря на язык оригинала исходного текста.
           - Старайтесь, чтобы объем резюме не превышал 400 слов.
           - Каждая запись оформляется как "<POST_NUMBER>) <USERNAME> <MESSAGE>"
           - Цитируйте конкретные заслуживающие внимания публикации, используя формат [DESCRIPTION]({resource_url}/POST_NUMBER)
           - Пример: ссылки на 3-й и 6-й посты пользователя sam: sam ([#3]({resource_url}/3), [#6]({resource_url}/6))
           - Пример: ссылка на 6-е сообщение пользователя jane: [согласовано с]({resource_url}/6)
           - Пример: ссылка на 13-е сообщение Джо: [Джо]({resource_url}/13)
           - При форматировании имен пользователей используйте [USERNAME]({resource_url}/POST_NUMBER)
    
           Отформатируйте свой ответ в виде объекта JSON с помощью единственного ключа с именем "summary", который имеет значение "summary".
           Ваши выходные данные должны быть в следующем формате:
             <output>
               {"summary": "xx"}
             </output>
    
           Где "xx" заменяется на текст краткой сводки.
         PROMPT
       end
    
       def response_format
         [{ "key" => "summary", "type" => "string" }]
       end
    
       def examples
         [
           [
             "Вот записи внутри XML-тегов <input></input>:\n\n<input>1) user1 сказал: Я люблю понедельники 2) user2 сказал: А я ненавижу понедельники</input>\n\nСформулируйте краткое, связное изложение текста выше, сохранив язык оригинала.",
             {
               summary:
                 "Два пользователя делятся своими чувствами к понедельникам. [user1]({resource_url}/1) ненавидит их, тогда как [user2]({resource_url}/2) любит их.",
             }.to_json,
           ],
    
  5. Kopieren Sie die geänderten Dateien in den Container:

    sudo docker cp summarize.rb app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb
    sudo docker cp summarizer.rb app:/var/www/discourse/plugins/discourse-ai/lib/personas/summarizer.rb
    
  6. Committen und starten Sie dann den Container neu:

    sudo docker commit app
    sudo /var/discourse/launcher restart app
    
  7. Überprüfen Sie das Ergebnis (für neue Themen):

Das alles ist nicht nötig, Sie können die Persona, die die Zusammenfassung durchführt, jetzt in den Admin-Einstellungen ändern.

Erstellen Sie eine neue Persona, die den Voreinstellungen folgt, ändern Sie die Systemaufforderung nach Belieben und legen Sie fest, dass die Zusammenfassungsfunktion sie unter /admin/plugins/discourse-ai/ai-features/1/edit verwendet.

2 „Gefällt mir“

Nun… Die neuesten Informationen zur Sprachunterstützung fanden sich in diesem Thema. Danke für die Antwort.

Der erste Versuch, einen ordnungsgemäßen Zusammenfassungsbot als Klon eines existierenden Bots zu erstellen, ist fehlgeschlagen. Er produziert immer noch Englisch. Wahrscheinlich mache ich etwas falsch.

Ich bin mir nicht sicher, wie gut du mit diesem Modell zurechtkommst, es ist nicht sehr leistungsfähig

1 „Gefällt mir“

Was ist der Workaround oder Ansatz aller für die Nicht-Englisch-KI-Zusammenfassung?

Zum Beispiel erhalte ich bei Chat-Zusammenfassungen, während die Locale auf Deutsch eingestellt ist, immer noch Zusammenfassungen in englischer Sprache, auch mit klaren Text-Markdown-Links zu einzelnen Chat-Nachrichten, die nicht korrekt als Links formatiert sind.

Getestet mit Gemini 2.5 Lite

1 „Gefällt mir“

Hallo, ich verwende immer noch den oben beschriebenen Workaround. Ich habe Tricks mit benutzerdefinierten Personas ausprobiert, aber es funktioniert nicht. Wahrscheinlich mache ich etwas falsch, aber für mich ist es weniger schmerzhaft.

Kurz gesagt, Sie bereiten Vorlagen vor, die von GitHub heruntergeladen wurden, passen diese an Ihre Bedürfnisse an und wenden sie jedes Mal nach einem erneuten Build an. Vergessen Sie nicht, alle 2-3 Monate nach neuen Versionen dieser Dateien zu suchen.

Erstellen Sie ein ausführbares Skript (im Verzeichnis $HOME) do_it_after_rebuild.sh

#/bin/bash
#
# https://github.com/discourse/discourse/tree/main/plugins/discourse-ai/lib/personas
docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb orig_summarize.rb
docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/summarizer.rb orig_summarizer.rb
docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/short_summarizer.rb orig_short_summarizer.rb
docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/discover.rb orig_discover.rb

rm GeoLite2*
wget https://raw.githubusercontent.com/8bitsaver/maxmind-geoip/release/GeoLite2-City.mmdb
wget https://raw.githubusercontent.com/8bitsaver/maxmind-geoip/release/GeoLite2-ASN.mmdb

docker cp GeoLite2-City.mmdb    app:/var/www/discourse/vendor/data/
docker cp GeoLite2-ASN.mmdb     app:/var/www/discourse/vendor/data/
docker cp summarize.rb          app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb
docker cp summarizer.rb         app:/var/www/discourse/plugins/discourse-ai/lib/personas/summarizer.rb
docker cp short_summarizer.rb   app:/var/www/discourse/plugins/discourse-ai/lib/personas/short_summarizer.rb
docker cp discover.rb           app:/var/www/discourse/plugins/discourse-ai/lib/personas/discover.rb
docker commit app
sudo /var/discourse/launcher restart app

Und führen Sie es nach dem erneuten Build aus:

./do_it_after_rebuild.sh
Dateien hier

Nehmen Sie diese Änderungen an den Dateien vor, die Sie regelmäßig von hier herunterladen müssen (ich zeige nur Diffs – Sie müssen diese Zeilen manuell in die Dateien einfügen):

diff discover.rb orig_discover.rb
35d34
<         * Use always German language.
80d78
<
└─# diff short_summarizer.rb orig_short_summarizer.rb
12c12,13
< Du bist ein fortgeschrittener Bot, um den Text zusammenzufassen. Sie analysieren den bereitgestellten Text und erzeugen eine kurze Zusammenfassung aus einem einzigen Satz, in dem das Hauptthema und die aktuellen Ereignisse dem Gesprächspartner ohne vorläufigen Kontext verständlich sind.
---
> You are an advanced summarization bot. Analyze a given conversation and produce a concise,
> single-sentence summary that conveys the main topic and current developments to someone with no prior context.
14c15
< ### Anweisungen:
---
> ### Guidelines:
16,28c17,23
< - Unterstreiche die neuesten Updates aufgrund ihrer Bedeutung im ursprünglichen Beitrag.
< - Konzentriere dich auf das betreffende Hauptthema oder -problem und behalte einen objektiven und neutralen Ton bei.
< - Schließen Sie fremde Details oder subjektive Meinungen aus.
< - Benutze immer nur die russische Sprache, ignoriere die Sprache des Originaltextes.
<
---
> - Underline the latest updates due to their importance in the original post.
> - Focus on the main topic or issue at hand and maintain an objective and neutral tone.
> - Exclude extraneous details or subjective opinions.
> - Always use only the Russian language, ignore the language of the original text.
└─# diff summarizer.rb orig_summarizer.rb
12,13c12,13
< Sie sind ein fortgeschrittener Bot, um kurze Inhalte zu erstellen, die kurze, zusammenhängende Auszüge aus dem bereitgestellten Text erzeugen.
< Sie können einen vorhandenen Lebenslauf auch ergänzen, indem Sie zusätzliche Beiträge hinzufügen, wenn Sie dazu aufgefordert werden.
---
> You are an advanced summarization bot that generates concise, coherent summaries of provided text.
> You are also capable of enhancing an existing summaries by incorporating additional posts if asked to.
15,24c15,23
< - Fügen Sie nur eine kurze Zusammenfassung hinzu, ohne weitere Kommentare.
< - Sie verstehen und erstellen Markdown im Discourse-Forum, einschließlich Links, _kursiv_, **Fetttext**.
< - Verwenden Sie die russische Sprache trotz der Sprache des ursprünglichen Quelltextes.
< - Versuchen Sie, den Lebenslauf auf 400 Wörter zu beschränken.
< - Jeder Eintrag wird als "<POST_NUMBER>) <USERNAME> <MESSAGE>" ausgegeben
< - Zitieren Sie bestimmte bemerkenswerte Publikationen mit dem Format [BESCHREIBUNG]({resource_url}/POST_NUMBER)
< - Beispiel: Links zu den 3. und 6. Posts von sam: sam ([#3]({resource_url}/3), [#6]({ resource_url}/6))
< - Beispiel: Verweis auf die 6. Nachricht von jane: [konsistent mit]({resource_url}/6)
< - Beispiel: Verweis auf Joes 13. Beitrag: [Jo]({resource_url}/13)
< - Verwenden Sie beim Formatieren von Benutzernamen [USERNAME]({resource_url}/POST_NUMBER)
---
> - Only include the summary, without any additional commentary.
> - You understand and generate Discourse forum Markdown; including links, _italics_, **bold**.
> - Maintain the original language of the text being summarized.
> - Aim for summaries to be 400 words or less.
> - Jeder Beitrag ist als "<POST_NUMBER>) <BENUTZERNAME> <NACHRICHT>" formatiert
> - Zitieren Sie bestimmte bemerkenswerte Beiträge im Format [BESCHREIBUNG] ({resource_url} / POST_NUMBER)
> - Beispiel: Link zum 6. Beitrag von jane: [einverstanden mit]({resource_url}/6)
> - Beispiel: Link zum 13. Beitrag von joe: [joe]({resource_url}/13)
> - Verwenden Sie beim Formatieren von Benutzernamen [BENUTZERNAME] ({resource_url} / POST_NUMBER)
Nr.26,30c25,28
< Отформатируйте свой ответ в виде объекта JSON с помощью единственного ключа с именем "Zusammenfassung", который имеет значение "Zusammenfassung".
< Ваши выходные данные должны быть в следующем формате:
< <Ausgabe>
< {"zusammenfassung": "xx"}
< </Ausgabe>
---
> Formatieren Sie Ihre Antwort als JSON-Objekt mit einem einzelnen Schlüssel namens "summary", der die Zusammenfassung als Wert enthält.
> Ihre Ausgabe sollte im folgenden Format vorliegen:
> 
> {"Zusammenfassung": "xx"}
32c30,31
< Wobei "xx" durch den Text der Zusammenfassung ersetzt wird.
---
> Where "xx" is replaced by the summary.
> reply with valid JSON only
43c42
< "Hier sind die Einträge in den XML-Tags <input></input>:\n\n<input>1) user1 sagte: Ich liebe Montags 2) user2 sagte: Und ich hasse Montags</input>\n\nformulieren Sie die kurze, zusammenhängende Darstellung des Textes oben, während Sie die ursprüngliche Sprache beibehalten.",
---
> "Here are the posts inside <input></input> XML tags:\n\n<input>1) user1 said: I love Mondays 2) user2 said: I hate Mondays</input>\n\nGenerate a concise, coherent summary of the text above maintaining the original language.",
46c45
< "Zwei Benutzer teilen ihre Gefühle für Montag. [user1]({resource_url}/1) hasst sie, während [user2]({resource_url}/2) sie liebt.",
---
> "Two users are sharing their feelings toward Mondays. [user1]({resource_url}/1) hates them, while [user2]({resource_url}/2) loves them.",
└─# diff summarize.rb orig_summarize.rb
159c159
< max_tokens: 4096,
---
> max_tokens: 500,
170,173c170,174
< Sie sind ein Bot, der den Text zusammenfasst.
< Sie sind in der Lage, Text effektiv auf wichtige Gedanken zu reduzieren.
< Sie verstehen und können Markdown-Markdown in Discourse generieren.
< Fügen Sie bei Bedarf Links im Format #{topic.url}/POST_NUMBER hinzu, zum Beispiel: [link](#{topic.url}/77)
---
> You are a summarization bot.
> You effectively summarise any text.
> You condense it into a shorter version.
> You understand and generate Discourse forum markdown.
> Try generating links as well the format is #{topic.url}/POST_NUMBER. eg: [ref](#{topic.url}/77)
177,180c178,180
< Handbuch: #{guidance}
< Sie fassen das Thema zusammen: #{topic.title}
< Bitte gib eine Antwort auf Russisch an.
< Benutze 400 Wörter in deiner Antwort:
---
>