Sesión 4.2: LLMs como herramientas de investigación
Primera parte
Segunda parte
\[P(\text{siguiente token} | \text{contexto})\]
No:
\[P(\text{afirmación verdadera})\]
En el prompt
En la arquitectura
Regla de oro: nunca confiar en la salida de un LLM sin verificación. Los LLMs son herramientas de borrador, no fuentes de verdad.
Casos de uso
Herramientas accesibles
Limitación: RAG reduce pero no elimina las alucinaciones. El modelo puede “ignorar” el contexto o interpretar mal los documentos.
Ejemplo de prompt para anotación
System: Eres un analista político.
Clasifica textos según el tema
principal. Temas posibles:
economía, educación, seguridad,
salud, medio ambiente.
Responde SOLO con el tema,
sin explicación.
User: "La inflación sigue siendo
un problema grave que afecta a
las familias más vulnerables."
Respuesta: economía
Ejemplo de prompt
Genera 10 respuestas simuladas
a una encuesta sobre confianza
en instituciones en Uruguay.
Cada respuesta debe incluir:
- edad (18-80)
- género (M/F)
- confianza_gobierno (1-4)
- confianza_justicia (1-4)
- comentario (1 oración)
Formato: CSV con encabezados.
Las respuestas deben reflejar
la diversidad demográfica real.
chat(): crear una sesión de chat$chat(): enviar un mensaje y recibir respuesta$extract_data(): extraer datos estructuradosEjemplo básico
library(ellmer)
# Crear un chat con Claude
chat <- chat_claude(
system_prompt = "Eres un analista
político experto en América Latina.
Responde en español."
)
# Enviar un mensaje
chat$chat("¿Cuáles son los principales
desafíos democráticos en la región?")
# El modelo responde con texto
# que podemos procesar en RSe necesita una API key del proveedor (OpenAI, Anthropic, etc.)
Persona: ¿quién es el modelo?
Eres un investigador experto en ciencia
política latinoamericana con 20 años
de experiencia en análisis de discurso.
Tarea: ¿qué debe hacer?
Clasifica el siguiente texto según
su orientación ideológica.
Contexto: información necesaria
El texto proviene de un discurso
presidencial de 2023 en Uruguay.
Las categorías son: izquierda,
centro-izquierda, centro,
centro-derecha, derecha.
Formato: estructura de salida
Responde en JSON:
{"categoria": "...",
"confianza": 0.0-1.0,
"justificacion": "..."}
Zero-shot: sin ejemplos
Clasifica el sentimiento:
"La economía ha crecido un 5%"
Funciona para tareas simples y comunes.
Few-shot: con ejemplos
Ejemplos:
- "La inflación es alta" → negativo
- "El empleo mejoró" → positivo
- "Los datos son de 2023" → neutro
Clasifica:
"La pobreza ha disminuido" →
Mejora la precisión en tareas específicas.
Chain-of-thought (CoT)
Clasifica y explica paso a paso:
Texto: "A pesar de la crisis, el
gobierno logró reducir la pobreza"
Análisis:
1. "crisis" = contexto negativo
2. "logró reducir pobreza" = resultado positivo
3. "a pesar de" = contraste
4. El resultado supera al contexto
Clasificación: POSITIVO
CoT mejora el razonamiento en tareas complejas (Wei et al., 2022).
Temperatura (0.0 - 2.0)
Para investigación: temperatura ≤ 0.3
Otros parámetros:
Recomendaciones por tarea:
| Tarea | Temperatura |
|---|---|
| Clasificación | 0.0 - 0.1 |
| Extracción de datos | 0.0 - 0.2 |
| Resumen | 0.2 - 0.4 |
| Análisis abierto | 0.3 - 0.5 |
| Escritura creativa | 0.7 - 1.0 |
| Brainstorming | 0.8 - 1.2 |
Para replicabilidad, usar temperatura 0 y fijar una semilla (seed) si el API lo permite.
Extrae las entidades del texto en JSON:
{"personas": [...],
"organizaciones": [...],
"lugares": [...],
"fechas": [...]}
Texto: "El presidente Lacalle Pou
se reunió con el FMI en Montevideo
el 15 de marzo de 2024."
Documentación mínima:
Sin esta documentación, el análisis no es reproducible.
Estrategias de validación:
Ejemplo de validación:
Dataset: 100 textos políticos
Gold standard: etiquetados por
2 investigadores
Resultados:
- LLM accuracy: 87%
- Diccionario: 72%
- LDA + supervisión: 79%
- Inter-rater (humanos): 91%
Conclusión: LLM cercano a humanos,
supera métodos clásicos
Siempre reportar métricas de validación en publicaciones.
| Criterio | LLMs | Clásicos (TF-IDF, LDA) |
|---|---|---|
| Precisión | Alta (contexto, negaciones) | Moderada |
| Velocidad | Lento (API calls) | Muy rápido |
| Costo | USD 0.01-0.10 por texto | Gratis |
| Reproducibilidad | Difícil (modelo cambia) | Alta |
| Transparencia | Caja negra | Interpretable |
| Escalabilidad | Costoso a gran escala | Escala bien |
| Idiomas | Multilingüe nativo | Requiere recursos por idioma |
Recomendación: usar LLMs para tareas donde la precisión importa más que el costo. Para grandes volúmenes, considerar híbridos: LLM para etiquetar subset → entrenar clasificador clásico.
Instalación:
Funciones principales:
chat_openai(): crear chat con OpenAIchat_claude(): crear chat con Claude$chat(): enviar mensaje$extract_data(): extraer datos estructuradoslibrary(ellmer)
library(tidyverse)
# Crear un chat con Claude
chat <- chat_claude(
model = "claude-sonnet-4-20250514",
system_prompt = "Eres un analista político experto en América Latina.
Responde de forma concisa en español."
)
# Enviar un mensaje
respuesta <- chat$chat("¿Cuáles son los principales desafíos
democráticos en Uruguay actualmente?")
# Ver la respuesta
cat(respuesta)
# El chat mantiene el historial
chat$chat("¿Y cómo se compara con Chile?")Tip: crear un chat nuevo para cada tarea independiente. El historial acumulado puede sesgar las respuestas.
# Definir el esquema esperado
library(ellmer)
# Chat para clasificación
clasificador <- chat_openai(
model = "gpt-4o-mini",
system_prompt = "Clasifica textos políticos.
Responde SOLO en JSON válido."
)
# Usar extract_data para obtener estructura
resultado <- clasificador$extract_data(
"La inflación sigue siendo un problema grave.",
type = type_object(
tema = type_string("Tema principal: economia/educacion/salud/seguridad/ambiente"),
sentimiento = type_string("positivo/negativo/neutro"),
confianza = type_number("Confianza de 0 a 1")
)
)
# Resultado es una lista de R
resultado$tema # "economia"
resultado$sentimiento # "negativo"
resultado$confianza # 0.9Conceptos clave:
Buenas prácticas:
En los laboratorios pondremos todo esto en práctica.
Nos vemos en el laboratorio.