Menu iconMenu icon
OpenAI API Biblia Volumen 1

Capítulo 7: Memoria y Conversaciones de Varios Turnos

Ejercicios Prácticos — Capítulo 7

Ejercicio 1: Implementación de Memoria a Corto Plazo en una Conversación

Tarea:

Crea un asistente simple que recuerde los mensajes previos del usuario y responda apropiadamente usando memoria a corto plazo. Mantén la conversación en una lista local y envía el historial completo en cada turno.

Solución:

import openai
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

conversation = [
    {"role": "system", "content": "You are a helpful assistant."}
]

def chat(user_input):
    conversation.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=conversation,
        max_tokens=150,
        temperature=0.5
    )

    reply = response["choices"][0]["message"]["content"]
    conversation.append({"role": "assistant", "content": reply})
    return reply

# Try a multi-turn conversation
print("User: What’s your favorite programming language?")
print("Assistant:", chat("What’s your favorite programming language?"))

print("\nUser: Can you show me a simple example in it?")
print("Assistant:", chat("Can you show me a simple example in it?"))

Ejercicio 2: Guardado y Recuperación de Memoria a Largo Plazo

Tarea:

Simular memoria persistente almacenando mensajes en un archivo JSON y recuperándolos al inicio de una nueva sesión.

Solución:

import json

MEMORY_FILE = "user_memory.json"

def save_message(message):
    try:
        with open(MEMORY_FILE, "r") as f:
            memory = json.load(f)
    except FileNotFoundError:
        memory = []

    memory.append(message)

    with open(MEMORY_FILE, "w") as f:
        json.dump(memory, f, indent=2)

def load_memory():
    try:
        with open(MEMORY_FILE, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

# Store a sample message
save_message({"role": "user", "content": "How does recursion work?"})
save_message({"role": "assistant", "content": "Recursion is when a function calls itself to solve a problem."})

# Load and review memory
print("Long-Term Memory:", load_memory())

Ejercicio 3: Resumir Mensajes Anteriores para Ahorrar Tokens

Tarea:

Utiliza la API de Chat Completions para resumir mensajes antiguos antes de incorporarlos a una nueva conversación para mantenerse dentro de los límites de tokens.

Solución:

def summarize_conversation(history):
    summary_prompt = [
        {"role": "system", "content": "Summarize this conversation briefly:"},
        {"role": "user", "content": "\n".join([f'{m["role"]}: {m["content"]}' for m in history])}
    ]

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=summary_prompt,
        max_tokens=100,
        temperature=0.3
    )

    return {"role": "system", "content": "Summary: " + response["choices"][0]["message"]["content"]}

# Example history
history = [
    {"role": "user", "content": "Tell me about machine learning."},
    {"role": "assistant", "content": "Machine learning is a subset of AI..."},
    {"role": "user", "content": "What is supervised learning?"}
]

# Get a summary
print("Summary:", summarize_conversation(history))

Ejercicio 4: Crear un Asistente Usando la API de Asistentes

Tarea:

Crea un asistente utilizando la API de Asistentes de OpenAI que recuerde un hilo y responda con contexto.

Solución:

import openai
import time

# Step 1: Create the assistant
assistant = openai.beta.assistants.create(
    name="Memory Coach",
    instructions="You are a memory coach that helps users retain information over time.",
    model="gpt-4o"
)

# Step 2: Create a thread
thread = openai.beta.threads.create()

# Step 3: Add a message
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Help me remember the difference between RAM and ROM."
)

# Step 4: Run the assistant
run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

# Step 5: Wait for completion
while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

# Step 6: Print the assistant’s response
messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant:", msg.content[0].text.value)

Ejercicio 5: Comparación entre Chat Completions y Asistentes

Tarea:

Ejecuta el mismo prompt usando ambas APIs y compara el manejo del contexto.

Solución:

Versión de Chat Completions:

chat_response = openai.ChatCompletion.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain how HTTP works."}
    ],
    max_tokens=150
)

print("Chat Completion Response:", chat_response["choices"][0]["message"]["content"])

Versión de Asistentes:

# Thread and assistant are assumed to be created already
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Explain how HTTP works."
)

run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant Response (Assistants API):", msg.content[0].text.value)

Estos ejercicios reforzaron cómo:

  • Gestionar la memoria a corto y largo plazo
  • Manejar los límites de contexto
  • Aplicar la gestión de hilos y tokens
  • Elegir entre las APIs de Chat Completions y Asistentes según tus objetivos

Al dominar estos flujos de trabajo, estás bien equipado para construir asistentes más inteligentes y conscientes del contexto que se adaptan a tus usuarios y sus necesidades.

