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)
// reto 01

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.

main.py
Ctrl/⌘ + Enter
¿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).

$ python main.py
    // reto 02

    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.

    main.py
    Ctrl/⌘ + Enter
    ¿Atascado? Ver pista
    for i, m in enumerate(mensajes):
        try:
            buenos.append(analizar(m))
        except ValueError:
            fallidos.append(i)
    $ python main.py
      // reto 03

      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.

      main.py
      Ctrl/⌘ + Enter
      ¿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.

      $ python main.py