- Este texto explora si solicitar repetidamente a un LLM que “escriba mejor código” al programar mejora realmente el código.
- El caso original se inspiró en un meme de la función de generación de imágenes de DALL-E de ChatGPT, donde se pide “hazlo más ...”.
Experimento con prompts de repetición simple
- A Claude 3.5 Sonnet se le proporcionó un prompt de programación en Python para resolver un problema sencillo pero optimizable.
- Implementación base
- Entre un millón de enteros aleatorios entre 1 y 100,000, calcular la diferencia entre el mínimo y máximo cuya suma de dígitos sea 30.
- La implementación simple tardó 657 ms (usando conversión con
str en Python).
- Iteración #1
- Se pidió a Claude que “escribiera mejor código” para mejorar el código.
- Claude refactorizó el código en forma de clase de Python, lo volvió orientado a objetos y precalculó la suma de dígitos de todos los números.
- 2.7x más rápido.
- Iteración #2
- Claude optimizó aún más el código usando multiprocesamiento y operaciones vectorizadas de NumPy.
- 5.1x más rápido.
- Iteración #3
- El código se volvió más complejo y hubo una regresión al enfoque de conversión de cadenas.
- 4.1x más rápido.
- Iteración #4
- Claude usó la librería Python
numba para invocar un compilador JIT y asyncio de Python para implementar paralelización.
- Mejora de rendimiento de hasta 100x.
- En lugar de “el código se vuelve cósmico”, terminó siendo un código “de nivel enterprise” sobreingenierizado.
Aplicación de ingeniería de prompts
- Para optimizar la salida del LLM, se necesita ingeniería de prompts.
- Claude 3.5 Sonnet tiene una fuerte capacidad para cumplir instrucciones de prompt, por lo que si le das directrices claras se obtienen mejores resultados.
- En lugar de solo “escribir mejor código”, se usa un prompt de sistema con instrucciones detalladas.
- Prompt inicial
- Se define con detalle qué significa “código optimizado” (algoritmo, paralelización, minimizar código innecesario, etc.).
- En la primera implementación, optimizar la suma de dígitos con Numba logró una mejora de 59x.
- Iteración #1
- Claude añadió paralelización, pero introdujo una operación rara de desplazamiento de bits (para hexadecimal) que generó un error.
- El rendimiento cayó a 9.1x.
- Iteración #2
- Claude intentó mejorar con operaciones SIMD, pero aún usó una operación de desplazamiento de bits incorrecta.
- Fue 65x más rápido que la implementación inicial.
- Iteración #3
- Claude optimizó el rendimiento usando una tabla hash.
- Fue 100x más rápido que la implementación inicial.
- Iteración #3
- Claude corrigió la operación de desplazamiento de bits incorrecta, lo que redujo ligeramente el rendimiento.
- Fue 95x más rápido que la implementación inicial.
Conclusión
- Incluso con un prompt ambiguo de “mejor código”, es posible ver mejoras graduales.
- Con ingeniería de prompts, al indicar claramente la dirección deseada (operaciones numéricas, JIT, paralelización, etc.), se obtiene código más evolucionado más rápido.
- Las ideas de optimización automatizada pueden ser una vía para descubrir nuevas herramientas (como numba), pero el ingeniero debe seguir validando errores y usarlas de forma selectiva.
- En sistemas reales de producción, no conviene usar sin filtro todo el código propuesto por un LLM; las restricciones por dominio y la necesidad de validación siguen siendo grandes.
- Este experimento está basado en código Python, pero también existe mucho potencial para aplicar ideas de optimización de LLM en otros lenguajes y enfoques de integración con Rust (como PyO3, entre otros).
1 comentarios
Opinión de Hacker News