👏

LLMの実験管理入門〜LLM実験管理SaaS 『PromptLayer』で実験管理を行う方法

2023/12/21に公開

※この記事はnoteから移行しました

こんにちはPharmaX共同創業者の上野(@ueeeenii)です。この記事は、PharmaXのアドベントカレンダーの8日目の記事です。

https://qiita.com/advent-calendar/2023/pharma-x

今回はAIを使ったアプリケーション開発には欠かせない実験管理の方法について解説したいと思います。特にLLMの実験管理に特化したクラウドサービスであるPromptLayerの使い方を紹介したいと思います。無料から使用することも可能で、SaaSなので月額固定費です。PromptLayerと他の実験管理ツールとの比較もご紹介します。

PromptLayer公式ドキュメントは英語で、PromptLayerについての日本語は記事まだ少なく、公式ドキュメントも多少不十分なところがあったりするので、記事を書くと皆さんの役に立つのではないかと思い執筆することとしました。

本番運用する上での工夫などについても述べていきたいと思います。ただ、マネージドなSaaSサービスにはなるので、セキュリティの問題などは各社の規定などに従い十分注意してご利用ください。今回は個人情報の扱いなどについては、あえて詳しく触れないこととします。

実験管理とはなにか、なぜ実験管理が必要なのか

そもそもAIを活用したアプリケーション開発にはなぜ実験管理が必要なのでしょうか?それは、AI開発では作成したモデルを評価する必要があるからです。

AIモデルは作成過程の変数を変えれば、予測結果が変わってしまいます。AIのモデルには様々なパラメータが存在し、パラメータを変更すると予測結果も変わります。学習・予測に使うアルゴリズムを変更した場合にも当然予測結果が変わっていきます。事前学習に使うデータが変わっても当然、予測結果は変わります。

どのような条件のときに、どのような予測結果が得られたのか(その時の精度はどうだったのか?)等を記録するのが「実験管理」と呼ばれる手法です。

実験管理は、最近ではMLOpsと呼ばれる分野の一領域になります。
また、実験管理するためのコードはアプリケーションコード上に記述する必要があることにも注意が必要です。

特にLLMでは、プロンプトエンジニアリングやRAGと呼ばれる手法など、LLM特有の最適化手法が出てきたため、これまでとは少し違った実験管理が求められます。GPT-4などのモデルを使っている場合、利用者側が事前学習を実験管理することはないので、Fine-tuningや利用時のプロンプトエンジニアリングなどを実験管理するということになります。

PromptLayerとはなにか?

PromptLayerの特長

公式ドキュメントは以下です。

https://docs.promptlayer.com/introduction

一言で言えば、無料から使えるLLM(特にOpenAI&AnthropicのLLM)に特化したクラウド型の実験管理ツールです。本番での運用時に結果をチーム全体で確認したいときなどにはやはりフルマネージドなクラウド型であることは便利です。エンプラの利用を想定すると、データの保管場所などの要件を今は満たせないということはあるでしょうが、サクッと使い始める敷居が低いのが最大の利点です。

特にPromptLayerはOpenAIとAnthropicのLLMに特化しているため、下記のように非常に簡単にコード上に記述することが可能です。

PromptLayerの公式ドキュメントのPythonの記述例

import promptlayer
import os
promptlayer.api_key = os.environ.get("PROMPTLAYER_API_KEY")

# Swap out your 'import openai'
OpenAI = promptlayer.openai.OpenAI
openai = OpenAI(
  api_key=os.environ.get("OPENAI_API_KEY"),
)

# Do something fun 🚀
response = openai.completions.create(
  model="text-ada-001", 
  prompt="My name is", 
  pl_tags=["name-guessing", "pipeline-2"]
)

これだけで実験結果が記録されます。

上記のようにopenaiの関数をラップするような形で関数が作られており、最初にpromptlayerライブラリからOpenAIというオブジェクトを生成してしまえば、後はopenaiのSDKを使う場合と同じように記述することができます。2023年の11月のDevDay以降使えるようになったPythonのopenai SDKのバージョン1.0.0以上に対応していることも地味に嬉しいポイントです。

Pythonだけではなく、JS/TS、Langchainを使った場合にも使用可能です。

それだけではなく、プロンプトテンプレートを保存してバージョン管理を行ったり、出力結果とメタデータを紐付けることなども可能です。

また、どの程度のお金がかかっているのか?といったことを分析するダッシュボードなども提供されています。もちろん、PromptLayerのAPIを通じてのリクエストしか集計されないので注意が必要です。
試しに使い始めて見てすぐのダッシュボード

日毎のコストやレイテンシーなども可視化されている

MLflowとの違いは?

フルマネージドなクラウド型サービスであることがPromptLayerの一番の特長です。本番での運用時に結果をチーム全体で確認したいときなどにはやはりフルマネージドなクラウド型であることは便利です。

一方でOSS版のMLflowをクラウド上で使いたい場合には、自分たちで環境を構築する必要があります。

実は、Databricks社がMLflowにもマネージド版があり、マネージドなクラウド環境でもMLflowを使うことが可能です。
https://www.databricks.com/jp/product/managed-mlflow

下記の公式の比較表も参考にしてください。
公式サイトから引用

そもそもMLflowはAI開発全般に対応しており、非常に機能も豊富です。そして、ユニコーン企業と言われるDatabricks社が開発しているので、信頼性も非常に高いでしょう。

