KikoCis commited on
Commit
0781d96
·
verified ·
1 Parent(s): 2c6f34b

fix: partidor de palabras — de codigo a codigo+dialogo

Browse files
Files changed (1) hide show
  1. 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
- return (s.toLowerCase().match(/[a-z_][\w./-]{1,}|\d{2,}/g) || []);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.10, // SUELO garantizado para los ultimos turnos
654
- HEAD_FRAC: 0.05, // reserva para los PRIMEROS mensajes, sin puntuar
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
- const headOn = true;
 
 
 
 
 
 
 
 
 
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 };