LLM Observability no está disponible en el sitio seleccionado ().
Información general
El SDK de LLM Observability para Node.js mejora la observabilidad de tus aplicaciones de LLM basadas en JavaScript. El SDK es compatible con las versiones 16 y posteriores de Node.js. Para obtener información sobre la compatibilidad de integración de LLM Observability, consulta Auto Instrumentation.
Puedes instalar y configurar el rastreo de varias operaciones como flujos de trabajo, tareas y llamadas a la API con funciones envueltas o bloques rastreados. También puedes anotar estas trazas (traces) con metadatos para obtener una visión más profunda del rendimiento y el comportamiento de tus aplicaciones, así como admitir varios servicios de LLM o modelos del mismo entorno.
Configuración
Requisitos previos
Debes tener instalada la última versión del paquete dd-trace:
Ejecuta tu aplicación con NODE_OPTIONS="--import dd-trace/initialize.mjs" y especifica las variables de entorno requeridas para activar LLM Observability.
Nota: dd-trace/initialize.mjs activa automáticamente todas las integraciones de APM.
obligatorio; cadena. El sitio de Datadog para enviar tus datos de LLM. Tu sitio es .
DD_LLMOBS_ENABLED
obligatorio; número entero o cadena. Activa esta opción para enviar los datos a LLM Observability. Debe establecerse en 1 o true.
DD_LLMOBS_ML_APP
obligatorio; cadena. El nombre de tu aplicación, servicio o proyecto de LLM, donde se agrupan todas las trazas y tramos (spans). Esto ayuda a distinguir entre diferentes aplicaciones o experimentos. Consulta las Directrices de denominación de aplicaciones para conocer los caracteres permitidos y otras restricciones. Para anular este valor en un tramo raíz específico, consulta Rastreo de varias aplicaciones.
DD_LLMOBS_AGENTLESS_ENABLED
opcional; número entero o cadena. Valor predeterminado: false. Solo se requiere si no utilizas el Datadog Agent, en cuyo caso se debe establecer en 1 o true.
DD_API_KEY
opcional; cadena. Tu clave de API de Datadog. Solo se requiere si no utilizas el Datadog Agent.
Configuración del código
Activa LLM Observability mediante programación a través de la función init() en lugar de ejecutarla con el comando dd-trace/initialize.mjs. Nota: No utilices este método de configuración con el comando dd-trace/initialize.mjs.
Estas opciones se establecen en la configuración de llmobs:
mlApp
opcional; cadena. El nombre de tu aplicación, servicio o proyecto de LLM, donde se agrupan todas las trazas y tramos. Esto ayuda a distinguir entre diferentes aplicaciones o experimentos. Consulta las Directrices de denominación de aplicaciones para conocer los caracteres permitidos y otras restricciones. Para anular este valor en una traza específica, consulta Rastreo de varias aplicaciones. Si no se especifica, el valor predeterminado es DD_LLMOBS_ML_APP.
agentlessEnabled
opcional; booleano. Valor predeterminado: false. Solo se requiere si no utilizas el Datadog Agent, en cuyo caso debe establecerse en true. Esto configura la biblioteca dd-trace para no enviar ningún dato que requiera el Datadog Agent. Si no se especifica, el valor predeterminado es DD_LLMOBS_AGENTLESS_ENABLED.
Estas opciones pueden establecerse en la configuración general del rastreador:
env
opcional; cadena. El nombre del entorno de tu aplicación (ejemplos: prod, pre-prod, staging). Si no se especifica, el valor predeterminado es DD_ENV.
service
opcional; cadena. El nombre del servicio utilizado para tu aplicación. Si no se especifica, el valor predeterminado es DD_SERVICE.
DD_API_KEY y DD_SITE se leen desde las variables de entorno para su configuración, por lo que no se pueden configurar mediante programación.
Configuración de AWS Lambda
Utiliza la función llmobs.flush() para enviar todos los tramos restantes del rastreador a LLM Observability al final de la función de Lambda.
Directrices de denominación de aplicaciones
El nombre de tu aplicación (el valor de DD_LLMOBS_ML_APP) debe ser una cadena Unicode en minúsculas. Puede contener los caracteres que se indican abajo:
Caracteres alfanuméricos
Guiones bajos
Signos de resta
Dos puntos
Puntos
Barras
El nombre puede tener hasta 193 caracteres y no puede contener guiones bajos contiguos ni finales.
Rastreo de tramos
Para rastrear un tramo, utiliza llmobs.wrap(options, function) como envoltura de función en la función que deseas rastrear. Para ver una lista de los tipos de tramo disponibles, consulta la documentación de tipos de tramos. Para lograr un rastreo más detallado de las operaciones dentro de las funciones, consulta Rastreo de tramos con métodos en línea.
Tipos de tramos
Los tipos de tramos son obligatorios, y se especifican en el objeto options que se pasa a las funciones de rastreo de llmobs (trace, wrap y decorate). Consulta la documentación de tipos de tramos para ver una lista de los tipos de tramos compatibles.
Nota: Los tramos con un tipo de tramo no válido no se envían a LLM Observability.
Captura automática de los argumentos, las salidas y el nombre de una función
llmobs.wrap, junto con llmobs.decorate para TypeScript, intenta capturar automáticamente las entradas, las salidas y el nombre de la función que se rastrea. Si necesitas anotar manualmente un tramo, consulta Anotación de un tramo. Las entradas y salidas que anotes anularán la captura automática. Además, para anular el nombre de la función, pasa la propiedad name del objeto options a la función llmobs.wrap:
functionprocessMessage(){...// lógica de la aplicación del usuario
return}processMessage=llmobs.wrap({kind:'workflow',name:'differentFunctionName'},processMessage)
Tramo de LLM
Nota: Si utilizas cualquier proveedor o marco de LLM compatible con las integraciones de LLM de Datadog, no necesitas iniciar manualmente un tramo de LLM para rastrear estas operaciones.
Para rastrear un tramo de LLM, especifica el tipo de tramo como llm y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Argumentos
modelName
opcional; cadena. Valor predeterminado: "custom". El nombre del LLM invocado.
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
modelProvider
opcional; cadena. Valor predeterminado: "custom". El nombre del proveedor del modelo.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functionllmCall(){constcompletion=...// lógica de la aplicación del usuario para invocar a LLM
returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Tramo de flujo de trabajo
Para rastrear un tramo de LLM, especifica el tipo de tramo como workflow y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Argumentos
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functionprocessMessage(){...// lógica de la aplicación del usuario
return}processMessage=llmobs.wrap({kind:'workflow'},processMessage)
Tramo de Agent
Para rastrear un tramo de LLM, especifica el tipo de tramo como agent y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Argumentos
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functionreactAgent(){...// lógica de la aplicación del usuario
return}reactAgent=llmobs.wrap({kind:'agent'},reactAgent)
Tramo de herramienta
Para rastrear un tramo de LLM, especifica el tipo de tramo como tool y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Argumentos
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functioncallWeatherApi(){...// lógica de la aplicación del usuario
return}callWeatherApi=llmobs.wrap({kind:'tool'},callWeatherApi)
Tramo de tarea
Para rastrear un tramo de LLM, especifica el tipo de tramo como task y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Argumentos
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functionsanitizeInput(){...// lógica de la aplicación del usuario
return}sanitizeInput=llmobs.wrap({kind:'task'},sanitizeInput)
Tramo de inserción
Para rastrear un tramo de LLM, especifica el tipo de tramo como embedding y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Nota: La anotación de las entradas de un tramo de inserción requiere un formato diferente al de otros tipos de tramos. Consulta Anotación de un tramo para obtener más detalles sobre cómo especificar entradas de inserción.
Argumentos
modelName
opcional; cadena. Valor predeterminado: "custom". El nombre del LLM invocado.
name
opcional; cadena. El nombre de la operación. Si no se especifica, name se establece de forma predeterminada como el nombre de la función rastreada.
modelProvider
opcional; cadena. Valor predeterminado: "custom". El nombre del proveedor del modelo.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
functionperformEmbedding(){...// lógica de la aplicación del usuario
return}performEmbedding=llmobs.wrap({kind:'embedding',modelName:'text-embedding-3',modelProvider:'openai'},performEmbedding)
Tramo de recuperación
Para rastrear un tramo de LLM, especifica el tipo de tramo como retrieval y, de manera opcional, especifica los siguientes argumentos en el objeto options.
Nota: La anotación de las salidas de un tramo de recuperación requiere un formato diferente al de otros tipos de tramos. Consulta Anotación de un tramo para obtener más detalles sobre cómo especificar salidas de recuperación.
Argumentos
name
opcional; cadena. El nombre de la operación. Si no se especifica, name es de forma predeterminada el nombre de la función rastreada.
opcional; cadena. El nombre de la aplicación de ML a la que pertenece la operación. Consulta Rastreo de varias aplicaciones para obtener más información.
Ejemplo
A continuación se incluye también un ejemplo de anotación de un tramo. Para obtener más información, consulta Anotación de un tramo.
functiongetRelevantDocs(question){constcontextDocuments=...// lógica de la aplicación del usuario
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)
Condiciones de finalización de un tramo para una función envuelta
llmobs.wrap extiende el comportamiento subyacente de tracer.wrap. El tramo subyacente creado cuando se llama a la función finaliza bajo las siguientes condiciones:
Si la función devuelve Promise, el tramo finaliza cuando la promesa se resuelve o se rechaza.
Si la función toma una devolución de llamada como el último parámetro, entonces el tramo finaliza cuando se llama a esa devolución de llamada.
Si la función no acepta una devolución de llamada y no devuelve Promise, entonces el tramo finaliza al final de la ejecución de la función.
En el siguiente ejemplo, se demuestra la segunda condición, en la que el último argumento es una devolución de llamada:
Ejemplo
constexpress=require('express')constapp=express()functionmyAgentMiddleware(req,res,next){consterr=...// lógica de la aplicación del usuario
// el tramo de esta función finaliza cuando se llama a `next`
next(err)}myAgentMiddleware=llmobs.wrap({kind:'agent'},myAgentMiddleware)app.use(myAgentMiddleware)
Si la aplicación no utiliza la función de devolución de llamada, lo recomendado es usar un bloque rastreado en línea en su lugar. Consulta Rastreo de tramos con métodos en línea para obtener más información.
constexpress=require('express')constapp=express()functionmyAgentMiddleware(req,res){// la devolución de llamada `next` no se utiliza aquí
returnllmobs.trace({kind:'agent',name:'myAgentMiddleware'},()=>{returnres.status(200).send('Hello World!')})}app.use(myAgentMiddleware)
Rastreo de las sesiones de usuario
El rastreo de sesiones permite asociar varias interacciones a un usuario determinado. Al iniciar un tramo raíz para una nueva traza o tramo en un nuevo proceso, especifica el argumento sessionId con el ID de cadena de la sesión de usuario subyacente:
El SDK incluye el método llmobs.annotate() para anotar tramos con entradas, salidas y metadatos.
Argumentos
El método LLMObs.annotate() acepta los siguientes argumentos:
span
opcional; tramo. Valor predeterminado: el tramo activo actual. El tramo que se va a anotar. Si no se especifica span (como cuando se utilizan envolturas de función), el SDK anota el tramo activo actual.
annotationOptions
obligatorio; objeto. Un objeto de diferentes tipos de datos con los que se va a anotar el tramo.
El objeto annotationOptions puede contener lo siguiente:
inputData
opcional; tipo JSON serializable o lista de objetos. Un tipo JSON serializable (para tramos que no son de LLM) o una lista de diccionarios con este formato: {role: "...", content: "..."} (para tramos de LLM). Nota: Los tramos de inserción son un caso especial y requieren una cadena o un objeto (o una lista de objetos) con este formato: {text: "..."}.
outputData
opcional; tipo JSON serializable o lista de objetos. Un tipo JSON serializable (para tramos que no son de LLM) o una lista de objetos con este formato: {role: "...", content: "..."} (para tramos de LLM). Nota: Los tramos de recuperación son un caso especial y requieren una cadena o un objeto (o una lista de objetos) con este formato: {text: "...", name: "...", score: number, id: "..."}.
metadata
opcional; objeto. Un objeto de pares de clave-valor JSON serializables que los usuarios pueden añadir como información de metadatos relevante para la operación de entrada o salida que describe el tramo (model_temperature, max_tokens, top_k, etc.).
metrics
opcional; objeto. Un objeto de claves JSON serializables y valores numéricos que los usuarios pueden añadir como métricas relevantes para la operación que describe el tramo (input_tokens, output_tokens, total_tokens, etc.).
tags
opcional; objeto. Un objeto de pares de clave-valor JSON serializables que los usuarios pueden añadir como etiquetas en relación con el contexto del tramo (session, environment, system, versioning, etc.). Para obtener más información sobre las etiquetas, consulta Empezando con las etiquetas (tags).
Ejemplo
functionllmCall(prompt){constcompletion=...// lógica de la aplicación del usuario para invocar a 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"}})returncompletion}llmCall=llmobs.wrap({kind:'llm',modelName:'modelName',modelProvider:'modelProvider'},llmCall)functionextractData(document){constresp=llmCall(document)llmobs.annotate({inputData:document,outputData:resp,tags:{host:"host_name"}})returnresp}extractData=llmobs.wrap({kind:'workflow'},extractData)functionperformEmbedding(){...// lógica de la aplicación del usuario
llmobs.annotate(undefined,{// esto puede establecerse como indefinido o descartarse por completo
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)functionsimilaritySearch(){...// lógica de la aplicación del usuario
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)
Evaluaciones
El SDK de LLM Observability incluye los métodos llmobs.exportSpan() y llmobs.submitEvaluation() para ayudar a que tu aplicación de LLM rastreada envíe evaluaciones a LLM Observability.
Exportación de un tramo
llmobs.exportSpan() puede utilizarse para extraer el contexto del tramo de un tramo. Tendrás que utilizar este método para asociar tu evaluación con el tramo correspondiente.
Argumentos
El método llmobs.exportSpan() acepta el siguiente argumento:
span
opcional; tramo. El tramo del que se va a extraer el contexto del tramo (los ID de tramo y traza). Si no se especifica (como cuando se utilizan envolturas de función), el SDK exporta el tramo activo actual.
Ejemplo
functionllmCall(){constcompletion=...// lógica de la aplicación del usuario para invocar a LLM
constspanContext=llmobs.exportSpan()returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Enviar evaluaciones
llmobs.submitEvaluation() puede utilizarse para enviar una evaluación personalizada asociada a un determinado tramo.
Argumentos
El método llmobs.submitEvaluation() acepta los siguientes argumentos:
span_context
obligatorio; diccionario. El contexto del tramo al que se va a asociar la evaluación. Debería ser la salida de LLMObs.export_span().
evaluationOptions
obligatorio; objeto. Un objeto de los datos de evaluación.
El objeto evaluationOptions puede contener lo siguiente:
label
obligatorio; cadena. El nombre de la evaluación.
metricType
obligatorio; cadena. El tipo de evaluación. Debe ser “categórica” o “puntuación”.
value
obligatorio; cadena o tipo numérico. El valor de la evaluación. Debe ser una cadena (para categórico metric_type) o un número (para puntuación metric_type).
tags
opcional; diccionario. Un diccionario de pares de clave-valor de cadena que los usuarios pueden añadir como etiquetas con respecto a la evaluación. Para obtener más información sobre las etiquetas, consulta Empezando con las etiquetas (tags).
Ejemplo
functionllmCall(){constcompletion=...// lógica de la aplicación del usuario para invocar a LLM
constspanContext=llmobs.exportSpan()llmobs.submitEvaluation(spanContext,{label:"harmfulness",metricType:"score",value:10,tags:{evaluationProvider:"ragas"}})returncompletion}llmCall=llmobs.wrap({kind:'llm',name:'invokeLLM',modelName:'claude',modelProvider:'anthropic'},llmCall)
Rastreo avanzado
Rastreo de tramos con métodos en línea
El SDK llmobs incluye un método en línea correspondiente para rastrear automáticamente la operación que implica un bloque de código determinado. Estos métodos tienen la misma firma de argumentos que sus homólogos de envoltura de función, con el añadido de que se requiere name, ya que el nombre no se puede deducir de una devolución de llamada anónima. Este método finalizará el tramo bajo las siguientes condiciones:
Si la función devuelve Promise, el tramo finaliza cuando la promesa se resuelve o se rechaza.
Si la función toma una devolución de llamada como el último parámetro, entonces el tramo finaliza cuando se llama a esa devolución de llamada.
Si la función no acepta una devolución de llamada y no devuelve Promise, entonces el tramo finaliza al final de la ejecución de la función.
Ejemplo sin una devolución de llamada
functionprocessMessage(){returnllmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},workflowSpan=>{...// lógica de la aplicación del usuario
return})}
Ejemplo con una devolución de llamada
functionprocessMessage(){returnllmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},(workflowSpan,cb)=>{...// lógica de la aplicación del usuario
letmaybeError=...cb(maybeError)// el tramo finalizará aquí y se etiquetará el error si no es nulo o indefinido
return})}
El tipo de devolución de esta función coincide con el tipo de devolución de la función rastreada:
functionprocessMessage(){constresult=llmobs.trace({kind:'workflow',name:'processMessage',sessionId:'<SESSION_ID>',mlApp:'<ML_APP>'},workflowSpan=>{...// lógica de la aplicación del usuario
return'hello world'})console.log(result)// 'hola, mundo'
returnresult}
Decoradores de función en TypeScript
El SDK de Observabilidad LLM para Node.js incluye una función llmobs.decorate que sirve como decorador de función para aplicaciones de TypeScript. Este comportamiento de rastreo de funciones es el mismo que llmobs.wrap.
Ejemplo
// index.ts
importtracerfrom'dd-trace';tracer.init({llmobs:{mlApp:"<YOUR_ML_APP_NAME>",},});const{llmobs}=tracer;classMyAgent{@llmobs.decorate({kind:'agent'})asyncrunChain(){...// lógica de la aplicación del usuario
return}}
Descarga forzada en entornos serverless
llmobs.flush() es una función de bloqueo que envía todos los datos de LLM Observability almacenados en búfer al backend de Datadog. Esto puede ser útil en entornos serverless para evitar que una aplicación se desconecte hasta que se envíen todas las trazas de LLM Observability.
Rastreo de varias aplicaciones
El SDK admite el rastreo de varias aplicaciones de LLM desde el mismo servicio.
Puedes configurar una variable de entorno DD_LLMOBS_ML_APP con el nombre de tu aplicación de LLM, en la que se agruparán de forma predeterminada todos los tramos generados.
Si quieres anular esta configuración y utilizar el nombre de una aplicación de LLM diferente en un tramo raíz determinado, pasa el argumento mlApp con el nombre de cadena de la aplicación de LLM subyacente al iniciar un tramo raíz para una nueva traza o tramo en un nuevo proceso.
functionprocessMessage(){...// lógica de la aplicación del usuario
return}processMessage=llmobs.wrap({kind:'workflow',name:'processMessage',mlApp:'<NON_DEFAULT_ML_APP_NAME>'},processMessage)
Rastreo distribuido
El SDK admite el rastreo a través de servicios o hosts distribuidos. El rastreo distribuido funciona mediante la propagación de la información del tramo a través de las solicitudes web.
La biblioteca dd-trace incluye integraciones listas para usar que admiten el trazado distribuido de marcos web populares. Requerir el rastreador activa automáticamente estas integraciones, pero puedes desactivarlas de manera opcional con el siguiente código:
consttracer=require('dd-trace').init({llmobs:{...},})tracer.use('http',false)// desactiva la integración http