さらに、LLM対応という観点では、MLflowも2.3からLLMのネイティブサポートを開始しています。

https://www.databricks.com/jp/blog/2023/04/18/introducing-mlflow-23-enhanced-native-llm-support-and-new-features.html

MLflowによるopenai(openai sdkバージョン0系)

あくまで個人的主観ですが、PromptLayerの方が多少書き方も簡単な気はします。(異論は認めます)

結論としては、利用開始する敷居はPromptLayerの方が低く、使い始めやすいとは思います。一方、エンプラでの利用などを前提として、会社全体で使っていくのならMLflowの利用も検討してみてもいいかもしれません。MLflowのマネージド版の料金は問い合わせる必要があるので、比較はできまていません。

LangSmithとの違いは?

PromptLayerもLangChainに対応していますが、LangChainの使用を前提にするならLangSmithはLangChainの書き方ほぼそのままで使えるのが特長です。

PromptLayerの公式ドキュメントから引用

PromptLayerは、上記のようにPromptLayer用のhandlerを呼び出す必要があります。

LangSmithはクラウド環境も提供しているので、その点も大きな違いはありません。

PromptLayerの利点としては、後ほど紹介するプロンプトのテンプレート保存機能があることでしょうか。

PromptLayerの使い方

はじめ方

それでは、PromptLayerの使い方をご紹介します。

公式ページ(https://promptlayer.com/ )でアカウントの作成を行う
promptlayerのAPIキーを作成する

を行ってください。公式ページのトップからアカウントの作成を行います。

公式ページのトップ「Start for free」ボタンをクリック

プランを選ぶことができ、とりあえずお試しで使ってみたい場合は無料プランから始めることができます。

プラン選択画面

サインインしたら下記のようなホーム画面になるので、Create new API KeyボタンをクリックしてAPIキーを作成してください。

ホーム画面

シンプルな記録をしてみる

すでにご紹介しているようにシンプルに記録をするだけなら非常に簡単です。OpenAIのChat Completionsを使う場合は下記のように記述すればいいだけです。

Chat Completions APIを使い場合の記述方法

実際にこのコードを実行してみると、History画面からPromptLayerに記録されます。

History画面から実行結果を確認できる

プロンプトテンプレートの登録とアプリケーションからの呼び出し

PromptLayerの目玉機能の一つがPrompt Templateの登録機能です。下記のようにテンプレートを登録することができます。{変数名}とすることで、Pythonコード上で変数を穴埋めすることも可能です。下記の例では、application_nameとlanguageという2つの変数を登録しています。

変数をテンプレートに登録

パラメータを保存することや、function-callingのためのfunctionsを登録することも可能です。

パラメータ登録画面

functions登録画面

保存するときにはコミットメッセージを求められます。

コミットメッセージ

アプリケーションからテンプレートを呼び出して使用する場合は、下記のようにテンプレート名を指定して呼び出します。include_metadata=Trueとすることで、メタデータも一緒に取得することが可能です。

アプリケーション上でテンプレートを取得

実際にテンプレートを呼び出して、リクエストして見ましょう。呼び出したテンプレートには{変数名}の形の文字列(f-strings形式と呼ばれます)なので、Pythonのf文字列を使ってフォーマットします。詳細については本筋と外れてしまうので、詳細を省きますが、取得したテンプレートを文字列展開した後に、その中に変数の値を埋め込む必要があるため、多少複雑な書き方になります。

登録したテンプレートを使用してリクエストする

この出力結果とテンプレートを紐付けるためには下記のように記述します。出力結果には一意のidが割り当てられており、そのidとテンプレートを紐づける必要があります。テンプレート内の変数に実際どのような値を代入していたのかは、prompt_input_variablesにdictで与えることで、確認可能になります。

出力結果とテンプレートを紐付ける

管理画面から確認すると、左上に「テストテンプレート」と紐づいており、この出力が「テストテンプレート」を使って得られたものであることが分かります。

左上に紐づくテンプレートが表示されている

実際にアプリケーション名として"テトリス"、プログラミング言語としてPythonが与えられていることも見て取れます。

出力結果にメタデータを与える

出力結果に後からメタデータを与えることも可能です。ここでは、本番やステージング環境ではなく、ローカルで実行したことが分かるようにメタデータを追加してみましょう

出力結果にメタデータを付与する

実際このようにして実行することで、管理画面の右上でMetaデータを確認することも可能です。

右上にメタデータが表示されている

最後に

今回は、LLMの実験管理とは?ということや、LLMに特化した実験管理SaaS PromptLayerの使い方について紹介してきました。

LLMを活用したアプリケーションを運用していく上で、欠かせない実験管理のヒントになったのではないでしょうか。是非いくつかのサービスを触ってみて、ご自身に合ったものを選択いただければと思いますが、導入としてPromptLayerから始めて見るのは非常にオススメです!

ただし、冒頭でも述べたように、クラウド型のサービスに個人情報を送信することにはなりますので、各人確認の上十分注意してご利用ください。

みなさんのLLMライフがより快適なものになれば幸いです!!

PhramaXでは、積極的な技術発信が文化となっていて、下記のような勉強会もい行います。ご興味のある方は是非ご参加ください!

https://yojo.connpass.com/event/305679/

PharmaXテックブログ

Discussion