This product is not supported for your selected Datadog site. ().

概要

Datadog の LLM Observability SDK は、自動インスツルメンテーションおよび手動インスツルメンテーション API を提供し、LLM アプリケーションの観測可能性とインサイトを提供します。

セットアップ

要件

Datadog API キー

最新の ddtrace パッケージがインストールされています (Python 3.7 以降が必要です)。

pip install ddtrace

最新の ddtrace パッケージがインストールされています (Node.js 16 以降が必要です)。

npm install dd-trace

最新の ddtracejava JAR がダウンロードされています。LLM Observability SDK は、ddtracejava v1.51.0 以降 (Java 8 以降が必要です) でサポートされています。

LLM Observability を有効にするには、ddtracerun コマンドを使用してアプリケーションを実行し、必要な環境変数を指定します。

: ddtracerun は自動的にすべての LLM Observability インテグレーションを有効にします。

DD_SITE=<YOUR_DATADOG_SITE> DD_API_KEY=<YOUR_API_KEY> DD_LLMOBS_ENABLED=1 \
DD_LLMOBS_ML_APP=<YOUR_ML_APP_NAME> ddtrace-run <YOUR_APP_STARTUP_COMMAND>

コマンドラインのセットアップ用の環境変数

DD_SITE 必須 - 文字列
LLM データ送信のための送信先 Datadog サイト。使用するサイトは です。

DD_LLMOBS_ENABLED 必須 - 整数または文字列
切り替えて、LLM Observability へのデータ送信を有効にします。1 または true に設定する必要があります。

DD_LLMOBS_ML_APP オプション - 文字列
すべてのトレースとスパンのグループ化が行われる LLM アプリケーション、サービス、またはプロジェクトの名前。これは、異なるアプリケーションや実験を区別するのに役立ちます。許可されている文字やその他の制約については、アプリケーション命名ガイドラインを参照してください。特定のルートスパンに対してこの値を上書きするには、複数のアプリケーションのトレースを参照してください。指定しない場合、DD_SERVICE の値、または上流サービスから伝播された DD_LLMOBS_ML_APP の値がデフォルト設定されます。
: バージョンddtrace==3.14.0 より前では、これは必須フィールドです。

DD_LLMOBS_AGENTLESS_ENABLED オプション - 整数または文字列 デフォルト: false
Datadog Agent を使用していない場合のみ必要で、その場合は 1 または true に設定する必要があります。

DD_API_KEY オプション - 文字列
Datadog API キー。Datadog Agent を使用していない場合のみ必要です。

LLM Observability を有効にするには、NODE_OPTIONS="import ddtrace/initialize.mjs" を使用してアプリケーションを実行し、必要な環境変数を指定します。

: ddtrace/initialize.mjs はすべての APM インテグレーションを自動的にオンにします。

DD_SITE=<YOUR_DATADOG_SITE> DD_API_KEY=<YOUR_API_KEY> DD_LLMOBS_ENABLED=1 \
DD_LLMOBS_ML_APP=<YOUR_ML_APP_NAME> NODE_OPTIONS="--import dd-trace/initialize.mjs" node <YOUR_APP_ENTRYPOINT>

コマンドラインのセットアップ用の環境変数

DD_SITE 必須 - 文字列
LLM データ送信のための Datadog サイト。使用するサイトは です。

DD_LLMOBS_ENABLED 必須 - 整数または文字列
切り替えて、LLM Observability へのデータ送信を有効にします。1 または true に設定する必要があります。

DD_LLMOBS_ML_APP オプション - 文字列
すべてのトレースとスパンのグループ化が行われる LLM アプリケーション、サービス、またはプロジェクトの名前。これは、異なるアプリケーションや実験を区別するのに役立ちます。許可されている文字やその他の制約については、アプリケーション命名ガイドラインを参照してください。特定のルートスパンに対してこの値を上書きするには、複数のアプリケーションのトレースを参照してください。指定しない場合、DD_SERVICE の値、または上流サービスから伝播された DD_LLMOBS_ML_APP の値がデフォルト設定されます。
: バージョンddtrace@5.66.0 より前では、これは必須フィールドです。

DD_LLMOBS_AGENTLESS_ENABLED オプション - 整数または文字列 デフォルト: false
Datadog Agent を使用していない場合のみ必要で、その場合は 1 または true に設定する必要があります。

DD_API_KEY オプション - 文字列
Datadog API キー。Datadog Agent を使用していない場合のみ必要です。

LLM Observability を有効にするには、ddtracejavaを使用してアプリケーションを実行し、必要なパラメーターを環境変数またはシステムプロパティとして指定します。

DD_SITE=<YOUR_DATADOG_SITE> DD_API_KEY=<YOUR_API_KEY> \
java -javaagent:path/to/your/dd-trace-java-jar/dd-java-agent-SNAPSHOT.jar \
-Ddd.service=my-app -Ddd.llmobs.enabled=true -Ddd.llmobs.ml.app=my-ml-app -jar path/to/your/app.jar

環境変数とシステムプロパティ

次のパラメーターを環境変数 (たとえば、DD_LLMOBS_ENABLED) または Java システムプロパティ (たとえば、dd.llmobs_enabled) として指定できます。

DD_SITE または dd.site 必須 - 文字列
LLM データ送信のための送信先 Datadog サイト。使用するサイトは です。

DD_LLMOBS_ENABLED または dd.llmobs.enabled 必須 - 整数または文字列
切り替えて、LLM Observability へのデータ送信を有効にします。1 または true に設定する必要があります。

DD_LLMOBS_ML_APP または dd.llmobs.ml.app オプション - 文字列
すべてのトレースとスパンのグループ化が行われる LLM アプリケーション、サービス、またはプロジェクトの名前。これは、異なるアプリケーションや実験を区別するのに役立ちます。許可されている文字やその他の制約については、アプリケーション命名ガイドラインを参照してください。特定のルートスパンに対してこの値を上書きするには、複数のアプリケーションのトレースを参照してください。指定しない場合、DD_SERVICE の値、または上流サービスから伝播された DD_LLMOBS_ML_APP の値がデフォルト設定されます。
: ddtracejavaのバージョン1.54.0 より前では、これは必須フィールドです。

