5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DataRobotのOSS「syftr」を動かして最適なRAGパイプラインを探してみた

Posted at

はじめに

DataRobot Japan データサイエンティストの大久保です。金融業界を担当しています。
昨今、LLMの弱点である「知識の最新性」や「事実性の欠如」を補う技術としてRAG (Retrieval Augmented Generation) が注目されています。しかし、一口にRAGと言っても、そのパイプラインは以下のような多様なコンポーネントの組み合わせで構成されており、その組み合わせは膨大です。

  • 埋め込みモデル
  • テキスト分割 (Splitter)
  • 検索 (Retriever)
  • LLM本体

これらのハイパーパラメータは相互に依存しあっており、手動でのチューニングは非常に困難です 。また、精度を追求すればコストやレイテンシーが増加するというトレードオフの関係にも悩まされます。

今回ご紹介するsyftr (GitHub)は、こうした課題を解決するためにDataRobotが開発したMITライセンスのオープンソースフレームワークです。syftrは、精度とコスト(あるいはレイテンシー)のトレードオフを考慮しながら、パレート最適なRAGの構成を自動で探索してくれます。

この記事ではsyftrをローカル環境で実際に動かしながら、その基本的な使い方と最適化の流れをご紹介します。

この記事でやること

  • syftrの公式リポジトリをクローンし、ローカルPCに環境を構築する。
  • syftr checkコマンドで、設定が正しく行われているかを確認する。
  • ターミナルからsyftr runコマンドを使い、サンプル設定で最適化を実行する。
  • Jupyter Notebookを使い、対話形式で最適化を実行し、結果を可視化する(パレートフロンティア)。

環境構築

それでは早速、syftrを動かすための環境を構築していきましょう。基本的には公式のREADMEの流れに沿って進めます。

1. リポジトリのクローン

まず適当な作業ディレクトリを作成し、syftrのリポジトリをクローンします。

mkdir syftr_demo
cd syftr_demo
git clone https://github.com/datarobot/syftr.git
cd syftr

2. 仮想環境の作成と依存関係のインストール

syftrでは、パッケージ管理ツールとしてuvの利用が推奨されています。以下のコマンドでuvをインストールし、仮想環境の作成、有効化、依存パッケージのインストールを一気に行います。

# uvのインストール
curl -LsSf https://astral.sh/uv/install.sh | sh

# 仮想環境の作成と有効化
uv venv
source .venv/bin/activate

# 依存パッケージのインストール
uv sync --extra dev
uv pip install -e .

-e .オプションは「編集可能モード(editable mode)」でインストールするためのものです。これにより、クローンしてきたソースコードを直接編集すると、その変更がすぐに仮想環境に反映されるようになります。

3. 設定ファイルの準備と編集

次に、最適化の挙動を管理する設定ファイルconfig.yamlを準備します。サンプルファイルをコピーして作成しましょう。

cp config.yaml.sample config.yaml

作成したconfig.yamlを開き、利用するLLMのAPIキーなどを設定します。ここではAzure OpenAIを利用する例を示します。

# ...(省略)...

# Azure OpenAI API (required when using Azure OAI LLMs)
azure_oai:
  # Sensitive strings can also be placed in the appropriate file in runtime-secrets/
  # For example, put this key in a file named runtime-secrets/azure_oai__api_key
  api_key: "<your-api-key>"
  api_url: "https://my-azure-endpoint.openai.azure.com/"

# ...(省略)...

ookubo1.png

続いて、同ファイル内のgenerative_modelsセクションで、利用したいモデルのコメントアウトを解除し、deployment_namecostの情報を追記します。

# ...(省略)...

generative_models:
  ## azure_openai Provider Example
  ## See docs/llm-providers.md for full documentation of all provider configurations
  azure_gpt_4o_mini:
    # Common configuration options
    provider: azure_openai # Client type to use (required)
    model_name: "gpt-4o-mini"
    temperature: 0 # Optional
    max_tokens: 2048 # Optional - max output tokens
    deployment_name: "gpt-4o-mini" # 追加:model-nameと同一でOK
    cost: # 追加:今回は適当な値を設定
      type: tokens
      input: 0.15
      output: 0.60

# ...(省略)...

ookubo2.png

これで環境構築は完了です。

syftrを動かしてみる

syftr checkで環境確認

まず、
syftr checkコマンドを実行して、設定が正しく読み込まれ、各種APIにアクセスできるかを確認します。

syftr check

たくさんのログが出力されますが、最後にAll checks passed. You are good to go!と表示されれば成功です。以下の画像はVSCode上でsyftr checkコマンドを実行した結果です。

ookubo3.png

syftr checkコマンドは内部で以下の様なチェックを行っています。

  • check_config(): config.yamlが存在し、正しく読み込めるか。
  • check_database(): 結果を保存するデータベース(デフォルトはSQLite)に接続できるか。
  • check_llms(): 設定ファイルに記載されたLLMのAPIが利用可能か。
  • check_embedding_models(): 埋め込みモデルが利用可能か。

