이 제품은 선택한 Datadog 사이트에서 지원되지 않습니다. ().

개요

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 이상 필요).

ddtracerun 명령을 사용하여 애플리케이션을 실행하고 필요한 환경 변수를 지정하여 LLM Observability를 활성화합니다.

참고: 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
필수 string
LLM 데이터를 제출할 대상 Datadog 사이트입니다. 사용자의 사이트: .
DD_LLMOBS_ENABLED
필수 integer 또는 string
LLM Observability로 데이터 전송을 활성화하는 토글입니다. 1 또는 true로 설정해야 합니다.
DD_LLMOBS_ML_APP
선택 사항 string
모든 트레이스와 스팬이 그룹화되는 LLM 애플리케이션, 서비스 또는 프로젝트의 이름입니다. 이를 통해 서로 다른 애플리케이션 또는 실험을 구분할 수 있습니다. 허용되는 문자 및 기타 제약 사항은 애플리케이션 명명 지침을 참조하세요. 주어진 루트 스팬에 대해 이 값을 재정의하려면 여러 애플리케이션 추적을 참조하세요. 제공하지 않으면 DD_SERVICE 값 또는 상위 서비스에서 전달된 DD_LLMOBS_ML_APP 값이 기본값으로 사용됩니다.
참고: ddtrace==3.14.0 이전 버전에서 이 필드는 필수 필드입니다.
DD_LLMOBS_AGENTLESS_ENABLED
선택 사항 integer 또는 string 기본값: false
Datadog Agent를 사용하지 않는 경우에만 필요하며, 이 경우 1 또는 true로 설정해야 합니다.
DD_API_KEY
선택 사항 string
Datadog API 키입니다. Datadog Agent를 사용하지 않는 경우에만 필요합니다.

NODE_OPTIONS="import ddtrace/initialize.mjs"를 사용하여 애플리케이션을 실행하고 필요한 환경 변수를 지정하여 LLM Observability를 활성화합니다.

참고: 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
필수 string
LLM 데이터를 제출할 Datadog 사이트입니다. 사용자의 사이트: .
DD_LLMOBS_ENABLED
필수 integer 또는 string
LLM Observability로 데이터 전송을 활성화하는 토글입니다. 1 또는 true로 설정해야 합니다.
DD_LLMOBS_ML_APP
선택 사항 string
모든 트레이스와 스팬이 그룹화되는 LLM 애플리케이션, 서비스 또는 프로젝트의 이름입니다. 이를 통해 서로 다른 애플리케이션 또는 실험을 구분할 수 있습니다. 허용되는 문자 및 기타 제약 사항은 애플리케이션 명명 지침을 참조하세요. 주어진 루트 스팬에 대해 이 값을 재정의하려면 여러 애플리케이션 추적을 참조하세요. 제공하지 않으면 DD_SERVICE 값 또는 상위 서비스에서 전달된 DD_LLMOBS_ML_APP 값이 기본값으로 사용됩니다.
참고: ddtrace@5.66.0 이전 버전에서 이 필드는 필수 필드입니다.
DD_LLMOBS_AGENTLESS_ENABLED
선택 사항 integer 또는 string 기본값: false
Datadog Agent를 사용하지 않는 경우에만 필요하며, 이 경우 1 또는 true로 설정해야 합니다.
DD_API_KEY
선택 사항 string
Datadog API 키입니다. Datadog Agent를 사용하지 않는 경우에만 필요합니다.

