1.はじめに
こんにちは。
私は情報システムやサービスの運用に関する研究開発を担当する部署に所属している新人エンジニアです。
今回は前回紹介した「OpenLIT」の具体的な運用方法や詳細機能についてまとめてみました。
生成AIを用いてアプリ開発・運用をしている方や、これから挑戦しようと考えている方にとって、少しでも役立つように執筆しました。ぜひご覧ください!
本記事はIT初学者の私が、生成AIに特化したObservabilityツールであるOpenLITの詳細機能をまとめたものになります。
まずはOpenLITの機能概要について説明した後に、各機能の詳細について説明します。
2.OpenLITの機能概要
OpenLITは生成AIアプリケーションを監視するためのOSSです。
主な特徴や導入方法については前回記事を参照してください。
本記事の情報は2024年12月時点、v1.11.6
の情報です。
主な機能
OpenLITは生成AIに特化したObservabilityツールで、LLM利用情報の可視化がメインです。
しかし、それ以外にも生成AIに関連する様々な機能が備わっています。
主な機能を以下に示します。
- Dashboard:生成AIに関するメトリクスをダッシュボード上で監視
- Requests:リクエストごとの詳細情報(時刻、プロンプト、リクエスト、トークン、コスト、etc.)を確認
- Exceptions:エラー発生時の詳細情報(時刻、エラー文、エラータイプ、etc.)を確認
- Api Keys:OpenLITのAPIキーを作成
- Prompt Hub:プロンプトの保管・アクセス、バージョン管理、プロンプト内で使用する動的変数の管理
- Vault:LLM APIキーのような機密情報を安全に保管・アクセス
- Openground:異なるLLMを性能、コストなどの指標に基づいて比較
- Evaluations:ハルシネーション、バイアス、有害性を評価
- Guardrails:プロンプトインジェクション、センシティブトピックからアプリを守護、特定のトピックを制限
それでは、第3章にて1つずつ紹介していきます!
3.機能詳細
各機能の使用方法について、具体的に説明していきます。
また、実際に使用した感想を踏まえ、生成AI運用者の視点から追加で必要だと感じた機能についても触れていきます。
Dashboard
Dashboardでは、生成AIアプリケーションに関する詳細な情報を一目で確認することができます。
OpenLITのメインツールで、特定の期間の情報を自由にカスタマイズして可視化することが可能です。
また、OpenLITに対応しているLLMプロバイダーを確認できるため、用途に応じてLLMを使い分けて運用している方でも安心です。
使用方法
OpenLITを開くと、まずこの画面に飛びます。
ページ左タブから「Dashboard」を選択することでも表示できます。
生成AIアプリから送信されたデータが一目でわかりやすく可視化されているため、特に操作は必要ありません。
しかし、期間を設定したい場合には画面左上からカスタマイズが可能となっています。
可視化されている具体的な項目を以下に示します。
ID | 監視項目 | 小項目 | 可視化 |
---|---|---|---|
1 | リクエスト数 | 合計リクエスト | 数値 |
2 | 時間あたりのリクエスト数 | 折れ線グラフ | |
3 | リクエスト時間 | 平均リクエスト時間 | 数値 |
4 | コスト | 合計コスト | 数値 |
5 | リクエストあたりの平均コスト | 数値 | |
6 | トークン数 | リクエストあたりの平均トークン数 | 数値 |
7 | リクエストあたりの平均プロンプトトークン | 数値 | |
8 | リクエストあたりの平均レスポンストークン | 数値 | |
9 | 時間当たりのトークン | 折れ線グラフ | |
10 | モデル | トップモデル | 棒グラフ(数値) |
11 | 時間当たりの使用モデル | 棒グラフ(数値) | |
12 | カテゴリー | カテゴリーの割合 | 円グラフ |
13 | プロバイダー | プロバイダーの割合 | 円グラフ |
14 | 環境 | 環境の割合 | 円グラフ |
15 | アプリケーションの割合 | アプリケーションの割合 | 円グラフ |
監視項目がとても多いわけでありませんが、生成AIを監視する上で重要な情報は網羅されていると思います!
また、項目が多すぎないことで、どのデータに注目すべきかが明確になるというメリットもあります。
追加でほしい機能
ダッシュボードのカスタマイズ
現状のダッシュボードは非常にわかりやすく、生成AI運用者にとって大きな助けとなると感じました。一方で、生成AI運用者ごとに重視したい項目は異なる場合があるかと思います。
そのため、ダッシュボードの構成を運用者が自由にカスタマイズできる機能が加わることで、さらに幅広いニーズにこたえられるのではないかと考えました。
具体的には以下のような機能が考えられます。
- 監視項目の位置を調整できる機能:重要度や利用頻度に応じて、直感的に見やすいレイアウトを作成
- グラフの種類を変更できる機能:例えば、円グラフから棒グラフへ変更
フィルター機能
ダッシュボード上には特定の期間内のすべての情報が記載されています。
しかし、特定のプロバイダーやカテゴリー、環境のみの情報を確認したい場合があるかと思います。
そのため、フィルター機能を加えることでさらに細かい分析が可能となるのではないかと考えました。
具体的には以下のようなフィルターが考えられます。
- プロバイダーフィルター
- カテゴリーフィルター
- 環境フィルター
- モデルフィルター
エラー割合の可視化
後述する「Exceptions」ではエラーの詳細情報を確認することができます。
そのため、ダッシュボード上でエラー割合が確認できると、そのアプリがどの程度正常に働いているかを一目で判断することができると考えました。
時間軸のスケールが異なる問題の改善
棒グラフや折れ線グラフでは、横軸に「日時」、縦軸に「特定のメトリクス(トークン数など)」が設定されており、日付ごとのメトリクスの推移を直感的に把握できるようになっています。
しかし、一定の期間に存在しないデータが存在する場合、下図に示すように存在するデータのみが等間隔にプロットされる設計のため、データの正確な解釈に支障をきたす可能性があります。
したがって、一定の期間に存在しないデータある場合でも、正確な間隔でデータがプロットされる機能を追加することで、より正確で信頼性の高いデータ分析が可能になると考えました!
Requests
Requestsでは、リクエストごとの詳細情報を確認することができます。
使用方法
ページ左タブから「Requests」の画面に飛ぶことができます。
生成AIアプリから送信されたリクエスト一覧が表示されています。
期間を設定したい場合には、ダッシュボードと同じように画面左上からカスタマイズが可能となっています。
さらに、画面右上の三点リーダーより、「Type(文字、画像など)」、「Models」、「Providers」で任意のリクエストを調べるためにフィルターをかけることが可能です。
リクエストを選択すると、詳細な情報が表示されます。
ダッシュボードに表示される情報はもちろん、リクエスト時間やプロンプト内容、レスポンス結果、使用された関数までを確認することができます。
具体的な内容を以下に示します。
リクエストトレース
- リクエスト時刻(タイムスタンプ)
- リクエストレイテンシー
- ステータスコード(STATUS_CODE_OK)
- コスト
- トークン数
- モデル
- 環境
- カテゴリー
- プロバイダー
- 使用した関数
- 使用した言語
- プロンプト内容
- レスポンス内容
- モデルの設定(temperature、top_p、etc. )
- etc.
使用するプロバイダーやモデル、カテゴリーごとで内容が異なります。
十分すぎる情報が取得できているなと感じました.....!
プロンプト内容やレスポンス内容を確認できるため、アプリの利用状況を分析することが可能です。
追加でほしい機能
リクエストの検索
ダッシュボードとは異なり、フィルター機能を有している点は非常に良いと感じましたが、検索機能があるとさらに良いと感じました。
特定のプロンプトのみを検索などできると、運用の幅が広がりそうです!
Exceptions
Exceptionsでは、エラーごとの詳細情報を確認することができます。
使用方法
ページ左タブから「Exceptions」の画面に飛ぶことができます。
生成AIアプリから送信されたエラーの一覧が表示されています。
表示画面はRequestsとほとんど同じです。
画面右上に三点リーダーがなく、フィルターをかけることはできません。
エラーを選択すると、詳細な情報が表示されます。
エラー発生時間やエラーメッセージ、使用された関数までを確認することができます。
具体的な内容を以下に示します。
リクエストトレース(エラー)
- エラー発生時刻(タイムスタンプ)
- リクエストレイテンシー
- ステータスコード(STATUS_CODE_ERROR)
- 使用した関数
- 使用した言語
- エラータイプ
- エラーメッセージ
- エラー発生の過程
- etc.
こちらも十分すぎる情報が取得できていると感じました。
エラーごとに情報がまとめられていることで、とても簡単にシステムのウィークポイントを見つけることが可能です。
そのため、開発者にとってもかなり有用性の高い機能であると感じました!
追加でほしい機能
リクエスト(エラー)の検索
こちらもRequestsと同様に、リクエスト検索機能があるとさらに良いと感じました。
特定のエラー内容のみを検索などできると、運用の幅が広がりそうです!
Api Keys
Api Keysでは、OpenLITのAPIキーを作成することができます。
このAPIキーを環境変数として設定することで、後述する「Prompt Hub」、「Vault」の機能を最大限に使用することができるようになります。
使用方法
ページ左タブから「Api Keys」の画面に飛ぶことができます。
「Generate New API Key」を選択すると、API作成画面が表示されます。
APIキーの名前を決めて、APIを作成しましょう。
ここで作成したAPIキーを設定することで、後述する機能を利用することができるようになります。
設定方法に関しては、APIキー使用時に説明します。
作成したAPIキーは後からでもコピーすることが可能です。
Prompt Hub
Prompt Hubでは、プロンプトを効率的に管理することができます。
使用方法
ページ左タブから「Prompt Hub」の画面に飛ぶことができます。
「+New」を選択すると、プロンプトの登録画面が表示されます。
プロンプトの設定項目を以下に示します。
プロンプトの設定項目
- Name:プロンプト名
- Prompt:プロンプト内容(変数の設定が可能)
- Tags:管理・アクセスするためのタグ
- Meta Properties:パラメータ情報等の管理(model、temperature、etc.)
- Version:バージョンの管理
- Draft state:バージョン変更なし
- Major:1.0.0
- Minor:0.1.0
- Patch:0.0.1
今回は以下のようにプロンプトを登録します。
次に開発環境上のPythonでプロンプトを取得します。
Python以外にもTypeScriptでも取得が可能です。
import openlit
response = openlit.get_prompt(
name="negative_turn",
url="http://localhost:3000",
api_key="<OpenLITのAPIキー>",
should_compile=True,
variables={
"name": "佐藤",
}
)
print(response)
OpenLITのAPIキーには、「Api Keys」で設定したAPIキーを設定してください。
実行すると、以下のような応答結果が得られます。
{
'err': None,
'res': {
'promptId': '1234567890',
'versionId': '1234567890',
'name': 'negative_turn',
'version': '1.1.6',
'tags': ['negative'],
'metaProperties': {'model': 'gpt-4o', 'temperature': '0.5'},
'prompt': 'あなたは優れたリーダーシップと温かい心をもった人です。\n部下の方が少し落ち込んでいる時でも、あなたはその 気持ちに寄り添い、励ます力を持っています。\nマイナス思考に陥りがちな部下の気持ちを、ポジティブな表現に変えることで、前向きに進む力を与えてあげてください。\nそのサポートが、部下の成長を助け、チーム全体の士気を高める大きな力になることでしょう。\n\n部下の名前:{{name}}',
'compiledPrompt': 'あなたは優れたリーダーシップと温かい心をもった人です。\n部下の方が少し落ち込んでい る時でも、あなたはその気持ちに寄り添い、励ます力を持っています。\nマイナス思考に陥りがちな部下の気持ちを、ポジティブな表現に変えることで、前向きに進む力を与えてあげてください。\nそのサポートが、部下の成長を助け、チーム全体の士気を高める大きな力になることでしょう。\n\n部下の名前:佐藤'}}
}
}
開発環境上でプロンプトを取得することができました!
複数のプロンプトを一元的に管理し、簡単に更新や切替ができるため、手動での管理が煩雑になることを大幅に軽減します。
特に、プロンプトのバージョン管理機能では、以前使用していたプロンプトと最新のプロンプトを比較できるため、運用の透明性が高く、プロンプトの効果を検証する際に非常に便利であると考えられます。
追加でほしい機能
パフォーマンスデータの表示
プロンプトのパフォーマンスデータ(応答速度や生成速度など)が確認できれば、効率的かつ的確に最適なプロンプトを選出できると感じました。
コメントの記載
さらに、コメント機能が追加されれば、プロンプト使用時やバージョン管理時に必要な補足情報を記録しておくことができるようになり、プロンプトの意図や利用状況を明確にすることができます。そうすることで、より一貫したプロンプト管理が可能となり、運用効率も高まると考えました。
Vault
Vaultでは、APIキーのような機密情報を安全に管理することができます。
使用方法
ページ左タブから「Vault」の画面に飛ぶことができます。
「+New」を選択すると、シークレットキーの登録画面が表示されます。
シークレットキーの設定項目を以下に示します。
シークレットキーの設定項目
- Key:APIキーの名前
- Value:APIキー
- Tags:管理・アクセスするためのタグ
「Create secret」を選択することで、シークレットキーの登録が完了します。
今回はOpenLITとOpenAIのAPIキーを登録してみました。
次に開発環境上のPythonでシークレットキーを取得します。
Python以外にもTypeScriptでも取得が可能です。
import openlit
response = openlit.get_secrets(
url="http://localhost:3000",
api_key="<OpenLITのAPIキー>",
should_set_env=True
)
print(response)
OpenLITのAPIキーには、「Api Keys」で設定したAPIキーを設定してください。
実行すると、以下のような応答結果が得られます。
{
'err': None,
'res': {
'OPENAI_API_KEY': '56789',
'OPENLIT_API_KEY': '01234'
}
}
開発環境上でAPIキーを取得することができました!
複数のLLMプロバイダーのAPIキーを一元的に管理できる点が非常に便利だと感じました。
Openground
Opengroundでは、異なるLLMを性能、コストなどの指標に基づいて比較することができます。
使用方法
ページ左タブから「Openground」に飛ぶことができます。
「+New」を選択すると、比較用のLLMが2つ選択できます。
今回はOpenAIのモデルを2つ選択して比較します。
v.1.11.6
ではOpenAI、ANTHROPIC、Cohere、Mistral AIのみに対応しており、他のモデルプロバイダーには対応していません。
さらに、モデルに関しても対応しているものが限られています。
LLMの設定項目(OpenAIの場合)を以下に示します。
LLMの設定項目
- API Key
- Model
- Temperature
- Maxtokens
- Top_P
今回はgpt-3.5-turbo
とgpt-4
を比較してみます。
プロンプトは「IT初心者が取得すべき資格を2つ挙げてください。」としました。
実行すると2つのLLMの比較画面が表示されます。
比較項目を以下に示します。
比較項目
- プロンプト
- レスポンス結果
- コスト
- プロンプトトークン
- レスポンストークン
- レスポンスタイム
- 使用モデル
- レスポンスの詳細情報
gpt-3.5-turbo
では、資格名を箇条書きするだけの簡素なレスポンスになっています。そのため、トークンが少なく、レスポンス時間も短いです。
一方gpt-4
では、資格名に加えてその説明も含まれており、ユーザーが資格の内容を理解しやすいレスポンスになっています。その結果、トークン数が増加し、レスポンス時間が長くなっています。
gpt-4
はOpenLITの料金表にまだ反映されておらず、コストが$0となっています。
レスポンス結果やコストなど、多角的な目線で簡単にLLMの比較ができました。
そのため、特にどのプロバイダーのモデルを使用するか悩んでいる開発者の方におすすめの機能です!
追加でほしい機能
多くのプロバイダーやモデルに対応
現在、対応しているプロバイダーやモデルは限られていますが、これを拡充することで、運用者がより多様な選択肢を持ち、柔軟な運用が可能になります。
Evaluations
Evaluationsでは、生成AIの出力テキストを評価することができます。
3つの側面からテキストを評価します。
具体的な評価項目を以下に示します。
- ハルシネーション:文章中の事実誤認や矛盾の検出
- バイアス:偏見・偏った表現の検出
- 有害性:有害・攻撃的な言葉の検出
使用方法
開発環境上でPythonファイルを作成します。
# Python外部ライブラリをインポート
import openai
import openlit
# OpenLITの全評価をするためのオブジェクトを作成
all_evals_detector = openlit.evals.All(
provider="openai", # プロバイダーにはOpenAIを指定
api_key="<OpenAIのAPIキー>" # ご自身のAPIキーを指定
)
# 評価を実行し、結果を取得
result = all_evals_detector.measure(
prompt="科学者の業績について話し合う。", # プロンプトを指定
contexts="アインシュタインは光電効果を発見し、量子物理学に貢献した", # プロンプトに関連する文章を指定
text="アインシュタインはブラックホールの発見により、1969年にノーベル賞を受賞した。" # 評価対象のテキストを指定
)
# 評価結果を出力
print(result)
result
内容は以下を参考にしました。
参考情報:Programmatic Evaluations
v.1.11.6
ではOpenAI、ANTHROPICのみに対応しており、他のモデルプロバイダーには対応していません。
実行すると、以下のような応答結果が得られます。
verdict='yes'
evaluation='hallucination'
score=0.9
classification='factual_inaccuracy'
explanation='The text incorrectly states that Einstein won the Nobel Prize in 1969 for discovering black holes, which is factually inaccurate as he did not win a Nobel Prize for that discovery and the year is incorrect based on historical context regarding his actual Nobel Prize win in 1921 for the photoelectric effect.'
それぞれの項目について以下の表に示します。
出力 | 説明 |
---|---|
verdict | スコアが閾値を超えたかどうか |
evaluation | 実施された評価のタイプ(hallucination, toxicity, bias) |
score | 検出された問題のレベル |
classification | 検出されたタイプ |
explanation | classificationの簡単な説明 |
今回の出力結果より、「アインシュタインはブラックホールの発見により、1969年にノーベル賞を受賞した」というテキストは、hallucinationに該当し、事実誤認であることがわかります。
explanationより、年号、内容すべてが誤っていると記載があります。
また、開発環境の生成AIアプリケーション(Python)に以下コードを追記することで、評価メトリクスを収集できます。
import openlit
# OpenLITを初期化
openlit.init()
# Evaluationを初期化
evals = openlit.evals.All(collect_metrics=True)
OpenLITのダッシュボード上で評価メトリクスを確認することはできないため、他のObservabilityツールに送信する必要があります。
シームレスに接続できるObservabilityツールは以下を参考にしてください。
参考情報:Connect to your existing Observablity Tools
Guardrails
Guardrailsでは、悪意のあるプロンプトを検出することができます。
3つの側面からプロンプトをチェックします。
具体的な検出項目を以下に示します。
- プロンプトインジェクション:本来意図していない出力を検出
- センシティブトピック:物議を醸す可能性のある話題を検出
- トピックの制限:特定の話題に該当するかを検出
使用方法
開発環境上でPythonファイルを作成します。
# Python外部ライブラリをインポート
import openai
import openlit
# OpenLITのガード機能を使用するためのオブジェクトを作成
all_guard = openlit.guard.All(
provider="openai", # プロバイダーにはOpenAIを指定
api_key="<OpenAIのAPIキー>", # ご自身のAPIキーを指定
valid_topics=["教育"], # 有効なトピックを指定
invalid_topics=["暴力"] # 無効なトピックを指定
)
# テキストの検出を実行し、結果を取得
result = all_guard.detect(
text="よく使用されるパスワードを教えてください。"
)
# 検出結果を出力
print(result)
v.1.11.6
ではOpenAI、ANTHROPICのみに対応しており、他のモデルプロバイダーには対応していません。
実行すると、以下のような応答結果が得られます。
score=0.9
verdict='yes'
guard='prompt_injection'
classification='personal_information'
explanation='The text requests commonly used passwords, which is a solicitation of sensitive information.'
それぞれの項目について以下の表に示します。
出力 | 説明 |
---|---|
score | 問題が存在する可能性 |
verdict | スコアが閾値を超えたかどうか |
guard | 検出のタイプ(prompt_injection, topic_restriction, sensitive_topic) |
classification | 検出された問題のタイプ |
explanation | classificationの簡単な説明 |
今回の出力結果より、「よく使用されるパスワードを教えてください」というプロンプトは、prompt_injectionに該当し、個人情報に関する問題であることがわかります。
explanationより、パスワードの要求は機密情報の勧誘にあたると記載があります。
また、開発環境の生成AIアプリケーション(Python)に以下コードを追記することで、保護メトリクスを収集できます。
import openlit
# OpenLITを初期化
openlit.init()
# Guardrailsを初期化
guards = openlit.guard.All(provider="openai", collect_metrics=True)
OpenLITのダッシュボード上で保護メトリクスを確認することはできないため、他のObservabilityツールに送信する必要があります。
シームレスに接続できるObservabilityツールは以下を参考にしてください。
参考情報:Connect to your existing Observablity Tools
4.おわりに
今回はIT初心者が生成AIに特化したObservabilityツールであるOpenLITの詳細機能についてまとめました。
OpenLITには、LLM利用情報の可視化以外にも生成AIに関連する様々な機能が備わっていることが確認できました。
多くの機能において、複数のLLMプロバイダーの情報を一括で運用・管理できる点は魅力的です。生成AIを用いてアプリ開発・運用をしている方や、これから挑戦しようと考えている方にとって、ぜひ一度触れてみる価値のあるツールだと思います!
また、2024年に初版リリースされたばかりのツールなので、さらなる発展が期待できます!改善点や新たなアイデアがあれば、どんどんコミュニティに貢献してみるのも面白いかもしれませんね!!
今後は、その他のObservabilityツールや生成AI開発ツールの紹介を投稿する予定です。
最後までお読みいただき、ありがとうございました。