DD_LLMOBS_AGENTLESS_ENABLED または dd.llmobs.agentless.enabled オプション - 整数または文字列 デフォルト: false
Datadog Agent を使用していない場合のみ必要で、その場合は 1 または true に設定する必要があります。

DD_API_KEY または dd.api.key オプション - 文字列
Datadog API キー。Datadog Agent を使用していない場合のみ必要です。

コマンドラインのセットアップを使用する代わりに、プログラムにより LLM Observability を有効にすることもできます。

LLMObs.enable() 関数を使用して LLM Observability を有効にします。

このセットアップ方法を ddtracerun コマンドと一緒に使用しないでください。
from ddtrace.llmobs import LLMObs
LLMObs.enable(
  ml_app="<YOUR_ML_APP_NAME>",
  api_key="<YOUR_DATADOG_API_KEY>",
  site="<YOUR_DATADOG_SITE>",
  agentless_enabled=True,
)
パラメーター

ml_app オプション - 文字列
すべてのトレースとスパンのグループ化が行われる LLM アプリケーション、サービス、またはプロジェクトの名前。これは、異なるアプリケーションや実験を区別するのに役立ちます。許可されている文字やその他の制約については、アプリケーション命名ガイドラインを参照してください。特定のトレースに対してこの値をオーバーライドするには、複数アプリケーションのトレースを参照してください。指定しない場合、DD_LLMOBS_ML_APP の値がデフォルト設定されます。

integrations_enabled デフォルト: true オプション - boolean
Datadog がサポートする LLM インテグレーション のために、LLM 呼び出しの自動追跡を有効化するフラグです。指定しない場合、サポートされているすべての LLM インテグレーションがデフォルトで有効になります。LLM インテグレーションを使用しないようにするには、この値を false に設定してください。

agentless_enabled オプション - boolean デフォルト: false
Datadog Agent を使用していない場合のみ必要で、その場合はこれを True に設定する必要があります。これは、ddtrace ライブラリにより、Datadog エージェントを必要とするデータが送信されないように設定します。指定しない場合、DD_LLMOBS_AGENTLESS_ENABLED の値がデフォルト設定されます。

site オプション - 文字列
LLM データ送信のための Datadog サイト。使用するサイトは 指定しない場合、DD_SITE の値がデフォルト設定されます。

api_key オプション - 文字列
Datadog API キー。Datadog Agent を使用していない場合のみ必要です。指定しない場合、DD_API_KEY の値がデフォルト設定されます。

enabled オプション - 文字列
アプリケーションの環境の名前 (例: prodpreprodstaging)。指定しない場合、DD_ENV の値がデフォルト設定されます。

service オプション - 文字列
アプリケーションで使用されるサービスの名前。指定しない場合、DD_SERVICE の値がデフォルト設定されます。

このセットアップ方法を ddtrace/initialize.mjs コマンドと一緒に使用しないでください。

init() 関数を使用して LLM Observability を有効にします。

const tracer = require('dd-trace').init({
  llmobs: {
    mlApp: "<YOUR_ML_APP_NAME>",
    agentlessEnabled: true,
  },
  site: "<YOUR_DATADOG_SITE>",
  env: "<YOUR_ENV>",
});

const llmobs = tracer.llmobs;

llmobs 設定のオプション

mlApp オプション - 文字列
すべてのトレースとスパンのグループ化が行われる LLM アプリケーション、サービス、またはプロジェクトの名前。これは、異なるアプリケーションや実験を区別するのに役立ちます。許可されている文字やその他の制約については、アプリケーション命名ガイドラインを参照してください。特定のトレースに対してこの値をオーバーライドするには、複数アプリケーションのトレースを参照してください。指定しない場合、DD_LLMOBS_ML_APP の値がデフォルト設定されます。

agentlessEnabled オプション - boolean デフォルト: false
Datadog Agent を使用していない場合のみ必要で、その場合はこれを true に設定する必要があります。これは、ddtrace ライブラリにより、Datadog エージェントを必要とするデータが送信されないように設定します。指定しない場合、DD_LLMOBS_AGENTLESS_ENABLED の値がデフォルト設定されます。

一般的なトレーサー設定のオプション:

site オプション - 文字列
LLM データ送信のための Datadog サイト。使用するサイトは 指定しない場合、DD_SITE の値がデフォルト設定されます。

enabled オプション - 文字列
アプリケーションの環境の名前 (例: prodpreprodstaging)。指定しない場合、DD_ENV の値がデフォルト設定されます。

service オプション - 文字列
アプリケーションで使用されるサービスの名前。指定しない場合、DD_SERVICE の値がデフォルト設定されます。

環境変数

次の値を環境変数として設定してください。プログラムにより設定することはできません。

DD_API_KEY オプション - 文字列
Datadog API キー。Datadog Agent を使用していない場合のみ必要です。

既存の AWS Lambda 関数を LLM Observability でインスツルメントするには、Datadog 拡張機能と各言語レイヤーを使用します。

  1. AWS コンソールで Cloudshell を開きます。
  2. Datadog CLI クライアントをインストールします。
npm install -g @datadog/datadog-ci
  1. Datadog API キーとサイトを設定します。
export DD_API_KEY=<YOUR_DATADOG_API_KEY>
export DD_SITE=<YOUR_DATADOG_SITE>

すでに Secrets Manager にシークレットがある場合や、シークレットを使用することが望ましい場合は、シークレット ARN を使用して API キーを設定できます。

export DATADOG_API_KEY_SECRET_ARN=<DATADOG_API_KEY_SECRET_ARN>
  1. LLM Observability を使用して Lambda 関数をインストールします (これには Datadog 拡張機能レイヤーのバージョン 77 以降が必要です)。