Ejercicios Prácticos — Capítulo 7

Ejercicio 1: Implementación de Memoria a Corto Plazo en una Conversación

Tarea:

Crea un asistente simple que recuerde los mensajes previos del usuario y responda apropiadamente usando memoria a corto plazo. Mantén la conversación en una lista local y envía el historial completo en cada turno.

Solución:

import openai
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

conversation = [
    {"role": "system", "content": "You are a helpful assistant."}
]

def chat(user_input):
    conversation.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=conversation,
        max_tokens=150,
        temperature=0.5
    )

    reply = response["choices"][0]["message"]["content"]
    conversation.append({"role": "assistant", "content": reply})
    return reply

# Try a multi-turn conversation
print("User: What’s your favorite programming language?")
print("Assistant:", chat("What’s your favorite programming language?"))

print("\nUser: Can you show me a simple example in it?")
print("Assistant:", chat("Can you show me a simple example in it?"))

Ejercicio 2: Guardado y Recuperación de Memoria a Largo Plazo

Tarea:

Simular memoria persistente almacenando mensajes en un archivo JSON y recuperándolos al inicio de una nueva sesión.

Solución:

import json

MEMORY_FILE = "user_memory.json"

def save_message(message):
    try:
        with open(MEMORY_FILE, "r") as f:
            memory = json.load(f)
    except FileNotFoundError:
        memory = []

    memory.append(message)

    with open(MEMORY_FILE, "w") as f:
        json.dump(memory, f, indent=2)

def load_memory():
    try:
        with open(MEMORY_FILE, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

# Store a sample message
save_message({"role": "user", "content": "How does recursion work?"})
save_message({"role": "assistant", "content": "Recursion is when a function calls itself to solve a problem."})

# Load and review memory
print("Long-Term Memory:", load_memory())

Ejercicio 3: Resumir Mensajes Anteriores para Ahorrar Tokens

Tarea:

Utiliza la API de Chat Completions para resumir mensajes antiguos antes de incorporarlos a una nueva conversación para mantenerse dentro de los límites de tokens.

Solución:

def summarize_conversation(history):
    summary_prompt = [
        {"role": "system", "content": "Summarize this conversation briefly:"},
        {"role": "user", "content": "\n".join([f'{m["role"]}: {m["content"]}' for m in history])}
    ]

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=summary_prompt,
        max_tokens=100,
        temperature=0.3
    )

    return {"role": "system", "content": "Summary: " + response["choices"][0]["message"]["content"]}

# Example history
history = [
    {"role": "user", "content": "Tell me about machine learning."},
    {"role": "assistant", "content": "Machine learning is a subset of AI..."},
    {"role": "user", "content": "What is supervised learning?"}
]

# Get a summary
print("Summary:", summarize_conversation(history))

Ejercicio 4: Crear un Asistente Usando la API de Asistentes

Tarea:

Crea un asistente utilizando la API de Asistentes de OpenAI que recuerde un hilo y responda con contexto.

Solución:

import openai
import time

# Step 1: Create the assistant
assistant = openai.beta.assistants.create(
    name="Memory Coach",
    instructions="You are a memory coach that helps users retain information over time.",
    model="gpt-4o"
)

# Step 2: Create a thread
thread = openai.beta.threads.create()

# Step 3: Add a message
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Help me remember the difference between RAM and ROM."
)

# Step 4: Run the assistant
run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

# Step 5: Wait for completion
while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

# Step 6: Print the assistant’s response
messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant:", msg.content[0].text.value)

Ejercicio 5: Comparación entre Chat Completions y Asistentes

Tarea:

Ejecuta el mismo prompt usando ambas APIs y compara el manejo del contexto.

Solución:

Versión de Chat Completions:

chat_response = openai.ChatCompletion.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain how HTTP works."}
    ],
    max_tokens=150
)

print("Chat Completion Response:", chat_response["choices"][0]["message"]["content"])

Versión de Asistentes:

# Thread and assistant are assumed to be created already
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Explain how HTTP works."
)

run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant Response (Assistants API):", msg.content[0].text.value)

Estos ejercicios reforzaron cómo:

  • Gestionar la memoria a corto y largo plazo
  • Manejar los límites de contexto
  • Aplicar la gestión de hilos y tokens
  • Elegir entre las APIs de Chat Completions y Asistentes según tus objetivos

Al dominar estos flujos de trabajo, estás bien equipado para construir asistentes más inteligentes y conscientes del contexto que se adaptan a tus usuarios y sus necesidades.

Ejercicios Prácticos — Capítulo 7

Ejercicio 1: Implementación de Memoria a Corto Plazo en una Conversación

Tarea:

