Josue Salazar

De Laya a s1-code: entrené un modelo System One para buscar código y construí s1grep

Mi primer modelo entrenado, con todo medido: tres versiones de s1-code y un buscador local en Rust, s1grep, que encuentra el código por lo que hace en nueve lenguajes, en inglés y en español, sin enviar nada a la nube.

Josue Salazar

Fundador y CEO · API SERVICE SAC

1 de octubre de 2026 · 24 min de lectura

168 / 201
búsquedas reales con la función correcta en 1.er lugar (los embeddings solos: 145)
83 % · 85 %
acierto en inglés y en español: el idioma de la pregunta casi no importa
1,3 s
por búsqueda en una CPU común, sin GPU ni nube, con los modelos ya cargados
9 lenguajes
Python, JavaScript, TypeScript, Go, Java, PHP, Rust, Ruby y C#
Sobre este trabajo: es el primer modelo que entreno. Vengo de la ingeniería de software, no de la investigación en IA, así que trabajé con una regla simple: ninguna decisión sin una medición. Las predicciones se escribieron antes de ver los resultados, los exámenes finales se abrieron una sola vez y aquí cuento también lo que no funcionó.

En corto

  • Laya, un modelo System One abierto, no sabía juzgar código: acertó 1 de 20 búsquedas, como el azar. Lo medimos en una tarde antes de construir nada sobre él.
  • Entrenamos nuestro propio modelo, s1-code, en tres versiones. La v3 acierta 161 de 197 búsquedas reales nunca vistas por sí sola, frente a 144 de la v1 (p = 0,002) y 152 de Qwen3-Embedding.
  • Construimos s1grep, un buscador local en Rust: encuentra la función correcta en 1.er lugar en 168 de 201 búsquedas reales, contra 145 de los embeddings solos, en inglés y en español por igual.
  • Lo llevamos de prototipo a producto en cinco versiones (0.2 a 0.5): nueve lenguajes, repositorios grandes buscables en minutos, búsqueda por palabras donde ayuda, un proceso en segundo plano que nadie tiene que arrancar y una herramienta para agentes de programación. El examen se mantuvo en 168 de 201 en cada versión.
  • No todo salió bien: la v3 no supera con seguridad a la v2, los modelos grandes con GPU siguen siendo mejores jueces y, en otros lenguajes, el juez ayuda en Java pero empeora JavaScript y Go. Todo eso está medido y contado aquí.

La pregunta

Los agentes de programación y las personas pierden mucho tiempo buscando dónde está algo en un repositorio. grep encuentra palabras, no intenciones: si preguntas "dónde se reintenta un pago fallido", la función puede llamarse send_with_retry y no contener ninguna palabra de tu pregunta.

Herramientas como jevgrep resuelven esto enviando tu código a un modelo en la nube. Nuestra pregunta fue otra:

¿Se puede construir una alternativa local, abierta y bilingüe (inglés y español) que encuentre código por lo que hace usando modelos System One y funcione en una CPU común?

La respuesta corta es sí, con matices. Este artículo cuenta los 18 pasos que llevaron hasta ahí, con lo que funcionó y lo que no.

Qué es un modelo System One

Un modelo System One no escribe texto. Recibe un documento y preguntas tipadas (elegir entre opciones, verdadero o falso, o una escala) y devuelve probabilidades en una sola pasada. Por eso es rápido, no "alucina" y sus respuestas se pueden calibrar: un 90 % debería acertar 9 de cada 10 veces.

s1-code recibe una función y una pregunta, y responde con la probabilidad de que esa función responda la búsqueda:

[CLS] noul question: This code answers the search: dónde se reintenta un pago fallido [SEP]
      [MASK] no  [MASK] sí [SEP]
billing/gateway/client.py
GatewayClient.send_with_retry

def send_with_retry(self, document, attempts=3): ... [SEP]
→ sí: 0,93

Partimos de Laya (Convai Innovations, Apache 2.0), un modelo System One multilingüe de 322 millones de parámetros. s1-code es Laya ajustado para una sola tarea: decidir si un código responde una búsqueda. Técnicamente es un System One usado en el papel de reranker.

