안녕하세요, 저는 로컬에서 google/gemma-3-4b 모델을 최신 버전의 Discourse와 함께 사용하고 있습니다. 이 모델은 특정 언어를 잘 처리합니다. API나 LM Studio를 통해 테스트해 보면, 제가 요청한 언어로 요약을 생성해 줍니다.
하지만 현재 Discourse는 항상 영어로 요약을 생성하고 있습니다. 아래 단계는 요약 언어(비영어)를 하드코딩하는 방법을 설명합니다.
중요! 다음 재빌드(rebuild) 시 변경 사항이 _실수_됩니다.
하드코딩할 줄은 아래 두 파일에 있습니다. ai_personas 테이블의 데이터베이스 값은 현재(2025년 7월) 사용되지 않습니다. 비프로덕션 환경에서 실험하는 분들을 위해, 여러분의 모국어를 하드코딩할 수 있습니다:
-
서버에 SSH로 접속합니다.
-
컨테이너에서 호스트 파일시스템으로 하드코딩할 파일
summarize.rb를 복사합니다:sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/tools/summarize.rb ./summarize.rb -
이제 파일을 편집하여 영어 시스템 프롬프트를 원하는 언어로 교체합니다:
요약
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 -
다음으로, 두 번째 파일에 대해 동일한 작업을 수행합니다:
sudo docker cp app:/var/www/discourse/plugins/discourse-ai/lib/personas/summarizer.rb ./summarizer.rb편집:
참고: 원본 텍스트의 언어를 오버라이드할 수 있습니다:
- Используйте русский язык, несмотря на язык оригинала исходного текста.요약
<<~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, ], -
수정된 파일을 컨테이너로 복사합니다:
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 -
그런 다음 컨테이너를 커밋하고 재시작합니다:
sudo docker commit app sudo /var/discourse/launcher restart app -
결과를 확인합니다 (새로운 토픽에 대해):

