Cómo guardar logs de mensajes de watsonx Assistant utilizando Webhooks

watsonx AssistantWebhooksRegistrar logs
Publicado el 12/8/2024
Fecha de ultima actualización: 12/8/2024

En los proyectos donde utilizamos watsonx Assistant como asistente conversacional, es crucial contar con un mecanismo para registrar los mensajes intercambiados entre los usuarios y el asistente. Esto permite analizar conversaciones, mejorar respuestas y auditar interacciones. Una forma eficiente de lograrlo es mediante el uso de webhooks, los cuales pueden extender la funcionalidad del asistente y conectarlo con sistemas externos.

En este artículo, explicaré cómo crear un microservicio para guardar logs de los mensajes enviados al asistente utilizando el tipo de webhook Log. Este microservicio almacenará los datos en una base de datos MongoDB y estará listo para integrarse con watsonx Assistant.

¿Qué son los webhooks en watsonx Assistant?

Un webhook es un mecanismo que permite realizar llamadas desde el asistente hacia un servicio externo durante una conversación. El webhook de tipo Log es particularmente útil para registrar cada mensaje y respuesta generados en el asistente, sin necesidad de condiciones adicionales.

El flujo típico de un webhook Log es el siguiente:

  1. El usuario envía un mensaje al asistente.
  2. El asistente procesa el mensaje y genera una respuesta.
  3. El webhook se activa, enviando el mensaje y su respuesta al microservicio configurado.
  4. El microservicio almacena la información, permitiendo su análisis posterior.

Creando el microservicio para guardar logs

El siguiente código muestra un ejemplo de microservicio desarrollado con FastAPI. Este microservicio se encarga de recibir los mensajes del webhook Log, validarlos y almacenarlos en una base de datos MongoDB.

Para implementar el microservicio que registra los logs de mensajes del asistente, debemos seguir los siguientes pasos:

Paso 1: Crear el ambiente virtual

Ejecuta los siguientes comandos en tu terminal:

cmd
python -m venv venv
source venv/bin/activate

Paso 2: Crear el archivo requirements.txt

Este archivo contendrá las dependencias del proyecto. Crea un archivo llamado requirements.txt con el siguiente contenido:

requirements.txt
fastapi[standard]
pymongo
pydantic-settings

Paso 3: Instalar las dependencias

Ejecuta el siguiente comando para instalar las librerías necesarias:

cmd
pip install -r requirements.txt

Con esto, el ambiente virtual estará configurado y las dependencias listas para usar.

Paso 4: Crear el archivo de configuración

Es necesario configurar las credenciales y parámetros de conexión a MongoDB. Para esto, crearemos un archivo llamado config.py con el siguiente contenido:

config.py
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
mongo_username: str
mongo_password: str
mongo_host: str
mongo_db: str
mongo_auth_source: str
mongo_replica_set: str
mongo_tls: bool
mongo_tls_ca_file: str
class Config:
env_file = ".env"
settings = Settings()

Además, debemos crear un archivo .env en el mismo directorio con las variables de entorno necesarias, como este ejemplo:

.env
mongo_username=tu_usuario
mongo_password=tu_contraseña
mongo_host=tu_host
mongo_db=tu_base_de_datos
mongo_auth_source=admin
mongo_replica_set=tu_replica
mongo_tls=True
mongo_tls_ca_file=/path/to/ca.pem

Esto permitirá cargar la configuración de manera centralizada y segura.

Paso 5: Crear los modelos de datos

Ahora definiremos los modelos necesarios para validar y estructurar los datos recibidos del webhook. Crea un archivo llamado models.py con el siguiente contenido:

models.py
from pydantic import BaseModel, Field
from typing import Dict, Any, Optional
class Event(BaseModel):
name: str
class PayloadResponse(BaseModel):
output: Dict[str, Any]
internal: Dict[str, Any]
user_id: str
context: Dict[str, Any]
class Payload(BaseModel):
log_id: str
request: Dict[str, Any]
response: PayloadResponse
assistant_id: str
request_timestamp: str
response_timestamp: str
language: str
skill_id: str
user_id: str
environment: str
channel: str
customer_id: str
class LogMessage(BaseModel):
event: Optional[Event]
payload: Optional[Payload]

Estos modelos permiten estructurar los datos enviados por watsonx Assistant, garantizando que sean válidos y estén completos antes de ser procesados.

Paso 6: Implementar el microservicio

Con la configuración y los modelos listos, podemos implementar el microservicio. Este se encargará de recibir los logs, validarlos y almacenarlos en MongoDB. Aquí está el código completo del microservicio en main.py:

main.py
from fastapi import FastAPI, HTTPException, status
from pymongo import MongoClient
from pymongo.errors import PyMongoError
from .models import LogMessage
from .config import settings
from datetime import datetime
app = FastAPI()
connection_string = f"mongodb://{settings.mongo_username}:{settings.mongo_password}@{settings.mongo_host}/{settings.mongo_db}?authSource={settings.mongo_auth_source}&replicaSet={settings.mongo_replica_set}"
tls_options = {
'tls': settings.mongo_tls,
'tlsCAFile': settings.mongo_tls_ca_file
}
client = MongoClient(connection_string, **tls_options)
client.admin.command('ping')
db = client["logs"]
@app.post("/logs/message")
async def create_log(log: LogMessage):
collection = db["messages"]
if not log.event.name == "message_logged":
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="El evento enviado no es del tipo message_logged."
)
log_dict = log.payload.model_dump()
log_dict["received_at"] = datetime.utcnow()
collection.insert_one(log_dict)
return { "status": "success" }
except PyMongoError as e:
raise HTTPException(
status_code=500,
detail=f"Error al insertar el log: {str(e)}"
)
except Exception as e:
raise HTTPException(
status_code=500,
detail=f"Error inesperado al procesar el log: {str(e)}"
)

Integrando el microservicio con Watsonx Assistant

Una vez que el microservicio está configurado y ejecutándose, el siguiente paso es integrarlo con watsonx Assistant mediante el uso de webhooks. Aquí te explico cómo hacerlo paso a paso:

Integrando el microservicio con Watsonx Assistant

Conclusión

Utilizar webhooks de tipo Log es una excelente estrategia para centralizar y analizar las interacciones entre usuarios y el asistente. Con este enfoque, podrás almacenar de manera segura y eficiente todos los mensajes en una base de datos, habilitando capacidades avanzadas como análisis de datos, auditorías o visualización de métricas.