Fase 1 · Medir antes de construir

¿Laya entiende código?

Antes de escribir el buscador hicimos una prueba barata: 20 preguntas sobre 1 531 funciones de repositorios privados de servicios backend en Python. Un buscador por palabras (BM25) eligió 25 candidatas y Laya las ordenó con cuatro formas distintas de preguntar.

Gráfico de barras: BM25 acierta 13 de 20 y Laya entre 0 y 1, como el azar
Laya acertó 0 o 1 de 20, lo mismo que el azar; BM25 acertó 13. Además dijo «sí» con 97 % de confianza a afirmaciones falsas.

Conclusión: no construir sobre Laya tal cual. Esa prueba de 13 minutos evitó semanas de trabajo sobre un modelo que no servía para esto.

¿Los embeddings encuentran el código?

Armamos un examen de 53 preguntas reales sacadas de commits y comparamos BM25, tres modelos de embeddings, su fusión con BM25 y dos rerankers, buscando en todas las funciones de los repositorios.

Tres paneles con top 1, top 5 y top 20 de siete métodos de búsqueda
Los embeddings encuentran el código: Qwen3-Embedding deja la correcta entre las 5 primeras en 49 de 53. Mezclar con BM25 empeora, y los rerankers grandes ayudan poco pero cuestan hasta 27 s por búsqueda en CPU.
Diagrama de puntos con el acierto en inglés y en español por método
La brecha de idioma: preguntar en español sobre código escrito en inglés. BM25 encuentra solo 3 de 22 preguntas en español; los embeddings multilingües cierran gran parte de esa brecha.

Revisamos también qué existía: hay buscadores semánticos abiertos (ck, osgrep y otros), pero ninguno tiene un juez System One local entrenado para código. Ese fue el hueco que decidimos llenar.

Fase 2 · Sacar el modelo de Python

Para que el producto fuera un solo binario, sin Python, había que correr el modelo con ONNX Runtime desde Rust. Cuatro hallazgos:

  • El exportador oficial estaba roto: fijaba el largo del texto en 16 tokens y fallaba con cualquier texto más largo. Con el exportador dynamo de PyTorch, ONNX coincide con el original en las 14 preguntas de prueba.
  • INT8 no acelera: la cuantización dinámica lleva todas las respuestas a 0,5 y la de solo pesos conserva la calidad pero es más lenta en CPU. Nos quedamos con float32.
  • El motor en Rust da lo mismo que Python: tokens idénticos y probabilidades a ±0,0006, también en Windows. Cada implementación nueva lleva su prueba de paridad.
  • El error del bfloat16: tres modelos venían en bfloat16 y la CPU no tiene instrucciones para ese formato. En float32 indexan 5,8 veces más rápido con el mismo resultado.
Barras de milisegundos por fragmento según el largo del texto en dos CPU
Cuatro veces más texto cuesta seis veces más tiempo. De aquí salió el diseño de embudo: un filtro barato trae unas 25 candidatas y el juez solo lee esas, en funciones cortas, no archivos enteros.
Dispersión de calidad contra segundos de indexación, con flechas del bfloat16 al float32
Calidad contra costo de indexar. Los círculos vacíos son los mismos modelos en bfloat16: igual de buenos y hasta 6 veces más lentos en CPU.

Fase 3 · Construir los datos

Entrenar un juez necesita miles de pares "búsqueda → función correcta". Los generamos "al revés": se elige una función y un modelo abierto (Qwen3-8B) escribe la búsqueda que haría alguien que la necesita, en inglés o en español y en uno de seis estilos. Un filtro descarta las que repiten el nombre de la función.

Datos de la v1Cantidad
Repositorios públicos de Python con licencia permisiva306
Funciones únicas, sin tests ni ejemplos799 635
Preguntas aceptadas (83 %)30 068
Ejemplos de entrenamiento (1 correcta y 3 trampas por pregunta)113 008
Preguntas de validación, de 16 repositorios nunca vistos400