datadog-ci lambda instrument -f <YOUR_LAMBDA_FUNCTION_NAME> -r <AWS_REGION> -v 125 -e 96 --llmobs <YOUR_LLMOBS_ML_APP>
datadog-ci lambda instrument -f <YOUR_LAMBDA_FUNCTION_NAME> -r <AWS_REGION> -v 137 -e 96 --llmobs <YOUR_LLMOBS_ML_APP>
datadog-ci lambda instrument -f <YOUR_LAMBDA_FUNCTION_NAME> -r <AWS_REGION> -v 26 -e 96 --llmobs <YOUR_LLMOBS_ML_APP>
  1. Lambda 関数を呼び出し、LLM Observability のトレースが Datadog UI に表示されることを確認します。

Lambda 関数が返される前に flush メソッドを使用して、LLM Observability のトレースを手動でフラッシュします。

from ddtrace.llmobs import LLMObs
def handler():
  # function body
  LLMObs.flush()
import tracer from 'dd-trace';
const llmobs = tracer.llmobs;

export const handler = async (event) => {
  // your function body
  llmobs.flush();
};

SDK をインストールし、アプリケーションを実行した後、自動インスツルメンテーションから LLM Observability にいくつかのデータが表示されなければなりません。手動インスツルメンテーションを使用して、まだサポートされていないライブラリからのカスタムビルドのフレームワークや操作をキャプチャできます。

手動インスツルメンテーション

LLM 操作をキャプチャするために、関数デコレータを使用してワークフローを簡単にインスツルメントすることができます。

from ddtrace.llmobs.decorators import workflow

@workflow
def handle_user_request():
    ...

または、細かい操作をキャプチャするためのコンテキストマネージャベースのアプローチ

from ddtrace.llmobs import LLMObs

with LLMObs.llm(model="gpt-4o"):
    call_llm()
    LLMObs.annotate(
        metrics={
            "input_tokens": ...,
            "output_tokens": ...,
        },
    )

利用可能なスパンの種類のリストについては、スパンの種類のドキュメント を参照してください。関数内の操作をより詳細にトレースする方法については、インラインメソッドを使用したスパンのトレースを参照してください。

スパンをトレースするには、トレースしたい関数の関数ラッパーとして llmobs.wrap(options, function) を使用します。利用可能なスパンの種類のリストについては、スパンの種類のドキュメント を参照してください。関数内の操作をより詳細にトレースする方法については、インラインメソッドを使用したスパンのトレースを参照してください。

スパンの種類

スパンの種類は必須であり、llmobs トレース関数 (tracewrap、および decorate) に渡される options オブジェクトに指定します。サポートされているスパンの種類のリストについては、スパンの種類のドキュメント を参照してください。

注: 無効なスパンの種類を持つスパンは、LLM Observability に送信されません。

自動関数引数/出力/名前キャプチャ

llmobs.wrap (TypeScript の場合はllmobs.decorate と一緒に) では、トレースされている関数の入力、出力、および名前のキャプチャが自動的に試みられます。スパンに手動でアノテーションを付ける必要がある場合は、スパンの強化を参照してください。アノテーションを付けた入力と出力により、自動キャプチャがオーバーライドされます。さらに、関数名をオーバーライドするには、オプションオブジェクトの name プロパティを llmobs.wrap 関数に渡します。

function processMessage () {
  ... // user application logic
  return
}
processMessage = llmobs.wrap({ kind: 'workflow', name: 'differentFunctionName' }, processMessage)

ラップされた関数のスパンを終了する条件

llmobs.wrap は、tracer.wrap の基本的な動作を拡張します。関数が呼び出されたときに作成される基本的なスパンは、次の条件で終了します。

関数が Promise を返す場合、スパンは Promise が解決したとき、または拒否されたときに終了します。 関数が最後のパラメーターとしてコールバックを受け取る場合、スパンはそのコールバックが呼び出されたときに終了します。 関数がコールバックを受け取らず、Promise を返さない場合、スパンは関数実行の終了時に終了します。

次の例は、最後の引数がコールバックである 2 番目の条件を示しています。

const express = require('express')
const app = express()

function myAgentMiddleware (req, res, next) {
  const err = ... // user application logic
  // the span for this function is finished when `next` is called
  next(err)
}
myAgentMiddleware = llmobs.wrap({ kind: 'agent' }, myAgentMiddleware)

app.use(myAgentMiddleware)

アプリケーションがコールバック関数を使用しない場合は、代わりにインラインでトレースされたブロックを使用することをお勧めします。詳細については、インラインメソッドを使用したトレースのスパンを参照してください。

const express = require('express')
const app = express()

function myAgentMiddleware (req, res) {
  // the `next` callback is not being used here
  return llmobs.trace({ kind: 'agent', name: 'myAgentMiddleware' }, () => {
    return res.status(200).send('Hello World!')
  })
}

app.use(myAgentMiddleware)

スパンの開始

開始するスパンの種類に基づいて、複数の方法でスパンを開始することができます。サポートされているスパンの種類のリストについては、スパンの種類のドキュメント を参照してください。

すべてのスパンは、LLMObsSpan のオブジェクトインスタンスとして開始されます。各スパンには、スパンとやりとりし、データを記録するためのメソッドがあります。

スパンの終了

トレースを送信し、Datadog アプリで表示するためには、スパンを終了する必要があります。

スパンを終了するには、スパンオブジェクトインスタンスで finish() を呼び出します。可能であれば、例外が発生したとしてもスパンが送信されるように、スパンを try/finally ブロックでラップしてください。

    try {
        LLMObsSpan workflowSpan = LLMObs.startWorkflowSpan("my-workflow-span-name", "ml-app-override", "session-141");
        // user logic
        // interact with started span
    } finally {
      workflowSpan.finish();
    }

LLM 呼び出し

LLM プロバイダーや、Datadog の LLM インテグレーションによってサポートされているフレームワークを使用している場合、これらの操作をトレースするために LLM スパンを手動で開始する必要はありません。

LLM 呼び出しをトレースするには、関数デコレータ ddtrace.llmobs.decorators.llm() を使用します。

model_name 必須 - 文字列
呼び出された LLM の名前。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

