Adapter le summarizer IA pour utiliser des langues non anglaises

Bonjour, j’utilise localement `google/gemma-3-4b` avec la dernière version de Discourse. Le modèle gère bien certaines langues. Lorsque je le teste via l’API ou LM Studio, il fournit le résumé dans la langue que je lui demande.

Actuellement, Discourse résume toujours en anglais. Les étapes ci-dessous décrivent comment coder en dur la langue de résumé (non anglaise).

Important ! Vos modifications seront perdues lors de la prochaine reconstruction.

Les lignes codées en dur se trouvent ci-dessous dans deux fichiers. Les valeurs de la base de données de la table ai_personas ne sont pas utilisées (juillet 2025). Pour ceux qui jouent avec des environnements non-production, vous pouvez coder en dur votre langue maternelle :

  1. Connectez-vous en SSH à votre serveur.

  2. Copiez le fichier codé en dur `summarize.rb` du conteneur vers le système de fichiers de l’hôte :

    sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb ./summarize.rb
    
  3. Modifiez maintenant le fichier, remplacez l’invite système anglaise par la langue souhaitée :

    Résumé
           system_prompt = 
           Vous êtes un bot de résumé.
           Vous résumez efficacement tout texte.
           Vous le condensez en une version plus courte.
           Vous comprenez et générez le Markdown du forum Discourse.
           Essayez de générer des liens également, le format est #{topic.url}/NUMÉRO_DE_POST. par exemple : [ref](#{topic.url}/77)
    
    
           user_prompt = 
             Guidance: #{guidance}
             Vous résumez le sujet : #{topic.title}
             Résumez ce qui suit en 400 mots :
    
             #{text}
    

    Résultat, par exemple :

           system_prompt = 
           Вы — бот, выполняющий суммаризацию текста.
           Вы умеете эффективно сокращать текст до ключевых мыслей.
           Вы понимаете и умеете генерировать разметку Markdown в Discourse.
           При необходимости добавляйте ссылки в формате: #{topic.url}/POST_NUMBER, например: [ссылка](#{topic.url}/77)
    
    
           user_prompt = 
             Руководство: #{guidance}
             Вы суммаризуете топик: #{topic.title}
             Пожалуйста, предоставьте ответ на русском языке.
             В ответе используй 400 слов:
    
             #{text}
    
  4. Ensuite, faites de même pour le second fichier :

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

    Modifier :

    Note : vous pouvez remplacer la langue du texte original :

    - Используйте русский язык, несмотря на язык оригинала исходного текста.
    

    [details=“Résumé”]

         
           Vous êtes un bot de résumé avancé qui génère des résumés concis et cohérents du texte fourni.
           Vous êtes également capable d'améliorer un résumé existant en intégrant des publications supplémentaires si on vous le demande.
    
           - Incluez uniquement le résumé, sans aucun commentaire supplémentaire.
           - Vous comprenez et générez le Markdown du forum Discourse ; y compris les liens, _l'italique_, le **gras**.
           - Maintenez la langue originale du texte résumé.
           - Visez des résumés de 400 mots ou moins.
           - Chaque publication est formatée comme "
           - Citez des publications spécifiques notables en utilisant le format [DESCRIPTION]({resource_url}/POST_NUMBER)
           - Exemple : liens vers les 3ème et 6ème publications de sam : sam ([#3]({resource_url}/3), [#6]({resource_url}/6))
           - Exemple : lien vers la 6ème publication de jane : [d'accord avec]({resource_url}/6)
           - Exemple : lien vers la 13ème publication de joe : [joe]({resource_url}/13)
           - Lors du formatage des noms d'utilisateur, utilisez [USERNAME]({resource_url}/POST_NUMBER)
    
           Formatez votre réponse sous forme d'objet JSON avec une seule clé nommée "summary", qui contient le résumé comme valeur.
           Votre sortie doit être dans le format suivant :
             
               {"summary": "xx"}
             
    
           Où "xx" est remplacé par le résumé.
         
       end
    
       def response_format
         [{ "key" =	> "summary", "type" =	> "string" }]
       end
    
       def examples
         [
           [
             "Voici les publications dans les balises XML 
    
    

Saisissez un résumé concis et cohérent du texte ci-dessus en conservant la langue originale.",
{
summary:
“Deux utilisateurs partagent leurs sentiments envers les lundis. user1 les déteste, tandis que user2 les aime.”,
}.to_json,
],


[/details]


5. Copiez les fichiers modifiés dans le conteneur :

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. Ensuite, validez et redémarrez le conteneur :

sudo docker commit app
sudo /var/discourse/launcher restart app


7. Vérifiez le résultat (pour les nouveaux sujets) :

![Screenshot from 2025-07-02 18-47-57|690x330](upload://l0bHaYbPILe3O0CC8u8QKmzTs22.png)

Il n’est pas nécessaire de faire tout cela, vous pouvez maintenant changer la Persona qui effectue le résumé dans les paramètres d’administration.

Créez une nouvelle Persona en suivant les paramètres de la précédente, modifiez l’invite système comme vous le souhaitez et définissez la fonctionnalité de résumé pour l’utiliser à l’adresse /admin/plugins/discourse-ai/ai-features/1/edit.

2 « J'aime »

Eh bien… Les derniers mots concernant la prise en charge des langues ont été trouvés dans ce sujet. Merci pour votre réponse.

La première tentative de création d’un bot de résumé approprié en tant que clone d’un bot existant a échoué. Il produit toujours de l’anglais. Probablement, je fais quelque chose de mal.

Je ne suis pas sûr que vous réussirez bien avec ce modèle, il n’est pas très puissant.

1 « J'aime »

Quelle est la solution de contournement ou l’approche de chacun pour le résumé d’IA non anglais ?

Par exemple, pour les résumés de discussion alors que la locale est définie sur l’allemand, j’obtiens toujours des résumés en langue EN, ainsi que des liens markdown de texte clair vers des messages de discussion individuels qui ne sont pas correctement formatés comme des liens.

Testé avec Gemini 2.5 Lite

1 « J'aime »

Bonjour, j’utilise toujours la solution de contournement décrite ci-dessus. J’ai essayé des astuces avec des Personas personnalisés, mais cela ne fonctionne pas. Je fais probablement quelque chose de mal, mais pour moi, c’est moins douloureux.

En bref, vous préparerez les modèles téléchargés depuis GitHub, les modifierez selon vos besoins et les appliquerez à chaque reconstruction. N’oubliez pas de vérifier les nouvelles versions de ces fichiers une fois tous les 2-3 mois.

Créez un script exécutable (dans le répertoire $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

Et exécutez après la reconstruction :

./do_it_after_rebuild.sh
Fichiers ici

Apportez ces modifications aux fichiers que vous devez télécharger périodiquement depuis ici (je ne montre que les diffs - vous devez ajouter ces lignes dans les fichiers manuellement) :

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 while maintaining 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 [DESCRIPTION]({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:
---
>