ddtracejava를 사용하여 애플리케이션을 실행하고, 필요한 파라미터를 환경 변수 또는 시스템 속성으로 지정하여 LLM Observability를 활성화합니다.

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
필수 string
LLM 데이터를 제출할 대상 Datadog 사이트입니다. 사용자의 사이트: .
DD_LLMOBS_ENABLED 또는 dd.llmobs.enabled
필수 integer 또는 string
LLM Observability로 데이터 전송을 활성화하는 토글입니다. 1 또는 true로 설정해야 합니다.
DD_LLMOBS_ML_APP 또는 dd.llmobs.ml.app
선택 사항 string
모든 트레이스와 스팬이 그룹화되는 LLM 애플리케이션, 서비스 또는 프로젝트의 이름입니다. 이를 통해 서로 다른 애플리케이션 또는 실험을 구분할 수 있습니다. 허용되는 문자 및 기타 제약 사항은 애플리케이션 명명 지침을 참조하세요. 주어진 루트 스팬에 대해 이 값을 재정의하려면 여러 애플리케이션 추적을 참조하세요. 제공하지 않으면 DD_SERVICE 값 또는 상위 서비스에서 전달된 DD_LLMOBS_ML_APP 값이 기본값으로 사용됩니다.
참고: ddtracejava 1.54.0 이전 버전에서 이 필드는 필수 필드입니다.
DD_LLMOBS_AGENTLESS_ENABLED or dd.llmobs.agentless.enabled
선택 사항 integer 또는 string 기본값: false
Datadog Agent를 사용하지 않는 경우에만 필요하며, 이 경우 1 또는 true로 설정해야 합니다.
DD_API_KEY 또는 dd.api.key
선택 사항 string
Datadog API 키입니다. Datadog Agent를 사용하지 않는 경우에만 필요합니다.

명령줄 설정을 사용하는 대신, 프로그래밍 방식으로도 LLM Observability를 활성화할 수 있습니다.

LLM Observability를 활성화하려면 LLMObs.enable() 함수를 사용하세요.

이 설정 방법을 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
선택 사항 string
모든 트레이스와 스팬이 그룹화되는 LLM 애플리케이션, 서비스 또는 프로젝트의 이름입니다. 이를 통해 서로 다른 애플리케이션 또는 실험을 구분할 수 있습니다. 허용되는 문자 및 기타 제약 사항은 애플리케이션 명명 지침을 참조하세요. 주어진 트레이스에 대해 이 값을 재정의하려면 여러 애플리케이션 추적을 참조하세요. 제공하지 않으면 DD_LLMOBS_ML_APP 값이 기본값으로 사용됩니다.
integrations_enabled 기본값: true
선택 사항 boolean
Datadog에서 지원하는 LLM 통합에 대해 LLM 호출을 자동으로 추적하도록 활성화하는 플래그입니다. 제공하지 않으면 모든 지원되는 LLM 통합이 기본적으로 활성화됩니다. LLM 통합을 사용하지 않으려면 이 값을 false로 설정하세요.
agentless_enabled
선택 사항 boolean 기본값: false
Datadog Agent를 사용하지 않는 경우에만 필요하며, 이 경우 True로 설정해야 합니다. 이 설정은 ddtrace 라이브러리가 Datadog Agent가 필요한 데이터를 전송하지 않도록 구성합니다. 제공하지 않으면 DD_LLMOBS_AGENTLESS_ENABLED 값이 기본값으로 사용됩니다.
site
선택 사항 string
LLM 데이터를 제출할 Datadog 사이트입니다. 사용자의 사이트: . 제공하지 않으면 DD_SITE 값이 기본값으로 사용됩니다.
api_key
선택 사항 string
Datadog API 키입니다. Datadog Agent를 사용하지 않는 경우에만 필요합니다. 제공하지 않으면 DD_API_KEY 값이 기본값으로 사용됩니다.
env
선택 사항 string
애플리케이션의 환경 이름(예: prod, preprod, staging)입니다. 제공하지 않으면 DD_ENV 값이 기본값으로 사용됩니다.
service
선택 사항 string
애플리케이션에 사용되는 서비스의 이름입니다. 제공하지 않으면 DD_SERVICE 값이 기본값으로 사용됩니다.
이 설정 방법을 ddtrace/initialize.mjs 명령과 함께 사용하지 마세요.