model_provider オプション - 文字列 デフォルト: "custom"
モデルプロバイダーの名前。
: 米ドルでの推定コストを表示するには、model_provider を次のいずれかの値に設定してください: openaiazure_openai、または anthropic

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import llm

@llm(model_name="claude", name="invoke_llm", model_provider="anthropic")
def llm_call():
    completion = ... # user application logic to invoke LLM
    return completion

LLM 呼び出しをトレースするには、スパンの種類を llm と指定し、必要に応じてオプションオブジェクトに次の引数を指定します。

modelName オプション - 文字列 デフォルト: "custom"
呼び出された LLM の名前。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

modelProvider オプション - 文字列 デフォルト: "custom"
モデルプロバイダーの名前。
: 米ドルでの推定コストを表示するには、modelProvider を次のいずれかの値に設定してください: openai, azure_openai, または anthropic

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function llmCall () {
  const completion = ... // user application logic to invoke LLM
  return completion
}
llmCall = llmobs.wrap({ kind: 'llm', name: 'invokeLLM', modelName: 'claude', modelProvider: 'anthropic' }, llmCall)

LLM 呼び出しをトレースするには、次のメソッドをインポートして、次の引数を指定して呼び出します。

import datadog.trace.api.llmobs.LLMObs;
LLMObs.startLLMSpan(spanName, modelName, modelProvider, mlApp, sessionID);

spanName オプション - 文字列
操作の名前。指定されていない場合、spanName はスパンの種類にデフォルト設定されます。

modelName オプション - 文字列 デフォルト: "custom"
呼び出された LLM の名前。

modelProvider オプション - 文字列 デフォルト: "custom"
モデルプロバイダーの名前。
: 米ドルでの推定コストを表示するには、modelProvider を次のいずれかの値に設定してください: openai, azure_openai, または anthropic

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。非 null の値を指定すると、アプリケーションの開始時に指定された ML アプリ名がオーバーライドされます。詳細については、複数のアプリケーションのトレースを参照してください。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeModel() {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    String inference = ... // user application logic to invoke LLM
    llmSpan.annotateIO(...); // record the input and output
    llmSpan.finish();
    return inference;
  }
}

ワークフロー

ワークフローのスパンをトレースするには、関数デコレータ ddtrace.llmobs.decorators.workflow() を使用します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import workflow

@workflow
def process_message():
    ... # user application logic
    return

ワークフローのスパンをトレースするには、スパンの種類を workflow と指定し、必要に応じてオプションオブジェクトに引数を指定します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function processMessage () {
  ... // user application logic
  return
}
processMessage = llmobs.wrap({ kind: 'workflow' }, processMessage)

ワークフローのスパンをトレースするには、次のメソッドをインポートして、次の引数を指定して呼び出します。

import datadog.trace.api.llmobs.LLMObs;
LLMObs.startWorkflowSpan(spanName, mlApp, sessionID);

spanName オプション - 文字列
操作の名前。指定されていない場合、spanName はスパンの種類にデフォルト設定されます。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。非 null の値を指定すると、アプリケーションの開始時に指定された ML アプリ名がオーバーライドされます。詳細については、複数のアプリケーションのトレースを参照してください。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String executeWorkflow() {
    LLMObsSpan workflowSpan = LLMObs.startWorkflowSpan("my-workflow-span-name", null, "session-141");
    String workflowResult = workflowFn(); // user application logic
    workflowSpan.annotateIO(...); // record the input and output
    workflowSpan.finish();
    return workflowResult;
  }
}

エージェント

エージェントの実行をトレースするには、関数デコレータ ddtrace.llmobs.decorators.agent() を使用します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import agent

@agent
def react_agent():
    ... # user application logic
    return

エージェントの実行をトレースするには、スパンの種類を agent と指定し、必要に応じて、オプションオブジェクトに引数を指定します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function reactAgent () {
  ... // user application logic
  return
}
reactAgent = llmobs.wrap({ kind: 'agent' }, reactAgent)

エージェントの実行をトレースするには、次のメソッドをインポートして、次の引数を指定して呼び出します。

import datadog.trace.api.llmobs.LLMObs;
LLMObs.startAgentSpan(spanName, mlApp, sessionID);

spanName オプション - 文字列
操作の名前。指定されていない場合、spanName のデフォルトはトレースされた関数の名前になります。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。非 null の値を指定すると、アプリケーションの開始時に指定された ML アプリ名がオーバーライドされます。詳細については、複数のアプリケーションのトレースを参照してください。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ツール呼び出し

ツール呼び出しをトレースするには、関数デコレータ ddtrace.llmobs.decorators.tool() を使用します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import tool

@tool
def call_weather_api():
    ... # user application logic
    return

ツール呼び出しをトレースするには、スパンの種類を tool と指定し、必要に応じてオプションオブジェクトに引数を指定します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function callWeatherApi () {
  ... // user application logic
  return
}
callWeatherApi = llmobs.wrap({ kind: 'tool' }, callWeatherApi)

ツール呼び出しをトレースするには、次のメソッドをインポートし、次の引数を指定して呼び出します。

import datadog.trace.api.llmobs.LLMObs;
LLMObs.startToolSpan(spanName, mlApp, sessionID);

spanName オプション - 文字列
操作の名前。指定されていない場合、spanName のデフォルトはトレースされた関数の名前になります。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。非 null の値を指定すると、アプリケーションの開始時に指定された ML アプリ名がオーバーライドされます。詳細については、複数のアプリケーションのトレースを参照してください。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

タスク

タスクスパンをトレースするには、関数デコレータ LLMObs.task() を使用します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import task

@task
def sanitize_input():
    ... # user application logic
    return

タスクスパンをトレースするには、スパンの種類を task と指定し、必要に応じてオプションオブジェクトに引数を指定します。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function sanitizeInput () {
  ... // user application logic
  return
}
sanitizeInput = llmobs.wrap({ kind: 'task' }, sanitizeInput)

タスクスパンをトレースするには、次のメソッドをインポートし、次の引数を指定して呼び出します。

