Discourse AI Personaのアップロードサポート

AIペルソナに長文を挿入できるようになりました!

これは多くのメリットを提供します。

  1. モデルのトレーニングにはない長文をカスタムAIボットに導入できます。(例:社内トレーニングドキュメント、社内レポート)

  2. 具体的なデータ(モデルのトレーニングセットに存在する場合でも)でペルソナをより適切に接地でき、モデルが特定の情報を適切に引用し、結果の品質を向上させるのに役立ちます。

アップロードを追加するには:

  1. /admin/plugins/discourse-ai/ai-personas/ インターフェイスを使用して新しいペルソナを作成します。

  2. ペルソナに含めたいテキストファイルをアップロードします。

:information_source: ファイルをアップロードする前に、関連する拡張子(.md および .txt)をサイト設定 authorized extensions で追加してください。これにより、ペルソナで使用できるようになります。

  1. 必要に応じてインデックス作成オプションを調整します。

前提条件

このオプションを機能させるには、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に送信される情報へのアクセスを提供します。

:warning: 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に多大な感謝を捧げます :hugs:

「いいね!」 24

手動でアップロードされたテキストに加えて、選択した基準に一致するフォーラム投稿を含めることは可能でしょうか?

例えば:

  • 指定されたカテゴリ内
  • 特定のタグが付いている(または付いていない)
  • 解決済みとマークされたトピックの一部である(または、具体的に解決策の投稿である)
  • 返信ではなく、トピックのOPである
  • 指定されたグループのユーザーによって投稿された
  • 特定の日付より前または後である

あるいは、これらの項目にチェックボックスを使用する代わりに、単に「指定されたフォーラム検索の上位N件のトピックのいずれか」ということは可能でしょうか?

「いいね!」 1

今日、カスタム検索コマンドでこれらすべてが可能になります。

  • 指定されたカテゴリをフィルターで選択できます
  • タグ
  • 解決済み
  • opのみ(可能だと思います)
  • 指定されたグループ
  • 日付の前と後

:hugs:

「いいね!」 5

うーん、誤解しているのかもしれません。それをペルソナに利用可能にすることは、同じことをしますか?

試してみましたが、ほとんどの場合、Mistral がトピックタイトルを幻覚させ、まったくランダムな投稿番号にリンクさせているだけです。 :slight_smile:

「いいね!」 1

Mistral はこれらのタスクに実際に十分ですか?それが幻覚の原因になると思います。Sam は正しい、ベースクエリを変更することで、OP で述べたすべてのことができます。

「いいね!」 1

そして、考えを終える前に投稿してしまいました。質問は次のとおりでした。検索コマンドとパラメータを提供することは、アップロードされたファイルを提供することと実質的に同じことですか?

しかし、はい、Mistralは十分ではないかもしれません。

「いいね!」 1

ここで少し詳しく説明します。

https://chat.lmsys.org/?leaderboard

Mistral には多くのバリエーションがあります… Mistral 7b、Mixtral 8x7b(あなたが持っているもの)、そして真新しい mistralai/Mixtral-8x22B-Instruct-v0.1 · Hugging Face があります。これは、クローズドソースのものを含む、リリースされた他の 5/6 のモデルです。

「Mistral は十分ではない」ということには注意が必要で、常に明確にする必要があります。

Mixtral-8x7b はツールサポートにはあまり適しておらず、逸脱しすぎると言えます。

それは次のようになります。

  1. 「アップロード」サポートにはかなり良い
  2. カスタムペルソナサポートには非常に良い
  3. ツールサポートには弱い

8x22b にアップグレードできるかどうかを検討しています(優れたツールサポートを備えています)。問題は、メモリ要件が非常に高く、サーバーにうまく収まるようにモデルを量子化する必要があることです。

しかし本当に… Amazon とデータプライバシー契約を結んでいるのであれば、Claude 3 Opus と Haiku へのアクセスを提供する Bedrock を強くお勧めします。

オープンソースモデルとクローズドソースモデルの間の緊張は理解できます。難しいですが、現時点ではクローズドソースモデルの方がかなり進んでいます。

「いいね!」 2

おっしゃる通りです。私の言い方が悪かったですね。クローズドソースモデルの方が全般的に優れていることを示唆していました。

「いいね!」 2

複数の.txtファイルを一度にアップロードすると不具合が発生します。ファイルはすぐに表示されますが、その後1つしか表示されなくなり、ファイル追加ボタンが応答しなくなります。

また、.mdファイルもサポートされると素晴らしいと思います。

「いいね!」 1

おっと、それはまずいですね…よく見つけましたね、@Roman が確認します。

これは問題なく動作するはずです。すでにサポートされており、拡張機能を有効にするだけです。

「いいね!」 3

マルチファイルバグの修正をプッシュしました。

「いいね!」 4

2件の投稿が新しいトピックに分割されました: Discourse AIの検索フィルターの品質向上

サムさん、これは具体的にどのように機能するのでしょうか?AI に猫や犬に関するデータであることを伝えますが、チャンクがすでに一定数(たとえば 2000)のトークンに設定されている場合、どのように影響するのでしょうか?[[metadata about dogs]] のような行を見たときにチャンクが途中で切れ、新しいチャンクが開始されるのでしょうか?

「いいね!」 1

はい、途中で切れます

「いいね!」 2

おっと、ほとんどのLLMモデルで機能する<meta>content</meta>形式を使用していました。[[ブラケット]]方式を選択した理由は何ですか?<tags>はまだ機能しますか、それともDiscourseではブラケット方式を使用する方が良いですか?

「いいね!」 1

これはLLMによってまったく消費されません(メタデータを解析して消費します)インデックス化されたデータに表示される可能性が非常に低い区切り文字が必要でした

「いいね!」 2

コピーにこの部分を追加しました

「いいね!」 1

これらのAIペルソナのために作成された埋め込みは、同じベクトルデータベースに格納されていますか?そして、実際、Discourseのために生成されたすべての埋め込みは、同じベクトルデータベースに格納されていますか?

「いいね!」 1

すべてPostgresで同じデータベースを使用

「いいね!」 2

アップロードされたファイルリストから削除された場合、ペルソナ内のアップロードされたテキストファイルはどうなりますか?RAGに使用されていることは理解していますが、ファイルを削除すると、インデックスから削除されますか?テキストファイルを削除し、調整を加えてから再アップロードすることで、インデックス化されたものを編集することは可能ですか?

「いいね!」 1