syftr runで最適化を実行

次に、ターミナルから最適化を実行してみましょう。
syftrにはサンプルとして、DataRobotの社内ドキュメントを対象とした評価データセット(DRDocs)用の設定ファイルが用意されています。
以下のコマンドで、この設定ファイルを使って最適化を実行します。--followオプションを付けると、実行ログがリアルタイムで表示されます。

# サンプル設定ファイルをダウンロード
curl -L https://raw.githubusercontent.com/datarobot/syftr/main/studies/example-dr-docs.yaml > studies/example-dr-docs.yaml

# 最適化を実行
syftr run studies/example-dr-docs.yaml --follow

実行が始まると、syftrに内包されているRayがローカル環境で起動し、ダッシュボードのURLが表示されます。このURLにアクセスすると、各トライアルの進捗をWeb UIで確認できます。

Rayは複雑な最適化計算を分散処理するフレームワークです。Rayを活用することで、syftrは多数のRAG Flowを効率的に評価します。RayはPythonモジュールとして配布されているため、使用する際の外部サービス登録等は必要ありません。

ookubo4.png

しばらく待つと最適化が完了し、ターミナルに各RAG Flowのトライアル結果がテーブルで表示されます。

ookubo.png

Jupyter Notebookで対話的に実行

ターミナルでも実行できますが、examples/1-welcome.ipynbを使うと、より対話的に最適化を実行でき、結果の可視化も簡単なのでおすすめです。
※本記事執筆時点では、1箇所修正が必要となります。以下のコードからコピー&ペーストする形で、syftr/plotting/insight.pyのstyle_pareto_table関数の冒頭部分を修正して下さい。

# ...(省略)...

@log_function_call
def style_pareto_table(df_pareto_descriptions, is_cost):

    if is_cost:
        obj2_fmt = "{:.4f}¢"
    else:
        obj2_fmt = "{:.2f}s"

    objective_2_name = get_objective_2_name(is_cost=is_cost)
    
    df_pareto_descriptions = df_pareto_descriptions[
        ["Accuracy", objective_2_name, "Title", "Description"]
    ].copy()  # リストの2番目の要素を"Latency"から変数にobjective_2_nameに修正

# ...(省略)...

上記の修正による変更差分は、以下のようになります。

ookubo5.png

example_study.plot_pareto()を実行すると、精度(Accuracy)とコスト(Cost)を軸にしたパレートフロンティア(パレート解の点群をプロットしていった先に得られる曲線)が描画されます。左上にプロットされる点ほど、低コストで高精度な「効率の良い」RAG Flowであることを示しています。

ookubo6.png

更にexample_study.pareto_flowsを実行すると、パレート最適と判断されたRAG Flowのパラメータ一覧を取得できます。

ookubo7.png

ここで、今回使用した設定ファイルstudies/example-dr-docs.yamlを簡単に見てみましょう。

# ...(省略)...

optimization:
  cpus_per_trial: 1
  max_concurrent_trials: 10
  num_eval_batch: 5
  num_eval_samples: 5
  num_trials: 10

# ...(省略)...
  rag_modes:
  - no_rag
  - rag
  rag_retriever:
    embedding_models:
    - BAAI/bge-small-en-v1.5
    - BAAI/bge-large-en-v1.5

# ...(省略)...
  response_synthesizer_llms:
  - gpt-4o-mini
  - gpt-35-turbo
  - gpt-4o-std

# ...(省略)...

今回は以下のような空間から10種のRAG Flowを探索していることが分かります。

  • rag_modes: 非RAGのLLM、またはRAGの2種から探索
  • embedding_models: RAGの場合、埋め込みモデルを2種から探索
  • response_synthesizer_llms: 使用するLLMを3種から探索

example_study.pareto_flowsの出力結果から、パレート最適なRAG Flowの1つはgpt-4o-miniをベースとしたRAGモデルであり、0.6もの精度を達成していることなどが分かります。

注意点として、最後のexample_study.knee_pointはトライアルの数が不十分な場合にはエラーが出ます。

ookubo8.png

トライアルの数を含む最適化の設定を変更したい場合は、今回の設定ファイルstudies/example-dr-docs.yamlを編集します。

まとめ

この記事では、DataRobotのOSSであるsyftrを使って、RAGパイプラインの構成を自動で最適化する手順をご紹介しました。

syftrを活用することで、これまで専門家の経験と勘に頼りがちだった複雑なRAGの設計を、データ駆動で体系的に行えるようになります。膨大なパラメータ空間の中から、プロジェクトの要件に応じた最適なパイプラインを効率的に見つけることができます。

syftrは現在も活発に開発が進められており、今後はマルチエージェント構成の最適化などにも対応が予定されています。皆さんもぜひお手元で試してみてください。

参考資料

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?