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"}))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.
¿Atascado? Ver pista
Usa texto.find("{") y texto.rfind("}"). Si alguno es -1, raise ValueError(...). Si no, json.loads(texto[inicio:fin + 1]).
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.
¿Atascado? Ver pista
respuesta = modelo_charlatan(f"Responde en JSON con categoria, urgencia y sentimiento. Texto: {mensaje}")
return extraer_json(respuesta)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}.
¿Atascado? Ver pista
Combina tres condiciones con and: isinstance(datos, dict), datos.get("categoria") in {...} y datos.get("urgencia") in {...}. Devuelve el resultado.