Aritmética exacta en LLMs: generación de código ejecutable
Los modelos de lenguaje no están diseñados para cálculos precisos: la arquitectura de transformadores predice tokens basándose en probabilidades, no en operaciones matemáticas. Una consulta como "18 × 38.76" podría devolver 697.68 o incluso un error como 680 debido a aproximaciones de patrones extraídos durante el entrenamiento. Este es un límite sistémico, no una degradación del modelo.
Solución: mantener al LLM fuera del cálculo directo. El modelo genera un script en Python para la tarea, que se ejecuta en un entorno aislado. Python garantiza precisión: 18 * 38.76 siempre devuelve exactamente 697.68.
Arquitectura del sistema
Flujo de procesamiento: usuario → LLM → script en Python → contenedor Docker → resultado (texto + Excel).
Ejemplo: cálculo de facturas de servicios (Tomsk):
- Entrada del usuario: «CW 320, HW 229, electricity 7422, prev: CW 302, HW 222, electricity 7133».
- LLM con prompt sistemático (tarifas desde configuración) genera un script.
- El script calcula el consumo, aplica tarifas y construye una tabla.
- Ejecución en sandbox, archivo devuelto.
Código generado simplificado:
# Lecturas de medidores
cold_current, cold_prev = 320, 302
hot_current, hot_prev = 229, 222
elec_current, elec_prev = 7422, 7133
# Consumo
cold_usage = cold_current - cold_prev # 18 m³
hot_usage = hot_current - hot_prev # 7 m³
elec_usage = elec_current - elec_prev # 289 kWh
# Tarifas de Tomsk 2025 (desde config, no del modelo)
tariffs = {
'cold_water': 38.76,
'hot_water': 142.63,
'electricity': 4.94,
'drainage': 27.04,
}
# Cálculo
cold_cost = cold_usage * tariffs['cold_water'] # 697.68
hot_cost = hot_usage * tariffs['hot_water'] # 998.41
elec_cost = elec_usage * tariffs['electricity'] # 1427.66
drain_cost = (cold_usage + hot_usage) * tariffs['drainage'] # 676.00
total = cold_cost + hot_cost + elec_cost + drain_cost # 3799.75
# Generar Excel
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['Servicio', 'Consumo', 'Tarifa, ₽', 'Monto, ₽'])
ws.append(['Agua fría', f'{cold_usage} m³', tariffs['cold_water'], cold_cost])
ws.append(['Agua caliente', f'{hot_usage} m³', tariffs['hot_water'], hot_cost])
ws.append(['Electricidad', f'{elec_usage} kWh', tariffs['electricity'], elec_cost])
ws.append(['Alcantarillado', f'{cold_usage + hot_usage} m³', tariffs['drainage'], drain_cost])
ws.append(['TOTAL', '', '', total])
wb.save('comunal.xlsx')
Las tarifas se inyectan desde un archivo externo de configuración actualizado mediante fuentes oficiales — sin alucinaciones del modelo.
Elección del LLM y sandbox
Modelos:
- Qwen (Alibaba): API gratuita, generación confiable de código para tareas simples.
- DeepSeek V3: Ideal para escenarios complejos (análisis de documentos), soporta caché de prompts.
GPT-4/Claude son excesivos para scripts de menos de 20 líneas.
Sandbox: contenedor Docker bajo demanda.
- Aislamiento por usuario.
- Librerías base: openpyxl, math, datetime.
- Tiempo máximo: 30 segundos.
- Pandas/numpy bloqueados en prompts.
Problemas comunes y soluciones
| Problema | Solución |
|--------|----------|
| Alucinaciones de tarifas | Inyectar tarifas desde el archivo de configuración en el prompt |
| Cálculo directo sin código | Validación + reintentar con instrucción: "solo código" |
| Texto corrupto en Excel | Usar encoding='utf-8', validación posterior |
| Importaciones faltantes | Restringir librerías en imagen y prompt |
| UX: conteo incorrecto de tokens | Conteo basado en backend |
| Errores de código | Devolver stderr al modelo para correcciones iterativas |
Devolver stderr reduce las iteraciones en un 5x: los modelos analizan trazas y corrigen errores más rápido.
Extensiones: análisis de presupuestos
Para revisar presupuestos (archivo Excel, ciudad): el modelo genera 150–200 líneas de código.
- Analiza estructuras arbitrarias.
- Compara con precios de mercado desde la configuración.
- Detecta errores aritméticos.
- Genera informes con codificación por colores (openpyxl).
Ejemplo: presupuesto de reforma de baño (Tomsk) — sobreprecio del 25,9%, 8 artículos >50% por encima, diferencias de 1–4 rublos.
Conclusiones clave
- Los cálculos son 100 % precisos: se ejecutan mediante Python.
- Las tarifas provienen de datos externos, nunca del modelo.
- El sandbox es obligatorio para seguridad.
- Las iteraciones con stderr aceleran la depuración.
- Escalable: actualizar la configuración sin reentrenar.
— Editorial Team
Aún no hay comentarios.