Saltar al contenido principal

🟢 ChatGPT a partir de GPT-3

Introducción​

ChatGPT ha explotado en el último mes, ganando un millón de usuarios en solo una semana. Sorprendentemente, el modelo subyacente, GPT-3, debutó en 2020 y se lanzó para acceso público hace más de un año.

Para aquellos que no lo saben, ChatGPT es un nuevo modelo de lenguaje de OpenAI que fue ajustado a partir de GPT-3 para ser optimizado para la conversación1. Tiene una interfaz de chat fácil de usar, donde puedes ingresar una entrada y obtener una respuesta de un asistente de inteligencia artificial. Échale un vistazo en chat.openai.com.

Si bien las primeras versiones de GPT-3 no eran tan avanzadas como la actual serie GPT-3.5, aún eran impresionantes. Estos modelos han estado disponibles a través de una API y una interfaz de usuario web de playground que te permite ajustar ciertos hiperparámetros de configuración y probar prompts. GPT-3 ganó una tracción significativa, pero no se acercó a la viralidad de ChatGPT.

Lo que hace que ChatGPT sea tan exitoso en comparación con GPT-3 es su accesibilidad como un asistente de IA sencillo para la persona promedio, independientemente de su conocimiento de la ciencia de datos, los modelos de lenguaje o la IA.

En este artículo, describo cómo se pueden implementar chatbots como ChatGPT utilizando un modelo de lenguaje grande como GPT-3.

Motivación​

Este artículo se escribió en parte debido a un tweet de Riley Goodside, que señaló cómo podría haberse implementado ChatGPT.

Al igual que otros modelos de la serie GPT-3.5, ChatGPT fue entrenado utilizando RLHF, pero gran parte de su efectividad proviene de utilizar un buen prompt.

El prompt​

Prompt completo de Skippy del encabezado del artículo

El prompting es el proceso de instruir a una IA para que haga algo. Como probablemente hayas visto en los ejemplos de ChatGPT en línea, puedes pedirle que haga casi cualquier cosa. Los casos de uso comunes son resumir textos, escribir contenido basado en una descripción o crear cosas como poemas, recetas y mucho más.

ChatGPT es tanto un modelo de lenguaje como una interfaz de usuario. La entrada de prompt que el usuario introduce en la interfaz se inserta en realidad en un prompt más grande que contiene toda la conversación entre el usuario y ChatGPT. Esto permite que el modelo de lenguaje subyacente comprenda el contexto de la conversación y responda adecuadamente.

Ejemplo de inserción de prompt de usuario antes de enviarlo al modelo

El modelo de lenguaje completa el prompt determinando qué palabras vienen a continuación en función de las probabilidades que aprendió durante el pre-entrenamiento2.

GPT-3 es capaz de 'aprender' a partir de una instrucción simple o unos pocos ejemplos en el prompt. Esto se llama aprendizaje con pocos ejemplos, o aprendizaje en contexto3. En el prompt del chatbot de arriba, creo un chatbot ficticio llamado Skippy y le pido que proporcione respuestas a los usuarios. GPT-3 se da cuenta del formato de ida y vuelta, USER: {entrada del usuario} y SKIPPY: {respuesta de Skippy}. GPT-3 entiende que Skippy es un chatbot y que los intercambios anteriores son una conversación, por lo que cuando proporcionamos la siguiente entrada del usuario, "Skippy" responderá.

Memorización​

Los intercambios anteriores entre Skippy y el usuario se agregan al siguiente prompt. Cada vez que proporcionamos más entrada del usuario y obtenemos más salida del chatbot, el prompt se expande para incorporar este nuevo intercambio. Así es como los chatbots como Skippy y ChatGPT pueden recordar las entradas anteriores. Sin embargo, hay un límite en cuanto a cuánto puede recordar un chatbot de GPT-3.

Los prompts pueden llegar a ser muy largos después de varias interacciones, especialmente si estamos utilizando el chatbot para generar respuestas largas como publicaciones de blog. Los prompts enviados a GPT-3 se convierten en tokens, que son palabras individuales o partes de ellas. Existe un límite de 4097 tokens (aproximadamente 3000 palabras) para el prompt combinado y la respuesta generada para modelos GPT-3, incluyendo ChatGPT.

Algunos ejemplos​

Hay muchos casos de uso diferentes para prompts de chatbot que almacenan conversaciones previas. ChatGPT está destinado a ser un asistente general multipropósito y, en mi experiencia, rara vez hace preguntas de seguimiento.

Chatbot de terapia que pregunta sobre tu día​

Puede ser útil tener un chatbot que haga preguntas y obtenga comentarios del usuario. A continuación se muestra un ejemplo de prompt de chatbot de terapia que hará preguntas y seguimientos para ayudar al usuario a reflexionar sobre su día.

Prompt de chatbot de terapia