Revisar dos muestras de 50 preguntas a mano, que costaron centavos, detectó frases de plantilla, tests colados y preguntas genéricas. Corregirlas antes de generar las 36 000 subió la aceptación de 80 % a 87 %.

Para enseñarle a decir "no", cada pregunta lleva trampas difíciles: las funciones más parecidas del mismo repositorio que no son la correcta.

Barras que comparan la dificultad de las preguntas generadas y las reales
Las preguntas generadas resultaron más difíciles que las reales: granite deja la correcta en 1.er lugar en el 50 % de las generadas y en el 66 % de las del examen.

Fase 4 · s1-code v1

Ajuste fino de Laya multilingüe con la receta de sus autores, 2 épocas en una GPU NVIDIA L4 en la nube (93 minutos) y calibración con 1 000 ejemplos apartados. Antes de entrenar fijamos el criterio: superar a granite solo (35 de 53) y la meta: 44.

Curva de pérdida del entrenamiento de la v1
La pérdida baja de 0,45 a 0,13. La caída brusca al empezar la época 2 es normal, pero también es la señal típica de que puede empezar a memorizar.
Barras de acierto en validación de granite, Laya y s1-code v1
En 400 preguntas de repositorios nunca vistos, s1-code v1 sube de 51 % a 80 % y rinde igual en inglés y en español: aprendió a juzgar código, no memorizó repositorios.
Barras con el resultado del examen original de 53 preguntas
Con preguntas reales de commits la mejora se reduce: 38 de 53, por encima del criterio (35) y lejos de la meta (44).

Después hicimos el examen más grande: 202 preguntas reales divididas en dev (100, para decidir) y test (102, se abre una sola vez). Y cambiamos de rival: un juez en cascada tiene que ganarle al buscador barato más fuerte, Qwen3-Embedding, no al más débil. Con ese rival, la ventaja de la v1 dejó de ser segura.

Fase 5 · s1-code v2: más datos, paridad exacta

La v2 sumó fuentes con preguntas escritas por personas y licencia verificada: mensajes de commit (CommitPackFT), issues ligados a la función corregida (SWE-bench, SWE-Gym, SWE-smith), búsquedas humanas (CoSQA) y funciones de repositorios privados de la organización, filtradas por secretos y datos personales. Cada pregunta recibió una gemela en el otro idioma.

Barras por fuente de datos y proporción de idiomas en v1 y v2
81 412 preguntas de entrenamiento, exactamente mitad en inglés y mitad en español: 2,9 veces más ejemplos que la v1.
Curva de pérdida del entrenamiento de la v2
Entrenamiento de la v2 en una A100 (64 minutos). La segunda época empeoró dev: memorizaba, así que usamos la primera.

En validación la v2 parecía muy superior (315 contra 269 de 400). Al desglosar por tipo de pregunta apareció un atajo: en las preguntas de CoSQA acertaba el 100 %, porque reconocía el estilo de la respuesta correcta, no la búsqueda.

Barras de acierto en validación por tipo de pregunta
El 100 % en CoSQA era un atajo del conjunto de datos. Sin esas preguntas, v1 y v2 empatan (266 contra 268 de 353; p = 0,89).
Comparación entre la predicción escrita antes y lo medido
La predicción escrita antes de abrir test (juez 74–78, combinado con Qwen3 82–86, sin diferencia segura con la v1) se cumplió: 74, 83 y p = 0,34.
Barras con el test de 102 preguntas por sistema
Test anterior, abierto una sola vez: v2 + Qwen3 acierta 86 de 102 contra 80 de Qwen3 solo, pero la diferencia no es estadísticamente segura (p = 0,21).
Barras de acierto por idioma en test
Lo que sí logró la v2: cero puntos de brecha entre inglés y español (84 % y 84 %).
Barras por conjunto e idioma comparando validación y examen real
La práctica y la realidad: las preguntas generadas y las reales no se comportan igual, por eso todas las decisiones se tomaron con preguntas reales.

