🐾

Datadog LLM Observabilityを試験導入しました

2024/09/09に公開

株式会社IVRyのMoriyaです。
OpenAI APIなどのLLM APIの監視を行うために、Datadog LLM Observabilityを試してみました。このブログでは、Datadog LLM Observabilityの導入方法・出来ることなどをまとめました。
https://www.datadoghq.com/ja/product/llm-observability/

背景

IVRyは、AI対話システムを利用した電話自動応答を開発している会社です。
https://ivry.jp/company/
当社では、LLM APIを使う機会が多い一方、LLM APIの監視には力を入れてきませんでした。そのため、LLM APIのLatencyなどを容易に可視化できておらず、状況に応じた迅速な判断をするのが難しいという課題がありました。
Datadog LLM Observabilityがリリースされたので、試してみることにしました。

導入方法

IVRyで開発しているAI対話システムは、Python applicationがECS上で動いています。このサービスに、Datadog LLM Observabilityを試験導入しました(staging環境のみ)。
以下のリンクに従って作業しました。
https://docs.datadoghq.com/llm_observability/setup/sdk/

環境変数の設定

以下の環境変数をPython applicationに設定します。なお、すでにDatadog自体は利用している前提です。

DD_API_KEY: Datadog API Key
DD_SITE: データを置くDatadog site。datadoghq.comなど。
DD_LLMOBS_ENABLED: LLM obsを使うか、のflag。
DD_LLMOBS_ML_APP: アプリケーション名。
DD_LLMOBS_AGENTLESS_ENABLED: Datadog agentを経由するか、のflag。

Pythonコードの設定

decoratorか、inline methodを使うことで、Datadog LLM Observabilityのメトリクスを取得できます。

decorator

関数宣言時に、decoratorを付与することで、LLM Observabilityを利用することができます。
ただ、今回のアプリケーションの場合、decoratorを付与したらunit testが壊れたので、decoratorは採用しませんでした。

from ddtrace.llmobs.decorators import llm

@llm(model_name="claude", name="invoke_llm", model_provider="anthropic")
def llm_call():

inline method

LLM APIを呼び出しているコード全体を、with文で囲います。
これを使うと、session_idに変数を渡せるので、複数のリクエストを統一的に扱えました。
また、spanに対して、いろいろなannotationが追加できるため、カスタマイズ性能が高いです。
今回はinline methodを採用しました。

from ddtrace.llmobs import LLMObs

def llm_call():
    with LLMObs.llm(
        model_name="claude",
        name="invoke_llm",
        model_provider="anthropic",
        session_id=session_id,
    ) as span:
    .....
      LLMObs.annotate(span=span, input_data=input, output_data=output)

出来ること

LLM APIの挙動をリアルタイムで確認できる

LLM APIの挙動をリアルタイムで確認することができます。session_idも付与しているため、異常が発生した際、すばやいデバッグが可能になると思います。

Latencyなどの監視も容易

Latency、エラーレートなども監視できるので、LLM系APIが壊れた際の対応も素早く出来るようになると期待できます。個人的には、この機能が一番嬉しいです。(なお、たまに稼働させるだけのstaging環境なので、以下のグラフに意味はありません)

LLM APIの分析が出来る

LLM APIの内容に応じたクラスタリング・quality checkなども出来ます。
私はそれほど使っていませんが、APIの回答が不安定になりがちな場合は、便利だと思います。

モデル間の比較がしやすくなる

モデルごとに上述した機能を閲覧できるので、どの会社・モデルが良いのかを調べるのが視覚的にやりやすくなることが期待できます。

デメリット

bugがあるかもしれない

2024年6月から開始された機能であるため、bugがあるかもしれません。
私の場合、データが送信・連携されないエラーに遭遇しました。

2024-08-28 01:59:42,390 DEBUG ddtrace.internal.writer.writer :Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
2024-08-28 01:59:42,411 DEBUG ddtrace.llmobs._llmobs :Disabling LLMObs
2024-08-28 01:59:42,412 DEBUG ddtrace.llmobs._llmobs :LLMObs disabled
Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
2024-08-28 01:59:42,417 DEBUG ddtrace.internal.writer.writer :Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
2024-08-28 01:59:42,439 DEBUG ddtrace.llmobs._llmobs :Disabling LLMObs
024-08-28 01:59:42,440 DEBUG ddtrace.llmobs._llmobs :LLMObs disabled
Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
2024-08-28 01:59:42,441 DEBUG ddtrace.internal.writer.writer :Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
2024-08-28 01:59:42,457 DEBUG ddtrace.internal.writer.writer :Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}
Sending request: POST evp_proxy/v2/api/v2/llmobs {'X-Datadog-EVP-Subdomain': 'llmobs-intake', 'Content-Type': 'application/json'}

dd-trace-pyにissueを立てたり、Datadogに問い合わせしましたが、エラー解決に難航していました。しかし、dd-trace-pyを先日リリースされたv2.11.2にupdateしたところ、問題が解決しました。https://github.com/DataDog/dd-trace-py/releases/tag/v2.11.2
gunicorn・celeryのようにforked processを利用するツールを使っている場合にデータが送付されないエラーがあり、それが最近になって解消されたようです。https://github.com/DataDog/dd-trace-py/pull/10249

感想

気軽に導入できて、色々なメトリクスを見られるので、とても便利だと思います。
一方で、今後改善されていく新プロダクトだと思うので、それらを勘案した上で、導入を検討すると良いのではないでしょうか。
日本語の記事は少ないですが、以下のスライドなども参考になると思います。
https://speakerdeck.com/abnoumaru/3-shake-sre-tech-talk-number-10-llmnoo11ynihong-reru
Datadog LLM Observability以外にも、OpenTelemetry-nativeなツールとして、OpenLIT・OpenLLMetryなどがあります。当社ではDatadogを利用しているのでDatadog LLM Observabilityを検証しましたが、これらのツールを試すのも面白いと思います。

おわりに

この開発は、IVRy開発合宿で行いました。
https://zenn.dev/ivry/articles/df67daa37efbb0
IVRyでの開発に興味がある方は、以下のページを閲覧してみてください!
https://ivry-jp.notion.site/IVRy-e1d47e4a79ba4f9d8a891fc938e02271

IVRyテックブログ

Discussion