El uso de Large Language Models (LLMs) en sistemas de ingeniería de software, como los revisores de código automatizados, introduce un nuevo vector de costo y latencia directamente ligado al consumo de tokens y a la interacción con las APIs de los modelos. A medida que la capacidad de los LLMs mejora, la complejidad de las tareas que se les asignan aumenta, lo que puede llevar a un incremento desproporcionado en el consumo de recursos. Este fenómeno no es exclusivo de los LLMs; históricamente, la mejora en la capacidad de cómputo ha llevado a la creación de algoritmos y sistemas más complejos que, sin una optimización continua, pueden volverse prohibitivamente caros o lentos. La tesis central es que la optimización de sistemas basados en LLMs a escala de hyperscaler requiere un análisis granular del flujo de tokens y llamadas, aplicando principios de caching y paralelización, y una experimentación rigurosa con los parámetros del modelo para equilibrar costo, latencia y calidad.

El problema fundamental de la computación que se aborda es la eficiencia de recursos en sistemas distribuidos de alto costo marginal por operación. En el contexto de los LLMs, cada token procesado o generado tiene un costo monetario y de latencia asociado. La explosión de la complejidad y el tamaño de los modelos, junto con la demanda de interacciones conversacionales, agrava este problema. La solución no reside únicamente en la selección del modelo más barato, sino en una ingeniería de prompts y una orquestación de llamadas que minimice el trabajo redundante y maximice la reutilización de cómputo, similar a cómo se optimizan las bases de datos con índices y caches para reducir las operaciones de I/O costosas.

Arquitectura del Sistema

El sistema de revisión de código se compone de un coordinador que distribuye el trabajo a un conjunto de revisores especializados, cada uno potencialmente utilizando diferentes modelos LLM. La interacción con los LLMs se realiza a través de APIs de proveedores externos (Anthropic, OpenAI). Un componente clave es el uso de una caché de prompts (Anthropic's prompt cache), que almacena prefijos de conversaciones ya computados por el LLM. Esta caché es fundamental para reducir el costo, ya que la escritura cuesta 1.25 veces el precio de entrada normal y la lectura 0.1 veces. La estrategia de optimización se centró en dos áreas principales: maximizar los aciertos de caché y reducir el número de llamadas al LLM por sesión.

Para maximizar los aciertos de caché, se reestructuró la construcción del prompt del sistema. Inicialmente, el prompt incluía información específica del repositorio y la fecha, impidiendo la reutilización de prefijos entre diferentes repositorios. Se introdujo un 'cache breakpoint' después de la parte común del prompt (definiciones de herramientas, prompt del agente) y se eliminó la información específica del repositorio de esa sección. Esto permitió que el primer request de cada sesión leyera de la caché en lugar de escribir, compartiendo un prefijo común entre todos los repositorios. Además, se movieron índices de referencia (estándares internos, archivos de habilidades) del revisor Codex directamente al prompt, eliminando llamadas de herramientas iniciales. Para reducir las llamadas al LLM, se eliminaron herramientas no utilizables por sub-revisores, se paralelizaron lecturas de archivos (permitiendo que los revisores leyeran contexto compartido y parches en una sola respuesta), se omitieron revisores en re-revisiones si no había cambios relevantes, y se eliminaron pasos post-revisión innecesarios. También se implementó un mecanismo para cancelar trabajos de LLM en curso si la revisión era cancelada externamente.

Flujo de Revisión de Código Optimizado

  1. 1 Ingreso de Merge Request El coordinador recibe una solicitud de revisión de código.
  2. 2 Preparación de Prompt Se construye el prompt del sistema con un prefijo compartido y un breakpoint ...
  3. 3 Consulta a Caché de Prefijos El primer request del LLM intenta leer el prefijo compartido de la caché.
  4. 4 Llamada Paralela a LLM Múltiples revisores (calidad, seguridad, rendimiento) inician llamadas al LLM...
  5. 5 Lectura de Archivos (Paralelo) Los revisores leen contexto compartido y parches en la primera respuesta del ...
  6. 6 Procesamiento LLM El LLM genera hallazgos y recomendaciones.
  7. 7 Filtrado de Hallazgos Se filtran hallazgos menores/duplicados, se ajusta la severidad.
  8. 8 Publicación de Revisión Se publica el comentario final de la revisión.
CapaTecnologíaJustificación
compute Anthropic Models (Claude Opus, Sonnet) Modelos Large Language Model (LLM) utilizados para la generación de revisiones de código. vs OpenAI Models (Codex)
cache Anthropic Prompt Cache Caché de prefijos de prompts para reducir el costo de tokens de entrada recurrentes. vs Custom caching layer, No caching Costo de escritura 1.25x, costo de lectura 0.1x. Expiración de 5 minutos.
orchestration OpenCode v2 Plataforma interna para orquestar las revisiones de código y las interacciones con los LLMs. vs OpenCode v1, pi-durable on Durable Objects
observability Internal Monitoring Tools Seguimiento del uso de tokens, costos por revisión, latencia y calidad de los hallazgos.

Trade-offs

Ganancias
  • ▲ Costo por revisión
  • ▲ Latencia de revisión
  • ▲ Calidad de hallazgos (menos ruido)
  • ▲ Fiabilidad (menos reintentos/fallos)
Costes
  • △ Hallazgos reales (Performance y Security en esfuerzo medio)
  • △ Latencia inicial (espera por caché compartida)

Fundamentos Teóricos

El problema de la eficiencia en el uso de recursos computacionales y la gestión de la latencia en sistemas distribuidos ha sido un tema central en la investigación académica durante décadas. La optimización de la caché de prompts en LLMs se alinea con los principios fundamentales de los sistemas de caché en la jerarquía de memoria, como se describe en trabajos clásicos sobre arquitectura de computadoras y sistemas operativos. Conceptos como la localidad temporal y espacial, y la minimización de 'cache misses', son directamente aplicables. La estrategia de dividir el prompt en prefijos reutilizables y gestionar los 'cache breakpoints' es análoga a la optimización de estructuras de datos para mejorar el rendimiento de la caché de CPU o la paginación de memoria.

La reducción de llamadas a la API y la paralelización de operaciones de I/O (lectura de archivos) reflejan principios de diseño de sistemas distribuidos para minimizar la latencia de red y el overhead de serialización/deserialización, como se discute en papers sobre RPC (Remote Procedure Call) y microservicios. La experimentación con modelos y niveles de esfuerzo para encontrar el punto óptimo entre costo y calidad es una aplicación práctica de la optimización multi-objetivo, un campo estudiado en investigación operativa y aprendizaje automático, donde se busca un equilibrio entre métricas a menudo contradictorias. La evaluación de la calidad de las revisiones, diferenciando entre 'ruido' y 'hallazgos importantes', se relaciona con métricas de precisión y recall en sistemas de recuperación de información y clasificación, fundamentales en el campo del Machine Learning y la minería de datos.