APEX-Anwendungen um Microsofts Cognitive Services ergänzen

Mit Oracle Application Express (APEX) haben wir eine großartige Möglichkeit, sehr schnell eine Webanwendung mit einfacher und mächtiger Datenbankanbindung zu erstellen. Doch ist unsere Anwendung auch intelligent? Kann sie Informationen aus Texten extrahieren oder Bilder analysieren? Könnte sie Menschen aus unterschiedlichen Sprachräumen verbinden? Bis jetzt nicht… Doch Moment! Haben wir über APEX nicht eine sehr komfortable Möglichkeit, externe REST-APIs anzusprechen und zu konsumieren? Bietet Microsoft nicht Machine Learning Technologie als REST-Service an, wobei wir uns um die Details des Lernens gar nicht kümmern müssen. Stichwort: Machine Learning as a Service? Genau! Durch die Cognitive Services von Microsoft können APEX-Anwendungen denkbar einfach um KI-Techniken erweitert, ohne das tiefgehende Kenntnisse im maschinellen Lernen benötigt werden.

Wie eine solche Erweiterung eingerichtet werden kann, soll in diesem Blogbeitrag am Beispiel einer Chat-Anwendung mit automatischer Übersetzung dargestellt werden.

 

Azure Cognitive Services

Zunächst aber ein kurzer Überblick über die Cognitive Services:

Microsoft gliedert sie in die fünf Aufgabengruppen: Bildanalyse, Spracheingabe, Sprache, Entscheidungshilfe und Suchen.

Übersicht Cognitive Services (Azure Logo © Microsoft)
Übersicht Cognitive Services (Azure Logo © Microsoft)

Bildanalyse

Die API-Schnittstellen der Bildanalyse bieten im Allgemeinen die Möglichkeit, aus Bildern Informationen zu gewinnen. Dabei kann es sich um Bilder mit Textinhalt, Bilder von Freihandschrift oder Bilder von Personen – insbesondere von Gesichtern – handeln. Auch Bewegtbilder, also Videos, können ausgewertet werden. So greift der Video Indexer auf eine Kombination aus verschiedenen Bildanalysemethoden zurück. Er ist in der Lage Gesichter zu erkennen und zuzuordnen, kann aber auch die dargestellte Szene auswerten und Bildelemente extrahieren. Beispiele dafür wären etwa das Geschlecht abgebildeter Personen und die Farbe gezeigter Gegenstände.

Die UI des Video Indexers
Die UI des Video Indexers

Spracheingabe

Die Dienste der Spracheingabe ermöglichen zum einen die Transkription von Sprache und eine Echtzeit-Übersetzung, zum anderen das Erkennen von Personen anhand von Sprachdaten. Dies kann zum Beispiel zur Verifikation über Sprache genutzt werden. Die automatische Verschriftlichung von Gesagtem wird vom Video Indexer nicht nur eingesetzt, um Transkripte eines Videos zu erstellen. Es können auch, zum Beispiel bei einer Rede, besprochene Themen erkannt und zum Erstellen entsprechender Tags verwendet werden.

Soll ein Text im Hinblick auf darin enthaltene Absichten oder auf einen bestimmten Kontext hin ausgewertet werden, bieten sich Schnittstellen der Gruppe Sprache an. Die Textanalyse-API sowie die Language Understanding-API eignen sich dafür ideal. Es kann aber auch Text übersetzt und beim Verständnis von Texten (geplant für die nahe Zukunft) geholfen werden. Des Weiteren wird dem Use Case, der selbständigen Q&A-Erstellung, eine eigene Schnittstelle, der Q&A Maker, zur Verfügung gestellt. Damit können aus Kundenanfragen die Intentionen und Problemfälle der Kunden automatisch erkannt und zugeordnet werden.

Ein weiteres Anwendungsgebiet maschinellen Lernens ist das Auswerten von Daten, um fundiertere Entscheidungen treffen zu können. Die Azure Cognitive Services bieten auch dafür APIs an. So können Anomalien in (Live-)Datensätzen erfasst werden. In Social Media-Anwendungen ist es möglich, anstößigen Inhalt zu erkennen und herauszufiltern, und im Anschluss den jeweiligen User zu verwarnen oder zu sperren.