Veredicto honesto de la v2: fue un buen trabajo de investigación y un empate como modelo. Lo que mejoró de verdad fue nuestra capacidad de saberlo.

Fase 6 · s1-code v3: un maestro y control de memorización

Analizamos los 25 fallos de la v2: 12 dejaban la correcta en 2.º lugar y 9 se confundían con un método hermano de la misma clase. Probamos cuatro candidatos a maestro con las mismas preguntas. El mejor fue Qwen3-Reranker-4B (89 de 100 en dev); el más llamativo, Nimble de 9B, quedó por debajo. Elegir maestro con una prueba costó menos de 1 USD.

La v3 se entrenó con:

  • 72 332 grupos de 1 correcta y 7 trampas sacadas del buscador real (Qwen3-Embedding), con paridad exacta de idioma.
  • Una pérdida que pone a competir la correcta contra sus trampas.
  • Notas del maestro en 20 000 grupos, mezcladas 50/50 con las etiquetas reales.
  • Control de memorización cada 1 000 pasos y parada temprana.
Curvas de validación, datos ya vistos y sobreconfianza durante el entrenamiento de la v3
La validación subió de 72 % a 82 % en el paso 13 000 y se estancó; la parada temprana cortó en el 17 000 y restauró el 13 000. La brecha de memorización se mantuvo estable y la sobreconfianza por debajo de 1 %.

Para medirla, agentes escribieron un test nuevo de 197 preguntas sobre funciones que no aparecían en ningún examen anterior. Se abrió una sola vez, con la predicción escrita antes.

Barras con intervalos de confianza de s1-code v3 frente a maestros y rivales
s1-code v3 frente a maestros y rivales en el test nuevo. Los modelos de 4 000 y 9 000 millones de parámetros siguen arriba, pero necesitan GPU.
SistemaTamaño1.er lugar (de 197)InglésEspañol
Qwen3-Reranker-4B (maestro)4 000M · GPU18391 %95 %
Nimble9 000M · GPU17790 %90 %
s1-code v3 + Qwen3-Embedding322M · CPU16885 %85 %
s1-code v2 + Qwen3-Embedding322M · CPU16583 %84 %
s1-code v3, juez solo322M · CPU16182 %81 %
jina-reranker-v2 (no comercial)278M · CPU15878 %82 %
Qwen3-Embedding solo600M15276 %78 %
s1-code v1, juez solo322M · CPU14468 %78 %
Evolución del juez de la v1 a la v3
El progreso real está en el juez por sí solo: de 144 a 161 de la v1 a la v3 (p = 0,002), con la brecha de idioma de 11 puntos a 0. Entre versiones consecutivas, la mejora es demasiado pequeña para el tamaño del examen.

Contra la regla fijada antes: la v3 debía ganarle con seguridad a la v2 y a Qwen3 solo. Le gana a Qwen3 solo (p = 0,0015) pero no a la v2 (p = 0,65). La regla completa no se cumplió, tal como anticipaba la predicción escrita (alrededor de 30 % de probabilidad).

Barras de acierto en decisiones generales de Laya base y s1-code
Una prueba extra: en 2 000 decisiones que no son de código, Laya base acierta 35 % y s1-code baja a 27–29 %. s1-code es un especialista en relevancia de código, no un System One general.

Fase 7 · s1grep: el producto

Con el modelo congelado, construimos el buscador alrededor de él. Funciona en cuatro pasos, todos en tu CPU:

  1. Indexar: tree-sitter parte cada archivo en funciones y métodos; granite convierte cada una en un vector y se guarda en SQLite, fuera del repositorio. Solo se vuelven a leer los archivos que cambiaron.
  2. Buscar: la pregunta se convierte en vector y salen las 25 funciones más cercanas.
  3. Juzgar: s1-code v3 lee las 5 primeras y responde con una probabilidad.
  4. Combinar: el orden del juez y el del buscador se fusionan con pesos elegidos en dev, nunca en test.
