180 lecturas Nueva Historia

Testar LLMs en la resolución de problemas de Leetcode en 2025

por Alex Svetkin9m2025/04/08
Read on Terminal Reader

Demasiado Largo; Para Leer

Los LLM de "razonamiento" de última generación pueden resolver una cantidad considerable de problemas algoritmicos difíciles de Leetcode.
featured image - Testar LLMs en la resolución de problemas de Leetcode en 2025
Alex Svetkin HackerNoon profile picture
0-item
1-item

Hace un año, mi punto de referencia mostró que los Grandes Modelos de Idiomas (LLMs) podían resolver desafíos de codificación algorítmica en Leetcode. Sin embargo, su capacidad estaba limitada a un subconjunto de conocidos problemas "populares". Nuevos problemas, que nunca formaban parte de sus conjuntos de datos de capacitación, presentaron dificultades. Mientras que los más fáciles fueron principalmente resueltos por los modelos, los más difíciles permanecieron inaccesibles.

mi punto de referenciami punto de referencia

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.

SWE-bench se centra en resolver problemas de software en la vida real - se basa en problemas de Github de proyectos de código abierto existentes.SWE-benchSWE-bench

Codeforces valores de referencia reflejan mejor las habilidades algorítmicas de resolución de problemas de los LLMs. OpenAI probó los modelos o1 y o3 en los problemas de Codeforces y compartió resultados detallados (1, 2), mientras que otros competidores no lo hicieron. Esto hizo imposible una comparación directa.

CodeforcesCodeforces1122

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:

  1. Descarga la descripción del problema.
  2. Crear un prompt de la descripción.
  3. Generar código con el LLM.
  4. Enviar el código para la validación.
  5. Await results.
  • 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.
  • A espera de los resultados.

  • Sketched pasos de la referencia

    Sketched pasos de la referencia


    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.
  • 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.
  • Se admiten muchos lenguajes de programación populares.
  • 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/leetgptsolverhttps://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

    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

    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

    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

    sementes = 42

    Sementes = 42


    o3-mini-2025-01-31

    Oct 01, 2023

    seed = 42



    o3-mini-2025-01-31

    o3-mini-2025-01-31

    o3-mini-2025-01-31

    Oct 01, 2023

    Oct 01, 2023

    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

    Results on the "well-known" problem set

    Results on the "well-known" problem set


    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.

    Results on the "unseen" problem set

    Results on the "unseen" problem set

    Los resultados son sorprendentemente diferentes para los problemas "invisibles" en dos aspectos:

    1. 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.
    2. 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 resultados

    Las 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 entrenadoel 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
  • https://github.com/whisk/leetgptsolverhttps://github.com/whisk/leetgptsolver
  • Mis resultados de referencia anteriores (2024): https://hackernoon.com/testing-llms-on-solving-leetcode-problems
  • https://hackernoon.com/testing-llms-on-solving-leetcode-problemshttps://hackernoon.com/testing-llms-on-solving-leetcode-problems


    Cubre la imagen creada por DALL·E.

    Trending Topics

    blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks