Tag: Langfuse

  • Observabilidad en LLMs: traza, mide y depura tus agentes de IA

    Observabilidad en LLMs: traza, mide y depura tus agentes de IA

    El equipo había estado tres semanas construyendo un agente de soporte técnico. Funcionaba bien en local. Lo lanzaron a producción un lunes por la mañana.

    El viernes tenían una factura de $1.200 en tokens, tres tickets de clientes con respuestas completamente inventadas y ninguna pista de en qué paso del flujo había empezado a fallar todo.

    El agente había estado corriendo. Respondiendo. Consumiendo. Pero nadie podía ver qué estaba pasando dentro.

    Ese es el problema que resuelve la observabilidad en LLMs — el conjunto de técnicas que permite registrar, medir y analizar cada paso de un agente de IA en producción: los prompts enviados, las herramientas invocadas, los tokens consumidos y los errores producidos. Si estás construyendo cualquier cosa con IA en producción, necesitas entenderla antes de que te pase lo mismo.


    El problema real: los LLMs son cajas negras que facturan

    Con una API REST tradicional tienes un contrato claro: envías una petición, recibes una respuesta, mides el tiempo, logueas el error. La traza es determinista.

    Con un LLM, el contrato se rompe. Puedes enviar el mismo prompt dos veces y recibir respuestas distintas. Un agente puede invocar herramientas en un orden diferente al esperado. El modelo puede alucinarse con un dato en el paso 3 de 7 y tú solo ves el resultado final — correcto en formato, incorrecto en contenido.

    Sin observabilidad, estás volando a ciegas. Y en producción, volar a ciegas con un LLM significa costos impredecibles, degradación silenciosa de calidad y bugs que no aparecen en ningún test.


    Los tres pilares de la observabilidad en LLMs

    La observabilidad clásica tiene tres dimensiones. En el mundo de los LLMs, cada una significa algo distinto.

    Trazas (Traces)

    Una traza registra el camino completo de una ejecución: qué prompt se envió, qué herramientas se llamaron, en qué orden, con qué inputs y qué outputs. En un agente con múltiples pasos, una traza te muestra el árbol completo de decisiones — no solo el resultado final.

    Es la diferencia entre saber que tu agente “falló” y saber exactamente en qué llamada a qué herramienta empezó a descarrilarse.

    Métricas

    Latencia por llamada, costo en tokens (input + output), tasa de éxito de herramientas, número de reintentos. Estas métricas agregadas te dicen si tu sistema está degradándose con el tiempo o si hay un prompt específico que consume diez veces más tokens que los demás.

    Logs estructurados

    No los logs de consola que escribes para depurar en local. Logs que capturen el contexto completo de cada ejecución: qué usuario lanzó la petición, qué versión del prompt se usó, qué modelo, qué temperatura. Logs que puedas consultar después cuando alguien reporte un comportamiento extraño hace 48 horas.


    Herramientas de observabilidad LLM en 2026

    Cinco herramientas que cualquier developer que construye con IA debería conocer:

    Herramienta Tipo Self-hosted Stack ideal Plan gratuito
    Langfuse SDK + plataforma ✅ Sí Cualquier API 50k obs/mes
    LangSmith Plataforma ❌ No LangChain Sí (limitado)
    Helicone Proxy ❌ No Multi-proveedor
    Arize Phoenix Análisis offline ✅ Sí Evaluación por lotes Open source
    OpenTelemetry GenAI Estándar ✅ Sí Stacks OTEL existentes Open source

    Langfuse — El estándar open source. Puedes autohospedarlo o usar su cloud. Tiene SDK para TypeScript, Python e integración nativa con LangChain, Vercel AI SDK y llamadas directas a la API de Anthropic u OpenAI. Es la opción que recomiendo si quieres control total sobre tus datos.

    LangSmith — El producto de LangChain. Excelente si ya usas LangChain en tu stack, pero te ata al ecosistema. Para proyectos con llamadas directas a la API, Langfuse gana en flexibilidad.

    Helicone — Proxy que se pone delante de cualquier llamada a la mayoría de proveedores LLM (OpenAI, Anthropic, Azure, LiteLLM y otros). Configuración en dos minutos, observabilidad inmediata. Ideal para proyectos donde no puedes tocar el código de integración o quieres monitoreo rápido sin instrumentación.

    Arize Phoenix — Enfocado en evaluación y análisis offline. Útil cuando quieres analizar lotes de ejecuciones para detectar problemas de calidad sistemáticos, no solo monitoreo en tiempo real.

    Semantic conventions for generative AI systems (OTel GenAI) — El estándar OTEL para IA lleva trazas de LLMs al stack de observabilidad que ya tienes (Grafana, Datadog, Honeycomb). Si tu empresa ya tiene infraestructura OTEL, esta es la forma de integrar los LLMs sin añadir otra herramienta.


    Implementación real con TypeScript y Langfuse

    Suficiente teoría. Esto es cómo lo implementas en un proyecto TypeScript.

    Primero, instala el SDK (versión actual: langfuse@3.x):

    npm install langfuse
    

    Inicializa el cliente una sola vez en tu aplicación — en un módulo singleton si usas NestJS, en un archivo de configuración si es un script:

    import Langfuse from "langfuse";
    
    export const langfuse = new Langfuse({
      publicKey: process.env.LANGFUSE_PUBLIC_KEY!,
      secretKey: process.env.LANGFUSE_SECRET_KEY!,
      baseUrl: "https://cloud.langfuse.com", // o tu instancia autohospedada
    });
    

    Ahora instrumenta una llamada a Claude. El patrón es siempre el mismo: creas una traza, creas una generación dentro de esa traza, ejecutas la llamada y registras el resultado:

    import Anthropic from "@anthropic-ai/sdk";
    import { langfuse } from "./langfuse-client";
    
    const client = new Anthropic();
    
    async function generateSupportResponse(
      userMessage: string,
      userId: string
    ): Promise<string> {
      // Abre la traza — representa toda la operación de negocio
      const trace = langfuse.trace({
        name: "support-response",
        userId,
        metadata: { channel: "web" },
      });
    
      // Crea una generación — representa una sola llamada al LLM
      const generation = trace.generation({
        name: "claude-response",
        model: "claude-sonnet-4-6",
        input: [{ role: "user", content: userMessage }],
      });
    
      try {
        const response = await client.messages.create({
          model: "claude-sonnet-4-6",
          max_tokens: 1024,
          messages: [{ role: "user", content: userMessage }],
        });
    
        const outputText =
          response.content[0].type === "text" ? response.content[0].text : "";
    
        // Registra la respuesta y el uso de tokens
        generation.end({
          output: outputText,
          usage: {
            input: response.usage.input_tokens,
            output: response.usage.output_tokens,
          },
        });
    
        return outputText;
      } catch (error) {
        // Registra errores también — son datos cruciales
        generation.end({
          level: "ERROR",
          statusMessage: error instanceof Error ? error.message : "Unknown error",
        });
        throw error;
      } finally {
        // Vacía el buffer antes de cerrar el proceso
        await langfuse.shutdownAsync();
      }
    }
    

    Para un agente con múltiples pasos — por ejemplo, uno que busca en una base de datos antes de responder — anidas spans dentro de la traza:

    async function agentWithToolCall(query: string, userId: string) {
      const trace = langfuse.trace({
        name: "agent-with-tools",
        userId,
        input: { query },
      });
    
      // Span para la búsqueda en base de datos
      const searchSpan = trace.span({
        name: "database-search",
        input: { query },
      });
    
      const searchResults = await searchDatabase(query);
    
      searchSpan.end({
        output: { resultCount: searchResults.length },
      });
    
      // Generación con los resultados como contexto
      const generation = trace.generation({
        name: "synthesis",
        model: "claude-sonnet-4-6",
        input: buildPromptWithContext(query, searchResults),
      });
    
      const response = await callClaude(query, searchResults);
    
      generation.end({ output: response });
      trace.update({ output: { response } });
      await langfuse.shutdownAsync();
    
      return response;
    }
    

    Con esto, cada ejecución queda registrada en Langfuse con su árbol completo de spans. Puedes ver exactamente cuánto tardó la búsqueda, cuántos tokens consumió la síntesis y qué prompt produjo esa respuesta que el cliente reportó como incorrecta.

    Es exactamente este tipo de arquitectura observable la que construimos en el curso Construye con IA — desde el primer agente hasta el sistema completo en producción, con trazabilidad desde el día uno.


    Los errores que aparecen cuando no tienes observabilidad

    Estos son los tres problemas que he visto repetirse en proyectos sin observabilidad — y que solo se detectan cuando ya han causado daño:

    Alucinaciones no detectadas. El agente responde con confianza. El formato es correcto. El dato está mal. Sin trazas, nunca sabes en qué paso del flujo el modelo inventó algo. Con trazas, identificas el prompt exacto que produce el problema y lo corriges.

    Latencias ocultas. El endpoint responde en 8 segundos. No sabes si el problema está en la llamada al LLM, en la búsqueda vectorial o en el postprocesado. Las métricas por span te dicen exactamente dónde está el cuello de botella.

    Costos fuera de control. Un prompt mal diseñado puede consumir 10x más tokens que uno equivalente. Sin métricas de uso por operación, solo ves la factura de fin de mes. Con observabilidad, detectas el problema en el primer día de producción.


    Por dónde empezar si ya tienes un proyecto en marcha

    No tienes que instrumentar todo de golpe. El orden que funciona:

    1. Añade Langfuse o Helicone a la llamada al LLM más crítica de tu sistema.
    2. Registra siempre: modelo, versión del prompt, userId, tokens usados.
    3. Cuando detectes un comportamiento inesperado, usa las trazas para reproducirlo.
    4. Una vez que el patrón funciona, extiéndelo al resto de llamadas.

    La observabilidad no es una feature opcional que añades al final. Es la infraestructura que te permite iterar sobre tus prompts con datos reales — no con intuición.

    Si quieres construir sistemas con IA desde cero con buenas prácticas de producción integradas desde el principio, en Dominicode Labs tenemos proyectos y recursos donde trabajamos exactamente esto junto a otros developers hispanohablantes.


    FAQ — Preguntas frecuentes sobre LLM Observability

    ¿Qué diferencia hay entre observabilidad en LLMs y logging tradicional?

    El logging tradicional captura eventos discretos: errores, requests, respuestas. La observabilidad en LLMs captura el flujo completo de razonamiento de un agente: qué herramientas invocó, en qué orden, con qué contexto, y cómo cada paso influyó en el resultado final. La diferencia es la misma que entre saber que tu avión aterrizó tarde y saber exactamente en qué tramo de la ruta perdió tiempo.

    ¿Necesito observabilidad si solo uso un LLM para tareas sencillas como resúmenes de texto?

    Si está en producción y lo usa más de un usuario, sí. Incluso para tareas aparentemente sencillas, la observabilidad te da visibilidad sobre costos (¿cuánto estoy gastando por resumen?), calidad (¿hay inputs que producen respuestas malas consistentemente?) y latencia (¿hay prompts que tardan 5x más que otros?). El esfuerzo de instrumentar una sola llamada es de menos de 20 líneas de código.

    ¿Langfuse es mejor que LangSmith?

    Depende de tu stack. Si usas LangChain, LangSmith es la integración más natural. Si haces llamadas directas a la API de Anthropic u OpenAI, o usas el Vercel AI SDK, Langfuse tiene mejor soporte, es open source y puedes autohospedarlo. Para proyectos donde los datos son sensibles y no quieres enviarlos a un tercero, Langfuse self-hosted es la única opción razonable.

    ¿Cómo gestiono la observabilidad en un agente con múltiples LLMs y herramientas?

    Usando el modelo de trazas jerárquicas: una traza por operación de negocio, spans para cada herramienta o paso intermedio, y generaciones para cada llamada al LLM. Langfuse, LangSmith y Arize Phoenix soportan este modelo de forma nativa. La clave es diseñar las trazas pensando en qué preguntas querrás responder cuando algo falle — no en lo que es fácil de capturar.

    ¿Cuánto cuesta implementar observabilidad con Langfuse?

    Langfuse Cloud tiene un plan gratuito generoso (50.000 observaciones al mes en la fecha de publicación de este post). Para proyectos con volumen alto, puedes autohospedarlo en tu propia infraestructura con Docker — el costo es solo el del servidor. LangSmith y Helicone tienen también niveles gratuitos, pero con menos control sobre los datos.


    Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.

  • Guía para implementar Langfuse y optimizar LLMs en producción

    Guía para implementar Langfuse y optimizar LLMs en producción

    Como empezar con langfuse: guía práctica para llevar LLMs a producción

    Tiempo estimado de lectura: 5 min

    • Instrumentar primero: arrancar con trazas por token, spans y versionado de prompts para entender coste y fallos.
    • Despliegue según necesidad: cloud para PoC rápido, self-hosted para cumplimiento y control de datos.
    • Integración mínima: usar @observe o CallbackHandler en LangChain para trazabilidad sin reescribir la app.
    • Métricas desde el día 1: coste por trace, latencia p95, tokens por prompt y tasa de fallos.

    Como empezar con langfuse es la primera pregunta que hace cualquier equipo cuando la prueba de concepto con un LLM deja de ser un hobby y empieza a costar dinero. Si quieres dejar de adivinar por qué un prompt alucina, cuánto te cuesta cada conversación o dónde se cuelga tu pipeline RAG, Langfuse es la herramienta que necesitas instrumentar primero.

    En las próximas secciones verás pasos concretos, ejemplos de código y criterios técnicos para decidir despliegue, métricas a monitorear y cómo integrar Langfuse con LangChain. Documentación oficialrepositoriocloud

    Resumen rápido (lectores con prisa)

    Qué es: plataforma de observabilidad para aplicaciones LLM que captura generaciones, spans, versionado de prompts y datasets de evaluación.

    Cuándo usarlo: cuando necesitas coste por usuario/prompt, reproducibilidad y trazas jerárquicas.

    Por qué importa: permite decidir modelo/prompt/retriever basándose en métricas reales.

    Cómo funciona: instrumentas SDK o CallbackHandler y obtienes traces con spans, tokens y costes.

    ¿Qué hace Langfuse y por qué importa?

    Langfuse es una plataforma de observabilidad y gestión para aplicaciones LLM. No es solo trazas: captura generaciones (tokens, coste), spans (retrieval, postprocessing), versionado de prompts y datasets de evaluación. Eso significa dos cosas:

    • Puedes detectar coste por usuario, por prompt y por modelo.
    • Puedes depurar cadenas complejas (retriever → LLM → herramientas) con trazas jerárquicas.

    Si pagas por token y dependes de resultados reproducibles, no es opcional.

    Paso 1 — Elegir despliegue: Cloud vs Self-hosted

    Cloud (rápido): Regístrate en cloud.langfuse.com, crea un proyecto y copia PUBLIC_KEY / SECRET_KEY. Ideal para PoC y equipos que quieren empezar en horas.

    Self-hosted (compliance): Clona github.com/langfuse/langfuse y levanta con Docker Compose si necesitas controlar datos y cumplir regulaciones.

    Ejemplo mínimo: docker-compose

    services:
      langfuse:
        image: ghcr.io/langfuse/langfuse
        ports: ["3000:3000"]
        environment:
          DATABASE_URL: postgresql://user:pass@db:5432/langfuse
          NEXTAUTH_SECRET: your-secret

    Paso 2 — SDK e instrumentación básica

    Instala el SDK (elige tu stack):

    • Python: pip install langfuse
    • Node.js: npm install langfuse

    Variables de entorno mínimas:

    LANGFUSE_PUBLIC_KEY=pk-lf-...
    LANGFUSE_SECRET_KEY=sk-lf-...
    LANGFUSE_HOST=https://cloud.langfuse.com
    OPENAI_API_KEY=sk-...

    Instrumentación rápida en Python

    from langfuse.decorators import observe
    from langfuse.openai import openai
    
    @observe()
    def answer_user(query: str):
        res = openai.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role":"user","content":query}],
            name="answer-v1"
        )
        return res.choices[0].message.content

    Resultado: una Trace en el dashboard con spans y generación (tokens, coste, parámetros).

    Paso 3 — Integración con LangChain y orquestadores

    Si usas LangChain o LlamaIndex, no decoras todo: añades un CallbackHandler.

    from langfuse.callback import CallbackHandler
    from langchain.chains import LLMChain
    from langchain_openai import OpenAI
    from langchain.prompts import PromptTemplate
    
    handler = CallbackHandler()
    llm = OpenAI()
    prompt = PromptTemplate.from_template("Resume: {text}")
    chain = LLMChain(llm=llm, prompt=prompt)
    
    result = chain.run("Documento grande...", callbacks=[handler])

    Langfuse trazará retrievals, llamadas a LLM y pasos intermedios, con breakdown de latencia.

    Paso 4 — Prompt Registry y control de cambios

    No hardcodees prompts. Usa el Prompt Registry para versionado y A/B:

    1. Crea prompt en el dashboard: summarizer-v1.
    2. En código pide la versión “production” y compila variables.
    3. Cambia el prompt desde UI sin redeploy.
    from langfuse import Langfuse
    lf = Langfuse()
    prompt = lf.get_prompt("summarizer-v1")
    compiled = prompt.compile(text="texto largo")

    Métricas y alertas que debes configurar desde el día 1

    • Coste por trace y coste por usuario (alerta si crece >20%).
    • Latencia p95 (alerta si >2s en >5% traces).
    • Tokens input por prompt (detecta drift del prompt).
    • Rate de fallos/completions incompletos.

    Estas métricas convierten intuición en decisiones: cambiar a modelo más barato, optimizar retriever o ajustar tiempo de espera.

    Buenas prácticas operativas

    • Empieza por instrumentar solo 3 endpoints críticos (hot-paths).
    • Mantén modo solo-lectura primero (trazas, sin escrituras al modelo).
    • Añade guardrails para escrituras: simulación y aprobaciones manuales.
    • Versiona eventos y prompts; añade pruebas automáticas contra datasets (Langfuse Datasets).

    Limitaciones y costes

    • Curva inicial: entender Trace/Span toma horas.
    • Coste cloud: gratuito en niveles bajos; luego pago por traces. Revisa precios en cloud.langfuse.com.
    • Ecosistema joven: integra pruebas y rollbacks para evitar dependencias fuertes en early-stage.

    Checklist de lanzamiento (lista corta)

    1. Levantar proyecto en cloud o self-host.
    2. Instrumentar 3 funciones LLM con @observe o CallbackHandler.
    3. Crear 2 prompts versionados y un dataset de evaluación.
    4. Configurar alertas: coste diario, latencia p95, tokens.
    5. Medir 2 semanas, optimizar prompts/modelos/retriever.

    Conclusión — empezar y aprender rápido

    Como empezar con langfuse no es un ritual largo: en horas puedes tener trazas reales y en días tomar decisiones de coste y calidad. Lo que cambia es la disciplina: medir antes de optimizar. Haz la primera integración hoy, monitorea 100 traces y actúa sobre los tres mayores consumidores de tokens — esa es la ingeniería que realmente reduce coste y riesgo. Esto no acaba aquí: instrumenta, compara y deja que los datos guíen las siguientes iteraciones.

    Si trabajas en flujos de automatización o sistemas que combinan agentes y workflows, es útil complementar la instrumentación con prácticas de operación y experimentación. Para recursos y experimentos prácticos adicionales considera Dominicode Labs como continuación lógica de pruebas y validación en pipelines de IA.

    FAQ

    ¿Qué es Langfuse?

    Langfuse es una plataforma de observabilidad para aplicaciones LLM que captura generaciones, spans, versionado de prompts y datasets de evaluación.

    ¿Cuándo debo usar cloud vs self-hosted?

    Usa cloud para PoC y despliegues rápidos. Elige self-hosted si necesitas control de datos, cumplimiento o auditoría completa.

    ¿Cómo integro Langfuse en un proyecto existente?

    Puedes instrumentar funciones clave con @observe en Python o añadir un CallbackHandler en LangChain para trazabilidad sin reescribir toda la app.

    ¿Qué métricas son esenciales desde el inicio?

    Coste por trace/usuario, latencia p95, tokens por prompt y tasa de fallos. Configura alertas para cambios significativos.

    ¿Puedo versionar prompts sin redeploy?

    Sí. Usa el Prompt Registry en el dashboard para versionado y A/B; compila la versión desde el SDK en tiempo de ejecución.

    ¿Cuál es el coste típico de usar Langfuse?

    Hay niveles gratuitos bajos y luego pago por traces en cloud. Revisa precios y modelos en cloud.langfuse.com.

    ¿Funciona con LangChain y otros orquestadores?

    Sí. Langfuse proporciona CallbackHandler para LangChain y puede trazar retrievals, llamadas LLM y pasos intermedios.