Barras de granite solo contra s1grep v0.1 por idioma
s1grep v0.1 en el test de 201 búsquedas reales: 168 en 1.er lugar contra 145 de los embeddings solos, y 189 entre los 5 primeros. Inglés y español quedan parejos.

Velocidad

Recortar lo que lee el juez a 256 o 192 tokens lo hace más rápido, pero baja el acierto por debajo de no usarlo, porque se entrenó leyendo 384. Lo que sí funcionó fue juzgar las candidatas una por una en vez de en lote (25 % más rápido, mismas respuestas) y dejar los modelos cargados en memoria.

Barras de segundos por búsqueda sin y con el proceso de fondo
La mayor parte del tiempo era cargar unos 2,5 GB de modelos en cada búsqueda. Un proceso en segundo plano, que arranca solo con la primera búsqueda, los mantiene en memoria y cada búsqueda baja a 1,3 s.

Cómo se usa

s1grep setup                                     # descarga los modelos, una sola vez
s1grep "dónde se reintenta un pago fallido" .    # buscar
s1grep index .                                   # indexar un repositorio grande y seguir el progreso
s1grep status                                    # qué está cargado y cuánto está indexado
s1grep mcp                                       # herramientas para agentes: search_code e index_status
s1grep skill --install                           # guía de uso para Claude Code

Es un solo binario para Linux y Windows, sin Python. Nadie tiene que arrancar ni detener nada: la primera búsqueda levanta un proceso en segundo plano que solo escucha en tu máquina, con una clave que únicamente tu usuario puede leer, y se apaga tras 30 minutos sin uso.

Fase 8 · ¿Sirve para otros lenguajes?

s1-code se entrenó solo con Python. Para saber si sirve en otros lenguajes, armamos un examen con CodeSearchNet: 100 búsquedas por lenguaje sobre repositorios públicos, con granite trayendo las candidatas del mismo repositorio.

Flechas por lenguaje que muestran el cambio de acierto al usar el juez
El juez ayuda en Java (+10) y PHP (+3), no cambia nada en Ruby y empeora JavaScript (−8) y Go (−6). Con 100 preguntas por lenguaje cada diferencia tiene un margen de unos ±9 puntos.

Nuestra predicción, escrita antes, decía que ningún lenguaje quedaría por debajo de granite solo. Falló en dos. La primera versión de s1grep se limitó a Python; desde la 0.2.6 lee nueve lenguajes con el mismo juez y esta tabla queda publicada para que cada uno sepa qué esperar. La solución de fondo es un juez entrenado con varios lenguajes.

Fase 9 · De prototipo a producto (s1grep 0.2 a 0.5)

La versión 0.1 demostraba la idea, pero en un repositorio grande la primera búsqueda podía tardar minutos, había que arrancar un servidor a mano y solo entendía Python. Antes de seguir añadiendo funciones, escribimos la arquitectura del producto, sus decisiones documentadas y una regla para todo cambio: el examen de 201 búsquedas no puede bajar. En las cinco versiones siguientes se mantuvo en 168.

Repositorios grandes: buscable en minutos

Indexar el código completo de cada función cuesta unos 5 a 10 por segundo en CPU: un repositorio de 25 000 funciones toma horas. La solución fue indexar en dos pasadas. Primero un esquema de cada función (ruta, nombre y primeras líneas), que basta para buscar en todo el repositorio; después, en segundo plano, el código completo, que es el que da la calidad final. Las búsquedas responden desde el primer momento y avisan cuánto del repositorio se puede buscar todavía.

Esquemas con1.er lugar (de 201)Entre los 5 primerosVelocidad
granite 278M, el modelo principal1351671×
granite 97M, un modelo más pequeño1331663,3×

Para los esquemas, un modelo tres veces más pequeño rinde casi igual, así que s1grep usa los dos: el pequeño para la primera pasada y el principal para la final. Con el repositorio completo, la búsqueda es exactamente la de antes.

Barras de la primera búsqueda y del tiempo hasta poder buscar en todo, en dos versiones
Un repositorio de unas 25 000 funciones indexado desde cero: la primera búsqueda pasa de 514 s a 18 s y todo el repositorio queda buscable en unos 7 minutos.

