Skip to content

Evaluacion con LangChain ​

Evaluar aplicaciones LangChain implica medir cadenas completas (input -> output) y componentes aislados (retriever, tools). LangSmith y librerias como Ragas complementan tests manuales.

Que evaluar ​

ComponentePregunta clave
RetrieverRecupera los chunks correctos?
RAG chainLa respuesta es fiel al contexto?
AgentElige la tool correcta?
MemoryMantiene coherencia en la sesion?

Dataset de prueba ​

python
eval_examples = [
    {
        "input": "Como hago backup en PostgreSQL?",
        "expected_sources": ["postgresql/09-administracion"],
        "reference": "Usar pg_dump para backup logico.",
    },
    {
        "input": "Que es un indice B-tree?",
        "reference": "Estructura de indice equilibrada para busquedas.",
    },
]

Guarda en JSON versionado (eval/langchain-v1.json).

Evaluacion manual rapida ​

python
def run_eval(rag_chain, examples):
    results = []
    for ex in examples:
        out = rag_chain.invoke(ex["input"])
        results.append({
            "input": ex["input"],
            "output": out,
            "reference": ex.get("reference"),
        })
    return results

for row in run_eval(rag_chain, eval_examples):
    print(row["input"], "->", row["output"][:200])

Revisa faithfulness y relevancia con ojo humano antes de automatizar.

LangSmith ​

Plataforma de trazas y evaluacion de LangChain.

bash
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=lsv2_...
export LANGCHAIN_PROJECT=manuales-rag

Cada invoke / stream genera trazas con latencia, tokens y pasos intermedios.

Evaluators en LangSmith ​

  • Correctness vs respuesta de referencia.
  • Criteria personalizados (tono, formato).
  • LLM-as-judge con rúbrica.
python
from langsmith import Client

client = Client()
# Definir dataset y evaluators en UI o API

Util para comparar prompts y modelos en el tiempo.

Ragas (metricas RAG) ​

bash
pip install ragas
python
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall

# dataset con question, answer, contexts, ground_truth
# scores = evaluate(dataset, metrics=[faithfulness, answer_relevancy, context_recall])

Metricas tipicas:

  • context_precision / recall — calidad del retrieval.
  • faithfulness — respuesta anclada al contexto.
  • answer_relevancy — responde la pregunta.

Evaluar agents ​

Checklist por traza:

  1. Tool invocada es la esperada?
  2. Argumentos validos y seguros?
  3. Numero de pasos razonable?
  4. Respuesta final correcta?
python
def assert_tool_used(trace, tool_name: str) -> bool:
    for step in trace.steps:
        if getattr(step, "tool", None) == tool_name:
            return True
    return False

En LangSmith inspecciona grafos de agente paso a paso.

Tests en CI ​

Subset pequeno en cada PR:

python
# tests/test_rag_smoke.py
def test_rag_no_empty(rag_chain):
    out = rag_chain.invoke("Que es Docker?")
    assert len(out) > 20
    assert "no se" not in out.lower() or "contexto" in out.lower()

def test_rag_pg_backup(rag_chain):
    out = rag_chain.invoke("Como hago backup en PostgreSQL?")
    assert "pg_dump" in out.lower() or "backup" in out.lower()

Evita llamadas lentas a LLM en cada commit si no hay presupuesto; ejecuta nightly.

Comparar versiones (A/B) ​

txt
prompt_v1 + llama3.1  -> faithfulness 0.82
prompt_v2 + llama3.1  -> faithfulness 0.88

Cambia una variable cada vez.

Buenas practicas ​

  • Dataset con casos negativos y edge cases.
  • Evaluar retrieval sin LLM primero.
  • Versiona prompts, modelos y eval set juntos.
  • Muestrea trazas LangSmith semanalmente.
  • Umbrales explicitos para bloquear deploy (ej. faithfulness >= 0.8).

Errores habituales ​

  • Solo probar preguntas faciles del dominio.
  • Cambiar modelo y prompt a la vez.
  • Ignorar latencia y coste en evaluacion.
  • No registrar version del indice vectorial.
  • Confiar ciegamente en LLM-as-judge.

Siguiente paso ​

El capitulo 7 cierra con despliegue, API, observabilidad y checklist de produccion.