Lección 14 · 04 Python con IA

Pide JSON y valida la respuesta

Un texto libre es difícil de procesar. Si le pides al modelo JSON, puedes guardar, contar y decidir con su respuesta. Pero nunca te fíes sin comprobar.

Pedir JSON

Si el prompt pide JSON, modelo() responde con un objeto que puedes convertir con json.loads:

import json

respuesta = modelo("Analiza y responde en JSON con categoria, urgencia y sentimiento. Texto: urgente, la web está caída y estoy fatal")
print(respuesta)
datos = json.loads(respuesta)
print(datos["categoria"], datos["urgencia"])

Los modelos reales a veces charlan

Muchas veces la respuesta trae texto alrededor del JSON. modelo_charlatan() imita ese comportamiento:

print(modelo_charlatan("Responde en JSON. Texto: no me llega la factura"))

json.loads sobre eso falla. La solución práctica es recortar desde la primera { hasta la última }:

import json

def extraer_json(texto):
    inicio, fin = texto.find("{"), texto.rfind("}")
    if inicio == -1 or fin < inicio:
        raise ValueError("no hay JSON en la respuesta")
    return json.loads(texto[inicio:fin + 1])

print(extraer_json(modelo_charlatan("Responde en JSON. Texto: no me llega la factura")))

Validar antes de usar

Que sea JSON no significa que sea correcto. Comprueba que están las claves y que los valores son de los permitidos:

PERMITIDAS = {"facturación", "incidencia", "ventas", "otros"}

def valida(datos):
    return (isinstance(datos, dict)
            and datos.get("categoria") in PERMITIDAS
            and datos.get("urgencia") in {"alta", "baja"})

print(valida({"categoria": "ventas", "urgencia": "baja"}))
print(valida({"categoria": "chistes", "urgencia": "baja"}))
// reto 01

Extrae el JSON

Define extraer_json(texto) que devuelva el diccionario contenido en texto, aunque venga con frases alrededor, y lance ValueError si no hay ninguno.

main.py
Ctrl/⌘ + Enter
¿Atascado? Ver pista

Usa texto.find("{") y texto.rfind("}"). Si alguno es -1, raise ValueError(...). Si no, json.loads(texto[inicio:fin + 1]).

$ python main.py
    // reto 02

    Analiza un mensaje

    Define analizar(mensaje) que pida JSON a modelo_charlatan() (el prompt debe contener JSON y acabar en Texto: <mensaje>), extraiga el diccionario y lo devuelva.

    main.py
    Ctrl/⌘ + Enter
    ¿Atascado? Ver pista
    respuesta = modelo_charlatan(f"Responde en JSON con categoria, urgencia y sentimiento. Texto: {mensaje}")
    return extraer_json(respuesta)
    $ python main.py
      // reto 03

      Valida la respuesta

      Define es_valida(datos) que devuelva True solo si datos es un diccionario con categoria en {facturación, incidencia, ventas, otros} y urgencia en {alta, baja}.

      main.py
      Ctrl/⌘ + Enter
      ¿Atascado? Ver pista

      Combina tres condiciones con and: isinstance(datos, dict), datos.get("categoria") in {...} y datos.get("urgencia") in {...}. Devuelve el resultado.

      $ python main.py