😎

Datadog LLM Observabilityへの入門

に公開

今回は、DatadogのLLM Observabilityの機能を利用して、LLMアプリケーションの結果をDatadogにて取り扱ってみます。

Datadog LLM Observabilityとは?

DatadogはObservabilityのSaaSとして絶対的な地位をとっているツールかと思います。LLMの発展に伴い、DatadogでもLLMのObservabilityを対応できるようになっており、その機能が今回紹介する機能になります。この機能を利用することでLLMアプリケーションの問題点の特定やパフォーマンス測定などを行うことができ、より堅牢なLLMアプリケーションの実装を実現できます。

https://docs.datadoghq.com/ja/llm_observability/

早速使ってみる

今回は以前紹介したmlflowを利用したLLMの実験管理にて利用したコードを再利用して、Datadog上でLLMアプリケーションの結果を管理してみようと思います。なお、Datadogを利用するにあたりDatadogのAPIキーと、LLMとしてOpenAIのモデルを利用するのでOpenAIのAPIキーの二つをご用意ください。

https://zenn.dev/akasan/articles/b37450993c3dce

環境構築

それではPython環境をuvを使って構築していきます。

uv init datadog-llm-o11y-prac -p 3.12
cd datadog-llm-o11y-prac
uv add ddtrace langchain langchain-openai

LLMアプリケーションの実装

先ほど添付したmlflowの記事の時のコードを再利用します。mlflowは今回使わないので一部修正しています。実装としては、指定された国の首都を取得するチェーンと、その首都で有名な観光スポットをいくつか提示するチェーンの二つから構成されます。

main.py
import os
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

llm = OpenAI(api_key="<OpenAI API Key>")


# 国名から首都を調べるチェーン
capital_prompt = PromptTemplate.from_template(
    "{country}の首都を教えてください。首都名のみを回答してください。"
)

# 首都から観光スポットを探すチェーン
tourism_prompt = PromptTemplate.from_template(
    "{capital}の有名な観光スポットを3つ教えてください。"
)

output_parser = StrOutputParser()

# チェーンの作成
capital_chain = capital_prompt | llm | output_parser
tourism_chain = tourism_prompt | llm | output_parser

# 2つのチェーンを組み合わせ
full_chain = (
    {"capital": capital_chain, "country": RunnablePassthrough()}
    | RunnablePassthrough.assign(tourism=lambda x: tourism_chain.invoke({"capital": x["capital"]}))
)

country_name = "日本"
result = full_chain.invoke({"country": country_name})

print(f"国: {result['country']}")
print(f"首都: {result['capital']}")
print(f"観光スポット:\n{result['tourism']}")

実行してみる

それでは実行してDatadog上に記録してみましょう。記録するにはいくつか方法がありますが、今回は以下の形式で実行します(公式のQuickstartの方法です)。

DD_LLMOBS_ENABLED=1 \
DD_LLMOBS_ML_APP=quickstart-app \
DD_API_KEY=<YOUR_DATADOG_API_KEY> \
ddtrace-run <your application command>

今回はuvを利用しているので以下のようにしました。

DD_LLMOBS_ENABLED=1 \
DD_LLMOBS_ML_APP=quickstart-app \
DD_API_KEY=<YOUR_DATADOG_API_KEY> \
uv run ddtrace-run python main.py

こちらを実行すると、以下のような結果がまずターミナル上に表示されました。

国: {'country': '日本'}
首都: 

東京
観光スポット:


1. 東京スカイツリー
東京スカイツリーは、高さ634メートルの世界最高の電波塔であり、展望台からは東京の街並みを一望することができます。また、近くには商業施設やレストランもあり、観光客に人気のスポットです。

2. 浅草寺
浅草寺は、東京の代表的な仏教寺院の一つであり、日本最古の寺院の一つでもあります。特に、仲見世通りにある多くの飲食店やお土産屋さんがあり、外国人観光客にも人気のスポットです。

3. 東京ディズニーリゾート
東京ディズニーリゾートは、ディズニーランドとディズニ

それではDatadog側も見てみましょう。Datadogでは「LLM Observability」の「Traces」を選択すると以下のような画面が表示されます。


トレース一覧画面

それではトレースを選択してみましょう。選択すると以下のように詳細画面が表示されます。


トレース詳細

また、それぞれのチェーンの入出力も確認できます。


首都取得チェーン


観光場所取得チェーン

また、APMを表示することで所要時間や順序がWaterfall形式でみれてとてもわかりやすいです。


APM画面

まとめ

今回は過去に使ったLLMアプリケーションコードに対してDatadogのLLM Observabilityを適用してみました。既存アプリケーションを変更することなく記録できるのでとても便利だと思います。なお、今回は使わなかったですがSDKを利用することでワークフローやタスクなどを定義でき、より詳細な記録ができるので、次回はそれを試してみようと思います。

Discussion