Uso de GPT-3 en las ciencias sociales: algunas ideas

En esta entrada me interesaba indagar acerca de las potencialidades que podría tener GPT-3, desde el punto de vista metodológico, para las investigaciones que hacemos en ciencias sociales, pero…empezando por el principio ¿qué es GPT-3?

Bueno, GPT-3 es un modelo de lenguaje basado en Inteligencia Artificial (IA), desarrollado por la empresa OpenAI, que ha tenido gran repercusión en los últimos meses y que tiene capacidad de predecir palabras o frases dado un contexto determinado. El texto que genera es posible a través de un pre-entrenamiento de modelo con un gran volumen de datos textuales de lenguaje natural. El acceso gratuito tiene un tope (U$S 18 para usar en 3 meses) y podemos conectarlo con RStudio.


Presento dos posibles aplicaciones para optimizar nuestros procesos:

  1. Identificación de tópicos o temas (binarios) en textos medianos o largos.

  2. Codificación de preguntas abiertas a partir de codigueras pre-definidas o emergentes


La librería que usé para el procesamiento es rgpt3 de Bennett Kleinberg (2022)1.

El paquete tiene una función que se llama gpt3_authenticate() y que te permite, luego de crear un usuario acá, acceder a una clave que va a permitirte conectar con la API de GPT-3. La clave debe ser guardada en un archivo de notas (.txt) y va a ser el primer argumento de la función para conectar. Luego, chequeo que la conexión se estableció con éxito con la función gpt3_test_completion()

#Cargo paquete ya instalado:
library(rgpt3)

gpt3_authenticate("ruta/access_key.txt") ##le indico dónde tengo guardado el archivo con la clave
gpt3_test_completion() ##testeo la conexión

Luego de estos pasos previos, ya tengo conectada mi consola R + RStudio con la API de GPT-3 !

Empecemos…💪


1. Identificación de tópicos o temas (binarios) en textos medianos o largos.

Me interesa saber, más allá de una clasificación genérica de menciones parlamentarias que tocan la temática de género(como lo hice en una entrada anterior), saber cuales de ellas hablan específicamente del tema violencia de género, y para eso uso la asistencia del modelo GPT-3 para que me ayude a identificarlas. Según algunos ensayos previos, veo que lo más optimo es hacerlo en dos pasos: en primer lugar le pido que identifique un Tema principal en cada mención (lo cual ya me podría ser útil y analizable en sí mismo), ya que la intervención podría tratar varios temas y, en segundo lugar, le doy una orden concreta para que identifique si ese tema se vincula con mi tópico de interés y le sugiero devolverme un Si si le parece que lo trata y un No, en el caso contrario.

Nota: Esto también podría servir para un análisis rápido de corpus de noticias o post de redes sociales. Más adelante vamos a ver que para textos cortos utilizo otra estrategia de clasificación/extracción de tópicos.

Las ordenes que le voy a dar son: ‘Identifique un tema principal en el siguiente texto:’ y ‘Este texto habla sobre violencia de género? Responda únicamente Si o No’ y luego, le pego cada una de las menciones y variables de origen de cada parlamentario/a, de este modo para el segundo caso:

prompt = data.frame('prompts' = c(paste('La siguiente frase menciona la violencia de género? Responda únicamente Si o No',base$speech)),'prompt_id' = c(1:nrow(base)))



consulta = gpt3_completions(prompt_var = prompt$prompts # defino las órdenes, una por cada mención
                             , id_var = prompt$prompt_id # el identificador
                             , param_model = 'text-davinci-003', ##defino el modelo
                            param_max_tokens = 2000,param_output_type = "complete",
                            param_temperature = 0) ##defino algunos parámetros: max_tokens (cuanto me va a traer como máximo, debe ser mayor que mi N y temperature que está entre 0 y 1, siendo las respuestas que se acercan a 1 más aleatorias) 

respuestas=consulta[[1]] ##veo el primer elemento en mi lista que es mi data frame de respuestas
base=cbind(base,respuestas) ##le pego las respuestas a la base original

Los resultados de la reducción del texto en dos pasos son lo que se muestran en la siguiente tabla, la variable gpt3_1 nos da una idea del tema principal del texto largo, y luego utilizo esa variable para identificar un tema específico:



2. Codificación de preguntas abiertas a partir de codigueras pre-definidas o emergentes