Schließlich ist es noch möglich die Fähigkeiten von Microsofts hauseigener Suchmaschine Bing zu nutzen und diese per API in die eigene Anwendung zu integrieren. Es kann beispielsweise eine Schnittstelle angesprochen werden, welche eine webbasierte Bilder- und Videosuche ermöglicht, eine Suche nach benutzerdefinierten Kriterien wird jedoch auch angeboten.

Wie die Integration der genannten Dienste funktionieren kann, wird nun an einem Beispiel gezeigt.

 

Integration der Translate-API in eine APEX-Anwendung

Es soll nun, um die bereits genannte Chatfunktionalität in APEX gehen. Da es durchaus vorkommen kann, dass in einem konzernweiten Chat verschiedensprachige Personen aufeinandertreffen, sollte es bei der Chatanwendung die Möglichkeit geben, die Nachrichten in eine vorher definierte „Muttersprache“ zu übersetzen.

Zum Einsatz kommt dafür die Azure Translate-API. Sie wurde im Azure Portal als Ressource erstellt und damit auch ein Subscription-Key generiert. Dieser Authentifizierungsschlüssel muss, wenn man keine Authentifizierung über Tokens verwenden möchte, bei jeder Anfrage im Header mitgesendet werden. Um einen Text übersetzen zu lassen, reicht es aus, einen POST-Request an die API zu senden.

<LISTING 1>
[
    {
"Text": "Hi, Guys! It's very nice to meet you all. I sincerely hope     you like Machine Learning!"
    }
]

Listing 1: Beispiel für den Request-Body im JSON-Format. Der Subscription Key wird im Header mitgesendet. Die gewünschte Sprache wird als Query-Parameter angehängt.

Mehr ist für die Interaktion mit der API nicht nötig. Darüber hinaus kann noch Verschiedenes in Bezug auf die Art der Authentifizierung und das Übersetzen von mehreren Texten gleichzeitig einstellen, dafür soll aber auf die umfangreiche Dokumentation [2] verwiesen werden.

Für die Beispielanwendung wird außerdem noch ein minimaler Node.js-Server mit dem Framework Socket.io verwendet, letzteres bringt verschiedene Funktionen zur Verwaltung von Socket-Verbindungen mit.

Veranschaulichung des Aufbaus der Beispielanwendung
Veranschaulichung des Aufbaus der Beispielanwendung

Socket Verbindungen bieten eine persistente Verbindung von Client und Server, sodass unter anderem jederzeit Daten mit geringer Latenz hin- und hergeschickt werden können [3]. Dies eignet sich hervorragend für einen Chat. Jeder Client verbindet sich also mit dem Node.js-Server, dieser wiederum leitet die entsprechenden Nachrichten an die Sockets, die verbundenen Clients, weiter. Doch das ist nicht alles. Verbindet sich ein Client das erste Mal mit dem Server, liefert er eine Nachricht mit einem Nutzernamen und seiner „Muttersprache“ mit. Soll an diesen Client nun eine Nachricht eines anderen Chatteilnehmers gesendet werden, welcher nicht dieselbe „Muttersprache“ angegeben hat, wird die Nachricht an die Textübersetzungs-API der Cognitive Services gesendet.

Erhält der Node.js-Server von der API eine Antwort im JSON-Format (siehe Listing 2), leitet er diese an den Zielclient weiter.

<LISTING 2>
[
    {
        "detectedLanguage": {
            "language": "en",
            "score": 1.0
        },
        "translations": [
            {
                "text": "Ciao, ragazzi! È molto bello conoscervi               tutti. Spero sinceramente che ti piaccia l'apprendimento automatico!",
                "to": "it"
            }
        ]
    }
]

Listing 2: Der Response-Body der Translator-API. Zu sehen ist auch, dass die Sprache des Textes aus dem POST-Request automatisch korrekt erkannt wurde.

Ein Nutzer erhält somit alle Nachrichten in der von ihm angegebenen Sprache, unabhängig davon, in welcher Sprache sie ursprünglich verfasst wurden (siehe Abbildungen 4 und 5).

Die Anwendung aus Sicht des fiktiven Nutzers „Piet“ mit der Muttersprache Niederländisch.
Die Anwendung aus Sicht des fiktiven Nutzers „Piet“ mit der Muttersprache Niederländisch.
Die Anwendung aus Sicht des fiktiven Nutzers „Luigi“ mit der Muttersprache Italienisch.
Die Anwendung aus Sicht des fiktiven Nutzers „Luigi“ mit der Muttersprache Italienisch.

