Manejo de Mensajes y Respuestas con OpenAI Assistant
Este documento detalla el manejo de mensajes y respuestas mediante el uso de OpenAI Assistant. El código presentado permite procesar diferentes tipos de mensajes (texto, audio, e imágenes) y gestionar respuestas fragmentadas dentro del contexto de un asistente. Además, incorpora un AbortController para manejar interrupciones y garantizar un control efectivo del flujo de ejecución.
Código de Implementación
El siguiente bloque de código ilustra cómo configurar y gestionar una acción personalizada con OpenAI Assistant:
import { Workflow } from "@elimeleth/vct-flow"
import { Assistant } from "@elimeleth/vct-layers"
export default new Workflow("any")
.addAction(async (ctx, methods) => {
return Assistant.layer({
invoke_params: {
extra: {
additional_instructions: `
Estas son metadata de la información del cliente con quien interactúas:
Nombre: ${ctx?.name || "Nombre no asignado aún"}
Teléfono: ${ctx.from}
`,
truncation_strategy: {
type: "last_messages",
last_messages: 20 // Limita el historial a los últimos 20 mensajes
}
}
},
functions: {
send: async (answer, save_metadata) => {
// Procesa y envía la respuesta al cliente
let chunks = answer.output.split("\n\n").filter(a => Boolean(a)); // Divide la respuesta en fragmentos
let body = [...new Set(chunks)] as string[]; // Elimina duplicados
await methods.send([{
body: body,
save_metadata
}]);
}
}
})(ctx, methods);
});
Explicación del Flujo y Funcionalidad
1. Configuración de Parámetros
- Se define un bloque de instrucciones adicionales que personaliza la interacción del asistente con el cliente.
- Se utiliza una estrategia de truncamiento (
truncation_strategy) para limitar el historial de mensajes a los últimos 20, optimizando el contexto proporcionado al modelo.
2. Función send
- Propósito : Procesar la respuesta generada por el asistente y enviarla al cliente.
- Pasos :
- Divide la respuesta en fragmentos (
chunks) usando saltos de línea dobles (\n\n). - Filtra los fragmentos vacíos y elimina duplicados para evitar redundancias.
- Envía los fragmentos procesados como un array al cliente.
3. Gestión del Contexto (ctx)
- Nombre del Cliente : Si está disponible, se extrae del contexto; de lo contrario, se establece un valor predeterminado ("Nombre no asignado aún").
- Teléfono del Cliente : Se extrae directamente del campo
ctx.from.
4. Truncamiento del Historial
- Permite limitar la cantidad de mensajes enviados al modelo para mantener un enfoque en las interacciones más recientes, lo que mejora el rendimiento y el costo.
Beneficios de la Implementación
- Personalización Dinámica Cada interacción incluye metadatos específicos del cliente, como su nombre y teléfono, para proporcionar un contexto enriquecido.
- Optimización del Historial El uso de estrategias de truncamiento garantiza que el modelo trabaje con información relevante y reciente, reduciendo el consumo de recursos.
- Manejo de Respuestas Fragmentadas Las respuestas largas se dividen en fragmentos únicos, eliminando redundancias antes de ser enviadas al cliente.
- Preparado para Diferentes Tipos de Mensajes La arquitectura está diseñada para manejar texto, audio e imágenes, lo que la hace versátil y adaptable a múltiples escenarios.
Manejo de Errores
El código asegura un manejo robusto de errores mediante:
- Validaciones del Contexto (
ctx) : Se verifica que los datos críticos estén disponibles antes de procesar la respuesta. - Registro de Errores : Todos los errores se registran en la consola para facilitar el diagnóstico.
Consideraciones Finales
- Modularidad : La función
sendpuede extenderse para soportar otros formatos de respuesta o integrarse con otros canales. - Monitoreo : Es importante agregar herramientas de monitoreo para evaluar la calidad de las respuestas y optimizar el flujo.
- Pruebas Exhaustivas : Antes de implementar en producción, prueba la configuración con diferentes volúmenes de datos y escenarios para asegurar un desempeño estable.