Nueve lenguajes

Cada lenguaje es una consulta de tree-sitter de pocas líneas que indica qué es una función y cómo se llama su contenedor (una clase, un impl de Rust, el receptor de un método en Go). Sumar un lenguaje no toca el resto del código. Python conserva el extractor con el que se entrenó y examinó el modelo, para que sus resultados no cambien.

Buscar por palabras solo donde ayuda

La búsqueda por significado falla con lo que se busca literalmente: un nombre exacto (parse_config) o un mensaje de error copiado de un log. Para eso cada repositorio tiene también un índice por palabras (BM25), con un tokenizador hecho para código que separa camelCase y snake_case y no depende de ningún idioma humano.

Usarlo en todas las búsquedas empeoró el examen: una pregunta en español comparte pocas palabras con código escrito en inglés, así que la lista por palabras solo metía ruido. La regla publicada decide por la forma de la consulta: si parece código, cuentan todas sus palabras; si es una frase, solo las coincidencias exactas.

Barras de acierto con y sin búsqueda por palabras en tres tipos de consulta
Con la regla, las preguntas en lenguaje natural no cambian (168 de 201), los nombres de función suben de 149 a 151 y el texto pegado del código, de 52 a 63 de 84.

Un juez que se detiene cuando está seguro

El juez lee las candidatas en orden y cada lectura cuesta unos 0,4 segundos. Si una supera el 90 % de probabilidad, no hace falta leer las siguientes.

El juez lee1.er lugar (de 201)Lecturas por búsqueda
Siempre las 51685,0
Hasta que una supera el 90 %1683,3
Hasta que una supera el 80 %1662,8
Siempre solo 31653,0

Para agentes de programación

El proceso en segundo plano usa dos hilos: uno responde al instante (saber si está vivo, su estado, detenerlo) aunque el otro esté buscando o indexando, y una búsqueda abandonada por su cliente se cancela. Por MCP, los agentes tienen dos herramientas: search_code, con paginación, avisos de cobertura y notificaciones de progreso, e index_status. El protocolo, las decisiones de arquitectura y los exámenes están documentados en el repositorio.

Lo que probamos y descartamos

Cada idea se midió con el mismo examen antes de entrar. Estas no pasaron:

Dispersión de velocidad contra acierto de cuatro formas de ejecutar el modelo de búsqueda
Ninguna forma de acelerar el modelo principal conservó los aciertos: los pesos en INT8 dan 1,25 a 1,3 veces más velocidad y pierden de 5 a 21 búsquedas; el modelo pequeño para todo es 2,3 veces más rápido y pierde 14.
IdeaResultadoDecisión
Pesos en INT8 para el modelo de búsqueda1,3× más rápido, 163 de 201 en el mejor casoDescartada
El modelo pequeño también para el código completo2,3× más rápido, 154 de 201Solo para esquemas
Esquemas de 2 líneas en vez de 4Igual de rápidos, 129 de 201 en vez de 135Descartada
Leer menos tokens por funciónLa función típica tiene unos 160 tokens: recortar a 384 ahorra 6–10 %Descartada
Dos jueces en paraleloCada lectura pasa de 0,39 s a 1,06 s: la CPU está limitada por la memoria, no por los núcleosDescartada
Buscar por palabras en todas las consultas145 a 155 de 201, sobre todo por las preguntas en españolSolo con la regla
Priorizar palabras raras de la pregunta que aparecen en nombres de funcionesArreglaba la búsqueda que la inspiró y bajó el examen a 141 de 201Descartada
Vigilar los archivos con un watcherDetectar cambios ya cuesta unos 110 ms de búsquedas de 1,3 a 2 sNo se construyó

La penúltima merece una nota: es fácil diseñar una regla mirando la búsqueda que falló y convencerse de que mejora el producto. Arreglaba ese caso y rompía 27 aciertos de otros. Por eso ninguna regla entra sin pasar por el examen.

