Lección 15 · 04 Python con IA
Procesar en lote y controlar el coste
El valor de automatizar aparece cuando pasas de un mensaje a mil. Para eso necesitas tres cosas: que un fallo no pare todo, saber cuánto vas a gastar y un tope.
Estimar tokens y coste
Los modelos cobran por tokens, trozos de texto de unos 4 caracteres de media. contar_tokens() hace esa estimación:
prompt = "Clasifica el mensaje en facturación, incidencia, ventas u otros. Texto: no me llega la factura"
print(len(prompt), "caracteres ≈", contar_tokens(prompt), "tokens")Con el precio por millón de tokens de tu proveedor calculas lo que cuesta un lote antes de lanzarlo:
mensajes = ["no me llega la factura"] * 5000
precio_millon = 0.25 # euros por millón de tokens de entrada (ejemplo)
tokens = sum(contar_tokens(f"Clasifica. Texto: {m}") for m in mensajes)
print(f"{tokens} tokens ≈ {tokens / 1_000_000 * precio_millon:.4f} €")Un fallo no debe parar el lote
Cada elemento va en su propio try. Lo que falla se apunta con el motivo y se sigue:
import json
def analizar(m):
if not m.strip():
raise ValueError("mensaje vacío")
return json.loads(modelo(f"Responde en JSON. Texto: {m}"))
resultados, fallos = [], []
for i, m in enumerate(["no me llega la factura", "", "la web da error"]):
try:
resultados.append(analizar(m))
except ValueError as e:
fallos.append({"posicion": i, "motivo": str(e)})
print(len(resultados), "bien;", fallos)Un tope de gasto
Antes de cada llamada, comprueba que no te pasas del presupuesto. Es la diferencia entre un susto y una factura controlada:
presupuesto_tokens = 40
gastado = 0
for m in ["factura de octubre", "precio del plan", "error al entrar", "otra factura"]:
prompt = f"Clasifica. Texto: {m}"
coste = contar_tokens(prompt)
if gastado + coste > presupuesto_tokens:
print("Presupuesto agotado: paro aquí")
break
gastado += coste
print(modelo(prompt), "→", m)
print("tokens gastados:", gastado)Presupuesta un lote
Calcula en tokens_totales la suma de contar_tokens(prompt) de todos los prompts (uno por mensaje, con la plantilla dada) y en euros su coste a precio_millon euros por millón de tokens, redondeado a 6 decimales.
¿Atascado? Ver pista
tokens_totales = sum(contar_tokens(PLANTILLA.format(m=m)) for m in mensajes) y después euros = round(tokens_totales / 1_000_000 * precio_millon, 6).
Lote a prueba de fallos
Procesa mensajes con analizar(). Guarda los diccionarios correctos en buenos y en fallidos la posición de los que lancen ValueError. Imprime ambos.
¿Atascado? Ver pista
for i, m in enumerate(mensajes):
try:
buenos.append(analizar(m))
except ValueError:
fallidos.append(i)Respeta el presupuesto
Clasifica los mensajes en orden con modelo() (prompt: Clasifica. Texto: <mensaje>) y para antes de pasarte de limite tokens. Guarda las categorías en hechas y los tokens usados en gastado.
¿Atascado? Ver pista
Dentro del bucle: calcula coste = contar_tokens(prompt); si gastado + coste > limite, break; si no, suma el coste y guarda modelo(prompt) en hechas.