Spaces:
Running
Running
fix: partidor de palabras — de codigo a codigo+dialogo
Browse files- js/acer-core.js +37 -5
js/acer-core.js
CHANGED
|
@@ -180,7 +180,31 @@ function truncateToTokens(s, maxTok) {
|
|
| 180 |
// de 2 caracteres porque en código los identificadores cortos existen y a veces
|
| 181 |
// son exactamente lo que se busca (`fs`, `db`, `id`).
|
| 182 |
function terms(s) {
|
| 183 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
}
|
| 185 |
|
| 186 |
/**
|
|
@@ -650,9 +674,8 @@ const DEFAULTS = {
|
|
| 650 |
// — presupuesto —
|
| 651 |
SUPERSEDE: true, // degradar resultados caducados (ver markSuperseded)
|
| 652 |
ELASTIC: true, // no rellenar con lo irrelevante (ver selectAndEmit)
|
| 653 |
-
TAIL_MIN_FRAC: 0.
|
| 654 |
-
HEAD_FRAC: 0
|
| 655 |
-
// (solo bajo presión — ver autotune)
|
| 656 |
RECENT: 6,
|
| 657 |
RECENT_FRAC: null, // null = derivado de la presión de compresión
|
| 658 |
MAX_MSG_CHARS: 12000,
|
|
@@ -730,7 +753,16 @@ function autotune(historyTok, budgetTok, O) {
|
|
| 730 |
// 100 % al 0 % a presupuesto 16.000. Su supervivencia era un accidente del
|
| 731 |
// relleno, no una propiedad de tener sitio. Cuesta un 5 % y ya está medido
|
| 732 |
// que no resta: incondicional.
|
| 733 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 734 |
const recencyWeight = O.RECENCY_WEIGHT * (1 - pressure); // solo informativo
|
| 735 |
|
| 736 |
return { pressure, recentFrac, recencyWeight, recencyTiebreak, headOn };
|
|
|
|
| 180 |
// de 2 caracteres porque en código los identificadores cortos existen y a veces
|
| 181 |
// son exactamente lo que se busca (`fs`, `db`, `id`).
|
| 182 |
function terms(s) {
|
| 183 |
+
// Emite el token COMPUESTO y además sus PARTES.
|
| 184 |
+
//
|
| 185 |
+
// El tokenizador anterior estaba afinado para código y en diálogo perdía:
|
| 186 |
+
// · exigía empezar por letra → «3pm», «2nd», «5» desaparecían enteros, y en
|
| 187 |
+
// conversación eso son horas, ordinales y fechas;
|
| 188 |
+
// · mantenía `process.env.HOME` y `src/utils.js` como UN token, así que una
|
| 189 |
+
// pregunta por «env» no casaba con la línea que lo contiene.
|
| 190 |
+
//
|
| 191 |
+
// Medido en un banco de diálogo (LoCoMo, 200 preguntas, n=200): cambiar SOLO
|
| 192 |
+
// el tokenizador y dejar todo lo demás igual explicaba 3,5 de los 4,8 puntos
|
| 193 |
+
// que nos separaban de un BM25 con el partidor del banco. No era la política
|
| 194 |
+
// de empaquetado: era el partidor de palabras.
|
| 195 |
+
//
|
| 196 |
+
// La forma compuesta se conserva porque para código ES el identificador —
|
| 197 |
+
// `src/utils.js` casa exacto y puntúa alto — y las partes se añaden para que
|
| 198 |
+
// el emparejamiento parcial también funcione. Se pagan más términos por línea,
|
| 199 |
+
// pero BM25 normaliza por longitud, que para eso está la `b`.
|
| 200 |
+
const out = [];
|
| 201 |
+
const seen = new Set();
|
| 202 |
+
const push = (t) => { if (t.length >= 2 && !seen.has(t)) { seen.add(t); out.push(t); } };
|
| 203 |
+
for (const m of s.toLowerCase().match(/[a-z0-9_][\w./-]*/g) || []) {
|
| 204 |
+
push(m);
|
| 205 |
+
if (/[./-]/.test(m)) for (const part of m.split(/[./-]+/)) push(part);
|
| 206 |
+
}
|
| 207 |
+
return out;
|
| 208 |
}
|
| 209 |
|
| 210 |
/**
|
|
|
|
| 674 |
// — presupuesto —
|
| 675 |
SUPERSEDE: true, // degradar resultados caducados (ver markSuperseded)
|
| 676 |
ELASTIC: true, // no rellenar con lo irrelevante (ver selectAndEmit)
|
| 677 |
+
TAIL_MIN_FRAC: 0.05, // SUELO garantizado para los ultimos turnos
|
| 678 |
+
HEAD_FRAC: 0, // desactivada: ver nota en autotune
|
|
|
|
| 679 |
RECENT: 6,
|
| 680 |
RECENT_FRAC: null, // null = derivado de la presión de compresión
|
| 681 |
MAX_MSG_CHARS: 12000,
|
|
|
|
| 753 |
// 100 % al 0 % a presupuesto 16.000. Su supervivencia era un accidente del
|
| 754 |
// relleno, no una propiedad de tener sitio. Cuesta un 5 % y ya está medido
|
| 755 |
// que no resta: incondicional.
|
| 756 |
+
// CABECERA DESACTIVADA (decisión del usuario, 2026-08-09).
|
| 757 |
+
// Medida, ayudaba en sesiones de agente: el encargo original pasaba de 0/5 a
|
| 758 |
+
// 5/5 con presupuesto apretado, porque el arranque lleva la tarea y nadie la
|
| 759 |
+
// repite, así que BM25 no puede rescatarla. Pero en DIÁLOGO no hay encargo
|
| 760 |
+
// que proteger y la reserva cobra sin dar nada: en LoCoMo el motor con ella
|
| 761 |
+
// recupera 56,2 % de la evidencia donde BM25 pelado recupera 62,5 %, con los
|
| 762 |
+
// mismos tokens. Una reserva incondicional para algo que puede no existir es
|
| 763 |
+
// la misma enfermedad que las constantes: presupone en vez de medir.
|
| 764 |
+
// Se deja el mecanismo, con HEAD_FRAC a 0. Ponerlo a 0.05 lo reactiva.
|
| 765 |
+
const headOn = O.HEAD_FRAC > 0;
|
| 766 |
const recencyWeight = O.RECENCY_WEIGHT * (1 - pressure); // solo informativo
|
| 767 |
|
| 768 |
return { pressure, recentFrac, recencyWeight, recencyTiebreak, headOn };
|