はじめに
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/"
# ...(省略)...
続いて、同ファイル内のgenerative_models
セクションで、利用したいモデルのコメントアウトを解除し、deployment_name
とcost
の情報を追記します。
# ...(省略)...
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
# ...(省略)...
これで環境構築は完了です。
syftr
を動かしてみる
syftr check
で環境確認
まず、
syftr check
コマンドを実行して、設定が正しく読み込まれ、各種APIにアクセスできるかを確認します。
syftr check
たくさんのログが出力されますが、最後にAll checks passed. You are good to go!
と表示されれば成功です。以下の画像はVSCode上でsyftr check
コマンドを実行した結果です。
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モジュールとして配布されているため、使用する際の外部サービス登録等は必要ありません。
しばらく待つと最適化が完了し、ターミナルに各RAG Flowのトライアル結果がテーブルで表示されます。
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に修正
# ...(省略)...
上記の修正による変更差分は、以下のようになります。
example_study.plot_pareto()
を実行すると、精度(Accuracy)とコスト(Cost)を軸にしたパレートフロンティア(パレート解の点群をプロットしていった先に得られる曲線)が描画されます。左上にプロットされる点ほど、低コストで高精度な「効率の良い」RAG Flowであることを示しています。
更にexample_study.pareto_flows
を実行すると、パレート最適と判断されたRAG Flowのパラメータ一覧を取得できます。
ここで、今回使用した設定ファイル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
はトライアルの数が不十分な場合にはエラーが出ます。
トライアルの数を含む最適化の設定を変更したい場合は、今回の設定ファイルstudies/example-dr-docs.yaml
を編集します。
まとめ
この記事では、DataRobotのOSSであるsyftr
を使って、RAGパイプラインの構成を自動で最適化する手順をご紹介しました。
syftr
を活用することで、これまで専門家の経験と勘に頼りがちだった複雑なRAGの設計を、データ駆動で体系的に行えるようになります。膨大なパラメータ空間の中から、プロジェクトの要件に応じた最適なパイプラインを効率的に見つけることができます。
syftr
は現在も活発に開発が進められており、今後はマルチエージェント構成の最適化などにも対応が予定されています。皆さんもぜひお手元で試してみてください。
参考資料
- GitHubリポジトリ: https://github.com/datarobot/syftr
- 原論文: syftr: Pareto-Optimal Generative Al
- Hugging Face (ベンチマークデータセット):https://huggingface.co/DataRobot-Research