MLflow AI Gatewayの発表

[Announcing the MLflow AI Gateway \| Databricks Blog](https://www.databricks.com/blog/announcing-mlflow-ai-gateway)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# パワフルなLLMアーキテクチャとインタフェースツールの提供

大規模言語モデル(LLM)は、SQLウェアハウスに格納されているテキストデータの感情分析から、ご自身の商品に関する細かい質問に回答するリアルタイムチャットbotのデプロイに至るビジネス価値を提供する様々な潜在ユースケースを解き放ちます。**しかし、これらのアプリケーションのためにパワフルなSaaSやオープンソースLLMへのアクセスを民主化することは、セキュリティ、コスト、データに関連するさまざまな課題をもたらします。** 例えば、企業でSaaS LLMのAPIトークンを効率的に管理する際の固有の課題を考えてみます:

- チームが平文でAPIトークンを通信することによるセキュリティ上の問題。
- アプリケーションのクラッシュや、レート制限違反によるコストのピークによる共有キーのコストの問題。
- ガードレイルなしに各チームが自分でAPIキーを管理することによるガバナンスの問題。

これらの課題によって、企業はイノベーションのためにLLMプロバイダー(OpenAI、Anthropic、オープンソースモデルなど)へのアクセスをスケールすることができません。さらに、最新モデルを用いてビジネス課題をクイックに解決するためには、データアナリストやデータサイエンティストは、表示んインタフェースを用いて最先端のLLMにアクセスする必要があります。

本日、MLflow 2.5でAI Gatewayコンポーネントのプレビューを発表できることを嬉しく思っています。**MLflow AI Gatewayは高度にスケーラブルで、企業が自分たちのLLMを管理し、実験やプロダクションのユースケースで活用できるようにする企業レベルのAPIげ０とウェイです。** 機能には、LLMの資格情報、デプロイメントの管理、チャット、コンプリーションのような一般的なタスクに対する標準インタフェース、複数のSaaSやオープンソースLLMとのインテグレーションなどがあります。AI Gatewayによって:

- 企業は開発からプロダクションを通じて自分たちのLLMを保護することができます。
- データアナリストは、コスト管理ガードレイルを用いて安全にLLMに問い合わせを行うことができます。
- データサイエンティストは、高品質プリケーションを構築するために、さまざまな最先端のLLMを用いてシームレスに実験を行うことができます。
- MLエンジニアは複数のデプロイメントに対してLLMを再利用することができます。

AIゲートウェイの使い方を見ていきましょう。

# AIゲートウェイルートを用いたお使いのLLMへのセキュアなアクセス

それぞれのユースケースやアプリケーションが必要とするモデルにアクセスできるようにすることは重要ですが、**コストをコントロールし、セキュリティ事故を防ぐために、システム的にこのアクセスを制御、制限することも重要です。** 組織内のそれぞれのチームで自分たちのLLM資格情報を管理させるのではなく、AIゲートウェイによってガードレイルを用いてLLMテクノロジーへのアクセスを集中管理できるようになります。これは、企業におけるそれぞれのSaaS LLMに対する「開発用」、「本番用」のキーを管理でき、ユーザーとサービルのレート制限を設定できることを意味します。

AIゲートウェイはルートを通じたアクセス管理を提供します。ルートは特定ベンダー(OpenAI、Anthropic、Hugging Faceなど)のLLMを表現し、関連づけられる資格情報と設定を定義します。企業はシンプルに自分たちのユースケースごとにルートを作成し、必要に応じてデータアナリスト、データサイエンティスト、プロダクションのアプリケーションのような利用者に対してアクセスを委譲します。**利用者は標準インタフェースの背後にあるこれらのルートに問い合わせお行えますが、資格情報や設定に対しては直接アクセスできないので、** 資格情報の漏洩や意図されない利用をガードすることができます。

以下のコードスニペットでは、MLflow Pythonクライアントを用いてどれだけ簡単にAIゲートウェイルートを作成、クエリーできるのかを示しています。

```py
from mlflow.gateway import set_gateway_uri, create_route, query

set_gateway_uri("databricks")

# Create a Route for completions with OpenAI GPT-4
create_route(
    name="gpt-4-completions",
   route_type="llm/v1/completions",
   data={
       "name": "gpt-4",
       "provider": "openai",
       "openai_config": {
           "openai_api_key": $OPENAI_API_KEY
       }
   }
)

# Query the Route with a prompt
gpt4_response = query(
    route="gpt-4-completions",
   data={"prompt": "What is MLflow?"}
)

assert gpt4_response == {
    "candidates": [
        {
            "text": "MLflow is an open-source platform for end-to-end ML...",
            "metadata": {"finish_reason": "stop"}
        }
    ],
    "metadata": {
        "input_tokens": 13,
        "output_tokens": 7,
        "total_tokens": 20,
        "model": "command",
        "route_type": "llm/v1/completions"
    }
}
```

また、AIゲートウェイは[Databricksモデルサービング](https://www.databricks.com/jp/product/model-serving)にデプロイされたオープンソースモデルもサポートしているので、複数のアプリケーションでLLMを再利用することができます。以下のコードでは、オープンソースのMPT-7B-Chatモデルを用いているDatabricksモデルサービングエンドポイントを用いて、テキストコンプリーションのためのAIゲートウェイルートの作成とクエリーを行っています。

```py
create_route(
    name="oss-mpt-7b-completions",
   route_type="llm/v1/completions",
   data={
       "name": "mpt-7b",
       "provider": "databricks-model-serving",
        "databricks_model_serving_config": {
            "databricks_workspace_url": "https://my.workspace.databricks.com",
            "databricks_api_token": $DATABRICKS_ACCESS_TOKEN,
        },
   }
)

mpt_7b_response = query(
    route="oss-mpt-7b-completions",
   data={"prompt": "What is MLflow?"}
)
response_text = mpt_7b_response["candidates"][0]["text"]
assert response_text.startswith("MLflow is an open source ML platform")
```

ルートの詳細については、[MLflow AI Gateway documentation](https://www.mlflow.org/docs/latest/gateway/index.html)をご覧ください。

# 標準インタフェースを用いた最新かつ最高のLLMの活用

コスト効率の良い方法でビジネス課題を解決し、高品質なアプリケーションを構築するためには、データアナリストやデータサイエンティストは、さまざまなSaaS LLMやオープンソースLLMをトライする必要があります。これらのLLMのそれぞれでは、それぞれ自身のリクエスト・レスポンスフォーマット、パラメータ、依存関係を定義しています。利用者が問い合わせをしたいそれぞれのLLMのベンダー固有の特殊なソフトウェアをインストールしたり、APIドキュメントに精通するのではなく、**AIゲートウェイはチャット、コンプリーション、エンベディングを含むLLMタスクのに対する標準的なREST APIを提供します。**

AIゲートウェイのそれぞれのルートには、テキストコンプリーションの`llm/v1/completions`、チャット`llm/v1/chat`のようなタイプがあり、リクエスト・レスポンスのフォーマットやクエリーパラメータを決定します。このフォーマットはすべてのベンダーのLLMで一貫性があり、データサイエンティストやデータアナリストは、最適な結果を得るために複数のLLMを実験できるようになります。

以下のコードスニペットでは、MLflow Pythonクライアントを用いたこのシームレスな実験をデモンストレーションしています。一行を変更することで、サンプルコードは二つのテキストコンプリーションルート: OpenAI GPT-4とCohereのCommandモデルに問い合わせを行っています。

```py
from mlflow.gateway import set_gateway_uri, create_route, query
set_gateway_uri(gateway_uri="databricks")

# Create a Route for Completions with Cohere
create_route(
    name="cohere-completions",
   route_type="llm/v1/completions",
   data={
       "name": "command",
       "provider": "cohere",
       "cohere_config": {
           "cohere_api_key": $COHERE_API_KEY
       }
   }
)

# Query the OpenAI GPT-4 route (see previous section) and the Cohere Route
openai_gpt4_response = query(
    route="gpt-4-completions",
    data={"prompt": "What is MLflow?", "temperature": 0.3, "max_tokens": 100}
)
cohere_command_response = query(
    route="cohere-completions", # Only the route name changes
    data={"prompt": "What is MLflow?", "temperature": 0.3, "max_tokens": 100}
)
```

テキストコンプリーション、チャット、エンべディングに対するAIゲートウェイの標準インタフェースの詳細については、[MLflow AI Gateway documentation](https://www.mlflow.org/docs/latest/gateway/index.html)をご覧ください。

# MLflow AI Gatewayを使い始める

DatabricksでMLflow AI Gatewayを試すことで、皆様のLLMユースケースを保護し、加速することをお勧めします！既存のDatabricksユーザーであれば、AIゲートウェイのプライベートプレビューに登録するためにDatabricks担当者にお問い合わせください。Databricksユーザーでない場合には、DatabricksとマネージドMLflowを学び、フリートライアルをスタートするために、 https://www.databricks.com/jp/product/managed-mlflow を訪れてください。オープンソースのMLflow AI Gatewayの詳細や、MLflow 2.5に含まれるそのほかの機能や改善点を学ぶには、[release changelog](https://github.com/mlflow/mlflow/blob/master/CHANGELOG.md)をチェックしてください。


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)