LLM Observability를 활성화하려면 init() 함수를 사용하세요.

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
선택 사항 string
모든 트레이스와 스팬이 그룹화되는 LLM 애플리케이션, 서비스 또는 프로젝트의 이름입니다. 이를 통해 서로 다른 애플리케이션 또는 실험을 구분할 수 있습니다. 허용되는 문자 및 기타 제약 사항은 애플리케이션 명명 지침을 참조하세요. 주어진 트레이스에 대해 이 값을 재정의하려면 여러 애플리케이션 추적을 참조하세요. 제공하지 않으면 DD_LLMOBS_ML_APP 값이 기본값으로 사용됩니다.
agentlessEnabled
선택 사항 boolean 기본값: false
Datadog Agent를 사용하지 않는 경우에만 필요하며, 이 경우 true로 설정해야 합니다. 이 설정은 ddtrace 라이브러리가 Datadog Agent가 필요한 데이터를 전송하지 않도록 구성합니다. 제공하지 않으면 DD_LLMOBS_AGENTLESS_ENABLED 값이 기본값으로 사용됩니다.

일반 트레이서 구성 옵션:

site
선택 사항 string
LLM 데이터를 제출할 Datadog 사이트입니다. 사용자의 사이트: . 제공하지 않으면 DD_SITE 값이 기본값으로 사용됩니다.
env
선택 사항 string
애플리케이션의 환경 이름(예: prod, preprod, staging)입니다. 제공하지 않으면 DD_ENV 값이 기본값으로 사용됩니다.
service
선택 사항 string
애플리케이션에 사용되는 서비스의 이름입니다. 제공하지 않으면 DD_SERVICE 값이 기본값으로 사용됩니다.
환경 변수

다음 값을 환경 변수로 설정하세요. 프로그래밍 방식으로는 구성할 수 없습니다.

DD_API_KEY
선택 사항 string
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 함수를 호출한 후 Datadog UI에서 LLM Observability 트레이스가 표시되는지 확인합니다.

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)을 사용하세요. 사용 가능한 스팬 종류의 목록은 스팬 종류 설명서를 참조하세요. 함수 내부 작업을 보다 세밀하게 추적하려면 인라인 메서드를 사용한 스팬 추적을 참조하세요.

스팬 종류

스팬 종류는 필수 항목이며, options 객체에 지정되어 llmobs 트레이싱 함수(trace, wrapdecorate)에 전달됩니다. 지원되는 스팬 종류의 목록은 스팬 종류 설명서를 참조하세요.

참고: 유효하지 않은 스팬 종류의 스팬은 LLM Observability에 제출되지 않습니다.

함수 인수/출력/이름 자동 수집

llmobs.wrap(TypeScript의 경우 llmobs.decorate 포함)은 추적되는 함수의 입력값, 출력값 및 함수 이름을 자동으로 수집하려고 시도합니다. 스팬에 수동으로 정보를 추가해야 하는 경우 스팬 강화를 참조하세요. 입력과 출력에 주석을 달면 자동 수집된 값을 재정의하게 됩니다. 또한 함수 이름을 재정의하려면 llmobs.wrap 함수의 options 객체에 name 속성을 전달하면 됩니다.

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

래핑된 함수의 스팬 종료 조건

llmobs.wraptracer.wrap의 기본 동작을 확장합니다. 함수가 호출될 때 생성된 기본 스팬은 다음 조건에서 종료됩니다.

함수가 Promise를 반환하면 Promise가 해결되거나 거부될 때 스팬이 종료됩니다. 함수의 마지막 파라미터가 콜백인 경우 해당 콜백이 호출될 때 스팬이 종료됩니다. 함수가 콜백을 받지 않고 Promise도 반환하지 않으면 함수 실행이 끝날 때 스팬이 종료됩니다.

다음 예시는 마지막 인수가 콜백인 두 번째 조건을 보여줍니다.

예시

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 호출

Datadog의 LLM 통합에서 지원하는 LLM 제공업체 또는 프레임워크를 사용하는 경우, 이러한 작업을 추적하기 위해 LLM 스팬을 수동으로 시작할 필요가 없습니다.

LLM 호출을 추적하려면 함수 데코레이터 ddtrace.llmobs.decorators.llm()을 사용하세요.

model_name
필수 string
호출된 LLM의 이름입니다.
name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
model_provider
선택 사항 string 기본값: "custom"
모델 제공자의 이름입니다.
참고: 미국 달러로 예상 비용을 표시하려면 model_provideropenai, azure_openai 또는 anthropic 값 중 하나로 설정하세요.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 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으로 지정하고 필요에 따라 options 객체에 다음 인수를 지정하세요.

