Para comprender los beneficios de integrar SAP e IBM Watson, verá un caso de uso.
Un día, mientras un ingeniero de servicio trabajaba afuera, escuchó el ruido de una máquina. Debido a las obstrucciones causadas por las herramientas, fue difícil ingresar un informe de texto largo para repararlo en el sitio web y tuvo que regresar a su oficina. Mientras completaba el formulario, necesitaba encontrar la máquina entre otras en la base de datos y recordar otros detalles, como el estado de mal funcionamiento, lo que podría resultar en una entrada inexacta e insuficiente. En el peor de los casos, podría olvidarse de presentar el informe debido a otro trabajo que debía realizarse. Si hubiera utilizado una aplicación que combinara los servicios de SAP e IBM Watson, la situación hubiera sido diferente.
La aplicación tiene las siguientes ventajas.
SAP Build Apps, anteriormente conocido como SAP AppGyver, es un servicio Low-Code/No-Code (LCNC) que se utiliza como capa de visualización. Kyma es un servicio de orquestación para desarrollar, operar y administrar el tiempo de ejecución de aplicaciones nativas de la nube que se combina con Kubernetes. Ejecuta un paquete Node.js dentro de un contenedor Docker en el clúster de Kubernetes. Node.js consta de tres capas: proxy, aplicación y destino. En la capa de proxy, los datos recibidos de SAP Build Apps se pasan a la capa de la aplicación como punto final de proxy. La capa de aplicación luego implementa la lógica de negocios. Finalmente, la capa de destino actúa como punto final de destino y accede a las API de varios servicios después de recibir datos de la capa de aplicación.
IBM Watson Assistant permite conversaciones naturales con computadoras mediante el uso de IA para comprender la intención del mensaje. Esto proporciona una mayor eficiencia y precisión a través del almacenamiento de datos.
El asistente se compone de Acciones y Pasos. Una Acción es una sección de diálogo entre el asistente y el usuario que tiene como objetivo resolver un problema o completar una tarea. En la demostración, «Crear notificación de mantenimiento» es una acción que resuelve un problema, ‘Informar un problema de máquina’. Dado que se pueden crear varias acciones, el asistente debe identificar qué acción desea realizar el usuario diciéndole al asistente un ID de componente en el que se hizo clic.
Un Paso se refiere a un solo diálogo entre el asistente y el usuario dentro de una Acción. Los pasos se combinan para resolver un problema y pueden tener funciones como decidir tipos de respuesta, actualizaciones de variables, validación y bifurcación condicional. La bifurcación condicional se puede utilizar para hacer una pregunta al usuario si el asistente no entiende su respuesta, o para determinar si se cambia de una solicitud de notificación de mantenimiento a una de orden de mantenimiento cuando se selecciona «Muy alta» como paso de prioridad de mantenimiento.
En este caso de uso, se utilizan dos tipos de respuesta: Opciones y Texto libre. Mientras que la escritura se utiliza en el desarrollo de acciones en IBM Watson Assistant como un valor de texto libre, IBM Watson Speech to Text se utiliza durante el desarrollo de aplicaciones en SAP Build Apps.
El flujo del chatbot se puede probar haciendo clic en el botón Vista previa.
IBM Watson Speech to Text reconoce el lenguaje hablado y lo transcribe a texto con un alto grado de precisión. Es compatible con varios tipos de archivos de audio y puede admitir muchos idiomas. Además, el modelo se puede personalizar para satisfacer necesidades específicas para diferentes casos de uso. Además de estas características, el servicio también ofrece diarización de locutores, que puede distinguir entre múltiples locutores. Es particularmente útil para transcribir conversaciones o discusiones entre varias personas.
// src/watson/s2t/target/apis.js
async convertWavAudio2Text(wav) {
return await speechToText
.recognize({
audio: wav,
contentType: "audio/wav",
model: "en-US_BroadbandModel",
backgroundAudioSuppression: 0.2,
keywords: [
"machine",
"vibration",
// ...
"motor",
"pump",
],
keywordsThreshold: 0.5,
})
// ...
}
Avance: recopilando palabras de uso común desde el módulo de SAP utilizando las API de SAP S/4HANAformateándolos en formatos de datos apropiados, registrándolos como palabras clave y configurando adecuado umbral, se puede mejorar la precisión del reconocimiento de voz.
SAP Build Apps es una plataforma LCNC construida sobre React Native. Permite la definición de una clase y la creación de la instancia, similar a cualquier lenguaje de programación regular. Crea una clase de paso para un componente de diálogo que incluye una pregunta de la IA y una respuesta del usuario. Dentro de la instancia de Step, la información recibida de IBM Watson Assistant se utiliza para modificar el estilo y otras propiedades del componente.
Al calcular la distancia entre la ubicación actual obtenida a través de SAP Build Apps y la ubicación de cada Objeto Técnico registrado en la base de datos de SAP S/4HANA, el sistema puede generar una lista de objetos candidatos ordenados por proximidad. Gracias a eso, el usuario puede encontrar fácilmente el objeto deseado entre muchos objetos.
// src/watson/assistant/calculateMeters.js
const calculateMeters = (currentLat, currentLon, targetLat, targetLon) => {
const EARTH_RADIUS = 6371e3;
const φ1 = (currentLat * Math.PI) / 180;
const φ2 = (targetLat * Math.PI) / 180;
const Δφ = ((targetLat - currentLat) * Math.PI) / 180;
const Δλ = ((targetLon - currentLon) * Math.PI) / 180;
const a =
Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const metres = Math.round(EARTH_RADIUS * c);
return metres;
};
Fórmula Haversine se puede utilizar para calcular la distancia entre dos puntos en una esfera. Aunque la Tierra no es una esfera perfecta, el error es insignificante para este caso.
Al presionar el botón de grabación y explicar la situación verbalmente, el usuario evita largas entradas de texto. Si el texto convertido difiere de lo que realmente se dijo, el usuario puede hacer clic en el icono de volver a grabar e intentarlo de nuevo.
el flujo de trabajo
Tener un tamaño de archivo más grande es una desventaja, aunque permite una mayor calidad de sonido y un tiempo de grabación más largo. Sin embargo, en este caso de uso, las grabaciones rara vez duran más de un minuto. Por lo tanto, es mejor priorizar una alta calidad de audio, ya que la precisión del reconocimiento de voz es fundamental. Al principio, utiliza las funciones Iniciar grabación de audio y Detener grabación de audio de SAP Build Apps. Estas funciones crean un archivo de audio local temporal con una extensión AAC, que luego se puede convertir al formato Base64 usando la función Convertir a Base64 antes de enviarse al proxy.
Los argumentos del inicio de la grabación de audio:
Argumentos de entrada | Descripción | Valores |
Frecuencia de muestreo | Frecuencia de muestreo de la grabación, en kHz. | 44100 |
Canales | Graba en un canal (mono) o dos (estéreo). | 1 |
Bits por muestra | ¿Cuántos bits por muestra deben almacenarse? | 24 |
El código para el proxy se proporciona a continuación.
// src/watson/s2t/application/convertS2T
const { Readable } = require("stream");
const ffmpeg = require("fluent-ffmpeg");
// base64 => buffer => stream => wav
const convertBase64ToWav = (base64) => {
const buffer = Buffer.from(base64, "base64");
const stream = Readable.from(buffer);
const wav = ffmpeg(stream).audioBitrate("1058k").format("wav").stream();
return wav;
};
Para mantener aún más la calidad del audio y evitar conversiones innecesarias, se recomienda seleccionar una extensión de archivo y una tasa de bits de audio adecuadas. En este caso, debe elegir un archivo WAV, que no es un formato de compresión con pérdida. También es crucial calcular la tasa de bits con precisión para obtener grabaciones de voz de alta calidad. En general, la tasa de bits de audio se puede calcular utilizando la siguiente fórmula:
Tasa de bits de audio = Tasa de muestreo × Canales × Bits por muestra.
El audioBitrate en el código se calcula de esta manera,
1058 (kbps) = 44100 (Hz) × 24 (bits) × 1
Las opciones seleccionadas en SAP Build Apps deben mapearse porque no son valores apropiados para enviar a SAP S/4HANA.
// src/integrationSuite/target/mapping.js
const mappingList = {
MaintNotificationCode: {
"Erratic output": "ERO",
"Insufficient power": "POW",
"Load drop": "LOA",
Noise: "NOI",
Overheating: "OHE",
Vibration: "VIB",
Other: "OTH",
Unknown: "UNK",
},
MaintenanceObjectIsDown: {
Yes: "True",
No: "False",
},
// ...
};
const mapping = (body) => {
for (var reqKey in mappingList) {
const bodyValue = body[reqKey];
if (bodyValue && mappingList[reqKey][bodyValue]) {
body[reqKey] = mappingList[reqKey][bodyValue];
break;
}
}
return body;
};
El contenido de la solicitud incluye los valores ReporterFullName y ReportedByUser, que se obtienen cuando el usuario se autentica en la página de inicio de sesión. La respuesta es el Id. de notificación de mantenimiento, que se utiliza para la siguiente imagen adjunta.
// src/integrationSuite/target/apis.js
async postMaintNotif(body, proxyRes) {
const mappedBody = mapping(body);
return await axios
.post("/v1/pr/API_MAINTNOTIFICATION/MaintenanceNotification", {
TechnicalObject: mappedBody.TechnicalObject,
NotificationText: mappedBody.NotificationText,
MaintNotificationCode: mappedBody.MaintNotificationCode,
MalfunctionEffect: mappedBody.MalfunctionEffect,
MaintenanceObjectIsDown: mappedBody.MaintenanceObjectIsDown,
MaintNotificationLongText: mappedBody.MaintNotificationLongText,
MaintNotifLongTextForEdit: mappedBody.MaintNotificationLongText,
MaintPriority: mappedBody.MaintPriority,
ReporterFullName: mappedBody.ReporterFullName,
ReportedByUser: mappedBody.ReportedByUser,
MalfunctionStartDate: mappedBody.MalfunctionStartDate,
LocationDescription: mappedBody.LocationDescription,
RequiredStartDate: mappedBody.RequiredStartDate,
RequiredEndDate: mappedBody.RequiredEndDate,
NotificationReferenceDate: mappedBody.NotificationReferenceDate,
NotificationType: "Y1",
TechObjIsEquipOrFuncnlLoc: "EAMS_EQUI",
MaintNotificationCodeGroup: "YB-PMGNL",
})
.then((res) => {
return res.data.MaintenanceNotification.MaintenanceNotificationType
.MaintenanceNotification.TEXT;
})
Puede usar la función de cámara en SAP Build Apps para tomar una foto y enviarla al proxy en formato base64. Sin embargo, los datos de imagen pueden consumir una gran cantidad de comunicación. Por lo tanto, es necesario verificar la configuración de la biblioteca. En este caso, se usa Express.js y el límite predeterminado para el cuerpo de la solicitud es de 100 KB. Si el cuerpo de la solicitud supera el límite, se producirá un error 413 («entidad de solicitud demasiado grande»).
Para resolver este problema, puede configurar Express.js de la siguiente manera,
// src/app.js
const express = require("express");
const app = express();
app.use(express.urlencoded({ extended: true, limit: "100mb" }));
Primero debe recuperar los valores de ‘Cookie’ y ‘X-CSRF-Token’ porque deben incluirse en el encabezado de la solicitud POST.
// src/s4HANA/target/apis.js
const res = await axios("/opu/odata/sap/API_CV_ATTACHMENT_SRV", {
headers: {
"x-csrf-token": "FETCH",
},
});
const cookie =
res.headers["set-cookie"][0] + ";" + res.headers["set-cookie"][1];
const xCSRFToken = res.headers["x-csrf-token"];
Puede ver los detalles de los parámetros del encabezado.
Parámetros de encabezado | Descripción | Valores de ejemplo |
La interfaz de usuario de SAP Fiori no muestra DMS (Sistema de gestión de documentos) sino GOS (Servicios de objetos genéricos) | ||
El ID de notificación de mantenimiento con el prefijo 0 | 000010000624 | |
El nombre del archivo con extensión. | ObjetoTécnico1.jpg |
El tipo de archivo del cuerpo debe ser binario.
// src/s4HANA/target/apis.js
return await axios
.post(
"/opu/odata/sap/API_CV_ATTACHMENT_SRV/AttachmentContentSet",
binaryFile,
{
headers: {
"Content-Type": "image/jpeg; image/png",
BusinessObjectTypeName: "PMQMEL",
LinkedSAPObjectKey: body.linkedSAPObjectKey,
Slug: body.slug,
Cookie: cookie,
"X-CSRF-Token": xCSRFToken,
},
}
)
Ha visto cómo se pueden combinar los servicios de IBM Watson y SAP para crear una notificación de mantenimiento a través de la voz en un dispositivo móvil. Esta integración puede beneficiar enormemente a las empresas al optimizar sus operaciones. Aunque se demuestra la notificación de mantenimiento, esta integración se puede aplicar a varias aplicaciones de eficiencia comercial en cada módulo de SAP.
Por favor, comparta sus comentarios o pensamientos en un comentario. FNo dude en seguirnos y contactarnos si tiene otros casos de uso o soluciones en mente, o si desea obtener más detalles.
Gracias a Günter Albrecht y Mohini Verma por apoyarme en este proyecto!
¡Puede acceder a los temas de SAP S/4HANA desde aquí!
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073