デュオ・チャット

GitLab Duo チャットのセットアップ

note
次のセクションの自動化には、このスニペットを使いましょう。
  1. Anthropic API機能を有効にします。
  2. OpenAIのサポートを有効にします。
  3. エンベッディングデータベースが設定されていることを確認します。
  4. 機能フラグを有効にしてください。

    Feature.enable(:gitlab_duo)
    Feature.enable(:tanuki_bot)
    Feature.enable(:ai_redis_cache)
    
  5. 現在のブランチがmaster で最新であることを確認してください。
  6. GitLab Duo Chat インターフェースにアクセスするには、どのページでも左下にあるHelpからAsk GitLab Duo Chat を選択してください。

ローカル開発のヒント

  1. レスポンスがユーザーインターフェースに表示されるまでに時間がかかりすぎる場合、gdk restart rails-background-jobs を実行してSidekiqを再起動してください。それでもうまくいかない場合は、gdk killgdk start を実行してみてください。
  2. また、Sidekiqを完全にバイパスし、チャットサービスを同期的に実行することもできます。これは、Sidekiqログの代わりにネットワークインスペクタでGraphQLエラーを利用できるようになるため、エラーのデバッグに役立ちます。
diff --git a/ee/app/services/llm/chat_service.rb b/ee/app/services/llm/chat_service.rb
index 5fa7ae8a2bc1..5fe996ba0345 100644
--- a/ee/app/services/llm/chat_service.rb
+++ b/ee/app/services/llm/chat_service.rb
@@ -5,7 +5,7 @@ class ChatService < BaseService
     private

     def perform
-      worker_perform(user, resource, :chat, options)
+      worker_perform(user, resource, :chat, options.merge(sync: true))
     end

     def valid?

GitLab Duo チャットでの作業

プロンプトはGitLab Duo Chatシステムで最も重要な部分です。プロンプトは、特定のタスクを実行するためにラージ言語モデルに送られる指示です。

プロンプトの状態は何週間もの反復の結果です。現在のツールでプロンプトを変更したい場合は、機能フラグを立てる必要があります。

新しいプロンプトや更新されたプロンプトがあれば、AIフレームワークチームのメンバーにレビューを依頼してください。

GitLab Duo チャットに貢献する

チャット機能は、大規模な言語モデルがどのように質問を解釈し、答えを提供すべきかを説明するシステムプロンプトを含むゼロショットエージェントを使用します。システムプロンプトは、ユーザーの質問に答えるための情報収集に使用できるツールを定義します。

ゼロショットエージェントはユーザーの質問を受信し、それに答えるために情報を収集するためにどのツールを使用するかを決定します。そして、大規模言語モデルにリクエストを行い、直接回答できるか、定義されたツールのいずれかを使用する必要があるかを決定します。

ツールにはそれぞれプロンプトがあり、そのツールを使って情報を収集する方法を大規模言語モデルに指示します。ツールは自己充足的に設計されており、大規模言語モデルへの複数のリクエストの往復を避けることができます。

ツールが必要な情報を収集した後、それはゼロショットエージェントに返され、ユーザーの質問に対する最終的な答えを提供するのに十分な情報が収集されたかどうかを大規模言語モデルに尋ねます。

新しいツールの追加

新しいツールを追加します:

  1. ee/lib/gitlab/llm/chain/tools/ フォルダにツール用のファイルを作成します。issue_identifierresource_reader のような既存のツールをテンプレートとして使用します。

  2. ツールのクラスを作成します:

    • ツールの名前と機能の説明
    • このツールを使用する質問例
    • 情報収集のためのツールの使用方法に関する大規模な言語モデルの指示 - つまり、このツールが使用している主なプロンプト。
  3. 大規模言語モデルへの実際のリクエストを行うRSpecテストを使用して、プロンプトをテストし、反復します。
    • プロンプトは試行錯誤が必要で、LLMの非決定性には驚かされます。
    • Anthropicはプロンプトに取り組むための良いガイドを提供しています。
    • GitLab のプロンプトに関するガイドです。
  4. 大規模な言語モデルからのレスポンスを解析し、ゼロショットエージェントに返すコードをツールに実装します。

  5. 新しいツール名をee/lib/gitlab/llm/completions/chat.rbtools 配列に追加し、ゼロショットエージェントがそれを知っているようにします。

  6. 新しいツールが応答すべき質問をテストスイートに追加してテストを追加します。必要に応じてプロンプトを繰り返します。

心に留めておくべき重要なことは、プロンプトとツールの説明を通して大規模な言語モデルに適切に指示すること、ツールを自立させること、ゼロショットエージェントに応答を返すことです。プロンプトに関するいくつかの試行錯誤により、新しいツールを追加することで、チャット機能の機能を拡張することができます。

このトピックを扱った短いビデオがあります。

デバッグ

リクエスト全体についてより多くのインサイトを集めるには、Gitlab::Llm::Logger ファイルを使ってログをデバッグしてください。運用環境でのデフォルトのログレベルはINFO で、個人を特定する情報を含む可能性のあるデータをログに記録するために使ってはいけません

抽象化レイヤーのAIリクエストに関連するデバッグメッセージを追うには、次のようにします:

export LLM_DEBUG=1
gdk start
tail -f log/llm.log

GitLab Duo チャットを定義済みの質問でテストします。

GitLab Duo Chat でのユーザーの質問に対する回答が成功するかどうかは、各ツールのツールチェインやプロンプトに大きく依存するため、プロンプトやツールのちょっとした変更が質問の処理に影響することはよくあります。ツールチェーンの変更が既存の機能を壊さないことを確認するために、以下の rspecs を使っていくつかの定義済みの質問に対する回答を検証することができます:

export OPENAI_API_KEY='<key>'
export ANTHROPIC_API_KEY='<key>'
REAL_AI_REQUEST=1 rspec ee/spec/lib/gitlab/llm/chain/agents/zero_shot/executor_spec.rb

ドキュメントの埋め込みを必要とするテスト問題を更新する必要がある場合、新しいフィクスチャが生成され、変更とともにコミットされることを確認してください。