Otra aplicación posible sería el tratamiento de preguntas abiertas usando el GTP-3 como un asistente para la codificación (lo cual nos podría ahorrar mucho tiempo!), al menos para una clasificación inicial cuando tenemos muchos casos.

Identifico dos formas: (a) Codigueras pre-definidas o (b) Emergentes



En el primer caso, dentro de la orden que le damos y que vimos anteriormente, le defino las categorías que deseo que identifique. Hay una publicación reciente (Bailey et al, 2022)2 que compara para un dataset de preguntas abiertas, un codificador humano, un modelo de aprendizaje automático (SVM) y el modelo GPT-3, y encuentra niveles de acierto altos(recomiendo la lectura! aunque sin dudas deben existir ventajas en el inglés).

El ensayo que hice fue de una encuesta de opinión pública, sobre la típica pregunta sobre los principales problemas del país, en este caso lo ideal es tener una respuesta única pero sin embargo, se puede definir en la orden (prompt) un criterio de priorización de algún tipo (ej. primera mención).


prompt = data.frame('prompts' = c(paste("Tengo algunas respuestas abiertas de una encuesta que pregunta lo siguiente: ¿qué cosas le preocupan en su vida?. 
Por favor, asigne una de las siguientes categorías a cada respuesta de texto abierto.
La categoría son: 

salud
economía
educación 
seguridad
política
pobreza
sueldos
desempleo
corrupción
suba de precios
espacios
transporte público
migración
vivienda
costo del estado

Si no es ninguna de las anteriores por favor asigne la categoría Otros",
base_op$R1)),'prompt_id' = c(1:nrow(base_op)))

consulta = gpt3_completions(prompt_var = my_prompts$prompts
                            , id_var = my_prompts$prompt_id
                            , param_model = 'text-davinci-003',
                            param_max_tokens = 500,param_temperature = 0,
                            param_output_type = "complete")


respuestas=consulta[[1]]
base_op=cbind(base_op,respuestas)


Los resultados que obtengo son los que se encuentran en la sigiente tabla, según los códigos sugeridos en mi orden. Esta categorización es más fácil de procesar, por ejemplo separando en diferentes columnas considerando la coma como separador y luego contabilizando menciones para cada código:





Por último, en el caso de preguntas que no tengan, o sea difícil, una codificación previa, voy a optar por una orden más concreta que me permita identificar códigos emergentes. En el ejemplo que utilicé, era una pregunta también de opinión pública orientada en conocer sobre qué genera bienestar de las personas consultadas. La orden diseñada fue:


prompt = data.frame('prompts' = c(paste("Tengo algunas respuestas abiertas de una encuesta que pregunta: ¿Qué cosas le causan bienestar, qué le hace feliz o le pone contento?. 
Por favor identifique en pocas palabras las principales respuestas",base_op$R2)),
'prompt_id' = c(1:nrow(base_op)))

consulta = gpt3_completions(prompt_var = prompt$prompts
                            , id_var = prompt$prompt_id
                            , param_model = 'text-davinci-003',param_max_tokens = 2000,
                            param_temperature = 0,
                            param_output_type = "complete")



respuestas_2=consulta[[1]]
base_op=cbind(base_op,respuestas_2)


Los resultados también me ayudan a reducir mi respuesta inicial para poder procesarlas creando, por ejemplo, conjuntos de códigos más amplios:




Esta es una idea inicial para uso de esta potente herramienta para nuestro trabajo orientado al procesamiento de grandes volúmenes de texto. Podrían haber otros de asistencia a armado de código para análisis y visualización. Espero que haya inspirado 🙏!





  1. Kleinberg, B. (2022). rgpt3: Making requests from R to the GPT-3 API (Version 0.3.1) [Computer software]. https://doi.org/10.5281/zenodo.7327667↩︎

  2. Mellon, Jonathan and Bailey, Jack and Scott, Ralph and Breckwoldt, James and Miori, Marta, Does GPT-3 know what the Most Important Issue is? Using Large Language Models to Code Open-Text Social Survey Responses At Scale (December 22, 2022). Available at SSRN: https://ssrn.com/abstract=4310154 or http://dx.doi.org/10.2139/ssrn.4310154↩︎

Avatar
Elina Gómez
Socióloga. MSc, PhD(c)

Socióloga