Wir hatten die Gelegenheit, unsere Produkte und Dienstleistungen auf der traditionell in Nürnberg stattfindenden SPS-Messe zu präsentieren. Eine der beliebtesten Präsentationen war der intelligente Roboter NAO, der mit den Besuchern interagierte. Dieser Blogbeitrag beleuchtet einige technische Aspekte dieser Lösung.
Seit mehreren Jahren beschäftigt sich SABO Mobile IT mit dem Einsatz von künstlicher Intelligenz und maschinellem Lernen zur Unterstützung von Softwarelösungen in der Industrie.
Wir haben unser Produkt Sabot (Smart Assistant Bot), unseren intelligenten Sprachassistenten (IVA) zur Steuerung von Maschinen wie Miwe-Backöfen, erfunden und entwickeln es ständig weiter. Der Nutzer kann das Gerät dann nicht nur mit Sprachbefehlen steuern, sondern auch die intelligenten Fähigkeiten des Assistenten selbst nutzen.
Für die Messe wollten wir die sprachgesteuerte Benutzeroberfläche in ein attraktives Paket verpacken, und der nette Roboter NAO schien ein idealer Kandidat zu sein.
Es gibt drei Hauptbereiche, in denen die NAO arbeitet:
1. Der Idle-Modus konzentrierte sich auf die Interaktion mit den Besuchern im Sinne einiger Icebreaker-Aktivitäten.
2. Der Servicemodus sollte ein fließendes Gespräch ermöglichen, um Erfrischungen für die Besucher zu bestellen.
3. Im Sabot-Modus wurde die Steuerung einer Miwe-Bäckerei demonstriert.
In den folgenden Abschnitten werden unsere Erfahrungen mit der Implementierung des Servicemodus beschrieben.
Im Servicemodus fungierte der NAO-Roboter als Barkeeper. Der Besucher konnte Fragen stellen, sich vom Roboter das Angebot erklären lassen, Artikel hinzufügen oder entfernen und seine Bestellung aufgeben. Der Roboter konnte auf Deutsch und Englisch sprechen.
Bei den folgenden Texten handelt es sich um Transkriptionen. Die Interviews wurden in natürlicher Sprache geführt.
Roboter: Wie kann ich Ihnen bei Ihrer Bestellung helfen?
Besucher: Was für Erfrischungen sind im Angebot?
Roboter: Wir bieten Heiß- und Kaltgetränke sowie Snacks an. Wie kann ich Ihnen bei Ihrer Bestellung helfen?
Besucher: Warme Getränke.
Roboter: Das sind die Heißgetränke, die wir anbieten: Caffè Crema, Espresso, Cappuccino, Latte Macchiato, heiße Schokolade, Tee.
Besucher: OK. Einen Espresso, bitte.
Roboter: Sicher! Ich habe einen Espresso zu Ihrer Bestellung hinzugefügt. Möchten Sie einen einfachen oder doppelten Schuss?
Besucht: Einfachen mit Milch.
Roboter: Ich habe einen Espresso mit Milch zu Ihrer Bestellung hinzugefügt. Möchten Sie noch etwas?
Besucher: Und etwas zu essen bitte.
Roboter: Aber sicher! Wir haben eine große Auswahl an Snacks. Hier sind einige Möglichkeiten: Schweizer Platte, süßer Snack, herzhafter Snack, Brezel, Croissant.
Besucher: Zwei Croissants.
Roboter: Gute Wahl! Ich habe 2 Croissants zu Ihrer Bestellung hinzugefügt. Möchten Sie noch etwas hinzufügen?
Besucher: Nein, danke.
Roboter: Gern geschehen! Ihre Bestellung wurde abgeschickt. Wenn Sie weitere Hilfe benötigen, zögern Sie nicht, uns zu fragen.
Besucher: Ein einfacher Espresso mit Milch und zwei Croissants.
Roboter: Sicher! Ich habe Ihrer Bestellung einen Espresso mit Milch und 2 Croissants hinzugefügt. Möchten Sie noch etwas hinzufügen oder ändern?
Nach Eingabe und Übermittlung der Bestellung wurde diese über eine Webanwendung auf einem nahe gelegenen Großbildschirm angezeigt. So konnte der Besucher seine Bestellung sehen und eine Minute auf die Zubereitung der Erfrischung warten.
Der NAO-Roboter ist mit einigen Sensoren und I/O-Geräten ausgestattet. Es gibt eine graphische IDE namens NAO Choregraph, die die graphische Sprache NAOqi unterstützt. Mit dieser Sprache können Szenarien erstellt werden, die aus mehreren Schritten bestehen. Ein Schritt kann Code enthalten, der in Python geschrieben wurde und das NAO SDK verwendet.
Der NAO-Audio-Provider ist eine Komponente, die direkt auf dem NAO-Roboter gehostet wird und Audio von seinem Mikrofon liefert.
Der NAO Audio Source Service ist eine spezielle Python-Anwendung, die auf einem mit dem NAO-Roboter vernetzten Computer gehostet wird. Seine Aufgabe ist es, Audiodatenfragmente vom NAO-Mikrofon über einen Socket an den NAO-Backend-Service weiterzuleiten.
Der NAO Backend Service ist ein .Net 6 Service, der diese grundlegenden Subtasks steuert:
• Empfang von NAO-Audiofragmenten.
• Verarbeitung der Sprach-zu-Text-Erkennungslogik mit Hilfe von Azure Cognitive Services. Aus Performancegründen verwenden wir eine kontinuierliche Spracherkennung. Bei diesem Ansatz wird die Sprache auch durch Sprechpausen automatisch in Sätze unterteilt.
• Weiterleitung des erkannten Textes an den aktuell aktivierten Textprozessor. Davon gibt es zwei - für den Sabotagemodus und für den Servicemodus. Im Folgenden wird der Textprozessor für den Service-Modus betrachtet.
• Verarbeitung der Textantwort des aktiven Textprozessors.
• Bereitstellung der Textantwort über einen Pull-Mechanismus vom NAO-Roboter.
Der NAO Text Response Handler ist eine Python-Komponente, die direkt auf dem NAO-Roboter läuft. Sie prüft ständig, ob eine Textantwort vom NAO Backend Service kommt. Ist dies der Fall, leitet der NAO-Roboter den Text an seinen integrierten Sprachsynthese-Prozessor weiter.
Der NAO Order Visualizer ist eine Webanwendung, die auf einen Socket im NAO Backend Service hört. Sobald eine neue Bestellung eintrifft, wird diese als visuelle Bestätigung für den Besucher angezeigt.
Wir haben eine Bestelllösung integriert, die auf ChatGPT-3.5 von OpenAI basiert und als Azure OpenAI Service bereitgestellt wird. Die Integration konnte logisch in mehrere Teilaufgaben unterteilt werden:
1. Entwurf und Abstimmung der ChatGPT-Eingabeaufforderung.
2. Definition und Verwaltung der ChatGPT-Funktionen.
3. Orchestrierung des Chats.
Es überrascht mich nicht, dass ChatGPT Prompt Engineering zu einem eigenständigen Bereich der Softwareentwicklung geworden ist. Das Tuning des Verhaltens eines Chatbots ist keine triviale Aufgabe. Ein geändertes Wort in der Eingabeaufforderung kann das Verhalten erheblich beeinflussen. Wir haben mit verschiedenen Versionen und Formulierungen experimentiert, bis wir eine Lösung gefunden hatten, die unseren Erwartungen entsprach.
Sie können Fragmente von unserem Barkeeper überprüfen:
Die Verwendung der ChatGPT-Funktionen ist ein mächtiges Feature, das in einigen Sprachversionen ab gpt-3.5-turbo-0613 zur Verfügung steht. Ich kann mir nicht vorstellen, ohne diese Funktionen die Steuerungsfunktionalität zu erreichen.
Wir haben drei Funktionen definiert: action_ItemAddedIntoOrder, action_ItemRemovedFromOrder und action_OrderSubmitted. Der Name einer Funktion, die Beschreibung, die Parameter - alles ist wichtig und kann das Verhalten des Bots beeinflussen.
Die Funktion zum Hinzufügen einer Position zum Auftrag wurde definiert:
Name: action_ItemAddedIntoOrder
Beschreibung: Eine Produktposition, die der Bestellung hinzugefügt wurde.
Parameter [Name, Beschreibung]:
[Position, Position of the product item in the order starting from 1.]
[Quantity, Quantity of the product. Default is 1.]
[Product, The product item's name added to the order.]
…
ChatGPT kann den Punkt im Gespräch erkennen, der durch den Aufruf der Methode behandelt wird. Z. B.
Besucher: Ein single Espresso mit Milch.
wird als Anruf interpretiert:
Bei der Verarbeitung von Funktionsargumenten ist eine gewisse Validierungslogik erforderlich. Die Antwort muss entsprechend dem gewünschten Verhalten angepasst werden.
Und was uns sehr geholfen hat, war die Erwähnung des Funktionsnamens in der Eingabeaufforderung für einige spezielle Fälle. Diese Regel hat uns zum Beispiel geholfen, das Hinzufügen des nächsten Artikels desselben Produkts in der Bestellung richtig zu handhaben:
- Wenn der Bestellung etwas hinzugefügt wird, auch wenn der hinzugefügte Artikel dem vorhergehenden ähnlich ist, rufen Sie erneut `action_ItemAddedIntoOrder` auf.
Die Hauptkomponente, die die Logik des Auftragsangebots abstrahiert, wurde auf diese Weise entworfen:
Die Implementierung der Abstraktion besteht aus der orchestrierenden Klasse OrderBotController und mehreren Unterkomponenten, die für die partielle Geschäftslogik verantwortlich sind.
Für den OrderBotController wurden mehr als 60 Integrationstests durchgeführt. Die ChatGPT-Antwort ist typisch für ihren nicht-deterministischen Charakter. Es ist schwierig, exakte Wizard-Antworten durch Tests zu bestätigen.
Durch die Einführung der ChatGPT-Funktionen ist es jedoch möglich, deren Aufrufe einschließlich ihrer Parameter zu überprüfen.
Die Tests liefern ein sehr schnelles und wertvolles Feedback zu jeder Änderung in der Funktionsverarbeitung und in der Definition der Eingabeaufforderung. Durch diese Vorgehensweise wurde die Abstimmung sicherer und effizienter.
Der NAO-Roboter kam sehr gut an. Er war der süßeste Barkeeper der Messe.
Wir entwickelten die erste Version. Es war eine sehr spannende Reise und Erfahrung. Wir haben auch viele Ideen und Vorschläge gesammelt, wie wir unsere Lösung für die nächste Version verbessern können. Und wir werden von den Erfahrungen profitieren. Die Technologien im Zusammenhang mit ChatGPT entwickeln sich sehr schnell, so dass häufig neue Funktionen implementiert werden. Und Projekte wie dieses helfen uns, das Potenzial und die Grenzen dieser Technologien besser zu verstehen.