こんにちは、アントン!
Mattermost から Discourse への移行は確かに可能ですが、カスタムインポートスクリプトを作成する必要があります。現時点では、既製のスクリプトは利用できません(利用可能なインポートスクリプトはこちらを参照してください)。既存のスクリプトを参考に学習することはできますが、それらの最終更新日を十分に確認し、適宜調整してください。一部のスクリプトは Discourse のテーブルへの参照が古い可能性があります。
Mattermost インポートスクリプトを含むプルリクエストは、コミュニティにとって非常に歓迎されるでしょう!
チャンネルとデータのマッピング
すべてをチャットチャンネルとしてインポートすることもできますが、他のタイプとしてマッピングすることも可能です。
- チャンネルをカテゴリとして: 各 Mattermost チャンネルを Discourse のカテゴリとしてインポートします。チャンネル内のスレッドはトピックになり、各メッセージは投稿になります。あるいは、個々の投稿がトピックの OP になることもあります。
- チャンネルをトピックとして: 別の方法として、各 Mattermost チャンネルを 1 つのトピックにし、メッセージを返信として追加します。この場合、スレッドは順番に表示されます。
- DM: プライベートメッセージとしてもインポートできます。アーカイブが必要なディスカッションに適しています。
コミュニティとコンテンツの量に最適なアプローチを慎重に検討してください。
トピックタイトル
チャットをトピックと投稿にマッピングする場合、各トピックのタイトルを作成する必要があります。そのための素晴らしい方法の 1 つは、Discourse AI を使用して、トピックの実際のコンテキストでタイトルを生成することです。
AI を使用したトピックタイトルの生成
要するに、この方法を使用します。
def gen_title(llm, system_prompt, topic)
begin
content = topic.posts.map(&:cooked).join("\n").slice(0..10_000)
message = [{type: :user, content: content}]
prompt = DiscourseAi::Completions::Prompt.new(system_prompt, messages: message)
title = llm.generate(
prompt,
user: Discourse.system_user,
temperature: 0.3,
feature_name: "ai_helper"
)
topic.title = title
topic.save!
puts "Topic: #{topic.id}, changed sucessfully."
rescue ActiveRecord::RecordInvalid
puts "validation error"
end
end
LLM とマスタープロンプトが必要です。
llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)
system_prompt = <<-PROMPT
I want you to act as a title generator for written pieces. I will provide you with a text,
and you will generate a title. Please keep the title concise and under 20 words,
and ensure that the meaning is maintained. The title will utilize the language type of the topic.
I want you to only reply the proposed title and nothing else, do not write explanations.
Never ever use colons in the title. Always use sentence case, using a capital letter at
the start of the title, never start the title with a lower case letter. Proper nouns in the title
can have a capital letter, and acronyms like LLM can use capital letters. Format some titles
as questions, some as statements. Make sure to use question marks if the title is a question.
PROMPT
次に、好みに応じてトピックのリストにループ処理できます。
# gen everything
Topic
.joins(:_custom_fields)
.where('topic_custom_fields.name = ?', 'import_id')
.find_each { |topic| gen_title(llm, system_prompt, topic) }
# filter PMs
Topic
.joins(:_custom_fields)
.where('topic_custom_fields.name = ?', 'import_id')
.where.not(archetype: "private_message")
.find_each { |topic| gen_title(llm, system_prompt, topic) }
重要な考慮事項
- リアクション: Mattermost は投稿ごとに複数のリアクションをサポートしています。Discourse の投稿としてインポートする場合、Discourse Chat(ネイティブで複数のリアクションをサポート)にマッピングしない限り、1 つに制限する必要があります。
- カスタム絵文字: カスタム絵文字を持ち込むことができます。Discourse Reactions プラグインのドキュメントを参照してください。
- チームと権限: Mattermost の「チーム」は Discourse に直接マッピングされませんが、適切なグループベースのアクセス制御を持つカテゴリ/チャンネルを設定できます。
- 添付ファイル: Mattermost の添付ファイル(画像やドキュメント)は、Discourse のようにコンテンツに埋め込まれません。インポート時に、添付ファイルのリンク(Markdown)を追加するか、投稿本文に埋め込む必要があります。
参考資料
チャットプラットフォームの移行経験があります。当社のチームからの支援をご希望の場合は、Discourse 移行サービスページをご覧ください。
スクリプト開発やマッピングの決定中に特定の質問がある場合は、Meta でお気軽にご質問ください!