Die Anbindung in APEX ist nun denkbar einfach. Abgesehen von der Erstellung eines User-Interfaces kann Socket.io Clientseitig per JavaScript File URL-Feld im Page Designer entweder als externe Web-URL oder als lokales Workspace-File eingebunden werden. Da Socket.io eventbasiert arbeitet, müssen noch Events (siehe Listing 3) definiert werden, welche die Nachrichten absenden und einkommenden Nachrichten registrieren. In der Beispielanwendung wurden die Events vollständig in JavaScript erstellt und im JavaScript-Feld der Hauptseite im Page Designer hinzugefügt.

<LISTING 3>
//Client verbindet sich mit Server
var socket = io.connect('Server-URL');
//Client teilt über die Socket-Verbindung Muttersprache und Nutzernamen mit
socket.emit('identify', {
       language: language.value,
       handle: handle.value
});
//Client registriert Chat-Event, zeigt erhaltene Nachricht an
socket.on('chat', function(data){
   let date = new Date();
   outputString = '<p><b>' + data.handle + '</b>@('+ date.toUTCString()
       + '): '
       + data.message
       + '</p><br>';
   display_region.innerHTML += outputString;
});
// Event um Nachrichten zu versenden
socket.emit('chat', {
        handle: handle.value,
        message: input.value
});

Listing 3: Die wichtigsten Events der Anwendung. Dies ist nur ein Beispiel um einen ungefähren Eindruck zu vermitteln. Die tatsächliche Implementierung sieht anders aus.

Eine Definition der Events über Dynamic Actions wäre aber ebenfalls möglich und in einer Produktiv-Anwendung auch wünschenswert.

Somit erhält man eine Anwendung in APEX, welche eine grundlegende Chatfunktionalität bietet und KI-Dienste aus der Cloud nutzt.

Verlässt man sich nun aber darauf, dass die Translate-API immer korrekt und im korrekten Kontext übersetzt, werden sich die potenziellen Nutzer das ein oder andere Mal reichlich wundern. So werden in der Regel längere Texte ungenauer übersetzt als einzelne, kurze Sätze. Für eine Chat-Testanwendung ist dies jedoch noch vollkommen akzeptabel. Die hinter der API stehenden Machine Learning-Modelle werden außerdem laufend weiter trainiert, weswegen davon auszugehen ist, dass sich die Übersetzungsfehler mit fortschreitender Zeit immer weiter minimieren werden.

 

Fazit zu den Azure Cognitive Services

Mit den Azure Cognitive Services bietet Microsoft ein interessantes Angebot im Bereich Machine Learning as a Service an. Für die Verwendung der Dienste sprechen zunächst die einfache Verwendung und die stetige Weiterentwicklung seitens Microsofts. Dabei profitiert man als Nutzer auch von der Konkurrenz der Anbieter untereinander, insbesondere Google, Microsoft und Amazon. Jeder Plattformbetreiber versucht die Nutzung seiner Dienste möglichst einfach bedien- und anpassbar zu gestalten. Gibt es außerdem neue oder verbesserte Techniken, beispielsweise eine neue Herangehensweise an Gesichtserkennung, hat es bis jetzt nicht lange gedauert, bis diese dem Nutzer zur Verfügung gestellt wurden. Dies ist in einem sich so schnell entwickelnden Themengebiet, wie dem des maschinellen Lernens, aber auch nötig. Sich mit der Azure Cloud zu beschäftigten, könnte aber besonders im Hinblick auf die geplante Cloud-Kooperation von Microsoft und Oracle interessant sein. Es braucht also keine Vorhersage anhand von Machine Learning um ahnen zu können, dass uns eine spannende Zukunft bevorsteht.

Quellen

[1] Microsoft News Center (2019, Juni 5). Microsoft and Oracle to interconnect Microsoft Azure and Oracle Cloud. Abgerufen 13. Oktober 2019, von https://news.microsoft.com/2019/06/05/microsoft-and-oracle-to-interconnect-microsoft-azure-and-oracle-cloud/

[2] Dokumentation Translator-API. Abgerufen 13. Oktober 2019, von https://docs.microsoft.com/de-de/azure/cognitive-services/translator

[3] Malte Ubl und Eiji Kitamura (2010, Oktober 20). Einführung zu WebSockets: Sockets im Web. Abgerufen 13. Oktober 2019, von https://www.html5rocks.com/de/tutorials/websockets/basics/

Jetzt teilen auf:

Jetzt kommentieren