AIペルソナに長文を挿入できるようになりました!
これは多くのメリットを提供します。
-
モデルのトレーニングにはない長文をカスタムAIボットに導入できます。(例:社内トレーニングドキュメント、社内レポート)
-
具体的なデータ(モデルのトレーニングセットに存在する場合でも)でペルソナをより適切に接地でき、モデルが特定の情報を適切に引用し、結果の品質を向上させるのに役立ちます。
アップロードを追加するには:
-
/admin/plugins/discourse-ai/ai-personas/インターフェイスを使用して新しいペルソナを作成します。 -
ペルソナに含めたいテキストファイルをアップロードします。
ファイルをアップロードする前に、関連する拡張子(
.mdおよび.txt)をサイト設定authorized extensionsで追加してください。これにより、ペルソナで使用できるようになります。
- 必要に応じてインデックス作成オプションを調整します。
前提条件
このオプションを機能させるには、ai_embeddings_enabled および ai_embeddings_model が設定されている必要があります。
Discourse AIは非常に多くの埋め込みモデルをサポートしています。
ホストされているお客様は、最先端のbge-large-enモデルを無料で利用できます。
セルフホスト者またはより多くの選択肢を求める人は、埋め込みモデルをセルフホストするか、Open AI、Google(Gemini)などのモデルを使用できます。
これはRAGですか?
アップロードサポートの実装は、まさにRetrieval-Augmented Generationです。
大まかに言うと、LLMにユーザーの質問に答えるように依頼するたびに、入力されたテキストに基づいて関連性の高い情報を検索し、システムプロンプトに挿入します。
さまざまなインデックス作成オプションの説明
トークンとは何ですか? トークンは、大規模言語モデルがテキストを分割するために使用するプリミティブです。素晴らしい視覚的な説明は次のとおりです:https://platform.openai.com/tokenizer
Discourse AIのアップロード実装には、次のトグルがあります。
Upload Chunk Tokens: ファイルがアップロードされた後、それらをチャンクに分割します。これにより、チャンクのサイズを制御できます。チャンクが埋め込みモデルにとって大きすぎる場合、埋め込みは切り捨てられます(トークンの一部のみが処理されます)。
Upload Chunk Overlap Tokens: 現在のチャンクに含まれる前のチャンクからのトークン数です。この数値が大きいほど、インデックスに重複した情報が多く保存されます。
Search Conversation Chunks: 関連性に基づいて、完了プロンプトに無条件に含まれる「チャンク」の数を制御します。数値が大きいほど、LLMに提供されるコンテキストが多くなります(そして呼び出しのコストが高くなります)。たとえば、これが10に設定され、Upload Chunk Tokensが200に設定されている場合、すべての完了には2000トークンの追加オーバーヘッドが発生します。
Discourse AIはどのように長文を分割しますか?
DiscourseはRecursive Character Text Splitterを使用しており、分割時に段落、次に改行、最後に単語を一緒に保持しようとします。
さらに、Discourseはテキストの分割方法を細かく制御できます。
[[metadata YOUR METADATA HERE]] セパレータを使用して長文を分割し、各セクションが何をカバーしているかを適切に強調表示できます。
例:
[[metadata about cats]]
a long story about cats
[[metadata about dogs]]
a long story about dogs
これにより、単一のテキストドキュメントがさまざまなコンテンツをカバーでき、「チャンクの汚染」を防ぐことができます。猫のチャンクには猫に関するデータのみが含まれ、犬のチャンクには犬に関するデータのみが含まれることが保証されます。
複雑に聞こえますが、デバッグ方法は?
Discourse AIにはサイト設定 ai bot debugging enabled groups が付属しており、このグループのユーザーはAIデバッグにアクセスできます。
AIデバッグ画面は、AIに送信される情報へのアクセスを提供します。
Garbage in - Garbage out 無用または曖昧な情報を提供しても、LLMはそれを魔法のように有用な情報に変換することはできません。
この画面は、チャンクのサイズを決定したり、チャンクが多すぎるか少なすぎるかを判断するのに役立ちます。
これは機能しますか?
実際の例として、HAProxyのドキュメントを分割してペルソナにフィードすることです。
System Prompt:
HAProxyに関する質問に答えることに特化したボットです。
Discourseフォーラムで動作し、Discourseマークダウンをレンダリングします。
回答を提供する際は、常にHAProxyドキュメントへのリンクを含めるようにしてください。
たとえば、セクション10.1.1にリンクする方法は次のとおりです。セクションまたはその中のオプションにリンクできます。
[fcgi-app](https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#10.1.1-fcgi-app)リンクは非常に役立つので、惜しみなく使用してください。
アップロード内容:
processed-haproxy-2.txt (1.2 MB)
次のスクリプトを使用して生成されました:
file_content = File.read("configuration.txt")
title = nil
body = nil
last_line = nil
sections = []
file_content.each_line do |line|
if line.strip.match?(/^[-]+$/)
section_number, title = title.to_s.split(" ", 2)
sections << {
section_number: section_number,
title: title,
body: body.to_s.strip
}
title = last_line
body = nil
last_line = nil
else
body = body.to_s + last_line.to_s
last_line = line
end
end
section_number, title = title.to_s.split(" ", 2)
sections << { section_number: section_number, title: title, body: body }
section_names =
sections.map { |section| [section[:section_number], section[:title]] }.to_h
sections[4..-1].each do |section|
title = []
current = +" "
section_number = section[:section_number]
section_number
.split(".")
.each do |number|
current << number
current << "."
title << section_names[current].to_s.strip
end
title = title.join(" - ")
body = section[:body]
next if body.strip.empty?
puts "[[metadata section=\"#{section_number}\" title=\"#{title.strip}\"]]"
puts body
end
Claude OpusとGPT-4の両方が、複雑な質問でひどく失敗することがあります。これは、インターネット上のすべてのトークンを消費するため、HAProxyドキュメントの50の異なるバージョンとそれに関するすべての議論が脳に入り込み、混乱させる可能性があるため、理解できます。
混乱したGPT-4とClaude 3 Opusの例
どちらも、Discourse RAGによってファインチューニングされた回答ほど客観的に優れていません。
混乱の少ないGPT-4とClaude Opusの例
将来
フィードバックをお待ちしています。将来のアイデアとしては、次のものが考えられます。
- PDF/DOCX/XLSなどのサポート。テキストに変換する必要がなくなります。
- ソースコード/HTMLのよりスマートなチャンク分割
- インデックス作成前の入力データのスマート変換
ご意見をお聞かせください!
この機能を実現してくれた@Romanに多大な感謝を捧げます ![]()



