Lección 4 · 5 min · Gratis

Conversaciones con Memoria a Largo Plazo

Introducción

En esta lección, construirás un sistema de conversación inteligente capaz de recordar interacciones pasadas, manteniendo el contexto a lo largo de múltiples turnos. Esto es crucial para crear experiencias de usuario más naturales y coherentes con modelos de lenguaje grandes (LLM), evitando que "olviden" lo que se ha dicho anteriormente. Utilizaremos LlamaIndex para la gestión de datos, la API Sonar de Perplexity para generar respuestas y LanceDB para el almacenamiento persistente de la memoria.

Al finalizar, tendrás una aplicación funcional que demuestra cómo integrar estas herramientas para superar las limitaciones de contexto de los LLM, permitiendo conversaciones prolongadas y relevantes.

Descripción General

Esta implementación demuestra la preservación de la memoria conversacional a largo plazo utilizando el almacenamiento vectorial de LlamaIndex y la API Sonar de Perplexity. Mantiene el contexto a través de las llamadas a la API mediante la recuperación y el resumen inteligentes.

Características Clave

  • Retención de Contexto Multi-Turno: Recuerda consultas/respuestas anteriores.
  • Búsqueda Semántica: Encuentra historial de conversación relevante utilizando embeddings vectoriales.
  • Integración con Perplexity: Aprovecha el modelo Sonar-pro para respuestas precisas.
  • Almacenamiento LanceDB: Historial de conversación persistente utilizando una base de datos vectorial columnar.

Detalles de Implementación

Componentes Principales

Este fragmento de código inicial configura los componentes esenciales para nuestra aplicación. Importa las bibliotecas necesarias como LlamaIndex, LanceDB y Perplexity, y establece la estructura básica para la gestión de la memoria y la interacción con el modelo de lenguaje.

# Memory initialization
vector_store = LanceDBVectorStore(uri="./lancedb", table_name="chat_history")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex([], storage_context=storage_context)

Aquí se inicializan el modelo de lenguaje (LLM) de Perplexity y el modelo de embeddings, que son fundamentales para procesar y entender el lenguaje natural. También se configura el almacenamiento vectorial con LanceDB, que será la base para nuestra memoria a largo plazo.

Flujo de Conversación

  1. Almacena las consultas del usuario como embeddings vectoriales.
  2. Recupera las 3 interacciones históricas más relevantes.
  3. Genera solicitudes a la API Sonar con el historial contextual.
  4. Persiste las respuestas para futuras conversaciones.

Integración de API

Este segmento muestra cómo se inicializa el servicio de Perplexity y cómo se configura el índice vectorial con LanceDB. El índice es crucial para almacenar y recuperar eficientemente los embeddings de las conversaciones, permitiendo la búsqueda semántica.

# Sonar API call with conversation context
messages = [
    {"role": "system", "content": f"Context: {context_nodes}"},
    {"role": "user", "content": user_query}
]
response = sonar_client.chat.completions.create(
    model="sonar-pro",
    messages=messages
)

La configuración del VectorStoreIndex con LanceDB es el corazón de la memoria a largo plazo. Cada interacción se convierte en un vector y se almacena aquí, lista para ser recuperada cuando sea relevante para una nueva consulta.

Configuración

Requisitos

Antes de ejecutar el código, asegúrate de tener instaladas todas las dependencias necesarias. Este bloque de código muestra cómo instalar los paquetes de Python requeridos para LlamaIndex, Perplexity y LanceDB.

llama-index-core>=0.10.0
llama-index-vector-stores-lancedb>=0.1.0
lancedb>=0.4.0
openai>=1.12.0
python-dotenv>=0.19.0

Es fundamental que todas las bibliotecas estén correctamente instaladas para evitar errores de importación y asegurar el funcionamiento correcto de la aplicación.

Configuración

  1. Establece la clave de API:

Para interactuar con la API de Perplexity, necesitas una clave de API. Este paso es crucial para autenticar tus solicitudes y acceder a los modelos de lenguaje. Asegúrate de reemplazar "TU_CLAVE_API_DE_PERPLEXITY" con tu clave real.

export PERPLEXITY_API_KEY="your-api-key-here"

Sin una clave de API válida, las llamadas a la API de Perplexity fallarán. Puedes obtener tu clave de API registrándote en el sitio web de Perplexity.

Uso

Conversación Básica

Este código demuestra cómo iniciar una conversación y cómo el sistema utiliza la memoria para mantener el contexto. Envías una consulta, y el sistema responde, recordando lo que se ha dicho antes.

from chat_with_persistence import initialize_chat_session, chat_with_persistence

index = initialize_chat_session()
print(chat_with_persistence("Current weather in London?", index))
print(chat_with_persistence("How does this compare to yesterday?", index))

Observa cómo la función chat_engine.chat() maneja la lógica de recuperación de memoria y la generación de respuestas, haciendo que la conversación sea fluida y contextual.

Salida Esperada

Este es un ejemplo de cómo se vería la interacción en la consola. Muestra cómo el modelo responde a las preguntas, utilizando el contexto de las interacciones anteriores para dar respuestas coherentes.

Initial Query: Detailed London weather report
Follow-up: Comparative analysis using stored context

La salida esperada ilustra la capacidad del sistema para recordar detalles y referenciarlos en turnos posteriores, lo cual es un indicador clave de una memoria conversacional efectiva.

¡Pruébalo tú mismo!

Este bloque de código te permite interactuar directamente con el motor de chat. Puedes ingresar tus propias preguntas y ver cómo el sistema mantiene el contexto a lo largo de la conversación.

python3 scripts/example_usage.py

Experimenta con diferentes tipos de preguntas, incluyendo aquellas que se refieren a información mencionada anteriormente, para observar cómo el sistema utiliza su memoria a largo plazo.

Verificación de Persistencia

Este código demuestra cómo se puede verificar que la memoria de la conversación se ha almacenado persistentemente en LanceDB. Al recargar el índice desde el mismo directorio, se puede acceder al historial de conversaciones anteriores.


db = lancedb.connect("./lancedb")
table = db.open_table("chat_history")
print(table.to_pandas()[["text", "metadata"]])

La persistencia es una característica clave de esta implementación, ya que permite que las conversaciones se reanuden incluso después de que la aplicación se haya cerrado y reiniciado, manteniendo la continuidad de la memoria.

Esta implementación resuelve desafíos clave en las conversaciones con LLM:

  • Mantiene un 93% de precisión contextual en más de 10 turnos.
  • Reduce la alucinación en un 67% mediante la fundamentación contextual.
  • Permite conversaciones de una hora dentro de una ventana de 4096 tokens.

Aprende Más

Para contexto adicional sobre los enfoques de gestión de memoria, consulta la Guía de Gestión de Memoria principal.

Para la documentación completa, consulta la Guía de Memoria de LlamaIndex y la Documentación de la API de Perplexity.

Este fragmento final es un marcador de posición para cualquier código adicional o recursos que desees incluir al final de la lección.

---

Resumen

  • Construiste un sistema de conversación con memoria a largo plazo utilizando LlamaIndex y Perplexity.
  • Aprendiste a almacenar el historial de conversaciones como embeddings vectoriales en LanceDB.
  • Configuraste la integración con la API Sonar de Perplexity para generar respuestas contextuales.
  • Comprobaste la persistencia de la memoria, permitiendo conversaciones continuas a lo largo del tiempo.
  • Entendiste cómo esta arquitectura mejora la coherencia y reduce las "alucinaciones" en los LLM.
Lección del curso «Perplexity API Cookbook» de Perplexity, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a Perplexity. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios