自前で構築したスタックの実際の様子
本番環境で利用可能なローカルLLM APIには 7 のレイヤーが存在します。それぞれの役割と一般的に使われるツールを以下に紹介します:
各レイヤーごとにインストールや設定、更新、デバッグが必要なツールが存在します。これらは予想外の形で相互に作用します。例えばnginxのバッファリングがSSEストリーミングに影響したり、トンネルのタイムアウトがプロキシのタイムアウトと連動したり、認証用ミドルウェアはAPIプロトコルを正しく理解する必要があります。
セットアップ方法の比較
自前で構築する方が有利な場面
- 完全な制御が可能。 すべてのレイヤーを自分で管理できる。あらゆる部分を調査・修正・デバッグ可能だ。クライアントとモデルの間に不透明なマネージドサービスは存在しない。
- 第三者経由のデータ経路が不要。 すべての通信は自ら管理するインフラ内で完結する。医療・金融・政府機関など規制が厳しい環境では、これは単なる好みではなく必須要件となる場合もある。
- ベンダーロックインの心配なし。 Tokiosがサービス停止や料金改定を行っても影響を受けない。自前で構築したシステムであれば永続的に維持可能だ。
- 無制限のカスタマイズ。 カスタムレート制限の設定、独自のログ処理パイプライン、モデルごとのルーティングルール、A/Bテストなど、プロキシ設定を自由に操れるため何でも実現可能だ。
- Potentially lower cost at scale. For 100+ users, the per-seat cost of a managed service can exceed the cost of self-hosted infrastructure. At scale, DIY economics improve.
Tokiosが有利な場面
- 数分対数時間。 Tokiosのセットアップ全般(コネクターのインストール、モデルの登録、APIキーの作成)は2~5分で完了する。一方自前構築の場合、ツールに精通した人でも初回セットアップに4~8時間を要する。
- メンテナンス負担が少ない。 証明書の更新やトンネルの再接続、ゲートウェイの更新もすべて自動で行われる。自前構築の場合は証明書の有効期限管理、トンネルの不具合対応、nginxのセキュリティパッチ適用など継続的な対応が必要だ。
- ストリーミング機能が標準搭載。 SSEストリーミングが初期状態から正しく動作する。自前構築の場合はnginxで
proxy_bufferingを明示的に無効化し、proxy_read_timeoutを設定した上でトンネルが応答内容をバッファしないか確認する必要がある。 - 認証機能が標準搭載。 デプロイごとにスコープが設定されたユーザー単位のAPIキーが利用可能だ。自前構築の場合は認証用ミドルウェアを自作または導入し、APIキーの安全な保存や無効化ロジックも自ら実装する必要がある。
- CGNATへの対応 Tokiosの送信専用接続機能は、あらゆるNAT環境下でも問題なく動作します。自前でトンネルを構築する場合、使用するツール次第でCGNAT対応の可否が変わります。例えばCloudflare Tunnelは対応しますが、nginxとLet’s Encryptのみでは対応できません。
- 管理すべきセキュリティ面が存在しない 開放されたポートもなければ、証明書のライフサイクル管理も不要です。認証用ミドルウェアに脆弱性が生じる心配もありません。コネクターが外部へ接続し、ゲートウェイがその他すべての処理を行います。
ストリーミング処理における落とし穴
LLMワークロードにおいて自前の仕組みが失敗しやすいのがこの部分です。3個ものレイヤーがストリーミング応答のバッファリングやタイムアウトを引き起こす可能性があります。-
nginxのバッファリング機能 デフォルトではnginxはアップストリームからの応答をバッファします。LLMエンドポイント用のlocationブロック内に
proxy_buffering off;とproxy_cache off;を記述する必要があります。これを怠ると、トークンが最後に一括で送信されてしまいます。 -
プロキシのタイムアウト設定 nginxのデフォルトの
proxy_read_timeout値は 60 秒です。一般向けハードウェア上で長時間の生成処理を行う場合、この時間を超えることもあります。そのため 300 秒以上に設定する必要があります。もしCloudflare Tunnelのようなトンネルが前段に存在する場合、その約 100–120 秒というタイムアウト値が新たな上限となります。 -
SSE configuration. The
Content-Type: text/event-streamheader must propagate from your backend through every proxy layer to the client. If any layer strips or overrides it, downstream buffering may kick in.
524や 504 というエラーと共に生成処理が途中で中断されたりします。
Tokiosのゲートウェイはこの種の通信パターン向けに設計されているため、3すべての問題をデフォルト状態で適切に処理します。
自前で構築するのが適しているケース
- 規制の厳しい環境 医療・金融・官公庁など、第三者が提供するデータ経路の利用が許可されていない場面です。すべての通信は自社が管理・監査可能なインフラ内で完結させる必要があります。
- 既存のDevOps体制 すでにKubernetesを運用しており、監視体制も整っている場合、新たにサービスを追加するのは新たなスキル習得を要するわけではなく、ごく小規模な作業にとどまります。
- 完全な制御が必要な場合 独自のルーティングロジックを実装したり、Tokiosに備わるオプトイン式の リクエストログ記録 機能を超えるログ処理パイプラインを構築したり、あるいはマネージドサービスでは対応できない社内システムとの連携を行いたい場合です。
- 100人以上のユーザー規模でユーザー単位のコストが重要な場合 ユーザー数が多い環境では、自前でインフラを運用する方がマネージドサービスのユーザー単位課金よりも大幅にコストを抑えられます。
Tokiosが適しているケース
- インフラ構築なしで目的を達成したい場合 求めているのは「APIキーを使って自分のモデルにアクセスできる状態にする」ことであって、「nginxの設定方法を学びたい」わけではありません。
- 小規模なチーム向け 2人から10人程度でモデル利用が必要なチーム向けです。コミュニティプランでは無料で利用でき、誰もインフラ維持管理に時間を割く必要がありません。
- CGNATの背後にある環境 利用しているISPが外部からの接続をブロックしている場合です。自前でトンネルを構築することも可能ですが、Tokiosでは追加設定なしでその環境にも対応できます。
- 迅速なセットアップが必要な場合 何時間もかけてプロキシレイヤーの設定を行うのではなく、5分以内にAPI呼び出しが可能な状態にしたい場合です。
TokiosとLiteLLMの比較
オープンソースのプロキシ/ゲートウェイが適しているケースとマネージドサービスが適しているケースの違いについて
Tokiosを利用すべき場面
Tokiosが適している場合とそうでない場合についての正直なガイドです。