AI・機械学習
Wayfinder Router: ローカルLLMとホスト型LLM間のクエリを決定論的にルーティング
Wayfinder Router: deterministic routing of queries between local and hosted LLM (github.com)
要約
Wayfinder Routerは、プロンプトの複雑さに応じて、オフラインでローカルモデルとクラウドモデル間で決定論的にルーティングするツールです。これにより、モデル呼び出しによる遅延やコストを発生させることなく、プロンプトの構造や単語から難易度を判断し、適切なモデルに振り分けます。簡単なプロンプトはローカルで処理し、複雑なプロンプトは高価なクラウドモデルに送ることで、コスト削減と効率化を実現します。
全文翻訳
プロンプトの複雑さを決定論的にルーティング—各プロンプトを、モデル呼び出しをすることなく、オフラインでローカルまたはクラウドモデルに送信します。クイックスタート · ベンチマーク · 比較 · 解説 · 変更履歴
ルートを決定するためのモデル呼び出しは不要
決定論的で完全にオフライン
独自のデータでキャリブレーション可能
独自のキーを持ち込み、セルフホスト可能
Wayfinderは、プロンプトの形状(長さ、見出し、リスト、コード)と、証明、数学、厳密な制約などの単語の難易度を示す手がかりを読み取り、小さなローカルモデルに送るべきか、大きなクラウドモデルに送るべきかを判断します。これはマイクロ秒で決定され、オフラインで動作し、決定を下すために別のモデルを呼び出すことはありません。APIキーもネットワークもモデル呼び出しも不要です。スコアと推奨が得られますが、それをどうするかはあなた次第です。安価なプロンプトはローカルに留まり、難しいものは高価なモデルに送られ、「これを要約して」や「スペルミスを修正して」といった作業にフロンティアモデルの価格を支払う必要がなくなります。
ほとんどのルーターは、モデル(学習済み分類器、LLMジャッジ、ホスト型API)を呼び出すことで決定します。これは、コストを節約するための正確なステップに、レイテンシ、コスト、そして少しのランダム性を追加します。Wayfinderは代わりに構造と単語を読み取るため、決定は無料で、毎回同じです。
| ルーターがモデル呼び出しで決定するか? | セルフホスト | キャリブレーション |
|---|---|---|
| **Wayfinder** | 決定論的構造スコア | いいえ | はい | はい |
| **RouteLLM** | 学習済み分類器 (優先データ) | はい | はい | 再学習 |
| **NotDiamond / Martian** | 学習済み、ホスト型 | はい | いいえ | プラットフォーム経由 |
| **OpenRouter (Auto)** | ホスト型自動ルーター | はい | いいえ | — |
| **LiteLLM** | プロバイダープロキシ (複雑性ルーティングなし) | いいえ | はい | n/a |
Wayfinderは最高の精度を追求していません。これは、オフラインで、ゼロモデル呼び出しで実行でき、独自のトラフィックに合わせて調整できる唯一のルーターです。デフォルトでは、プロンプトの構造のみをスコアリングします。語彙的キュー(証明、数学、制約)も読み取ることができますが、これらはデフォルトでオフになっています。独立して作成されたプロンプトに対する二重盲検テストでは、語彙的な改善は汎化しないことが示されたため(未見の難しいプロンプトの約20%を捕捉し、単純な単語数ベースラインに劣る)、これらはオプトインです。独自のトラフィックの語彙に合わせてキャリブレーションした場合にのみ、その重みを上げてください。難易度が純粋に意味論的なプロンプト(微妙なコードスニペット、無邪気に見える「100番目の素数は何か?」など)には構造的な手がかりがなく、意味論的ルーターがそれに勝ります。盲検テストを生き残る優位性とは、モデル呼び出しなしで、決定論的でサブミリ秒のオフラインルーティング決定です。
ベンチマーク(`make benchmark`)は、正直なベースラインと完全なオラクルに対して、どこで勝つか、どこで負けるかを示します。RouterBenchやRouterArenaにそれを向けて、採点された数値を確認してください。ここに初めて来た方、または検討中の方へ?FAQには率直な回答が記載されています—どこで負けるか(RouterBenchの短いが難しい項目ではランダムよりも優れていない)と、それでもなぜそれを実行するのかを含めてです。デモを試す(キー不要)
ルーティングの決定を自分で確認する方法は2つあります—APIキーもモデルもネットワークも不要です。
ターミナルで—Wayfinderパレットでの決定ファーストチャット。ターミナルチャットはデフォルトのインストールに含まれているため、追加するものは何もありません—または、`uvx`経由でインストールせずに実行します:
```bash
uvx wayfinder-router chat --dry-run # zero install, zero keys
# or: pip install wayfinder-router && wayfinder-router chat
```
各ターンで、どこにルーティングされたか(`● LOCAL` / `◆ CLOUD`)、構造スコアとその理由(`/why`)、および常にクラウドを使用した場合と比較した累積節約が表示されます。`/init`はチャットを離れずにモデルを設定し、`/route` · `/local` · `/cloud`はターンを強制し、会話はセッション間で持続します(`/threads`)。
ブラウザで—ライブしきい値スライダー付きのウェブチャットUI:
```bash
pip install "wayfinder-router[gateway]"
wayfinder-router webchat --dry-run # opens http://127.0.0.1:8088/demo
```
`webchat`は`serve`(ゲートウェイとその`/demo`ページ; `--no-open`, `--port`, `--host 0.0.0.0`, `--dry-run`)を薄く起動するもので、`serve`はヘッドレスコマンドです。どちらのインターフェースでも、すべてのメッセージに対して、どこにルーティングされたか(ローカル vs クラウド)、複雑性スコアとその理由(機能の内訳)、および常にクラウドを使用した場合と比較したコスト削減が表示されます。設定なしではどちらも決定のみ(ウェブでは`--dry-run`; ターミナルのプレビュー)であるため、ゼロセットアップで試すことができます。実際の返信を得るには、`wayfinder-router init`を実行して`[gateway.models]`をスキャフォールドし(その後、`wayfinder-router doctor`でキーが解決されることを確認します)—クイックスタートを参照してください。
**任意のOpenAI互換APIで動作します**
Wayfinderは各呼び出しをOpenAIスタイルの`/chat/completions`エンドポイントに転送します—したがって、プロバイダーがそれを話すなら(ほとんどがそうです)、ただ動作します。ティアは、`base_url`、モデル名、およびリクエスト時に環境から読み取られるキーで構成されます。SDKもプロバイダーごとのコードも不要です。無料のローカルモデルとホスト型モデルを組み合わせたり、2つのクラウドティアを実行したりできます。
…さらにGroq、Together、OpenRouter、Fireworks、DeepSeek、およびローカルサーバー(vLLM、LM Studio、llama.cpp)—およびBearerキーを受け入れる任意のOpenAI互換エンドポイント。
**クイックスタート**
Wayfinderをモデルの前に置きます。アプリはOpenAI APIを話し続け、`base_url`を1つ変更するだけです。設定をスキャフォールドします—`init`はスターター`wayfinder-router.toml`(キーなしローカルOllama → Anthropicクラウド)と`.env.example`を書き込み、その後キーをチェックします:
```bash
pip install "wayfinder-router[gateway]"
wayfinder-router init # starter config (hybrid preset)
wayfinder-router init --preset openai # two OpenAI tiers (gpt-4o-mini -> gpt-4o)
wayfinder-router init --preset gemini # two Gemini tiers (gemini-2.5-flash -> gemini-2.5-pro)
wayfinder-router init --interactive # pick providers/models step by step
```
または、`wayfinder-router.toml`で手動で2つのモデルを記述します:
```toml
[routing]
threshold = 0.5 # below -> local, at/above -> cloud
[gateway.models.local]
base_url = "http://localhost:11434/v1"
model = "llama3.2"
[gateway.models.cloud]
base_url = "https://api.openai.com/v1"
model = "gpt-4o"
api_key_env = "OPENAI_API_KEY" # read from this env var, never stored
# api_key_cmd = "op read op://Private/OpenAI/credential" # optional: fill it from a vault
```
Wayfinderは秘密を保存しません。モデルは環境変数(`api_key_env`)を指定し、キーはリクエスト時に環境から読み取られます。これを「インストール」する必要はありません—変数をエクスポートするだけです。生のキーをシェルに貼り付けたくない場合は、オプションの`api_key_cmd`を追加すると、Wayfinderは起動時に秘密ストアからその変数を埋めます—`op read ...` (1Password)、`security ...` (macOS Keychain)、`secret-tool ...` (Linux)、`pass`/`gopass`、`vault kv get ...`、`aws secretsmanager get-secret-value ...`、`bw`、`doppler`、`gcloud secrets ...`、または秘密を出力する任意のコマンド。キーはメモリにのみ保持され、ディスクに書き込まれることはありません。`wayfinder-router doctor`は、これらのツールのどれがインストールされているかを検出し、正確な行を提案します。キーを設定してからゲートウェイを実行します。`doctor`は、開始する前に設定と各モデルのキーが解決されるかどうか(✓設定済み / ✗未設定)を再確認します:
```bash
export ANTHROPIC_API_KEY=sk-... # or OPENAI_API_KEY, per your config
wayfinder-router doctor # ✓/✗ per model — is each key set?
wayfinder-router serve --port 8088
```
既存のクライアントをそれに向けます。コード変更なし:
```python
client = openai.OpenAI(base_url="http://localhost:8088/v1", api_key="unused")
client.chat.completions.create(model="auto", messages=[{"role": "user", "content": "..."}])
```
簡単なプロンプトはローカルに、難しいプロンプトはクラウドに行き、すべての応答には`x-wayfinder-router-model`と`x-wayfinder-router-score`が含まれるため、どこに送られたかを確認できます。1つのリクエストを制御したい場合は、`model="cloud"` / `prefer-local`でピン留めするか、`X-Wayfinder-Threshold`ヘッダーで単一呼び出しのカットオフを変更します(「Steer a single request」を参照)。
動作しているか確認します:
```bash
curl -s localhost:8088/healthz # {"status":"ok","models":["cloud","local"]}
curl -s -D - -o /dev/null http://localhost:8088/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"hi"}]}' \
| grep -i x-wayfinder-router
# x-wayfinder-router-model: local
# x-wayfinder-router-score: 0.00
```
まだバックエンドがない場合は、`wayfinder-router serve --dry-run`がアップストリームを呼び出す代わりにルーティング決定で応答するため、実際のモデルを配線する前に30秒でルーティングを体験できます。
インストールコマンド