El auge de los Modelos de Lenguaje de Gran Escala (LLMs) ha desatado una ola de herramientas de generación de código. Sin embargo, la mayoría de estas herramientas se limitan a ser simples autocompletados con esteroides. Escribir una función aislada es fácil; modificar un sistema de software heredado de 500,000 líneas de código sin introducir efectos secundarios es un desafío completamente distinto.
En Bystro, hemos desarrollado un enfoque que permite a los agentes de código operar en repositorios complejos con un nivel de acierto equivalente al de un ingeniero de software experimentado.
El límite del contexto plano
La mayoría de los asistentes de código actuales intentan meter tantos archivos como sea posible en la "ventana de contexto" del LLM. Este enfoque de "fuerza bruta" falla por tres razones clave:
- Pérdida de atención en el medio: Los LLMs tienden a ignorar información ubicada en el centro de contextos extremadamente largos.
- Ruido innecesario: Importar archivos de configuración, estilos e interfaces irrelevantes confunde el razonamiento lógico del modelo.
- Costo y latencia: Procesar cientos de miles de tokens por cada pequeña iteración hace que el bucle de feedback del desarrollo sea demasiado lento.
Nuestro enfoque: Representación en Grafos de Contexto Activo
En lugar de tratar el código como texto plano, nuestro sistema construye un Grafo de Contexto Activo (Active Context Graph) en tiempo real.
1. Extracción de AST y Firmas
Cuando un agente recibe una tarea (por ejemplo, "Modificar el sistema de facturación para permitir cobros parciales"), no lee los archivos línea por línea. En su lugar:
- Analiza el AST (Abstract Syntax Tree) de la base de código.
- Extrae las firmas de tipo y las dependencias de los módulos afectados.
- Genera una representación abstracta que expone solo los puntos de entrada, tipos y llamadas clave de los componentes.
2. Inferencia de Dependencias Dinámicas
El sistema determina dinámicamente qué partes del código importan o se ven afectadas por la sección que se quiere modificar. Si modificamos un tipo en PaymentService, el grafo de contexto marca automáticamente los archivos en Controllers y Repositories que consumen ese tipo, presentándolos al agente como advertencias inmediatas de tipo de compilación.
3. Bucle de Edición de Dos Pasos
Dividimos la tarea del agente en dos roles diferenciados:
- El Planificador (Planner): Analiza el problema a alto nivel, navega por el grafo de dependencias y describe qué archivos se deben modificar y qué pruebas deben escribir.
- El Ejecutor (Executor): Realiza modificaciones quirúrgicas específicas (usando herramientas de parcheo precisas basadas en bloques de código) y ejecuta la suite de tests en milisegundos. Si el test falla, el ejecutor reporta la traza de error al planificador para ajustar la estrategia.
Resultados
Este enfoque quirúrgico reduce el consumo de tokens en un 85% y aumenta la tasa de éxito de compilación en el primer intento del 35% al 92% en proyectos de escala empresarial.
El futuro del desarrollo de software no reside en crear modelos más grandes con ventanas de contexto infinitas, sino en estructurar y representar el conocimiento del software de una manera que las máquinas puedan digerir con precisión arquitectónica.