modelName
선택 사항 string 기본값: "custom"
호출된 LLM의 이름입니다.
name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
modelProvider
선택 사항 string 기본값: "custom"
모델 제공자의 이름입니다.
참고: 미국 달러로 예상 비용을 표시하려면 modelProvideropenai, azure_openai 또는 anthropic 값 중 하나로 설정하세요.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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
선택 사항 String
작업의 이름입니다. 제공하지 않으면 spanName은 스팬 종류로 기본값이 설정됩니다.
modelName
선택 사항 String 기본값: "custom"
호출된 LLM의 이름입니다.
modelProvider
선택 사항 String 기본값: "custom"
모델 제공자의 이름입니다.
참고: 미국 달러로 예상 비용을 표시하려면 modelProvideropenai, azure_openai 또는 anthropic 값 중 하나로 설정하세요.
mlApp
선택 사항 String
해당 작업이 속한 ML 애플리케이션의 이름입니다. null이 아닌 값을 제공하면 애플리케이션 시작 시 제공된 ML 애플리케이션 이름이 재정의됩니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.
sessionId
선택 사항 String
기본 사용자 세션의 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
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

from ddtrace.llmobs.decorators import workflow

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

워크플로 스팬을 추적하려면 스팬 종류를 workflow로 지정하고 필요에 따라 options 객체에 인수를 지정하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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
선택 사항 String
작업의 이름입니다. 제공하지 않으면 spanName은 스팬 종류로 기본값이 설정됩니다.
mlApp
선택 사항 String
해당 작업이 속한 ML 애플리케이션의 이름입니다. null이 아닌 값을 제공하면 애플리케이션 시작 시 제공된 ML 애플리케이션 이름이 재정의됩니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.
sessionId
선택 사항 String
기본 사용자 세션의 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
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

from ddtrace.llmobs.decorators import agent

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

에이전트 실행을 추적하려면 스팬 종류를 agent로 지정하고 필요에 따라 options 객체에 인수를 지정하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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
선택 사항 String
작업의 이름입니다. 제공하지 않으면 spanName은 추적된 함수의 이름으로 기본값이 설정됩니다.
mlApp
선택 사항 String
해당 작업이 속한 ML 애플리케이션의 이름입니다. null이 아닌 값을 제공하면 애플리케이션 시작 시 제공된 ML 애플리케이션 이름이 재정의됩니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.
sessionId
선택 사항 String
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.

도구 호출

도구 호출을 추적하려면 함수 데코레이터 ddtrace.llmobs.decorators.tool()을 사용하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

from ddtrace.llmobs.decorators import tool

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

도구 호출을 추적하려면 스팬 종류를 tool로 지정하고 필요에 따라 options 객체에 인수를 지정하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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
선택 사항 String
작업의 이름입니다. 제공하지 않으면 spanName은 추적된 함수의 이름으로 기본값이 설정됩니다.
mlApp
선택 사항 String
해당 작업이 속한 ML 애플리케이션의 이름입니다. null이 아닌 값을 제공하면 애플리케이션 시작 시 제공된 ML 애플리케이션 이름이 재정의됩니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.
sessionId
선택 사항 String
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.

작업

작업 스팬을 추적하려면 함수 데코레이터 LLMObs.task()를 사용하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

from ddtrace.llmobs.decorators import task

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

작업 스팬을 추적하려면 스팬 종류를 task로 지정하고 필요에 따라 options 객체에 인수를 지정하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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
선택 사항 String
작업의 이름입니다. 제공하지 않으면 spanName은 추적된 함수의 이름으로 기본값이 설정됩니다.
mlApp
선택 사항 String
해당 작업이 속한 ML 애플리케이션의 이름입니다. null이 아닌 값을 제공하면 애플리케이션 시작 시 제공된 ML 애플리케이션 이름이 재정의됩니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.
sessionId
선택 사항 String
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.

임베딩

임베딩 작업을 추적하려면 함수 데코레이터 LLMObs.embedding()을 사용하세요.

