8 puntos por GN⁺ 2025-01-04 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-01-04
Opinión de Hacker News
  • En la optimización de código, conviene probar primero si el número es menor que el mínimo o mayor que el máximo. Se puede hacer antes de calcular la suma digital y puede aumentar la velocidad hasta 5.5 veces. Esto se puede hacer con numpy sin usar Numba.
  • Modelos de lenguaje grandes (LLM) como GPT suelen dar resultados de nivel intermedio al principio. Se afirma que se pueden obtener mejores resultados con instrucciones específicas.
  • Un LLM actúa como un motor de simulación situacional y simula modelos del mundo real mediante la predicción de texto. Para una predicción de texto precisa se necesita un modelo preciso del mundo real.
  • Los LLM tienden a enfocarse en programación para principiantes, y es efectivo especificar paquetes y solicitar código simple.
  • En Android/Kotlin, ChatGPT es ineficiente y suele llamar a métodos inválidos o obsoletos con frecuencia.
  • Es importante comenzar una sesión de programación con una "planificación abierta" en lugar de "escribir código". Hay que explicitar las suposiciones del LLM y ajustar el plan antes de codificar.
  • Explica cómo desinstalar y reinstalar PostgreSQL por completo en Debian, manteniendo el directorio de datos para conservar las bases de datos existentes.
  • Optimizar el código demasiado pronto puede ser contraproducente; es mejor optimizarlo solo cuando sea necesario.
  • Pedir repetidamente "escribe mejor código" puede degradar el rendimiento. Puede hacer que la solución deje de funcionar.
  • En LiveCode, el cálculo es más rápido que en Python; se explica cómo calcular la suma usando un bucle.