import datadog.trace.api.llmobs.LLMObs;
LLMObs.startTaskSpan(spanName, mlApp, sessionID);

spanName オプション - 文字列
操作の名前。指定されていない場合、spanName のデフォルトはトレースされた関数の名前になります。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。非 null の値を指定すると、アプリケーションの開始時に指定された ML アプリ名がオーバーライドされます。詳細については、複数のアプリケーションのトレースを参照してください。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

埋め込み

埋め込み操作をトレースするには、関数デコレータ LLMObs.embedding() を使用します。

: 埋め込みスパンの入力のアノテーションを付けるには、他のスパンタイプとは異なるフォーマットが必要です。埋め込み入力を指定する方法の詳細については、スパンの強化を参照してください。

model_name 必須 - 文字列
呼び出された LLM の名前。

name オプション - 文字列
操作の名前。指定されていない場合、name にはトレースされた関数の名前が設定されます。

model_provider オプション - 文字列 デフォルト: "custom"

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import embedding

@embedding(model_name="text-embedding-3", model_provider="openai")
def perform_embedding():
    ... # user application logic
    return

埋め込み操作をトレースするには、スパンの種類をembeddingとして指定し、必要に応じてオプションオブジェクトに引数を指定します。

: 埋め込みスパンの入力のアノテーションを付けるには、他のスパンタイプとは異なるフォーマットが必要です。埋め込み入力を指定する方法の詳細については、スパンの強化を参照してください。

modelName オプション - 文字列 デフォルト: "custom"
呼び出された LLM の名前。

name オプション - 文字列
操作の名前。指定されていない場合、name にはトレースされた関数の名前が設定されます。

modelProvider オプション - 文字列 デフォルト: "custom"
モデルプロバイダーの名前。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

function performEmbedding () {
  ... // user application logic
  return
}
performEmbedding = llmobs.wrap({ kind: 'embedding', modelName: 'text-embedding-3', modelProvider: 'openai' }, performEmbedding)

取得

取得スパンをトレースするには、関数デコレータ ddtrace.llmobs.decorators.retrieval() を使用します。

: 取得スパンの出力のアノテーションを付けるには、他のスパンタイプとは異なるフォーマットが必要です。取得出力を指定する方法の詳細については、スパンの強化を参照してください。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

session_id オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

ml_app オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

from ddtrace.llmobs.decorators import retrieval

@retrieval
def get_relevant_docs(question):
    context_documents = ... # user application logic
    LLMObs.annotate(
        input_data=question,
        output_data = [
            {"id": doc.id, "score": doc.score, "text": doc.text, "name": doc.name} for doc in context_documents
        ]
    )
    return

取得スパンをトレースするには、スパンの種類を retrieval と指定し、必要に応じてオプションオブジェクトに次の引数を指定します。

: 取得スパンの出力のアノテーションを付けるには、他のスパンタイプとは異なるフォーマットが必要です。取得出力を指定する方法の詳細については、スパンの強化を参照してください。

name オプション - 文字列
操作の名前。指定されていない場合、name のデフォルトはトレースされた関数の名前になります。

sessionId オプション - 文字列
基盤となるユーザーセッションの ID。詳細については、ユーザーセッションの追跡を参照してください。

mlApp オプション - 文字列
操作が属する ML アプリケーションの名前。詳細については、複数のアプリケーションのトレースを参照してください。

ここには、スパンにアノテーションを付ける例も含まれています。詳細については、スパンの強化を参照してください。

function getRelevantDocs (question) {
  const contextDocuments = ... // user application logic
  llmobs.annotate({
    inputData: question,
    outputData: contextDocuments.map(doc => ({
      id: doc.id,
      score: doc.score,
      text: doc.text,
      name: doc.name
    }))
  })
  return
}
getRelevantDocs = llmobs.wrap({ kind: 'retrieval' }, getRelevantDocs)

スパンのネスト

現在のスパンが終了する前に新しいスパンを開始すると、2 つのスパンの間にある親子関係が自動的にトレースされます。親スパンは大きな操作を表し、子スパンはその中の小さなネストされたサブ操作を表します。

from ddtrace.llmobs.decorators import task, workflow

@workflow
def extract_data(document):
    preprocess_document(document)
    ... # performs data extraction on the document
    return

@task
def preprocess_document(document):
    ... # preprocesses a document for data extraction
    return
function preprocessDocument (document) {
  ... // preprocesses a document for data extraction
  return
}
preprocessDocument = llmobs.wrap({ kind: 'task' }, preprocessDocument)

function extractData (document) {
  preprocessDocument(document)
  ... // performs data extraction on the document
  return
}
extractData = llmobs.wrap({ kind: 'workflow' }, extractData)
import datadog.trace.api.llmobs.LLMObs;
import datadog.trace.api.llmobs.LLMObsSpan;

public class MyJavaClass {
  public void preprocessDocument(String document) {
  LLMObsSpan taskSpan = LLMObs.startTaskSpan("preprocessDocument", null, "session-141");
   ...   // preprocess document for data extraction
   taskSpan.annotateIO(...); // record the input and output
   taskSpan.finish();
  }

  public String extractData(String document) {
    LLMObsSpan workflowSpan = LLMObs.startWorkflowSpan("extractData", null, "session-141");
    preprocessDocument(document);
    ... // perform data extraction on the document
    workflowSpan.annotateIO(...); // record the input and output
    workflowSpan.finish();
  }
}

スパンの強化

ここでの メトリクス パラメーターは、個々のスパンに属性として付加された数値を指します — Datadog プラットフォームメトリクスではありません。input_tokensoutput_tokenstotal_tokens のような特定の認識されたキーに対して、Datadog はこれらのスパン属性を使用して、ダッシュボードやモニターで使用するための対応するプラットフォームメトリクス (ml_obs.span.llm.input.tokens など) を生成します。

SDK には、入力、出力、およびメタデータでスパンを強化するための LLMObs.annotate() メソッドが用意されています。

LLMObs.annotate() メソッドは次の引数を受け付けます。