Crea un asistente simple que recuerde los mensajes previos del usuario y responda apropiadamente usando memoria a corto plazo. Mantén la conversación en una lista local y envía el historial completo en cada turno.

Solución:

import openai
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

conversation = [
    {"role": "system", "content": "You are a helpful assistant."}
]

def chat(user_input):
    conversation.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=conversation,
        max_tokens=150,
        temperature=0.5
    )

    reply = response["choices"][0]["message"]["content"]
    conversation.append({"role": "assistant", "content": reply})
    return reply

# Try a multi-turn conversation
print("User: What’s your favorite programming language?")
print("Assistant:", chat("What’s your favorite programming language?"))

print("\nUser: Can you show me a simple example in it?")
print("Assistant:", chat("Can you show me a simple example in it?"))

Ejercicio 2: Guardado y Recuperación de Memoria a Largo Plazo

Tarea:

Simular memoria persistente almacenando mensajes en un archivo JSON y recuperándolos al inicio de una nueva sesión.

Solución:

import json

MEMORY_FILE = "user_memory.json"

def save_message(message):
    try:
        with open(MEMORY_FILE, "r") as f:
            memory = json.load(f)
    except FileNotFoundError:
        memory = []

    memory.append(message)

    with open(MEMORY_FILE, "w") as f:
        json.dump(memory, f, indent=2)

def load_memory():
    try:
        with open(MEMORY_FILE, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

# Store a sample message
save_message({"role": "user", "content": "How does recursion work?"})
save_message({"role": "assistant", "content": "Recursion is when a function calls itself to solve a problem."})

# Load and review memory
print("Long-Term Memory:", load_memory())

Ejercicio 3: Resumir Mensajes Anteriores para Ahorrar Tokens

Tarea:

Utiliza la API de Chat Completions para resumir mensajes antiguos antes de incorporarlos a una nueva conversación para mantenerse dentro de los límites de tokens.

Solución:

def summarize_conversation(history):
    summary_prompt = [
        {"role": "system", "content": "Summarize this conversation briefly:"},
        {"role": "user", "content": "\n".join([f'{m["role"]}: {m["content"]}' for m in history])}
    ]

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=summary_prompt,
        max_tokens=100,
        temperature=0.3
    )

    return {"role": "system", "content": "Summary: " + response["choices"][0]["message"]["content"]}

# Example history
history = [
    {"role": "user", "content": "Tell me about machine learning."},
    {"role": "assistant", "content": "Machine learning is a subset of AI..."},
    {"role": "user", "content": "What is supervised learning?"}
]

# Get a summary
print("Summary:", summarize_conversation(history))

Ejercicio 4: Crear un Asistente Usando la API de Asistentes

Tarea:

Crea un asistente utilizando la API de Asistentes de OpenAI que recuerde un hilo y responda con contexto.

Solución:

import openai
import time

# Step 1: Create the assistant
assistant = openai.beta.assistants.create(
    name="Memory Coach",
    instructions="You are a memory coach that helps users retain information over time.",
    model="gpt-4o"
)

# Step 2: Create a thread
thread = openai.beta.threads.create()

# Step 3: Add a message
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Help me remember the difference between RAM and ROM."
)

# Step 4: Run the assistant
run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

# Step 5: Wait for completion
while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

# Step 6: Print the assistant’s response
messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant:", msg.content[0].text.value)

Ejercicio 5: Comparación entre Chat Completions y Asistentes

Tarea:

Ejecuta el mismo prompt usando ambas APIs y compara el manejo del contexto.

Solución:

Versión de Chat Completions:

chat_response = openai.ChatCompletion.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain how HTTP works."}
    ],
    max_tokens=150
)

print("Chat Completion Response:", chat_response["choices"][0]["message"]["content"])

Versión de Asistentes:

# Thread and assistant are assumed to be created already
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Explain how HTTP works."
)

run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant Response (Assistants API):", msg.content[0].text.value)

Estos ejercicios reforzaron cómo:

  • Gestionar la memoria a corto y largo plazo
  • Manejar los límites de contexto
  • Aplicar la gestión de hilos y tokens
  • Elegir entre las APIs de Chat Completions y Asistentes según tus objetivos

Al dominar estos flujos de trabajo, estás bien equipado para construir asistentes más inteligentes y conscientes del contexto que se adaptan a tus usuarios y sus necesidades.

Ejercicios Prácticos — Capítulo 7

Ejercicio 1: Implementación de Memoria a Corto Plazo en una Conversación

Tarea:

Crea un asistente simple que recuerde los mensajes previos del usuario y responda apropiadamente usando memoria a corto plazo. Mantén la conversación en una lista local y envía el historial completo en cada turno.