참고: 임베딩 스팬의 입력에 주석을 달려면 다른 스팬 유형과 다른 형식을 사용해야 합니다. 임베딩 입력을 지정하는 방법에 대한 자세한 내용은 스팬 강화를 참조하세요.

model_name
필수 string
호출된 LLM의 이름입니다.
name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 설정됩니다.
model_provider
선택 사항 string 기본값: "custom"
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

from ddtrace.llmobs.decorators import embedding

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

임베딩 작업을 추적하려면 스팬 종류를 embedding로 지정하고 필요에 따라 options 객체에 인수를 지정하세요.

참고: 임베딩 스팬의 입력에 주석을 달려면 다른 스팬 유형과 다른 형식을 사용해야 합니다. 임베딩 입력을 지정하는 방법에 대한 자세한 내용은 스팬 강화를 참조하세요.

modelName
선택 사항 string 기본값: "custom"
호출된 LLM의 이름입니다.
name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 설정됩니다.
modelProvider
선택 사항 string 기본값: "custom"
모델 제공자의 이름입니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 ML 애플리케이션의 이름입니다. 자세한 내용은 여러 애플리케이션 추적을 참조하세요.

예시

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

검색

검색 스팬을 추적하려면 함수 데코레이터 ddtrace.llmobs.decorators.retrieval()을 사용하세요.

참고: 검색 스팬의 출력에 주석을 달려면 다른 스팬 유형과 다른 형식을 사용해야 합니다. 검색 출력을 지정하는 방법에 대한 자세한 내용은 스팬 강화를 참조하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
session_id
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
ml_app
선택 사항 string
해당 작업이 속한 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로 지정하고 필요에 따라 options 객체에 다음 인수를 지정하세요.

참고: 검색 스팬의 출력에 주석을 달려면 다른 스팬 유형과 다른 형식을 사용해야 합니다. 검색 출력을 지정하는 방법에 대한 자세한 내용은 스팬 강화를 참조하세요.

name
선택 사항 string
작업의 이름입니다. 제공하지 않으면 name은 추적된 함수의 이름으로 기본값이 설정됩니다.
sessionId
선택 사항 string
기본 사용자 세션의 ID입니다. 자세한 내용은 사용자 세션 추적을 참조하세요.
mlApp
선택 사항 string
해당 작업이 속한 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)

스팬 중첩

현재 스팬이 종료되기 전에 새로운 스팬을 시작하면 두 스팬 간에 자동으로 부모-자식 관계가 추적됩니다. 부모 스팬은 더 큰 작업을 나타내며, 자식 스팬은 그 안의 더 작은 중첩된 하위 작업을 나타냅니다.

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();
  }
}

스팬 강화

여기서 `metrics` 파라미터는 개별 스팬에 속성으로 첨부되는 숫자 값을 의미하며, Datadog 플랫폼 메트릭은 아닙니다. input_tokens, output_tokens, total_tokens와 같이 특정 인식된 키에 대해 Datadog는 이러한 스팬 속성을 사용하여 대시보드와 모니터에서 사용할 수 있는 해당 플랫폼 메트릭(예: ml_obs.span.llm.input.tokens)을 생성합니다.

SDK는 입력, 출력 및 메타데이터로 스팬을 강화하기 위해 LLMObs.annotate() 메서드를 제공합니다.

LLMObs.annotate() 메서드는 다음과 같은 인수를 받습니다.