span オプション - スパン デフォルト: 現在のアクティブなスパン
アノテーションを付けるスパン。span が指定されていない場合 (関数デコレータを使用する場合など)、SDK は現在のアクティブなスパンにアノテーションを付けます。

input_data オプション - JSON のシリアライズ可能な型、または辞書のリスト
JSON のシリアライズ可能な型 (非 LLM スパン用) またはこの形式の辞書のリスト: {"content": "...", "role": "...", "tool_calls": ..., "tool_results": ...}、ここで "tool_calls" は、必須キー "name""arguments" を持つツール呼び出し辞書のオプションのリストであり、オプションのキー "tool_id""type"、および "tool_results" は、必須キー "result" と、関数呼び出しシナリオ用のオプションのキー "name""tool_id""type" を持つツール結果辞書のオプションのリストです。: 埋め込みスパンは特別なケースであり、{"text": "..."} という形式の文字列または辞書 (または辞書のリスト) が必要です。

output_data オプション - JSON のシリアライズ可能な型、または辞書のリスト
JSON のシリアライズ可能な型 (非 LLM スパン用) またはこの形式の辞書のリスト: {"content": "...", "role": "...", "tool_calls": ...}、ここで "tool_calls" は、必須キー "name""arguments" と、関数呼び出しシナリオ用のオプションのキー "tool_id""type" を持つツール呼び出し辞書のオプションのリストです。: 取得スパンは特別なケースであり、{"text": "...", "name": "...", "score": float, "id": "..."} という形式の文字列または辞書 (または辞書のリスト) が必要です。

tool_definitions オプション - 辞書のリスト
関数呼び出しシナリオ用のツール定義辞書のリスト。各ツール定義には、必須の "name": "..." キーと、オプションの "description": "..." および "schema": {...} キーが必要です。

metadata オプション - 辞書
スパンで記述された入力または出力操作に関連するメタデータ情報としてユーザーが追加できる、JSON のシリアライズ可能なキーと値のペアの辞書です (model_temperaturemax_tokenstop_k など)。

metrics オプション - 辞書
スパンで記述された操作に関連するメトリクスとしてユーザーが追加できる、JSON のシリアライズ可能なキーと数値の辞書です (input_tokensoutput_tokenstotal_tokenstime_to_first_token など)。time_to_first_token の単位は秒であり、デフォルトで出力される duration メトリクスと同様です。

notification オプション - 辞書
ユーザーがタグとしてスパンに追加できる、JSON のシリアライズ可能なキーと値のペアの辞書です。キーの例: sessionenvsystemversion。タグの詳細については、タグの概要を参照してください。

from ddtrace.llmobs import LLMObs
from ddtrace.llmobs.decorators import embedding, llm, retrieval, workflow

@llm(model_name="model_name", model_provider="model_provider")
def llm_call(prompt):
    resp = ... # llm call here
    LLMObs.annotate(
        span=None,
        input_data=[{"role": "user", "content": "Hello world!"}],
        output_data=[{"role": "assistant", "content": "How can I help?"}],
        metadata={"temperature": 0, "max_tokens": 200},
        metrics={"input_tokens": 4, "output_tokens": 6, "total_tokens": 10},
        tags={"host": "host_name"},
    )
    return resp

@workflow
def extract_data(document):
    resp = llm_call(document)
    LLMObs.annotate(
        input_data=document,
        output_data=resp,
        tags={"host": "host_name"},
    )
    return resp

@embedding(model_name="text-embedding-3", model_provider="openai")
def perform_embedding():
    ... # user application logic
    LLMObs.annotate(
        span=None,
        input_data={"text": "Hello world!"},
        output_data=[0.0023064255, -0.009327292, ...],
        metrics={"input_tokens": 4},
        tags={"host": "host_name"},
    )
    return

@retrieval(name="get_relevant_docs")
def similarity_search():
    ... # user application logic
    LLMObs.annotate(
        span=None,
        input_data="Hello world!",
        output_data=[{"text": "Hello world is ...", "name": "Hello, World! program", "id": "document_id", "score": 0.9893}],
        tags={"host": "host_name"},
    )
    return

SDK には、入力、出力、メタデータを使用してスパンにアノテーションを付けるための llmobs.annotate() メソッドが用意されています。

LLMObs.annotate() メソッドは次の引数を受け付けます。

span オプション - スパン デフォルト: 現在のアクティブなスパン
アノテーションを付けるスパン。span が指定されていない場合 (関数ラッパーを使用している場合など)、SDK により現在のアクティブなスパンにアノテーションが付けられます。

annotationOptions 必須 - オブジェクト
スパンにアノテーションを付けるための異なるタイプのデータのオブジェクトです。

annotationOptions オブジェクトには、次の項目を含めることができます。

inputData オプション - JSON のシリアライズ可能な型、またはオブジェクトのリスト
(非 LLM スパン用の) JSON のシリアライズ可能な型、またはこの形式の辞書のリスト: {role: "...", content: "..."} (LLM スパン用)。 : 埋め込みスパンは特別なケースであり、{text: "..."} という形式の文字列またはオブジェクト (またはオブジェクトのリスト) が必要です。

outputData オプション - JSON のシリアライズ可能な型、またはオブジェクトのリスト
(非 LLM スパン用の) JSON のシリアライズ可能な型、またはこの形式のオブジェクトのリスト: {role: "...", content: "..."} (LLM スパン用)。: 取得スパンは特別なケースであり、{text: "...", name: "...", score: number, id: "..."} という形式の文字列またはオブジェクト (またはオブジェクトのリスト) が必要です。

metadata オプション - オブジェクト
スパンで記述された入力または出力操作に関連するメタデータ情報としてユーザーが追加できる、JSON のシリアライズ可能なキーと値のペアのオブジェクト (model_temperaturemax_tokenstop_k など)。

metrics オプション - オブジェクト
スパンで記述された操作に関連するメトリクスとしてユーザーが追加できる、JSON のシリアライズ可能なキーと数値のオブジェクト (input_tokensoutput_tokenstotal_tokens など)。

