Hace un año,
Desde entonces, Open AI, Anthropic y Google han lanzado versiones mejoradas de sus modelos y han aparecido nuevos jugadores como Deepseek y xAI. Muchos modelos se comercializan ahora como capaces de escribir código, lo que no era el caso antes.
Motivación
Hay referencias existentes para los LLM para evaluar sus habilidades de codificación.
Esto llevó a la creación de un nuevo punto de referencia, permitiendo una comparación directa de los LLM. Y, después de todo, ¿por qué no hacerlo sólo por diversión?
El diseño de los benchmarks
La idea es emular las acciones humanas al resolver problemas algorítmicos pero usar un LLM para escribir el código:
- Descarga la descripción del problema.
- Crear un prompt de la descripción.
- Generar código con el LLM.
- Enviar el código para la validación.
- Await results.
Estos pasos deben realizarse para cada problema en nuestro conjunto de pruebas y para cada LLM. Por razones de simplicidad, solo hay un intento para que un LLM escriba código sobre cada problema, sin ningún feedback para repetir para mejorar la solución.» BR
¿Por qué Leetcode?
Leetcode ha demostrado ser una buena opción para el benchmarking por varias razones:
- Los problemas de Leetcode se utilizan en entrevistas reales para puestos de ingeniero de software.
- Los estudiantes de ciencias de la computación aprenden a resolver problemas similares durante su educación.
- Tiene un juez en línea que puede comprobar si la solución es correcta en segundos.
- Muchos lenguajes de programación populares son compatibles.
- El rendimiento del usuario humano en este problema también está disponible.
Cómo funciona Leetcode
Si nunca ha tratado con la programación competitiva o la resolución de desafíos algorítmicos, aquí está una breve explicación.
Dado un conjunto de números enteros y un objetivo de números enteros, devuelva los índices de los dos números de tal forma que se sumen al objetivo. Puede asumir que cada entrada tendría exactamente una solución, y no puede usar el mismo elemento dos veces.Dado un conjunto de números enteros y un objetivo de números enteros, devuelva los índices de los dos números de tal forma que se sumen al objetivo. Puede asumir que cada entrada tendría exactamente una solución, y no puede usar el mismo elemento dos veces.Un programador concursante necesita escribir una pieza de código que resuelva ese problema. Para empezar, hay un "snippet" - una función incompleta, con un nombre y argumentos dados, pero un cuerpo vacío:
class Solución: def twoSum(self, nums: List[int], target: int) -> List[int]: # tu código aquí
class Solución: def dosSum(self, nums: List[int], target: int) -> List[int]: # tu código aquí
Normalmente, varias muestras de entrada y salida (casos de prueba), se proporcionan en la descripción:
Input: nums = [2,7,11,15], objetivo = 9 Sitio de salida: [0,1]
Input: nums = [2,7,11,15], objetivo = 9 Input: [0,1]
Un problema puede tener decenas de casos de prueba que solo están disponibles para el juez en línea.Un problema se resuelve (o una solución se considera aceptada) si y sólo si el código produce las salidas esperadas para todos los casos de prueba dentro de un tiempo y límites de memoria razonables.La solución puede ser escrita en cualquier lenguaje de programación que sea compatible con el juez.
Cada problema tiene una "taxa de aceptación", la proporción de soluciones aceptadas presentadas por los usuarios de Leetcode.Tenga en cuenta que un único usuario puede enviar su código un número ilimitado de veces, y cada intento cuenta hacia la tasa de aceptación.
Estas reglas no fueron inventadas por Leetcode; se han utilizado comúnmente en los concursos de ciencias de la computación durante bastante tiempo.
Conjuntos de datos
Como en la referencia anterior, quería ejecutar LLMs en dos conjuntos de problemas:
- Los problemas "conocidos" no solo se publican hace mucho tiempo, sino que también se utilizan más a menudo para entrevistas de software - por lo tanto, las soluciones están ampliamente disponibles.
- Los problemas "invisibles" que se publicaron recientemente, y sus soluciones probablemente no fueron observadas por los LLMs probados.
Los problemas "conocidos" no solo se publican hace mucho tiempo, sino que también se utilizan con más frecuencia para entrevistas de software - por lo tanto, las soluciones están ampliamente disponibles. Problemas "invisibles" que fueron publicados recientemente, y sus soluciones no eran susceptibles de ser observados por los LLMs probados. Mientras que la mayoría de los problemas tienen descripciones de texto simple y sólo requieren expandir una función dada con código, otros son diferentes. Algunos requieren implementar una interfaz, es decir, expandir varias funciones en un problema. Otros tienen enlaces y imágenes externas, lo que podría suponer dificultades para los LLM, ya que pocos modelos soportan las entradas de imagen o la navegación por Internet.
Leetcode ofrece tres listas de problemas: "Leetcode 75", y "Top interview 150", "Leetcode 75", y "Top 100 Me gusta" Mi conjunto de datos de "problemas bien conocidos" combina"Top entrevista 150""Leetcode 75""Top 100 Likes"
Para los problemas "invisibles", he seleccionado 99 de los problemas publicados más recientes: 33 fáciles, 33 medianos y 33 difíciles. El reciente fue determinado en base a los ID de problema, que son incrementales. Aunque Leetcode no muestra la fecha de publicación de los problemas, se puede aproximar a partir de comentarios y discusiones.
Los niveles de dificultad son puramente subjetivos y a la discreción de los editores. no tenía la intención de coincidir con el número de problemas para cada dificultad o conjunto de datos.
Configuración del problema
Configuración del problema
Conjunto de problemas
Configuración de problemas
(23 Mar 2025)
Bien conocido
Bien conocido
Bien conocido Unseen
(23 Mar 2025)
Invisible
(23 Mar 2019)
Invisible
(23 Mar 2025)» BR Total
133
99
Total
Total
Total
TotalTotales 131
133
99
99
Easy
41
33
Easy
Eso es fácil
Fácil de usar 41
41
33
33
Medium
78
33
Medios
Medios
Medios 78
78
33
33
Hard
14
33
Hard
Hard
Hardidad 14
14
33
33
Tasa de aceptación de usuarios de Leetcode
53.44%
37,05%
Ratio de aceptación de usuarios de Leetcode
Tasa de aceptación de usuarios de Leetcode
Rata de aceptación de los usuarios de Leetcode 53.44%
53.44%
53.44% 37,05%
37,05%
37,05%Las declaraciones de problemas y los fragmentos de código se obtuvieron usando mi herramienta de benchmarking, que se publica en Github: https://github.com/whisk/leetgptsolver
https://github.com/whisk/leetgptsolver https://github.com/whisk/leetgptsolver
Prompt, elección de idioma y generación de código
El índice de referencia fue diseñado de esta manera: LLM hace solo un intento de generar código sin ninguna información previa sobre el problema (o cualquier otro problema) y sin conocer sus casos de prueba, excepto aquellos que estaban en la descripción misma.
No hay mecanismo para proporcionar feedback o mejorar el código después de que se haya generado.Utilizé la misma prompt para cada LLM y cada problema:
Hola, esta es una entrevista de codificación. Se le dará: * Una declaración de problema (con casos de prueba de muestra si está disponible). * Un fragmento de código de inicio (con firmas de funciones fijas). Por favor escriba su solución en el lenguaje de programación {language}. Su código debe: * Solucionar el problema completamente y correctamente. * Pasar todos los casos de prueba de muestra proporcionados. * Ejecutar dentro de los límites de tiempo y memoria aceptables (asumir grandes entradas si no se especifican). * Siga buenas prácticas de codificación (lógica clara, estructura legible, uso apropiado de las características del idioma). Aquí está la declaración de problema: {question} Aquí está el fragmento de código, que debe ampliar con su solución: {snippet} Requisitos importantes:Hola, esta es una entrevista de codificación. Se le dará: * Una declaración de problema (con casos de prueba de muestras si está disponible). * Un fragmento de código de inicio (con firmas de funciones fijas). Por favor escriba su solución en el lenguaje de programación {language}. Su código debe: * Solucionar el problema completamente y correctamente. * Pasar todos los casos de prueba de muestras proporcionados. * Executar dentro de los límites de tiempo y memoria aceptables (asumir grandes entradas si no se especifican). * Siga buenas prácticas de codificación (lógica clara, estructura legible, uso adecuado de características de idioma). Aquí está la declaración de problema: {question} Aquí está el fragmento de código, que debe ampliar con su solución: {snippet} Requisitos importantes:El prompt fue “polido” con ChatGPT4 desde mi primer proyecto, pero sin implementar ninguna técnica de “ingeniería prompt”.
La descripción del problema fue borrada de las etiquetas HTML antes de utilizarla en el prompt.
Para el lenguaje de programación que escogí Python (versión 3).
Se pidió a los LLM que emitieran sólo el código de trabajo sin ningún texto anterior, pero eso no era cierto en muchos casos. se implementó una limpieza básica, y todo más que el código real se eliminó y no se envió.
Modelos y parámetros
Los modelos utilizados en el índice de referencia se enumeran en la tabla siguiente, con todos los parámetros no predeterminados especificados.
Las fechas de corte del conocimiento se obtienen de la documentación oficial del vendedor y se proporcionan para referencia, si son conocidas.
Vendor
Vendor
Vendedor
El vendedor El modelo
El modelo
El modelo Data de corte del conocimiento
Data de cierre del conocimiento
Data de corte del conocimiento "Reflexión"
"Reflexión"
“Razonamiento” Parametros
Parametros
Parámetros Antrópico
claude-3-7-sonnet-20250219
Nov 2024
No
temperatura = 0.0 max_tokens = 4096
Anthropic
Antigüedad
clase-3-7-sonnet-20250219
classificador 3-7-sonnet-20250219
claude-3-7-sonnet-20250219 Nuevo 2024
Año 2024
No
No
No
temperatura = 0.0 max_tokens = 4096
temperatura = 0.0 max_tokens = 4096
claude-3-7-sonnet-20250219 (con pensamiento habilitado)
Nov 2024
Yes
temperatura = 0.0 max_tokens = 16384 budget_tokens = 8192
claude-3-7-sonnet-20250219 (con pensamiento habilitado)
clase-3-7-sonnet-20250219 (con pensamiento habilitado)
claude-3-7-sonnet-20250219 (con pensamiento habilitado) Nuevo 2024
Año 2024
Sí
Sí
Sí
temperatura = 0.0 max_tokens = 16384 budget_tokens = 8192
temperatura = 0.0 max_tokens = 16384 budget_tokens = 8192
DeepSeek
deepseek-chat (DeepSeek-V3)
unknown
No
temperatura = 0.0
DeepSeek
Definición
deepseek-chat (DeepSeek-V3)
deepseek-chat (DeepSeek-V3)
deepseek-chat(DeepSeek-V3) en la página web nombre desconocido
conocido y desconocido
No
No
No
temperatura = 0.0
Temperatura = 0.0
deepseek-reasoner (DeepSeek-R1)
unknown
Yes
temperatura = 0.0
Reflexiones en profundidad (DeepSeek-R1)
Reflexiones sobre la profundidad (DeepSeek-R1)
Deepseek-reasoner (DeepSeek-R1)
unknown
conocido y desconocido
Sí
Sí
Sí
temperatura = 0.0
Temperatura = 0.0
Google
gremini-2.0-flash-001
unknown
No
temperatura = 0.0
Google
En Google
mujer 2.0-flash-001
mujer 2.0-flash-001
Genius 2.0-flash-001 nombre desconocido
conocido y desconocido
No
No
No
temperatura = 0.0
Temperatura = 0.0
gemini-2.0-pro-exp-02-05
unknown
No
temperatura = 0.0
conexión 2.0-pro-exp-02-05
mujer 2.0-pro-exp-02-05
mujer 2.0-pro-exp-02-05 nombre desconocido
conocido y desconocido
No
No
No
temperatura = 0.0
Temperatura = 0.0
gemini-2.5-pro-exp-03-25
unknown
Yes
temperatura = 0.0
m22.5-pro-exp-03-25
Gomera-2.5-pro-exp-03-25
Gemini-2.5-pro-exp-03-25 nombre desconocido
conocido y desconocido
Sí
Sí
Sí
temperatura = 0.0
Temperatura = 0.0
xAI
grok-2-1212
Julio 17, 2024
No
seed = 42
xAI
xA y
grok-2-1212
Grock-2-1212
grok-2-1212 Julio 17, 2024
El 17 de julio de 2024
No
No
No
sementes = 42
Sementes = 42
OpenAI
o1-2024-12-17
Oct 01, 2023
Yes
seed = 42
OpenAI
Abrir la página
o1-2024-12-17
o1-2024-12-17
o1-2024-12-17 Oct 01, 2023
Oct 01, 2023
Sí
Sí
Sí
sementes = 42
Sementes = 42
o3-mini-2025-01-31
Oct 01, 2023
Sí
seed = 42
o3-mini-2025-01-31
o3-mini-2025-01-31
o3-mini-2025-01-31 Oct 01, 2023
Oct 01, 2023
Sí
Sí
Sí
sementes = 42
Sementes = 42
El índice de referencia tenía como objetivo ser lo más determinista y reproducible posible; por lo tanto, se utilizaron parámetros como "temperatura" o "semilla". sin embargo, ninguno de los modelos probados garantiza una salida totalmente determinista.
Todas las fechas de corte conocidas son anteriores al problema más antiguo en el conjunto de datos conocido (noviembre de 2024). sin embargo, no pude encontrar fechas de corte para las familias de modelos Gemini y DeepSeek.
Algunos modelos soportan los modos de "razonamiento" o "pensamiento" por defecto, mientras que para Claude 3.7 Sonnet se puede habilitar mediante el paso de parámetros. El uso de esta función se especifica en la tabla. Otras características del modelo (o "herramientas") como la búsqueda web no se habían habilitado, incluso si se admitió.
Resultados
Todos los competidores mostraron tasas de aceptación muy altas en problemas bien conocidos, como en el índice de referencia anterior. no probé modelos o modificaciones superiores (es decir: Claude 3.7 Sonnet con razonamiento habilitado, DeepSeek R1, Gemini 2.5 Pro, O1) para ahorrar tiempo y créditos, ya que los resultados eran altamente predecibles.
Los resultados son sorprendentemente diferentes para los problemas "invisibles" en dos aspectos:
- Para todos los modelos la tasa de aceptación es menor para los problemas "invisibles". Esto es especialmente notable para los problemas medianos y duros.
- Los modelos con el modo "razonamiento" o "pensamiento" habilitado produjeron mejores resultados en problemas de todas las dificultades, aunque los números exactos variaron de modelo en modelo.
Para todos los modelos la tasa de aceptación es menor para los problemas "invisibles".la tasa de aceptación es más baja para los problemas "invisibles" Los modelos con el modo "razonamiento" o "pensamiento" permitieron producir mejores resultados en problemas de todas las dificultades, aunque los números exactos variaron de modelo a modelo. Los modelos con el modo "razonamiento" o "pensamiento" permitieron producir mejores resultadosLas tasas de aceptación significativamente más altas para los problemas conocidos se pueden explicar por la posibilidad de que esos problemas y sus soluciones fueran parte de los conjuntos de capacitación, y los modelos sólo tuvieron que reproducir una solución correcta conocida. Sin embargo, la tasa de aceptación de los usuarios para los nuevos problemas medios y duros también es menor que para los problemas en el conjunto "conocido". Este caso es difícil de cuantificar, y no significa necesariamente que los nuevos problemas sean "más difíciles".
Todos los modelos con el modo "reasoning" habilitado superaron significativamente a sus homólogos básicos. Lo más importante, algunos de ellos fueron capaces de resolver una parte considerable de problemas medianos y duros - un logro imposible hace sólo un año. El o3-mini muestra los mejores resultados entre todos los modelos "reasoning" - se desempeñó incluso mejor que el mucho más caro y más lento o1. Hay que señalar que o3-mini fue entrenado específicamente para resolver problemas de programación competitivos. Sin embargo, me resisto a concluir cuál modelo es mejor para resolver problemas algorítmicos porque depende mucho del presupuesto del token, y la latencia y elLo más importante, algunos de ellos fueron capaces de resolver una parte considerable de problemas medios y duroso3-mini fue especialmente entrenado el o3-mini fue especialmente entrenado
Consideraciones futuras
No se puede garantizar que los conjuntos de problemas "invisibles" no estén incluidos en los datos de formación de los modelos.Para abordar esto, podemos considerar generar nuevos problemas únicos diseñados específicamente para futuros índices de referencia - por supuesto, utilizando LLMs.
Además, otra estrategia es emplear lenguajes de programación menos comúnmente utilizados.Este enfoque puede requerir que los LLM diseñen una solución en lugar de "copiar-pasar" el código correcto conocido escrito en Python.
Estas ideas necesitan más investigación, y espero que alguien más o yo pueda sumergirse en ellas.
Línea
- Raw resultados, problemas, y el código fuente se pueden encontrar en mi GitHub:
https://github.com/whisk/leetgptsolver - Mis resultados de referencia anteriores (2024):
https://hackernoon.com/testing-llms-on-solving-leetcode-problems
Raw resultados, problemas y el código fuente se pueden encontrar en mi GitHub: https://github.com/whisk/leetgptsolver https://github.com/whisk/leetgptsolver https://github.com/whisk/leetgptsolverMis resultados de referencia anteriores (2024): https://hackernoon.com/testing-llms-on-solving-leetcode-problems https://hackernoon.com/testing-llms-on-solving-leetcode-problems https://hackernoon.com/testing-llms-on-solving-leetcode-problems
Cubre la imagen creada por DALL·E.