Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 14:46
4fe8008

Added

  • Métricas locales de evaluación (KJR-TSK-0111, roadmap 0.4.0):
    faithfulness, contextPrecision, contextRecall, answerRelevance
    y el agregador evaluateAnswer en src/evaluation/local-metrics.js.
    Variantes léxico-deterministas (solape de tokens de contenido, con
    stopwords/interrogativos es-en filtrados) sin LLM ni dependencias:
    aptas para baselines offline y CI. Valores siempre en [0,1], entradas
    degeneradas con semántica definida y relevantIds vacío → error
    explícito. Re-exportadas en el barrel.

  • Golden set offline (KJR-TSK-0112, roadmap 0.4.0): corpus mínimo en
    examples/golden/ (facturación/envíos/soporte) + golden.json con
    preguntas, respuestas esperadas, fuentes relevantes y baseline
    calibrado al pipeline de stubs. Runner en
    src/evaluation/golden-runner.js (loadGoldenSet, validateGoldenSet,
    runGoldenSet): indexa con HashEmbedder + InMemoryVectorStore, lanza
    el retrieval híbrido y compara las medias de las métricas locales
    contra el baseline — cualquier caída falla señalando métrica y peores
    casos. Corre como test (tests/golden-set.test.js): guardián de
    regresión en CI sin credenciales.

  • Disagreement auto-labelling (KJR-TSK-0113, roadmap 0.4.0): cada
    JudgeVerdict de evaluateMultiJudge incluye ahora label
    (consensus/outlier, null si el score no es parseable) y deviation
    respecto a la mediana; el EvaluationReport agrega outliers con los
    providers desviados ≥ threshold. La mediana como consenso resiste a un
    juez desviado; con dos jueces enfrentados ambos quedan como outlier
    (no hay consenso posible). Cambio aditivo: aggregateScore y
    disagreement no cambian.

  • Prompt-template auditado del Reranker LLM (KJR-TSK-0114, roadmap
    0.4.0): el prompt inline de RerankerRole (modo llm) se extrae a
    src/retrieval/rerank-prompt.js (buildRerankPrompt,
    RERANK_PROMPT_VERSION, RERANK_SNIPPET_MAX_CHARS) sin cambio de
    redacción (v1). Tests snapshot congelan el texto exacto: cambiarlo
    exige actualizar snapshot y versión conscientemente en el mismo PR.

  • karajan-rag eval <golden.json> [corpus] (KJR-TSK-0115, roadmap
    0.4.0): evaluación declarativa desde CLI. Ejecuta el golden set offline
    (stubs deterministas), reporta cada métrica contra su baseline (✓/✗ con
    peores casos) y termina con exit code 1 si el baseline falla — apto
    para CI. --judges claude,ollama añade veredictos LLM-as-judge por
    caso con aggregateScore y outliers etiquetados. --dimensions N
    para el embedder del run. runEvalCommand re-exportado en el barrel.

Fixed

  • Easy RAG — guarda de integridad manifest↔store (KJR-BUG-0005,
    PR #93): si .karajan/manifest.json declara ficheros pero el store
    está vacío (in-memory recién creado o persistente vaciado),
    indexDirectory reportaba "sin cambios" y las queries devolvían vacío
    en silencio. Ahora descarta el manifest y reindexa completo,
    notificándolo por onEvent.

Bugs detectados durante la validación del despliegue real en GCP
(KJR-TSK-0110, primer caso de uso en producción del módulo deploy/gcp):

  • deploy/gcp — Cloud SQL (KJR-BUG-0001, PR #87): el provider google
    ~>6.0 crea instancias con edición ENTERPRISE_PLUS por defecto, que
    rechaza tiers compartidos; se fija edition = "ENTERPRISE", compatible
    con el default db-f1-micro.
  • Migración pgvector (KJR-BUG-0002, PR #90): karajan_rag_chunks.id
    pasa de uuid a text — los chunk ids de la capa Easy RAG son texto
    estable (doc:ruta.md#0) y el INSERT fallaba. Se retira pgcrypto y se
    documenta el ajuste de dimensión según el fingerprint del manifest.
  • deploy/gcp — Cloud Run (KJR-BUG-0003, PR #88): deletion_protection = false explícito; el default del provider impedía reemplazar
    revisiones fallidas y rompía terraform destroy.
  • Dockerfile (KJR-BUG-0004, PR #89): pg no llegaba a la imagen — la
    stage de deps heredaba el package.json del repo y npm lo omitía por
    figurar en devDependencies. Ahora los backends (pg,
    @lancedb/lancedb) se instalan sobre un package.json aislado.