Habla con tu yo más joven utilizando antiguas entradas de diario​

Michelle Huang usó GPT-3 para tener una conversación con su yo más joven. El prompt utiliza algo de contexto, en este caso antiguas entradas de diario, combinado con un formato de ida y vuelta de chatbot. GPT-3 es capaz de imitar una personalidad basada en estas entradas.

Prompt del Tweet:

El siguiente es una conversación entre Michelle presente (edad [redactada]) y Michelle joven (edad 14).

Michelle joven ha escrito las siguientes entradas en su diario:
[entradas del diario aquí]

Michelle presente: [escribe tus preguntas aquí]

La autora señala que las entradas de diario pueden alcanzar el límite de tokens. En este caso, podrías seleccionar algunas entradas o tratar de resumir varias entradas.

Implementación​

Voy a explicar cómo codificar un chatbot simple impulsado por GPT-3 en Python. Incluir GPT-3 en una aplicación que estés construyendo es increíblemente fácil utilizando la API de OpenAI. Necesitarás crear una cuenta en OpenAI y obtener una clave API. Echa un vistazo a su documentación aquí.

Visión general de lo que tenemos que hacer:

  1. Formatear la entrada del usuario en un mensaje de chatbot para GPT-3.
  2. Obtener la respuesta del chatbot como una respuesta de GPT-3.
  3. Actualizar el mensaje con tanto la entrada del usuario como la respuesta del chatbot.
  4. Repetir.

Aquí está el mensaje que utilizaré. Podemos usar Python para reemplazar <historial de conversación> y <entrada del usuario> con sus valores reales.

chatbot_prompt = """
Como chatbot avanzado, tu objetivo principal es ayudar a los usuarios de la mejor manera posible. Esto puede implicar responder preguntas, proporcionar información útil o completar tareas basadas en la entrada del usuario. Para ayudar eficazmente a los usuarios, es importante ser detallado y exhaustivo en tus respuestas. Usa ejemplos y evidencias para respaldar tus puntos y justificar tus recomendaciones o soluciones.

<historial de conversación>

Usuario: <entrada del usuario>
Chatbot:"""

Mantengo un registro tanto de la próxima entrada del usuario como de la conversación anterior. Cada iteración se agrega una nueva entrada/salida entre el chatbot y el usuario.

import openai

openai.api_key = "TU CLAVE API AQUÍ"
model_engine = "text-davinci-003"
chatbot_prompt = """
Como chatbot avanzado, tu objetivo principal es ayudar a los usuarios de la mejor manera posible. Esto puede implicar responder preguntas, proporcionar información útil o completar tareas basadas en la entrada del usuario. Para ayudar eficazmente a los usuarios, es importante ser detallado y exhaustivo en tus respuestas. Usa ejemplos y evidencias para respaldar tus puntos y justificar tus recomendaciones o soluciones.

<historial de conversación>

Usuario: <entrada del usuario>
Chatbot:"""


def obtener_respuesta(historial_de_conversacion, entrada_del_usuario):
mensaje = chatbot_prompt.replace(
"<historial de conversación>", historial_de_conversacion).replace("<entrada del usuario>", entrada_del_usuario)

# Obtener la respuesta de GPT-3
respuesta = openai.Completion.create(
engine=model_engine, prompt=mensaje, max_tokens=2048, n=1, stop=None, temperature=0.5)

# Extraer la respuesta del objeto de respuesta
texto_respuesta = respuesta["choices"][0]["text"]

respuesta_chatbot = texto_respuesta.strip()

return respuesta_chatbot


def main():
historial_de_conversacion = ""

while True:
entrada_del_usuario = input("> ")
if entrada_del_usuario == "salir":
break
respuesta_chatbot = obtener_respuesta(historial_de_conversacion, entrada_del_usuario)
print(f"Chatbot: {respuesta_chatbot}")
historial_de_conversacion += f"Usuario: {entrada_del_usuario}\nChatbot: {chatbot_response}\n"

main()

Aquí hay un enlace al código completo para un chatbot simple: aquí.

Ahora solo queda construir una interfaz de usuario atractiva con la que los usuarios puedan interactuar.

Written by jayo78.


  1. OpenAI. (2022). ChatGPT: Optimizing Language Models for Dialogue. https://openai.com/blog/chatgpt/. https://openai.com/blog/chatgpt/ ↩
  2. Jurafsky, D., & Martin, J. H. (2009). Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics and Speech Recognition. Prentice Hall. ↩
  3. Brown, T. B., Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P., Neelakantan, A., Shyam, P., Sastry, G., Askell, A., Agarwal, S., Herbert-Voss, A., Krueger, G., Henighan, T., Child, R., Ramesh, A., Ziegler, D. M., Wu, J., Winter, C., … Amodei, D. (2020). Language Models are Few-Shot Learners. ↩