Solución:

import openai
import os
from dotenv import load_dotenv

load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")

conversation = [
    {"role": "system", "content": "You are a helpful assistant."}
]

def chat(user_input):
    conversation.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=conversation,
        max_tokens=150,
        temperature=0.5
    )

    reply = response["choices"][0]["message"]["content"]
    conversation.append({"role": "assistant", "content": reply})
    return reply

# Try a multi-turn conversation
print("User: What’s your favorite programming language?")
print("Assistant:", chat("What’s your favorite programming language?"))

print("\nUser: Can you show me a simple example in it?")
print("Assistant:", chat("Can you show me a simple example in it?"))

Ejercicio 2: Guardado y Recuperación de Memoria a Largo Plazo

Tarea:

Simular memoria persistente almacenando mensajes en un archivo JSON y recuperándolos al inicio de una nueva sesión.

Solución:

import json

MEMORY_FILE = "user_memory.json"

def save_message(message):
    try:
        with open(MEMORY_FILE, "r") as f:
            memory = json.load(f)
    except FileNotFoundError:
        memory = []

    memory.append(message)

    with open(MEMORY_FILE, "w") as f:
        json.dump(memory, f, indent=2)

def load_memory():
    try:
        with open(MEMORY_FILE, "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

# Store a sample message
save_message({"role": "user", "content": "How does recursion work?"})
save_message({"role": "assistant", "content": "Recursion is when a function calls itself to solve a problem."})

# Load and review memory
print("Long-Term Memory:", load_memory())

Ejercicio 3: Resumir Mensajes Anteriores para Ahorrar Tokens

Tarea:

Utiliza la API de Chat Completions para resumir mensajes antiguos antes de incorporarlos a una nueva conversación para mantenerse dentro de los límites de tokens.

Solución:

def summarize_conversation(history):
    summary_prompt = [
        {"role": "system", "content": "Summarize this conversation briefly:"},
        {"role": "user", "content": "\n".join([f'{m["role"]}: {m["content"]}' for m in history])}
    ]

    response = openai.ChatCompletion.create(
        model="gpt-4o",
        messages=summary_prompt,
        max_tokens=100,
        temperature=0.3
    )

    return {"role": "system", "content": "Summary: " + response["choices"][0]["message"]["content"]}

# Example history
history = [
    {"role": "user", "content": "Tell me about machine learning."},
    {"role": "assistant", "content": "Machine learning is a subset of AI..."},
    {"role": "user", "content": "What is supervised learning?"}
]

# Get a summary
print("Summary:", summarize_conversation(history))

Ejercicio 4: Crear un Asistente Usando la API de Asistentes

Tarea:

Crea un asistente utilizando la API de Asistentes de OpenAI que recuerde un hilo y responda con contexto.

Solución:

import openai
import time

# Step 1: Create the assistant
assistant = openai.beta.assistants.create(
    name="Memory Coach",
    instructions="You are a memory coach that helps users retain information over time.",
    model="gpt-4o"
)

# Step 2: Create a thread
thread = openai.beta.threads.create()

# Step 3: Add a message
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Help me remember the difference between RAM and ROM."
)

# Step 4: Run the assistant
run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

# Step 5: Wait for completion
while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

# Step 6: Print the assistant’s response
messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant:", msg.content[0].text.value)

Ejercicio 5: Comparación entre Chat Completions y Asistentes

Tarea:

Ejecuta el mismo prompt usando ambas APIs y compara el manejo del contexto.

Solución:

Versión de Chat Completions:

chat_response = openai.ChatCompletion.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain how HTTP works."}
    ],
    max_tokens=150
)

print("Chat Completion Response:", chat_response["choices"][0]["message"]["content"])

Versión de Asistentes:

# Thread and assistant are assumed to be created already
openai.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Explain how HTTP works."
)

run = openai.beta.threads.runs.create(
    assistant_id=assistant.id,
    thread_id=thread.id
)

while True:
    run_status = openai.beta.threads.runs.retrieve(run.id, thread_id=thread.id)
    if run_status.status == "completed":
        break
    time.sleep(1)

messages = openai.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
    if msg.role == "assistant":
        print("Assistant Response (Assistants API):", msg.content[0].text.value)

Estos ejercicios reforzaron cómo:

  • Gestionar la memoria a corto y largo plazo
  • Manejar los límites de contexto
  • Aplicar la gestión de hilos y tokens
  • Elegir entre las APIs de Chat Completions y Asistentes según tus objetivos

Al dominar estos flujos de trabajo, estás bien equipado para construir asistentes más inteligentes y conscientes del contexto que se adaptan a tus usuarios y sus necesidades.