AI Gateway ADR 001: 直接接続を許可する

概要

コード補完リクエストはクライアントから AI Gateway に直接送信され、コード生成リクエストは引き続き GitLab Rails を介して間接的に送信されます。

コンテキスト

ブループリントの最初のイテレーションでは、すべてのコード提案リクエストを GitLab Rails を介して間接的に AI Gateway にルーティングすることを提案していました。 これには複数の理由がありました。

  • コード提案リクエストが補完リクエストか生成リクエストかの判定が GitLab Rails 側で行われていた
  • よりシンプルなリクエスト認証が使用できた。例えば、self-managed インスタンスからのリクエスト認証に IJWT を使用できた。

エピック 12224 では、リクエストレイテンシを下げるためのさまざまなオプションを議論しました。これにより、全体的なレスポンスタイムも下がります。

決定事項

このエピックでは、コード補完リクエストとコード生成リクエストで異なるリクエストフローを使用することにしました。両リクエストタイプは少し異なります。

  • コード補完リクエストはレイテンシに非常に敏感であり、リクエストの タイミング内訳 によると、時間の 50% 以上は AI プロバイダーへの接続に費やされています。
  • コード生成リクエストはレイテンシにそれほど敏感ではありません。リクエスト時間のほとんどは AI プロバイダー側で費やされており、レイテンシ最適化が全体的なレスポンスタイムに与える影響はわずかです。また、これらのリクエストは GitLab Rails で追加データを使って強化するため、引き続きリクエストを GitLab Rails を介してルーティングすることが重要です。

コード補完リクエストについては、クライアントから AI Gateway に直接送信できると決定しました。これによりレイテンシが 150ms 削減されます。AI Gateway が マルチリージョンデプロイ をサポートする際にもこのメリットが得られます。なぜなら、その時点でコード補完リクエストを同じリージョン内で処理できるからです。GitLab Rails はマルチリージョンデプロイをサポートしていないため、補完リクエストを GitLab Rails 経由でルーティングしている限り、長距離接続ホップを排除できず、それもレイテンシを増加させます。

直接接続の使用はオプションの最適化となります。クライアントがリクエストが「補完」タイプであると認識しない場合は、現在のように引き続き GitLab Rails を介してリクエストを送信できます。

WebSocket プロトコルの使用も検討しましたが、現在のところ HTTP の使用を継続します。計画は、直接接続の認証に短期 JWT を使用することです。これは高速な操作のはずで(間接的に送信されるリクエストですでに使用しています)、WebSocket の主要な利点を再現するものです。WebSocket では、接続を開く際に一度だけユーザーを認証できます。WebSocket を使えば接続が数ミリ秒高速になるかもしれませんが、デメリットを上回るものではありません。これはつまり、別のプロトコルに切り替えるために AI Gateway とクライアント側の両方ではるかに多くの作業が必要となることを意味します。また、WebSocket はステートフルなプロトコルであり、AI Gateway のマルチリージョンサポートを複雑にします。

AI Gateway のマルチリージョンデプロイがサポートされれば、米国以外の GitLab ユーザーにとってレイテンシはさらに改善されます。クライアントと GitLab Rails 間の長距離接続ホップを回避できるためです。

結果

  • GitLab Rails によるコード補完リクエストの事前処理は行いません。現在 GitLab Rails 側ではコード補完リクエストの特別な事前処理は何も行っていません。将来これを行いたい場合、考えられるアプローチは、このコメント で概要が示されているように、GitLab 固有のデータを事前にフェッチし、クライアント側でこの強化を行うことです。
  • Cloud Connector はこれらの直接接続を認証できる必要があります。エンドユーザー向けに発行された短期 JWT を使用します。Issue 168 で決定したとおり、AI Gateway がこれらの短期トークンを発行します。
  • この最適化を最大限に活用するためには、クライアント側でリクエストタイプの認識(補完 vs 生成)をサポートする必要があります。これは一部のクライアントと言語ですでにサポートされていますが、理想的にはほとんどの頻繁に使用されるエディターとプログラミング言語でサポートすべきです。
  • クライアントの初期化プロセスを更新する必要があります。クライアントは、GitLab Rails インスタンスから他の直接接続の詳細とともに短期トークンを受け取ります。詳細については Issue 66 を参照してください。
  • AI Gateway は、現在 GitLab Rails で処理されているモニタリングとレート制限をサポートする必要があります。