Juan Diego Andrés PRADA··RAMÍREZ Entrar
Lección 6 de 7

LLMs por API: leer y reportar con Claude

¿Qué es un LLM por API?

Un LLM (Large Language Model, modelo de lenguaje grande) es un modelo de IA que entiende y genera texto. Usarlo por API significa llamarlo desde tu código Python: tú envías un mensaje (y opcionalmente una imagen), el modelo responde, y tú procesas esa respuesta como cualquier otro dato. En este módulo usamos Claude de Anthropic a través de su SDK oficial de Python.

¿Cómo funciona?

Instalas el SDK, configuras tu clave de API en una variable de entorno y haces una petición con client.messages.create(...): indicas el modelo, un límite de tokens de salida y la lista de mensajes. El modelo devuelve bloques de contenido; lees el texto del primero. Como Claude además ve imágenes, podemos enviarle la foto de una hoja manuscrita.

pip install anthropic
export ANTHROPIC_API_KEY="tu-clave-aqui" # macOS / Linux
import anthropic

client = anthropic.Anthropic() # lee ANTHROPIC_API_KEY del entorno

respuesta = client.messages.create(
 model="claude-opus-4-8",
 max_tokens=1024,
 messages=[
 {"role": "user", "content": "Responde solo con la palabra: listo"},
 ],
)

# El contenido es una lista de bloques; tomamos el texto del primero
print(respuesta.content[0].text)

Nunca escribas la clave de API dentro del código. Guárdala en una variable de entorno (ANTHROPIC_API_KEY) y deja que el SDK la lea sola con anthropic.Anthropic().

¿Para qué sirve? (y qué pieza del OMR construye)

En el proyecto OMR, OpenCV resuelve las burbujas marcadas, pero hay dos cosas que la visión clásica no hace bien: leer texto manuscrito (el nombre del estudiante, una respuesta abierta) y redactar un reporte en lenguaje natural. Esta es la pieza extra: usamos Claude para (1) leer una hoja manuscrita desde la cámara y (2) convertir los resultados de Pandas en un informe claro para el profesor.

Leer una hoja manuscrita (visión)

Enviamos la foto de la hoja como imagen en base64 y le pedimos a Claude que extraiga el texto. Pedimos la salida en JSON para poder procesarla después.

import base64
import json
import anthropic

client = anthropic.Anthropic()

# 1. Codificamos la imagen a base64 (sin saltos de línea)
with open("hoja_manuscrita.jpg", "rb") as f:
 img_b64 = base64.standard_b64encode(f.read()).decode("utf-8")

# 2. Enviamos imagen + instrucción
respuesta = client.messages.create(
 model="claude-opus-4-8",
 max_tokens=1024,
 messages=[
 {
 "role": "user",
 "content": [
 {
 "type": "image",
 "source": {
 "type": "base64",
 "media_type": "image/jpeg",
 "data": img_b64,
 },
 },
 {
 "type": "text",
 "text": (
 "Lee esta hoja de examen manuscrita. "
 'Devuelve SOLO un JSON con esta forma: '
 '{"nombre": "...", "respuestas": ["A", "B", ...]}'
 ),
 },
 ],
 },
 ],
)

texto = respuesta.content[0].text
datos = json.loads(texto) # convertimos el JSON de Claude en un dict de Python
print(datos["nombre"])
print(datos["respuestas"])

El bloque de imagen va antes del bloque de texto en content. Y la cadena base64 no debe llevar saltos de línea: por eso usamos standard_b64encode(...).decode("utf-8") sin trocearla.

Un LLM puede equivocarse o "alucinar". Para datos críticos (una nota oficial), trata su salida como un borrador a revisar, no como verdad absoluta. Verifica siempre lo que devuelve antes de publicarlo.

Redactar el reporte del curso (texto)

Tomamos la tabla de resultados del módulo de Pandas (un CSV o un resumen) y le pedimos a Claude un informe breve para el profesor.

import anthropic

client = anthropic.Anthropic()

resumen = (
 "Promedio del curso: 3.8/5.0. Aprobados: 18 de 25. "
 "Pregunta más fallada: P4 (60% de error). Mejor nota: 5.0 (Marta)."
)

respuesta = client.messages.create(
 model="claude-opus-4-8",
 max_tokens=1024,
 system="Eres un asistente que redacta reportes escolares claros y breves.",
 messages=[
 {
 "role": "user",
 "content": (
 "Con estos datos, escribe un párrafo de reporte para el profesor "
 "y una recomendación concreta:\n" + resumen
 ),
 },
 ],
)

print(respuesta.content[0].text)

El campo system fija el rol y el estilo del modelo para toda la conversación. El role: "user" es lo que tú pides en cada turno. Mantén el system estable y pon en user lo que cambia por petición.

Tech English: prompt = instrucción/consigna; token = unidad de texto que el modelo procesa; API key = clave de acceso; base64 = codificación de binarios como texto; system prompt = instrucción de sistema (define el rol).

Ejercicios

  1. Toma una foto de una nota manuscrita corta (tu nombre y tres letras). Envíala a Claude pidiendo un JSON {"nombre": "...", "respuestas": [...]} y conviértelo con json.loads. Imprime el nombre y la lista. Comprueba si acertó.
  2. Crea un resumen de resultados (inventado o desde tu CSV de Pandas) y pídele a Claude, con un system que fije el rol de "coordinador académico", un reporte de 3 frases más una recomendación. Cambia el system y observa cómo cambia el tono.
Tu progreso se guarda en este navegador. Inicia sesión para guardarlo en tu cuenta y verlo desde cualquier dispositivo.