---
title: "Tarea 8: Codificación y confiabilidad con LLMs"
subtitle: "IA para Científicos Sociales - UCU"
author: "Danilo Freire"
date: "2026-04-15"
format:
  html:
    toc: true
    toc-depth: 2
    number-sections: true
    code-fold: false
lang: es
engine: knitr
---

## Instrucciones

Esta tarea aplica los conceptos del Laboratorio 8 a una construcción [nueva]{.alert}: la retórica populista. En la clase medimos retórica liberal-iliberal con un codebook que ya venía dado; acá van a [diseñar el suyo desde cero]{.alert}, codificar a mano su propio gold standard, validar, medir confiabilidad y auditar un sesgo. Responder cada pregunta escribiendo código R en los bloques indicados.

**Para trabajar en esta tarea:**

1. Descarguen este archivo `.qmd` y `discursos_ideologia.csv` (en `clases/dia-04/datos/`) de la [página del curso](https://danilofreire.github.io/introduccion-ia-ucu/laboratorios.html), o clonen el repositorio con `git clone https://github.com/danilofreire/introduccion-ia-ucu.git`. Mantengan el CSV en una subcarpeta `datos/` junto al `.qmd`
2. Necesitan Quarto y RStudio (>= 2022.07)
3. Necesitan la API key de OpenRouter configurada en `.Renviron` como `OPENROUTER_API_KEY` (alternativa: Ollama local)
4. Instalar `quallmer` desde GitHub: `install.packages("pak"); pak::pak("quallmer/quallmer")`
5. Abrir este archivo en RStudio y ejecutar los bloques con Ctrl+Enter

### Configuración

```{r setup, message=FALSE, warning=FALSE}
library(ellmer)
library(quallmer)
library(tidyverse)
library(tidytext)

set.seed(2026)

stopifnot(Sys.getenv("OPENROUTER_API_KEY") != "")

# 15 fragmentos de discurso político
discursos <- read_csv("datos/discursos_ideologia.csv", show_col_types = FALSE)

MODELO <- "openrouter/nvidia/nemotron-3-super-120b-a12b:free"
```

## Codificación y validación

### Pregunta 1: Diseñar un codebook para populismo

Diseñen desde cero un codebook para medir [retórica populista]{.alert}: el grado en que un discurso apela al "pueblo" o "la gente común" en contra de una "élite", "casta" o "los de arriba". Usen una escala de 0 (nada populista) a 10 (muy populista). Escriban instrucciones claras de qué cuenta como populismo.

*Pista:* miren el codebook de la clase como molde, pero las `instructions` y la escala son suyas. Un `type_integer` con `levels = list(... = "interval")`.

```{r p1}
# Escriban su código aquí

```

**Respuesta:**

### Pregunta 2: Codificar a mano su propio gold

Antes de confiar en el LLM, codifiquen ustedes. Elijan seis discursos del corpus y asígnenles a mano un puntaje de populismo (0 a 10) según su propio juicio y su codebook. Construyan el gold standard con `qlm_humancoded()`.

*Pista:* el gold necesita una columna `.id` y su columna de puntaje. Es la misma estructura que usaron para las etiquetas humanas en la clase.

```{r p2}
# Escriban su código aquí

```

**Respuesta:**

### Pregunta 3: Codificar con el LLM y validar

Codifiquen los mismos seis discursos con `qlm_code()` y validen contra su gold con `qlm_validate()` a nivel de intervalo. Reporten la correlación de Pearson y el ICC. ¿El LLM coincide con su juicio?

*Pista:* `qlm_validate(coded, gold = gold, by = "populismo", level = "interval")`. Muéstrenlo como tabla con `as_tibble(...) |> select(measure, value)`.

```{r p3}
# Escriban su código aquí

```

**Respuesta:**

## Confiabilidad y métodos clásicos

### Pregunta 4: Confiabilidad de dos formulaciones

La confiabilidad no es solo entre corridas: también importa si el resultado cambia al reformular el codebook. Escriban una segunda versión de su codebook con instrucciones más breves (`codebook_breve`), codifiquen los mismos textos y comparen las dos codificaciones con `qlm_compare()`. ¿Son estables?

*Pista:* `qlm_compare(coded1, coded2, by = "populismo", level = "interval", tolerance = 1)` da el alpha de Krippendorff.

```{r p4}
# Escriban su código aquí

```

**Respuesta:**

### Pregunta 5: LLM vs diccionario

Comparen el LLM con un método clásico. Armen un diccionario de palabras populistas (pueblo, gente, élite, casta, corruptos, privilegiados...) y cuenten cuántas aparecen en cada discurso. Correlacionen ese conteo con el puntaje del LLM. ¿Cuánto se parecen?

*Pista:* tokenicen con `tidytext::unnest_tokens()`, cuenten las coincidencias por discurso y usen `cor()`.

```{r p5}
# Escriban su código aquí

```

**Respuesta:**

## Auditoría y datos sintéticos

### Pregunta 6: Sesgo por etiqueta ideológica

Auditen un sesgo distinto al del género. Pídanle al modelo que describa las propuestas económicas de un político, variando solo una etiqueta: "un político de izquierda" vs "un político de derecha". Codifiquen las dos descripciones con un codebook de tono (-5 a +5) y comparen. ¿El modelo trata distinto a una etiqueta que a la otra?

*Pista:* mismo texto, solo cambia la etiqueta. Es el patrón de la slide "Medir el sesgo", con etiquetas ideológicas en vez de nombres.

```{r p6}
# Escriban su código aquí

```

**Respuesta:**

### Pregunta 7: Viñetas sintéticas para un experimento

Los LLMs sirven para generar estímulos de experimentos. Usen `chat_structured()` para generar cuatro viñetas cortas que describan a un candidato, variando una sola dimensión: su postura migratoria (restrictiva / abierta). Cada viñeta debe ser plausible y comparable. Muéstrenlas.

*Pista:* definan un `type_array` de `type_object` con un campo `postura` y un campo `texto`. Pídanle viñetas equilibradas que solo difieran en esa dimensión.

```{r p7}
# Escriban su código aquí

```

**Respuesta:**

## Reflexión

### Pregunta 8: Reporte para un paper

Imaginen que en su próximo paper van a usar un LLM con `quallmer` para medir el populismo de tres mil discursos. Escribir el párrafo de "Métodos" que describiría el uso del LLM, en estilo académico (máximo doscientas palabras). Incluir: el codebook y la escala, la validación contra una submuestra codificada a mano, la confiabilidad, el modelo y su versión, y la auditoría de sesgos.

**Respuesta:**

### Pregunta 9: Diseño de un mini-experimento

Diseñar (no implementar) un mini-experimento para responder: "¿El LLM describe a los políticos de izquierda con un tono sistemáticamente distinto al de los de derecha?". Especificar: hipótesis nula, variable independiente, variable dependiente, tamaño de muestra, métrica de comparación y al menos una amenaza de validez. Máximo doscientas palabras.

**Respuesta:**