span
선택 사항 Span 기본값: 현재 활성 스팬
주석을 달 스팬입니다. span이 제공되지 않으면(함수 데코레이터를 사용할 때와 같이) SDK는 현재 활성 스팬에 주석을 답니다.
input_data
선택 사항 JSON serializable type or list of dictionarie
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 serializable type or list of dictionarie
JSON 직렬화 가능 유형(비LLM 스팬용)이거나 {"content": "...", "role": "...", "tool_calls": ...} 형식의 딕셔너리 목록입니다. 여기서 "tool_calls"는 함수 호출 시에 필수 키인 "name", "arguments"와 선택적 키인 "tool_id", "type"를 가진 선택적인 도구 호출 딕셔너리 목록입니다. 참고: 임베딩 스팬은 특수한 케이스로, 다음 형식의 문자열 또는 딕셔너리(또는 딕셔너리 목록)이 필요합니다. {"text": "...", "name": "...", "score": float, "id": "..."}.
tool_definitions
선택 사항 list of dictionaries
함수 호출 시 사용할 도구 정의 딕셔너리 목록입니다. 각 도구 정의는 필수 키인 "name": "..."고 선택적 키인 "description": "...""schema": {...}를 가질 수 있습니다.
metadata
선택 사항 dictionary
사용자가 스팬에서 설명된 입력 또는 출력 작업과 관련된 메타데이터 정보로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 딕셔너리입니다(model_temperature, max_tokens, top_k 등).
metrics
선택 사항 dictionary
사용자가 스팬에서 설명된 작업과 관련된 메트릭으로 추가할 수 있는 JSON 직렬화 가능한 키와 숫자 값의 딕셔너리입니다(input_tokens, output_tokens, total_tokens, time_to_first_token 등). time_to_first_token의 단위는 초이며, 기본적으로 제공되는 duration 메트릭과 유사합니다.
tags
선택 사항 dictionary
사용자가 스팬에 태그로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 딕셔너리입니다. 예시 키: session, env, systemversion. 태그에 대한 자세한 내용은 태그 시작하기를 참조하세요.

예시

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 기본값: 현재 활성 스팬
주석을 달 스팬입니다. span이 제공되지 않으면(함수 래퍼를 사용할 때와 같이) SDK는 현재 활성 스팬에 주석을 답니다.
annotationOptions
필수 object
스팬에 주석을 달기 위한 다양한 유형의 데이터 객체입니다.

annotationOptions 객체는 다음을 포함할 수 있습니다.

inputData
선택 사항 JSON serializable type or list of objects
JSON 직렬화 가능 유형(비LLM 스팬용)이거나 {role: "...", content: "..."}(LLM 스팬용) 형식의 딕셔너리 목록입니다. 참고: 임베딩 스팬은 특별한 케이스로, {text: "..."} 형식의 문자열 또는 객체(또는 객체 목록)가 필요합니다.
outputData
선택 사항 JSON serializable type or list of objects
JSON 직렬화 가능 유형(비LLM 스팬용)이거나 {role: "...", content: "..."}(LLM 스팬용) 형식의 객체 목록입니다. 참고: 검색 스팬은 특별한 케이스로, {text: "...", name: "...", score: number, id: "..."} 형식의 문자열 또는 객체(또는 객체 목록)가 필요합니다.
metadata
선택 사항 object
사용자가 스팬에서 설명된 입력 또는 출력 작업과 관련된 메타데이터 정보로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 객체입니다(model_temperature, max_tokens, top_k 등).
metrics
선택 사항 object
사용자가 스팬에서 설명된 작업과 관련된 메트릭으로 추가할 수 있는 JSON 직렬화 가능한 키와 숫자 값의 객체입니다(input_tokens, output_tokens, total_tokens 등).
tags
선택 사항 object
사용자가 스팬의 컨텍스트에 대한 태그로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 객체입니다(session, environment, system, versioning 등). 태그에 대한 자세한 내용은 태그 시작하기를 참조하세요.

예시

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
선택 사항 String 또는 List<LLMObs.LLMMessage>
문자열(비LLM 스팬용) 또는 LLMObs.LLMMessage(LLM 스팬용) 목록입니다.
outputData
선택 사항 String 또는 List<LLMObs.LLMMessage>
문자열(비LLM 스팬용) 또는 LLMObs.LLMMessage(LLM 스팬용) 목록입니다.

LLM 메시지

LLM 스팬은 LLMObs.LLMMessage 객체를 사용하여 LLM 메시지로 주석을 달아야 합니다.

LLMObs.LLMMessage 객체는 다음 인수를 사용하여 LLMObs.LLMMessage.from()을 호출하여 인스턴스화할 수 있습니다:

role
필수 String
메시지 작성자의 역할을 설명하는 문자열입니다.
content
필수 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 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;
  }
}

메트릭 추가