notification オプション - オブジェクト
スパンのコンテキストに関してユーザーがタグとして追加できる、JSON のシリアライズ可能なキーと値のペアのオブジェクト (sessionenvironmentsystemversioning など)。タグの詳細については、タグの概要を参照してください。

function llmCall (prompt) {
  const completion = ... // user application logic to invoke LLM
  llmobs.annotate({
    inputData: [{ role: "user", content: "Hello world!" }],
    outputData: [{ role: "assistant", content: "How can I help?" }],
    metadata: { temperature: 0, max_tokens: 200 },
    metrics: { input_tokens: 4, output_tokens: 6, total_tokens: 10 },
    tags: { host: "host_name" }
  })
  return completion
}
llmCall = llmobs.wrap({ kind:'llm', modelName: 'modelName', modelProvider: 'modelProvider' }, llmCall)

function extractData (document) {
  const resp = llmCall(document)
  llmobs.annotate({
    inputData: document,
    outputData: resp,
    tags: { host: "host_name" }
  })
  return resp
}
extractData = llmobs.wrap({ kind: 'workflow' }, extractData)

function performEmbedding () {
  ... // user application logic
  llmobs.annotate(
    undefined, { // this can be set to undefined or left out entirely
      inputData: { text: "Hello world!" },
      outputData: [0.0023064255, -0.009327292, ...],
      metrics: { input_tokens: 4 },
      tags: { host: "host_name" }
    }
  )
}
performEmbedding = llmobs.wrap({ kind: 'embedding', modelName: 'text-embedding-3', modelProvider: 'openai' }, performEmbedding)

function similaritySearch () {
  ... // user application logic
  llmobs.annotate(undefined, {
    inputData: "Hello world!",
    outputData: [{ text: "Hello world is ...", name: "Hello, World! program", id: "document_id", score: 0.9893 }],
    tags: { host: "host_name" }
  })
  return
}
similaritySearch = llmobs.wrap({ kind: 'retrieval', name: 'getRelevantDocs' }, similaritySearch)

SDK には、入力、出力、メトリクス、メタデータを使用してスパンにアノテーションを付けるためのいくつかのメソッドが用意されています。

入力と出力のアノテーション付け

LLMObsSpan インターフェイスの annotateIO() メンバーメソッドを使用して、LLMObsSpan に構造化された入力および出力データを追加します。ここにはオプションの引数と LLM メッセージオブジェクトが含まれます。

引数

引数が null または空の場合、処理は何も行われません。たとえば、inputData が空でない文字列で、outputData が null の場合、inputData のみが記録されます。

inputData オプション - 文字列 または リスト<LLMObs.LLMMessage>
文字列 (非 LLM スパン用)、または LLM スパン用の LLMObs.LLMMessage のリスト。

outputData オプション - 文字列 または リスト<LLMObs.LLMMessage>
文字列 (非 LLM スパン用)、または LLM スパン用の LLMObs.LLMMessage のリスト。

LLM メッセージ

LLM スパンは、LLMObs.LLMMessage オブジェクトを使用して LLM メッセージでアノテーションを付ける必要があります。

LLMObs.LLMMessage オブジェクトは、次の引数を指定して LLMObs.LLMMessage.from() を呼び出すことでインスタンス化できます。

role 必須 - 文字列
メッセージの作成者の役割を記述する文字列。

content 必須 - 文字列
メッセージの内容を含む文字列。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeChat(String userInput) {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    String systemMessage = "You are a helpful assistant";
    Response chatResponse = ... // user application logic to invoke LLM
    llmSpan.annotateIO(
      Arrays.asList(
        LLMObs.LLMMessage.from("user", userInput),
        LLMObs.LLMMessage.from("system", systemMessage)
      ),
      Arrays.asList(
        LLMObs.LLMMessage.from(chatResponse.role, chatResponse.content)
      )
    );
    llmSpan.finish();
    return chatResponse;
  }
}

メトリクスの追加

メトリクスの一括追加

LLMObsSpan インターフェイスの setMetrics() メンバーメソッドは、複数のメトリクスを一括でアタッチするための次の引数を受け付けます。

引数

metrics 必須 - Map<string, number>
スパンで記述された操作に関連するメトリクスを記録するためにユーザーが追加できる JSON のシリアライズ可能なキーと数値のマップ (たとえば、input_tokensoutput_tokenstotal_tokens)。

単一のメトリクスを追加

LLMObsSpan インターフェイスの setMetric() メンバーメソッドは、単一のメトリクスをアタッチするための次の引数を受け付けます。

引数

key 必須 - CharSequence
メトリクスの名前。

value 必須 - intlong、または double
メトリクスの値。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeChat(String userInput) {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    String chatResponse = ... // user application logic to invoke LLM
    llmSpan.setMetrics(Map.of(
      "input_tokens", 617,
      "output_tokens", 338,
      "time_per_output_token", 0.1773
    ));
    llmSpan.setMetric("total_tokens", 955);
    llmSpan.setMetric("time_to_first_token", 0.23);
    llmSpan.finish();
    return chatResponse;
  }
}

タグの追加

タグの詳細については、タグの概要 を参照してください。

タグの一括追加

LLMObsSpan インターフェイスの setTags() メンバーメソッドは、複数のタグを一括でアタッチするための次の引数を受け付けます。

引数

notification 必須 - Map<string, object>
スパンのコンテキストを説明するためにユーザーがタグとして追加できる JSON のシリアライズ可能なキーと値のペアのマップ (たとえば、sessionenvironmentsystem、またはversion)。

単一のタグを追加

LLMObsSpan インターフェイスの setTag() メンバーメソッドは、単一のタグをアタッチするための次の引数を受け付けます。

引数

key 必須 - 文字列
タグのキー。

value 必須 - intlongdoubleboolean、または_String_
タグの値。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeChat(String userInput) {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    String chatResponse = ... // user application logic to invoke LLM
    llmSpan.setTags(Map.of(
      "chat_source", "web",
      "users_in_chat", 3
    ));
    llmSpan.setTag("is_premium_user", true);
    llmSpan.finish();
    return chatResponse;
  }
}

