Un mini marco para evaluar el rendimiento de LLM en el juego de adivinanzas de los toros y vacas, que apoya a múltiples proveedores a través de Litellm.
Nota
TLDR: Bulls and Cows es un juego que rompe el código para dos jugadores. Un jugador escribe un número secreto de 4 dígitos. Los dígitos deben ser todos diferentes (por ejemplo, 1234 ). Luego, otro jugador (un LLM en este caso) trata de adivinar el número secreto (por ejemplo, 1246 ). Por cada suposición se devuelve la información del número de partidos. Si los dígitos coincidentes están en sus posiciones correctas, son "toros" (dos toros en este ejemplo: 1 y 2 ), si en diferentes posiciones, son "vacas" (una vaca, 4 ). La solución correcta requiere razonamiento para pensar en la próxima buena memoria de suposición y en contexto para aprender de las respuestas pasadas. Se demuestra que cualquier número secreto de 4 dígitos se puede resolver en siete turnos.


| Modelo | Juegos | Tasa de éxito | AVG Turns (solo éxito) | Fallas de formato (giros) |
|---|---|---|---|---|
| OPERAI/O1-MINI-2024-09-12 | 25 | 60.0% [40.7%; 76.6%] | 9.1 ± 2.7 | 23.1% |
| OpenRouter/Anthricic/Claude-3.5-Sonnet | 50 | 36.0% [24.1%; 49.9%] | 9.8 ± 4.0 | 0.0% |
| OPERAI/GPT-4O-2024-08-06 | 50 | 30.0% [19.1%; 43.8%] | 9.5 ± 3.6 | 0.0% |
| OPERAI/GPT-4O-MINI-2024-07-18 | 50 | 26.0% [15.9%; 39.6%] | 10.0 ± 3.1 | 0.1% |
| OpenRouter/Deepseek/Deepseek-chat | 50 | 18.0% [9.8%; 30.8%] | 11.6 ± 3.6 | 3.3% |
| OpenRouter/Meta-llama/Llama-3.1-405b-Instructo | 50 | 8.0% [3.2%; 18.8%] | 9.5 ± 3.3 | 3.0% |
| OpenRouter/Google/Gemini-PRO-1.5 | 50 | 8.0% [3.2%; 18.8%] | 8.0 ± 4.1 | 0.1% |
| OpenRouter/Google/Gemini-Flash-1.5 | 50 | 2.0% [0.4%; 10.5%] | 8.0 ± 0.0 | 0.9% |
| antrópico/Claude-3-5-HAIKU-20241022 | 50 | 0.0% [0.0%; 7.1%] | 0.0 ± 0.0 | 0.9% |
Importante
Para la mayoría de las carreras, se jugaron 50 juegos (excl. O1-Mini), por lo tanto, los intervalos de confianza son amplios. Si desea gastar $ 100-200 en créditos API en las pruebas para lograr resultados más precisos y hacer que el CIS sea más estrecho, no dude en comunicarse conmigo o abrir un PR con sus resultados.
GUESS: 1234 (definido en el archivo de indicaciones).strip() se agregó para abordar esto).o1-mini , a menudo olvida el formato de reglas y trata de agregar énfasis audaz a la respuesta. Este comportamiento se consideró inaceptable y se contó como un error y un giro desperdiciado, ya que la instrucción especifica explícitamente el formato requerido.o1-mini ).3 dígitos (versión de depuración: menos turnos, razonamiento más corto):
openai/gpt-4o-mini-2024-07-18 : 283K almacenado en caché + 221k sin dejar engramado + 68k salida = $ 0.1 ( recomendado para la depuración )
openai/gpt-4o-2024-08-06 : 174K almacenado en caché + 241k sinachado + 56k salida = $ 1.38
openai/gpt-4-turbo-2024-04-09 : desconocido = $ 6.65
openai/o1-mini-2024-09-12 : 0K almacenado en caché + 335k sin dejar engramado + 1345k salida = $ 17.15
anthropic/claude-3-haiku-20240307 : 492K Entrada + 46k Salida = $ 0.18
4 dígitos (versión principal):
openai/gpt-4o-mini-2024-07-18 : 451K almacenado en caché + 429k sin dejar de lado + 100k Salida = $ 0.15
openai/gpt-4o-2024-08-06 : 553k en caché + 287k sin dejar de lado + 87k = $ 2.29
(25 juegos) openai/o1-mini-2024-09-12 : 0k almacenado en caché + 584k sin dejar engramado + 1815k salida = $ 23.54
anthropic/claude-3-5-haiku-20241022 : 969K Entrada + salida de 90k = $ 1.42
openrouter/anthropic/claude-3.5-sonnet (nuevo): desconocido = $ 5.2
Este marco surgió gracias a un curioso comentario de un suscriptor de mi canal de telegrama. Afirmaron haber probado varios LLM en un juego de toros y vacas, concluyendo que ninguno podría resolverlo y, por lo tanto, los LLM no pueden razonar. Intrigado, pedí ejemplos de estos llamados "fracasos", solo para que me dijeran que los chats fueron eliminados. Conveniente. Más tarde, mencionaron probar la previa O1, que aparentemente lo resolvió, en aproximadamente 20 movimientos, lejos de los 7 movimientos considerados óptimos.
Mientras tanto, había estado buscando una excusa para experimentar con OpenHands, y ¿qué mejor manera que desafiar a Copilot a girar un punto de referencia de LLM desde cero? Después de tres noches de esfuerzo a medias (estaba jugando al Stalker 2 simultáneamente), nació este punto de referencia, un producto de la apatía de partes iguales y el deseo de demostrar un punto que nadie pidió. ¡Disfrutar!
pip install -r requirements.txt
pre-commit install(Opcional) Para comprender la lógica, lea todas las indicaciones aquí.
Configure las claves API de su proveedor de LLM como variables de entorno (ya sea directora en su terminal o usando el archivo .env). Recomiendo usar teclas OpenAI o antrópicas y OpenRouter para cualquier otra cosa.
Ajuste config/default_config.yaml con el modelo deseado y la configuración del juego. Use run_id para almacenar diferentes ejecuciones en carpetas separadas; de lo contrario, las carpetas de resultados se nombrarán con marcas de tiempo. Los campos principales son: model , target_length (cuántos dígitos en el número secreto), num_concurrent_games (para evitar límites de API TPS ridículas. Por ejemplo, para el nivel antrópico 2 no recomiendo establecer este valor por encima de 2 , mientras que OpenAI fácilmente podría soportar 8 - 10 juegos concurrentes).
Ejecute el punto de referencia y visualice los resultados de todas las ejecuciones:
python run_benchmark.py
python scripts/visualize_results.pyLos resultados estarán disponibles en HTML (con gráficos adicionales) y Markdown.
El punto de referencia evalúa LLM en tres aspectos clave:
Los resultados se guardan con historiales de juegos completos (incluidos registros de conversación, por ejemplo, aquí) y configuraciones para un análisis detallado.
El proyecto usa negro (longitud de línea: 100) e ISORT para el formato de código. Los ganchos previos al comercio aseguran la calidad del código al verificar:
Ejecutar cheques manuales con:
pre-commit run --all-filesEjecutar pruebas (sí, hay pruebas en la lógica del juego, el análisis y la validación de la respuesta):
python -m pytest . -v