自定义 AI 摘要器以支持非英语语言

您好,我本地使用 \google/gemma-3-4b\\ 和最新的 Discourse。该模型可以很好地处理多种语言。当我在 API 或 LM Studio 中测试它时,它会以我要求的语言提供摘要。

目前 Discourse 始终以英语提供摘要。以下步骤描述了如何硬编码摘要的语言(非英语)。


重要提示!您的更改将在下次重建时丢失

硬编码的行位于以下两个文件中。ai_personas 表中的数据库值(2025 年 7 月)未使用。对于在非生产环境中进行操作的用户,您可以硬编码您的母语:

  1. SSH 登录到您的服务器。

  2. 将硬编码的文件 summarize.rb 从容器复制到主机文件系统:

    sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb ./summarize.rb
    
  3. 现在编辑文件,将英文系统提示替换为所需的语言:

    Summary
           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
    

    结果,例如:

           system_prompt = <<~TEXT
           Вы — бот, выполняющий суммаризацию текста.
           Вы умеете эффективно сокращать текст до ключевых мыслей.
           Вы понимаете и умеете генерировать разметку Markdown в Discourse.
           При необходимости добавляйте ссылки в формате: #{topic.url}/POST_NUMBER, например: [ссылка](#{topic.url}/77)
           TEXT
    
           user_prompt = <<~TEXT
             Руководство: #{guidance}
             Вы суммаризуете топик: #{topic.title}
             Пожалуйста, предоставь ответ на русском языке.
             В ответе используй 400 слов:
    
             #{text}
           TEXT
    
  4. 接下来,对第二个文件执行相同的操作:

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

    编辑:

    注意:您可以覆盖原始文本的语言:

    > - Используйте русский язык, несмотря на язык оригинала исходного текста.
    
    Summary
          <<~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,
           ],
    

    结果:

           <<~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. 将修改后的文件复制到容器中:

    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. 然后提交并重启容器:

    sudo docker commit app
    sudo /var/discourse/launcher restart app
    
  7. 检查结果(针对新主题):

无需执行所有这些操作,您现在可以在管理员设置中更改用于摘要的 Persona。

创建一个新的 Persona,遵循现有 Persona 的设置,根据需要更改系统提示,并将摘要功能设置为使用它,地址为 /admin/plugins/discourse-ai/ai-features/1/edit

2 个赞

嗯……关于语言支持的最新消息是在这个话题中找到的。感谢回复。

创建第一个克隆现有机器人的正确摘要机器人的尝试失败了。它仍然生成英文。可能是我做错了什么。

我不确定您使用此模型的效果如何,它不是那么强大

1 个赞

大家对于非英语内容的 AI 摘要有什么变通方法或处理方式吗?

例如,对于聊天摘要,即使本地化设置(Locale)为德语,我仍然会收到英语摘要,并且摘要中指向单个聊天消息的清晰文本 Markdown 链接格式不正确。

已使用 Gemini 2.5 Lite 进行测试

1 个赞

你好,我仍然使用上面描述的变通方法。我尝试了使用自定义 Persona 的技巧,但它不起作用。可能是我做错了什么,但对我来说这不那么痛苦。

简而言之,您将准备从 GitHub 下载的模板,根据您的需要修改它们,并在每次重建后应用。不要忘记每 2-3 个月检查这些文件的新版本。

$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

并在重建后运行:

./do_it_after_rebuild.sh
Files here

对您需要定期从 此处 下载的文件进行这些更改(我只显示差异 - 您必须手动将这些行添加到文件中):

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, 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 [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.
> - Each post is formatted as "<POST_NUMBER>) <USERNAME> <MESSAGE>"
> - Cite specific notable posts in the format [DESCRIPTION]({resource_url}/POST_NUMBER)
> - Example: Link to the 3rd and 6th posts from sam: sam ([#3]({resource_url}/3), [#6]({ resource_url}/6))
> - Example: Reference to jane's 6th message: [consistent with]({resource_url}/6)
> - Example: Reference to joe's 13th post: [joe]({resource_url}/13)
> - Use [USERNAME]({resource_url}/POST_NUMBER) when formatting usernames
Nr.26,30c25,28
< Отформатируйте свой ответ в виде объекта JSON с помощью かдинственного ключа с именем "Zusammenfassung", который имеет значение "Zusammenfassung".
< Ваши выходные данные должны быть в следующем формате:
< 
< {"zusammenfassung": "xx"}
< /Ausgabe>
---
> Format your response as a JSON object with a single key named "summary" that has the summary as its value.
> Your output should be in the following format:
> 
> {"summary": "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:
---
>