v0.4.0
Added
-
Métricas locales de evaluación (KJR-TSK-0111, roadmap 0.4.0):
faithfulness,contextPrecision,contextRecall,answerRelevance
y el agregadorevaluateAnswerensrc/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 yrelevantIdsvací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.jsoncon
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
JudgeVerdictdeevaluateMultiJudgeincluye ahoralabel
(consensus/outlier, null si el score no es parseable) ydeviation
respecto a la mediana; elEvaluationReportagregaoutlierscon 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:aggregateScorey
disagreementno cambian. -
Prompt-template auditado del Reranker LLM (KJR-TSK-0114, roadmap
0.4.0): el prompt inline deRerankerRole(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,ollamaañade veredictos LLM-as-judge por
caso conaggregateScorey outliers etiquetados.--dimensions N
para el embedder del run.runEvalCommandre-exportado en el barrel.
Fixed
- Easy RAG — guarda de integridad manifest↔store (KJR-BUG-0005,
PR #93): si.karajan/manifest.jsondeclara ficheros pero el store
está vacío (in-memory recién creado o persistente vaciado),
indexDirectoryreportaba "sin cambios" y las queries devolvían vacío
en silencio. Ahora descarta el manifest y reindexa completo,
notificándolo poronEvent.
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 fijaedition = "ENTERPRISE", compatible
con el defaultdb-f1-micro. - Migración pgvector (KJR-BUG-0002, PR #90):
karajan_rag_chunks.id
pasa deuuidatext— los chunk ids de la capa Easy RAG son texto
estable (doc:ruta.md#0) y el INSERT fallaba. Se retirapgcryptoy se
documenta el ajuste de dimensión según el fingerprint del manifest. - deploy/gcp — Cloud Run (KJR-BUG-0003, PR #88):
deletion_protection = falseexplícito; el default del provider impedía reemplazar
revisiones fallidas y rompíaterraform destroy. - Dockerfile (KJR-BUG-0004, PR #89):
pgno llegaba a la imagen — la
stage de deps heredaba elpackage.jsondel repo y npm lo omitía por
figurar en devDependencies. Ahora los backends (pg,
@lancedb/lancedb) se instalan sobre unpackage.jsonaislado.