Lecciones de método

  1. Medir antes de construir. Una prueba de 20 preguntas evitó construir sobre un modelo que no servía.
  2. Cada implementación nueva necesita su prueba de paridad. ONNX, Rust, Windows e INT8 "cargaban sin error"; solo la comparación con el original mostró cuáles daban lo mismo.
  3. El examen no debe escribirse leyendo la respuesta. Las preguntas escritas mirando el código favorecían a la búsqueda por palabras.
  4. Revisar muestras antes de escalar. Dos muestras de 50 preguntas corrigieron defectos que habrían contaminado 36 000.
  5. Un juez tiene que ganarle al rival barato más fuerte. Superar al más débil parecía un éxito y no lo era.
  6. Escribir la predicción antes del resultado y abrir el test una sola vez. Con 100 preguntas, 9 aciertos de diferencia pueden ser azar.
  7. Desglosar antes de celebrar. Un salto de 269 a 315 venía entero de un atajo del conjunto de datos.
  8. Vigilar la memorización mientras se entrena, no después, y quedarse con el mejor punto.
  9. Elegir al maestro con una prueba. El modelo más llamativo no fue el mejor.
  10. Diseñar para que la nube falle. El proveedor apagó GPUs dos veces a mitad de una corrida; guardar cada resultado al llegar convirtió eso en minutos perdidos, no en horas.
  11. Una regla que arregla un caso puede romper cuarenta. Toda mejora se mide con el examen completo, nunca con el ejemplo que la inspiró.
  12. Medir lo publicado, no lo que crees haber publicado. Un valor cambiado por error dejó los esquemas en 2 líneas durante dos versiones; solo el examen lo destapó.
  13. Las cifras publicadas de un modelo no sustituyen a tu examen. Un modelo con mejores resultados en los benchmarks públicos de código perdió 14 búsquedas en el nuestro.

Límites y costos

  • Los exámenes tienen 200 preguntas: detectan diferencias de unos 10 aciertos, no menores.
  • Si el buscador no trae la función correcta entre las candidatas, el juez no puede rescatarla.
  • Los modelos grandes con GPU siguen siendo mejores jueces; s1-code gana en tamaño, CPU, paridad de idioma, licencia y privacidad.
  • En un repositorio grande, todo queda buscable en minutos, pero la calidad final (el código completo de cada función) tarda más: en una CPU, unas 5 a 10 funciones por segundo.
  • El juez se entrenó con Python: en otros lenguajes y en código de dominios muy específicos da probabilidades bajas, y todavía no sabe decir con seguridad que la respuesta no está en el repositorio.
  • Los repositorios privados usados para el examen y parte del entrenamiento no se publican; se describen solo en conjunto.
  • Todavía no medimos el efecto en un agente real (tokens o tiempo ahorrados), que es la comparación que hace jevgrep.
Costo de GPU en la nubeUSD (estimado)
s1-code v1: preguntas, vectores, entrenamiento (L4) y evaluación4–5
s1-code v2: preguntas (4 L4), vectores, entrenamiento (A100, 64 min) y evaluación10–11
s1-code v3: vectores, maestro 4B, prueba de rivales, entrenamiento (A100, 73 min)8–10
s1grep: desarrollo y todas las mediciones en CPU0
Total22–26

Lo que sigue

  • s1-code v4: un juez generalista entrenado con varios lenguajes desde el inicio, con el mismo método y las mismas reglas de examen.
  • Saber decir "no está aquí": un examen con preguntas cuya respuesta no existe en el repositorio y un juez calibrado para reconocerlas. Es lo que más valor tendría para un agente: dejar de buscar donde no hay nada.
  • Medir con agentes reales, con las mismas tareas que usa jevgrep: cuántos archivos lee y cuántos tokens gasta un agente con y sin s1grep.

Cada versión se publica solo si le gana a la anterior en el examen. Si no, se cuenta igual.

Recursos

Referencias

¿Quieres aplicar IA en tu empresa sin enviar tus datos a la nube?

En API SERVICE SAC aplicamos IA conectada a tus sistemas, medida con tus propios datos.

Conversemos