エラーのアノテーション付け

Throwable の追加 (推奨)

LLMObsSpan インターフェイスの addThrowable() メンバーメソッドは、スタックトレースを持つ Throwable をアタッチするための次の引数を受け付けます。

引数

throwable 必須 - Throwable
発生した Throwable/Exception。

エラーメッセージの追加

LLMObsSpan インターフェイスの setErrorMessage() メンバーメソッドは、エラー文字列をアタッチするための次の引数を受け付けます。

引数

errorMessage 必須 - 文字列
エラーメッセージ。

エラーフラグの設定

LLMObsSpan インターフェイスの setError() メンバーメソッドは、操作にエラーがあることを示すための次の引数を受け付けます。

引数

error 必須 - boolean
true の場合、スパンでエラーが発生しています。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeChat(String userInput) {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    String chatResponse = "N/A";
    try {
      chatResponse = ... // user application logic to invoke LLM
    } catch (Exception e) {
      llmSpan.addThrowable(e);
      throw new RuntimeException(e);
    } finally {
      llmSpan.finish();
    }
    return chatResponse;
  }
}

メタデータのアノテーション付け

LLMObsSpan インターフェイスの setMetadata() メンバーメソッドは、次の引数を受け付けます。

metadata 必須 - Map<string, object>
スパンによって記述された入力または出力操作に関連するメタデータを含む、JSON のシリアライズ可能なキーと値のペアのマップです。

import datadog.trace.api.llmobs.LLMObs;

public class MyJavaClass {
  public String invokeChat(String userInput) {
    LLMObsSpan llmSpan = LLMObs.startLLMSpan("my-llm-span-name", "my-llm-model", "my-company", "maybe-ml-app-override", "session-141");
    llmSpan.setMetadata(
      Map.of(
        "temperature", 0.5,
        "is_premium_member", true,
        "class", "e1"
      )
    );
    String chatResponse = ... // user application logic to invoke LLM
    return chatResponse;
  }
}

自動インスツルメンテーションスパンのアノテーション付け

SDK の LLMObs.annotation_context() メソッドは、アノテーションコンテキストがアクティブな間に開始されたすべての自動インスツルメンテーションスパンを変更するために使用できるコンテキストマネージャーを返します。

LLMObs.annotation_context() メソッドは、次の引数を受け付けます。

name オプション - str
アノテーションコンテキスト内で開始される自動インスツルメンテーションスパンのスパン名をオーバーライドする名前です。

prompt オプション - 辞書
LLM 呼び出しに使用されるプロンプトを表す辞書です。完全なスキーマとサポートされているキーについては、プロンプトオブジェクトのドキュメントを参照してください。Prompt オブジェクトを ddtrace.llmobs.utils からインポートし、prompt 引数として渡すこともできます。: この引数は LLM スパンにのみ適用されます。

notification オプション - 辞書
ユーザーがタグとしてスパンに追加できる、JSON のシリアライズ可能なキーと値のペアの辞書です。キーの例: sessionenvsystemversion。タグの詳細については、タグの概要を参照してください。

from ddtrace.llmobs import LLMObs
from ddtrace.llmobs.decorators import workflow

@workflow
def rag_workflow(user_question):
    context_str = retrieve_documents(user_question).join(" ")

    with LLMObs.annotation_context(
        prompt = Prompt(
            id="chatbot_prompt",
            version="1.0.0",
            template="Please answer the question using the provided context: {{question}}\n\nContext:\n{{context}}",
            variables={
                "question": user_question,
                "context": context_str,
            }
        ),
        tags = {
            "retrieval_strategy": "semantic_similarity"
        },
        name = "augmented_generation"
    ):
        completion = openai_client.chat.completions.create(...)
    return completion.choices[0].message.content

SDKの llmobs.annotationContext() は、コールバック関数のスコープ内で開始されたすべての自動インスツルメンテーションスパンを変更するために使用できるコールバック関数を受け付けます。

llmobs.annotationContext() メソッドは、第 1 引数に次のオプションを受け付けます。

name オプション - str
アノテーションコンテキスト内で開始される自動インスツルメンテーションスパンのスパン名をオーバーライドする名前です。

notification オプション - オブジェクト
ユーザーがスパンにタグとして追加できる JSON のシリアライズ可能なキーと値のペアのオブジェクトです。キーの例: sessionenvsystemversion。タグの詳細については、タグの概要を参照してください。

const { llmobs } = require('dd-trace');

function ragWorkflow(userQuestion) {
    const contextStr = retrieveDocuments(userQuestion).join(" ");

    const completion = await llmobs.annotationContext({
      tags: {
        retrieval_strategy: "semantic_similarity"
      },
      name: "augmented_generation"
    }, async () => {
      const completion = await openai_client.chat.completions.create(...);
      return completion.choices[0].message.content;
    });
}

プロンプト追跡

構造化されたプロンプトメタデータを LLM スパンにアタッチすることにより、結果を再現し、変更を監査し、バージョン間でプロンプトのパフォーマンスを比較できるようにします。テンプレートを使用する際、LLM Observability は、テンプレートの内容の変更に基づいてバージョン追跡も提供します。

LLM 呼び出しの前にプロンプトメタデータをアタッチするには、LLMObs.annotation_context(prompt=...) を使用します。スパンアノテーションの詳細については、スパンの強化を参照してください。

引数

prompt 必須の - 辞書
次のプロンプトスキーマに従った型付き辞書。

サポートされているキー:

id (str): このプロンプトの論理識別子。ml_app ごとに一意である必要があります。デフォルトは {ml_app}unnamed_prompt です。 version (str): プロンプトのバージョンタグ (例: “1.0.0”)。詳細については、バージョン追跡を参照してください。 variables (Dict[str, str]): テンプレートのプレースホルダーに入力するために使用される変数。 template (str): プレースホルダーを含むテンプレート文字列 (例: "Translate {{text}} to {{lang}}")。 chat_template (List[Message]): マルチメッセージテンプレート形式。{ “role”: “”, “content”: “