메트릭 일괄 추가

setMetrics() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 여러 메트릭을 일괄 연결하기 위해 다음 인수를 허용합니다.

인수
metrics
필수 Map<string, number>
사용자가 스팬에서 설명된 작업과 관련된 메트릭을 기록하기 위해 추가할 수 있는 JSON 직렬화 가능한 키와 숫자 값의 맵입니다(예: input_tokens, output_tokens 또는 total_tokens).

단일 메트릭 추가

setMetric() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 단일 메트릭을 연결하기 위해 다음 인수를 허용합니다.

인수
key
필수 CharSequence
메트릭의 이름입니다.
value
필수 int, long 또는 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;
  }
}

태그 추가

태그에 대한 자세한 내용은 태그 시작하기를 참조하세요.

태그 일괄 추가

setTags()LLMObsSpan 인터페이스의 구성원 메서드로, 여러 태그를 일괄 연결하기 위해 다음 인수를 허용합니다.

인수
tags
필수 Map<string, object>
사용자가 스팬의 컨텍스트를 설명하기 위해 태그로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 맵입니다(예: session, environment, system 또는 version).

단일 태그 추가

setTag() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 단일 태그를 연결하기 위해 다음 인수를 허용합니다.

인수
key
필수 String
태그의 키입니다.
value
필수 int, long, double, boolean, 또는 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;
  }
}

오류에 주석 달기

예외 추가하기(권장)

addThrowable() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 스택 트레이스가 포함된 예외를 연결하기 위해 다음 인수를 허용합니다.

인수
throwable
필수 Throwable
발생한 예외입니다.

오류 메시지 추가하기

setErrorMessage() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 오류 문자열을 연결하기 위해 다음 인수를 허용합니다.

인수
errorMessage
필수 String
오류 메시지입니다.

오류 플래그 설정하기

setError() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 작업의 오류를 나타내기 위해 다음 인수를 허용합니다.

인수
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;
  }
}

메타데이터에 주석 달기

setMetadata() 메서드는 LLMObsSpan 인터페이스의 구성원 메서드로, 다음 인수를 허용합니다.

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
선택 사항 dictionary
LLM 호출에 사용된 프롬프트를 나타내는 딕셔너리입니다. 전체 스키마 및 지원되는 키에 대한 설명서는 프롬프트 객체 설명서를 참조하세요. 또한 Prompt 객체를 ddtrace.llmobs.utils에서 가져와 prompt 인수로 전달할 수 있습니다. 참고: 이 인수는 LLM 스팬에만 적용됩니다.
tags
선택 사항 dictionary
사용자가 스팬에 태그로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 딕셔너리입니다. 예시 키: session, env, systemversion. 태그에 대한 자세한 내용은 태그 시작하기를 참조하세요.

예시

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() 메서드는 첫 번째 인수에 대해 다음 옵션을 허용합니다.

name
선택 사항 str
주석 컨텍스트 내에서 시작된 모든 자동 계측된 스팬의 스팬 이름을 재정의하는 이름입니다.
tags
선택 사항 object
사용자가 스팬에 태그로 추가할 수 있는 JSON 직렬화 가능한 키-값 쌍의 객체입니다. 예시 키: session, env, systemversion. 태그에 대한 자세한 내용은 태그 시작하기를 참조하세요.

예시

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
필수 dictionary
아래의 프롬프트 스키마를 따르는 유형화된 딕셔너리입니다.

지원되는 키:

id (str): 이 프롬프트의 논리적 식별자입니다. 각 ml_app마다 고유해야 합니다. 기본값은 {ml_app}unnamed_prompt입니다. version (str): 프롬프트의 버전 태그입니다(예: “1.0.0”). 자세한 내용은 버전 추적을 참조하세요. variables (Dict[str, str]): 템플릿 자리표시자를 채우는 데 사용되는 변수입니다. template (str): 자리표시자가 포함된 템플릿 문자열입니다(예: "Translate {{text}} to {{lang}}"). {{text}} to {{lang}}"). chat_template(목록[메시지]): 다중 메시지 템플릿 형식입니다.{ “role”: “”, “content”: “