{"id":23455,"date":"2022-08-14T13:55:23","date_gmt":"2022-08-14T11:55:23","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=23455"},"modified":"2023-06-18T17:52:31","modified_gmt":"2023-06-18T15:52:31","slug":"mealdb-chatbot-mit-google-dialogflow","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/","title":{"rendered":"MealDB Chatbot mit Google Dialogflow"},"content":{"rendered":"\n<p><em>Ein Projekt von Ronja Brauchle, Julia Cypra und Lara Winter<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einleitung <\/h2>\n\n\n\n<p>Gab es bereits drei Tage hintereinander Pasta mit Pesto? Ist das einzig abwechslungsreiche in deinem Speiseplan die Entscheidung ob die klassische Tiefk\u00fchlpizza mit Salami oder die extravagantere Wahl des Flammenkuchens nach Bauernart in den Ofen geschoben wird?&nbsp; Unser MealBot hilft genau bei diesen monotonen und inspirationslosen Phasen: Er schl\u00e4gt Rezepte basierend auf Lebensmitteln vor, die man gerade zuhause liegen hat; er kann nach L\u00e4nderk\u00fcchen und Essensvorlieben Mahlzeiten heraussuchen oder einfach zu einer dir bereits bekannten Mahlzeit das Rezept ausgeben.<\/p>\n\n\n\n<p>Wir haben f\u00fcr das Projekt Dialogflow von Google verwendet, das eine Engine basierend auf NLU (Natural Language Understanding) ist und mit der man intelligente Chatbots erstellen kann. Durch das Anbinden an die MealDB (<a href=\"https:\/\/www.themealdb.com\/\">https:\/\/www.themealdb.com\/<\/a>) mithilfe der MealAPI kann unser Chatbot dem User hunderte von Rezepten ausgeben. Der MealBot wurde in Telegram integriert und ist somit dort f\u00fcr jeglichen Chitchat anzutreffen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entwurf und Architektur <\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cloud.google.com\/static\/dialogflow\/es\/docs\/images\/fulfillment-flow.svg\" alt=\"\" width=\"537\" height=\"207\"\/><figcaption>https:\/\/cloud.google.com\/static\/dialogflow\/es\/docs\/images\/fulfillment-flow.svg<\/figcaption><\/figure>\n\n\n\n<p>Die obige Abbildung visualisiert die Auftragsausf\u00fchrung nach einer Benutzereingabe. Wie bereits erw\u00e4hnt, ist unser Chatbot in den Messengerdienst Telegram integriert, von dort wird die Benutzereingabe weiter an Dialogflow geleitet. Dank der in Dialogflow integrierten KI kann die Benutzereingabe einem der passenden individuell erstellten Intents zugeordnet werden. Dabei werden au\u00dferdem auch bestimmte Parameter aus der Eingabe extrahiert. Ein Intent kann eine vorgefertigte statische Antwort beinhalten, es kann aber auch unter dem Punkt \u201eFulfillment\u201c ein Webhook Aufruf aktiviert und somit passender Code getriggert werden. Im Falle eines Webhook Aufrufes werden die extrahierten Parameter, sowie weitere Informationen zu dem zugeordneten Intent in einer JSON HTTPS POST Anfrage, dem Fulfillment Request, an den Webhhokdienst geschickt. Der Webhook kann selbst gehostet werden, dieser muss dann HTTPS POST Anfragen in Form von JSON verarbeiten. In unserem Fall haben wir den Code zur Auftragsausf\u00fchrung im Inline-Editor von Dialogflow erstellt und somit in einer Cloud Function bereitgestellt. Die Cloud Function wird dann durch den Dialogflow getriggert und erh\u00e4lt die Daten aus der JSON Anfrage. Die Cloud Function besteht lediglich aus einer index.js, die Funktionen f\u00fcr die jeweiligen Intents enth\u00e4lt. Durch das passende Intent Matching wird dann auch die jeweilige Funktion ausgef\u00fchrt. In dieser Funktion wird unsere externe API, die MealDB, abgefragt. Dabei wird je nach Intent ein zugeh\u00f6riger Endpoint mit den passenden Parametern angesprochen. Die Antwort der MealDB Abfrage wird dann zusammen mit anderen Daten in der Webhook Antwort wieder an Dialogflow zur\u00fcckgeschickt. Dialogflow extrahiert aus der Antwort die ben\u00f6tigten Daten und sendet diese letztendlich an Telegram, sodass der Endbenutzer die Antwort erh\u00e4lt.<\/p>\n\n\n\n<p>Die untenstehende Abbildung verdeutlicht nochmal den Ablauf mit den von uns benutzten Technologien.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio.png\"><img loading=\"lazy\" decoding=\"async\" width=\"751\" height=\"82\" data-attachment-id=\"23456\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/untitled-diagram-drawio-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio.png\" data-orig-size=\"751,82\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Untitled-Diagram.drawio\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio.png\" alt=\"\" class=\"wp-image-23456\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio.png 751w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Untitled-Diagram.drawio-300x33.png 300w\" sizes=\"auto, (max-width: 751px) 100vw, 751px\" \/><\/a><\/figure>\n\n\n\n<p>Der Vorteil von Cloud Functions ist, dass diese serverless, g\u00fcnstig und skalierbar sind. Das hei\u00dft die Cloud Function ist ereignisgesteuert und wird nur bei einem Event getriggert. Dadurch und wegen der Skalierbarkeit halten sich die Kosten gering.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Basics aka die Bausteine von Dialogflow<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Intents<\/h3>\n\n\n\n<p>Intents erm\u00f6glichen es dem Agenten die Motivation hinter einer bestimmten Benutzereingabe zu verstehen. Jeder Intent stellt eine Aufgabe oder Handlung dar, die der Benutzer ausf\u00fchren m\u00f6chte. Im folgenden Bild sieht man die von uns f\u00fcr den MealBot erstellten Intents inklusive der Erkl\u00e4rung dieser.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23498\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/intentubersichtedited\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited.png\" data-orig-size=\"1027,792\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"IntentUbersichtedited\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited-1024x790.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited-1024x790.png\" alt=\"\" class=\"wp-image-23498\" width=\"554\" height=\"426\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited-1024x790.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited-300x231.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited-768x592.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentUbersichtedited.png 1027w\" sizes=\"auto, (max-width: 554px) 100vw, 554px\" \/><\/a><\/figure>\n\n\n\n<p>Ausdr\u00fccke, die dasselbe bedeuten, aber auf unterschiedliche Weise konstruiert werden, werden demselben Intent zugeordnet. Somit kommen wir direkt zum ersten Bestandteil (von dreien) eines Intents, und zwar zu den Trainingsformulierungen:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.Trainingsformulierungen<\/h4>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23494\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/intenttrainingsformulierung\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung.png\" data-orig-size=\"1049,843\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"IntentTrainingsformulierung\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung-1024x823.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung-1024x823.png\" alt=\"\" class=\"wp-image-23494\" width=\"647\" height=\"520\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung-1024x823.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung-300x241.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung-768x617.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/IntentTrainingsformulierung.png 1049w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/a><\/figure>\n\n\n\n<p>Trainingsformulierungen sind Beispiels\u00e4tze f\u00fcr das, was der Endnutzer sagen k\u00f6nnte. Wenn der Endnutzerausdruck einer dieser S\u00e4tze \u00e4hnelt, stimmt Dialogflow mit dem Intent \u00fcberein. Jedoch muss man nicht jede denkbare Formulierung angeben, da das integrierte maschinelle Lernen die Liste automatisch um \u00e4hnliche \u00c4u\u00dferungen erweitert.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Parameter <\/h4>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"319\" data-attachment-id=\"23511\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/actionparameter\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter.png\" data-orig-size=\"1042,325\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"actionparameter\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter-1024x319.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter-1024x319.png\" alt=\"\" class=\"wp-image-23511\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter-1024x319.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter-300x94.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter-768x240.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/actionparameter.png 1042w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Parameter sind die aus dem Benutzerausruck extrahierten Werte (in der ersten Trainingsformulierung w\u00e4ren es \u201cgarlic\u201d und \u201csalt\u201d). Jeder Parameter hat einen Entit\u00e4tstyp (siehe Abschnitt Entities; hier \u201cIngredients\u201d). Der bzw. die Parameter werden je nach Intent an den passenden Endpoint geschickt. Aus dem von der Meal API zur\u00fcckgeschickten Datensatz formt man dann eine Antwort, die dem User ausgegeben wird.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Antwort<\/h4>\n\n\n\n<p>Bei den meisten Intents konstruieren und formatieren wir die Antwort im Inline-Editor, wo wir mit dem von der API zur\u00fcckgeschickten Datensatz direkt weiterarbeiten k\u00f6nnen. Bei Smalltalk bezogenen Intents, die keine API-Anfrage ben\u00f6tigen, wird die Antwort per GUI angegeben:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46.jpeg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23461\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/whatsapp-image-2022-08-14-at-12-29-46\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46.jpeg\" data-orig-size=\"603,370\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"WhatsApp-Image-2022-08-14-at-12.29.46\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46.jpeg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46.jpeg\" alt=\"\" class=\"wp-image-23461\" width=\"406\" height=\"249\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46.jpeg 603w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-300x184.jpeg 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/a><figcaption>Beispiel Intent \u201cthanks\u201d<\/figcaption><\/figure>\n\n\n\n<p>Man unterscheidet bei Antworten zwischen zwei Arten:<\/p>\n\n\n\n<p>1.<strong>Standard-Antwort<\/strong>: Bot antwortet auf die Frage und ist anschlie\u00dfend bereit weitere unspezifische Fragen zu beantworten.&nbsp;<\/p>\n\n\n\n<p>Bsp: Intent \u201crandom-meal\u201d : Der User fragt, ob der Bot irgendein Rezept vorschlagen k\u00f6nnte -&gt; Der Bot gibt direkt eins aus und ist bereit, andere Fragen zu beantworten.<\/p>\n\n\n\n<p>2. <strong>follow-up-intents<\/strong>: Bot antwortet auf die erste Frage, erwartet dann aber vom User weitere Eingaben, die sachlich auf die erste Frage aufbauen.<\/p>\n\n\n\n<p>Bsp: alle \u201cfilter-by\u201d Intents: Der User fragt beispielsweise nach chinesischem Essen, woraufhin der Bot ihm 3 Rezepte vorschl\u00e4gt und er vom User erwartet, eins auszuw\u00e4hlen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Entities<\/h3>\n\n\n\n<p>Entities werden verwendet, um bestimmte Informationen herauszufiltern, die der Benutzer erw\u00e4hnt. Sie nehmen n\u00fctzliche Daten auf und stellen sie zur weiteren Verarbeitung bereit. Man unterscheidet zwischen zwei Arten:<\/p>\n\n\n\n<p>1.<strong>System entities<\/strong>, die bereits in Dialogflow enthalten sind und mit denen der Agent ohne zus\u00e4tzliche Konfiguration Informationen zu einer Vielzahl von Konzepten extrahieren kann.<\/p>\n\n\n\n<p>Bsp: Dialogflow erkennt direkt eine Zeitangabe, ein Datum oder eine Zahl (sys.time, sys.date, sys.number)<\/p>\n\n\n\n<p>2. <strong>Developer entities<\/strong> definiert der Entwickler anhand seines individuellen Datensatzes selbst. Bez\u00fcglich der Parameter, die wir an die Endpoints der Meal API schicken, haben wir folgende Entities definiert:<\/p>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/ingredientsentity.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23512\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/ingredientsentity\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/ingredientsentity.png\" data-orig-size=\"883,653\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ingredientsentity\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/ingredientsentity.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/ingredientsentity.png\" alt=\"\" class=\"wp-image-23512\" width=\"438\" height=\"320\"\/><\/a><figcaption>\u201cIngredients\u201d-Entit\u00e4t: Lebensmittel, die in der MealDB vorhanden sind und die der Agent bei einem Benutzerausdruck identifizieren sowie extrahieren k\u00f6nnte<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image alignleft size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1.jpeg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23462\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/whatsapp-image-2022-08-14-at-12-29-46-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1.jpeg\" data-orig-size=\"217,306\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"WhatsApp-Image-2022-08-14-at-12.29.46-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1.jpeg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1.jpeg\" alt=\"\" class=\"wp-image-23462\" width=\"128\" height=\"181\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1.jpeg 217w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/WhatsApp-Image-2022-08-14-at-12.29.46-1-213x300.jpeg 213w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Entity Dilemma <\/h4>\n\n\n\n<p>Um eine Benutzereingabe richtig zu verstehen und die passenden Parameter herauszufiltern, muss Dialogflow die zugeh\u00f6rigen Entitys kennen. Denn ist ein Entity vorher nicht bekannt, kann Dialogflow dies auch nicht erkennen und somit eine Eingabe auch nicht dem passenden Intent zuweisen. Sollte der Benutzer zum Beispiel eingeben: \u201eI want to cook pancakes.\u201c, Dialogflow aber nicht wei\u00df was pancakes sind, kann er damit nichts anfangen. Aus diesem Grund mussten wir alle m\u00f6glichen Gerichte, L\u00e4nder, Kategorien und Zutaten als Entitys abspeichern. Bei den Kategorien und L\u00e4ndern ging dies auch relativ schnell. Bei dem Entity \u201eAreaAdjective\u201c mussten wir ein Adjektiv herausfiltern, da der API Endpoint nur diese akzeptiert hat. So funktioniert zum Beispiel eine Abfrage mit \u201eitalian\u201c, wohingeben \u201eItaly\u201c keine Ergebnisse liefert. Durch das Hinzuf\u00fcgen von Synonymen konnten wir das Problem aber schnell l\u00f6sen, denn so wird \u201eItaly\u201c automatisch zu \u201eitalian\u201c umgewandelt. Bei den Gerichten und Zutaten hat es sich aber ein bisschen schwieriger gestaltet. Denn es gibt keinen Endpoint bei der MealDB, mit welchem man alle vorhandenen Rezepte abfragen kann, man kann lediglich alle Rezepte mit einem bestimmten Anfangsbuchstaben abfragen. Deshalb haben wir uns eine kleine Hilfsfunktion erstellt, die in einer Schleife Abfragen mit allen m\u00f6glichen Buchstaben macht. Die einzelnen Zwischenergebnisse haben wir dann in ein Array gepushed, sodass wir zum Schluss alle m\u00f6glichen Rezepte zusammen hatten. Diese Rezepte haben wir uns dann ausgeben lassen \u00fcber die Konsole und als CSV Format in dem Entity \u201eIngredients\u201c hochgeladen. Dazu der passende Code, der vielleicht nicht der sch\u00f6nste ist, aber funktioniert hat.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23465\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/unbenannt-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt.png\" data-orig-size=\"972,361\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Unbenannt\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt.png\" alt=\"\" class=\"wp-image-23465\" width=\"611\" height=\"226\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt.png 972w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-300x111.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-768x285.png 768w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/a><\/figure>\n\n\n\n<p>Die Zutaten konnten wir zwar alle \u00fcber einen Endpoint abfragen, da es aber viel zu vielen waren, um sie von Hand als Enitiy einzugeben, haben wir uns daf\u00fcr auch eine Hilfsfunktion erstellt. Mit dieser Funktion haben wir die Abfrage formatiert und wieder ausgegeben, sodass wir alle Zutaten auf einmal im CSV Format hochladen konnten. Der Code dazu funktioniert \u00e4hnlich wie der obere.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"101\" data-attachment-id=\"23466\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/unbenannt-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1.png\" data-orig-size=\"972,101\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Unbenannt-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1.png\" alt=\"\" class=\"wp-image-23466\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1.png 972w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1-300x31.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-1-768x80.png 768w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Kontext<\/h3>\n\n\n\n<p>Schon mal an einer regen Diskussion von Fremden vorbeigelaufen und Phrasen aufgeschnappt, die f\u00fcr einen als Au\u00dfenstehender \u00fcberhaupt keinen Sinn ergeben haben?&nbsp;<\/p>\n\n\n\n<p>So wie Menschen einen Kontext brauchen, um herauszufinden, was ein bestimmtes Wort oder bestimmter Satz bedeutet, ben\u00f6tigen auch Chatbots sie. Ohne Kontext k\u00f6nnte das Wort bzw. der Satz absolut keine Bedeutung haben oder etwas v\u00f6llig anderes bedeuten als die urspr\u00fcngliche Absicht des Benutzers<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Unser pers\u00f6nliches (philosophisches) Kontext-Dilemma<\/h4>\n\n\n\n<p>Wie bei den Intents oben bereits kurz skizziert, ist unser Rezept-Vorschlag-Konzept wie folgt aufgebaut: Der Benutzer fragt idealerweise nach einem Rezept basierend auf einer L\u00e4nderk\u00fcche, Essenskategorie etc. Darauffolgend schl\u00e4gt der Agent ihm bis zu 3 Rezepte vor, von denen sich der Benutzer f\u00fcr eins entscheiden kann. Wie man bereits schon ahnen k\u00f6nnte, ist hier ein Kontext erforderlich, damit der Chatbot Aussagen wie \u201cOption 2\u201d,\u201cIch will das erste\u201d auch zuordnen kann.<\/p>\n\n\n\n<p>Mit voller Motivation haben wir f\u00fcr jeden Intent einen follow-up intent zusammengeklickt, der genau diese Auswahl anhand der Nummerierung der vorgeschlagenen Rezepte erkennen sollte. Somit wurde logischerweise f\u00fcr jeden Intent ein eigener Output-Kontext erstellt, der bei dem jeweiligen follow-up Intent als Input-Kontext wieder eingespeist wurde. Schnell wurde uns beim Code-Schreiben bewusst, dass eigentlich jeder follow-up intent die selbe Logik implementiert, und zwar zu erkennen welches Rezept ausgew\u00e4hlt wurde und dieses formatiert an den User zur\u00fcckzugeben. Die Idee schlich sich herein, alle individuellen Kontexte der Intents in einen zusammenzufassen und diesen einen bequem in einer Funktion zu verwalten und f\u00fcr alle follow-up intents aufzurufen. Wir gaben der Idee nach, da alles nach unseren Erwartungen richtig ausgegeben wurde. Trotzdem f\u00fchlt sich die L\u00f6sung nicht ganz \u201cclean\u201d an, da sprachwissenschaftlich gesehen eigentlich jeder Intent vom Inhalt her einen eigenen Kontext verdienen sollte: Ob man gerade nach einer Essenskategorie oder L\u00e4nderk\u00fcche gefragt hat, sollte in einer echten Konversation schon einen Unterschied machen. Programmatisch hat es uns die Sache jedoch wesentlich erleichtert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API Routen<\/h2>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v1\/1\/categories.php &#8220;)<\/strong><\/p>\n\n\n\n<p>Auflisten aller meal categories. Wird genutzt, um die Beschreibung einer vom Endnutzer eingegebenen Kategorie herauszufiltern und auszugeben.<\/p>\n\n\n\n<p><strong>axios.get(&#8220;<\/strong><a href=\"https:\/\/www.themealdb.com\/api\/json\/v1\/1\/random.php\"><strong>https:\/\/www.themealdb.com\/api\/json\/v1\/1\/random.php<\/strong><\/a><strong>&#8220;)<\/strong><\/p>\n\n\n\n<p>Ausgabe des Rezeptes eines random meals.<\/p>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v1\/1\/filter.php&#8221;, { params: { a: inputArea } })<\/strong><\/p>\n\n\n\n<p>Filtern der Gerichte nach einem vom Endnutzer eingegeben Land. Wird genutzt um drei random Gerichte dieses Landes als Optionen dem Nutzer zur Verf\u00fcgung zu stellen<\/p>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v2\/9973533\/filter.php&#8221;, { params: { i: paramsIngredients } })<\/strong><\/p>\n\n\n\n<p>Filtern der Gerichte nach einer oder mehreren vom Endnutzer eingegeben Zutaten. Wird genutzt um drei random Gerichte mit diesen Zutaten als Optionen dem Nutzer zur Verf\u00fcgung zu stellen.<\/p>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v1\/1\/search.php&#8221;, { params: { s: inputMeal } })<\/strong><\/p>\n\n\n\n<p>Filtern der Gerichte nach einem vom Endnutzer eingegeben Gericht. Wird genutzt um bis zu drei Arten dieses Gerichtes als Optionen dem Nutzer zur Verf\u00fcgung zu stellen.<\/p>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v1\/1\/filter.php&#8221;, { params: { c: inputCategory } })<\/strong><\/p>\n\n\n\n<p>Filtern der Gerichte nach einer vom Endnutzer eingegeben Kategorie. Wird genutzt um bis zu drei Optionen aller Gerichte aus dieser Kategorie als Optionen dem Nutzer zur Verf\u00fcgung zu stellen.<\/p>\n\n\n\n<p><strong>axios.get(&#8220;https:\/\/www.themealdb.com\/api\/json\/v2\/9973533\/lookup.php&#8221;, { params: { i: mealId } })<\/strong><\/p>\n\n\n\n<p>Suche nach einem bestimmten Gericht durch den Parameter id und Ausgabe des Rezeptes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel Cloud Function for Firebase &#8211; FilterByArea:<\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23467\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/unbenannt-2-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2.png\" data-orig-size=\"812,360\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Unbenannt-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2.png\" alt=\"\" class=\"wp-image-23467\" width=\"550\" height=\"244\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2.png 812w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2-300x133.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-2-768x340.png 768w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/figure>\n\n\n\n<p>In der Funktion wird als Parameter der Webhook Client agent \u00fcbergeben. \u00dcber diesen bekommt die Variable InputArea als Wert den Parameter des Entit\u00e4tstyps &#8220;AreaAdjective&#8221;, der vom Nutzer eingeben und von Dialgogflow erkannt&nbsp; und extrahiert wurde. Mit Hilfe der Bibliothek axios wird auf die MealDB zugegriffen. Dabei wird die URL mit inputArea \u00fcbergeben.&nbsp; Als Antwort kommen bei res nun die Daten aus der MealDB zur\u00fcck. Diese werden an die Funktion handleResult() \u00fcbergeben, welche die Daten filtert. Letztendlich werden die gefilterten Daten \u00fcber agent.add() zur Antwort, die dem Endnutzer dann angezeigt wird.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Chatbot in Action<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23475\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/1_nummeriert-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1.jpg\" data-orig-size=\"811,513\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1660481756&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"1_nummeriert-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1.jpg\" alt=\"\" class=\"wp-image-23475\" width=\"464\" height=\"293\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1.jpg 811w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1-300x190.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1_nummeriert-1-768x486.jpg 768w\" sizes=\"auto, (max-width: 464px) 100vw, 464px\" \/><\/a><\/figure>\n\n\n\n<p>1. Intents und Entit\u00e4ten: Die Nutzereingabe wird mit Hilfe der Trainingss\u00e4tze und dem Parameter mit dem Entit\u00e4tstyp dem passenden Intent zugeordnet, dem &#8220;filter-by-ingredients&#8221; Intent. Somit kommt die passende Antwort zur\u00fcck. Die Nutzereingabe carrot wird als Parameter &#8220;Carrots&#8221; des Entit\u00e4tstypen &#8220;ingredients&#8221; erkannt. Dialogflow kann dies zuordnen, auch mit anderer Gro\u00df &#8211; und Kleinschreibung bzw. Ein &#8211; oder Mehrzahl.<\/p>\n\n\n\n<p>2. FollowUpIntent: Option 0: Dialogflow erkennt die 0 als passend zu den Trainingss\u00e4tzen vom Intent &#8220;filter-by-ingredients &#8211; zero&#8221;. Dieser ist ein FollowUp Intent auf &#8220;filter-by-ingredients&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23482\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/inked2_nummeriert-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1.jpg\" data-orig-size=\"813,604\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1660483084&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Inked2_nummeriert-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1.jpg\" alt=\"\" class=\"wp-image-23482\" width=\"463\" height=\"344\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1.jpg 813w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1-300x223.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked2_nummeriert-1-768x571.jpg 768w\" sizes=\"auto, (max-width: 463px) 100vw, 463px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23483\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/inked4_nummeriert\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert.jpg\" data-orig-size=\"813,607\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1660481935&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Inked4_nummeriert\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert.jpg\" alt=\"\" class=\"wp-image-23483\" width=\"467\" height=\"349\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert.jpg 813w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert-300x224.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Inked4_nummeriert-768x573.jpg 768w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/a><\/figure>\n\n\n\n<p>3. Kontext:&nbsp; Die Nutzereingabe wurde dem &#8220;filter-by-area&#8221; Intent mit dem Parameter &#8220;areaAdjective&#8221; = thai zugeordnet. Au\u00dferdem wurde der Kontext &#8220;user-data&#8221; hergestellt. Der Nutzer gibt nun die Option 2 an und der Chatbot befindet im FollowUpIntent &#8220;filter-by-area &#8211; options&#8221; mit dem Parameter value = 2. Das passende Rezept wird ausgegeben. Gibt der Nutzer nun die Option 3 ein, so wird wieder das passende Rezept ausgegeben. Der Chatbot kann die 3 deswegen immer noch als number Parameter des FollowUpIntent &#8220;filter-by-area &#8211; options&#8221; erkennen, da er sich noch im Kontext&nbsp; &#8220;user-data&#8221; befindet. F\u00fcr solche Zusammenh\u00e4nge ist also der Kontext n\u00f6tig.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23478\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/8_nummertiert-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1.jpg\" data-orig-size=\"813,706\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"8_nummertiert-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1.jpg\" alt=\"\" class=\"wp-image-23478\" width=\"449\" height=\"390\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1.jpg 813w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1-300x261.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8_nummertiert-1-768x667.jpg 768w\" sizes=\"auto, (max-width: 449px) 100vw, 449px\" \/><\/a><\/figure>\n\n\n\n<p>4. Problem: Lasagna Problem: Unter der Option Lasagna kann der Chatbot nichts finden. Unter der Option Lasagna Sandwich jedoch schon. Die Erwartung des Endnutzers k\u00f6nnte allerdings sein, bei der Suche nach Lasagna alle Rezepte die Lasagna im Namen haben zu finden, u.a. Lasagna Sandwich. Die Meal Optionen im Chatbot sind allerdings an die in der MealDB gebunden und in der MealDB gibt es kein Gericht Lasagna. Demnach gibt es in der &#8220;Meal&#8221; Entit\u00e4ten Liste auch keine Lasagna. Dialogflow sucht die Entit\u00e4ten nach Lasagna ab, kann aber keinen genauen Treffer finden und den Wortteil &#8220;Lasagna&#8221; aus &#8220;Lasagna Sandwich&#8221; nicht extrahieren und als richtig erkennen. Der Nutzer muss also den gesamten Namen des Gerichts angeben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing<\/h2>\n\n\n\n<figure class=\"wp-block-image alignleft size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"740\" data-attachment-id=\"23486\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/unbenannt-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3.png\" data-orig-size=\"290,740\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Unbenannt-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3.png\" alt=\"\" class=\"wp-image-23486\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3.png 290w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt-3-118x300.png 118w\" sizes=\"auto, (max-width: 290px) 100vw, 290px\" \/><\/a><\/figure>\n\n\n\n<p>Zum Testing haben wir leider nur wenig gefunden, vor allem zu automatischen Tests, um den Dialogflow als Ganzes zu testen. Zwar gibt es in der Dialogflow GUI die M\u00f6glichkeit einzelne S\u00e4tze zu testen, wobei auch der zugeh\u00f6rige Intent, Context sowie die extrahierten Parameter angezeigt werden, was auch sehr hilfreich zum Debuggen war. Der nebenstehende Screenshot zeigt, wie dies dann aussieht. So werden zum Beispiel unter dem Punkt \u201eContexts\u201c die passenden Contexte angezeigt, da es sich um einen follow-up Intent handelt. Au\u00dferdem wurde der passende Intent \u201efilter-by-area\u201c zugeordnet, sowie der Parameter \u201eitalian\u201c. Unter dem Punkt \u201eDiagnostic Info\u201c kann man noch zus\u00e4tzlich die JSON Anfrage und Antwort vom Webhook anschauen.<\/p>\n\n\n\n<p>Jedoch kann man in der Google Cloud Console die Cloud Function testen, wie der untenstehende Screenshot zeigt.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" data-attachment-id=\"23489\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/14\/mealdb-chatbot-mit-google-dialogflow\/unbenannt1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1.png\" data-orig-size=\"1272,706\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Unbenannt1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1-1024x568.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1-1024x568.png\" alt=\"\" class=\"wp-image-23489\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1-1024x568.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1-300x167.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1-768x426.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/Unbenannt1.png 1272w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Dazu kopiert man die JSON Webhook Anfrage aus der obigen \u201eDiagnostic Info\u201c und startet den Test. Wie man sehen kann, funktioniert die Anfrage und die passende fulfillmentMessage mit der MealDB Antwort kommt zur\u00fcck. Au\u00dferdem werden darunter auch die Logs angezeigt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Unser Fazit mit Dialogflow<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Vorteile<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>Dialogflow basiert auf einem sehr intuitiven Konzept; Intents, Entities etc. versuchen die Charakteristiken der nat\u00fcrlichen Sprache nachzustellen, sodass es einem leicht f\u00e4llt die Funktionsweise eines Chatbots nachzuvollziehen.<\/li><li>Die GUI ist sehr einfach und simpel gehalten; man konnte sich auch ohne Hilfe der Dokumentation schnell zurechtfinden.<\/li><li>Da die KI bereits zur Verf\u00fcgung gestellt wird, sind keine tieferen Kenntnisse in dem Gebiet notwendig.<\/li><li>Der 90 Tage Testzeitraum war mit circa 300$ Guthaben mehr als ausreichend f\u00fcr einen Chatbot in unserem Rahmen<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Nachteile<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>Der gr\u00f6\u00dfte Nachteil von Dialogflow war das sehr lange Deployen der cloud functions; ein Durchgang hat circa drei Minuten gedauert. Von daher war es ziemlich nervig, wenn auf Anhieb was nicht funktioniert hat und man bei jedem Rumprobieren, selbst wenn man nur eine Kleinigkeit ge\u00e4ndert hat, drei Minuten warten musste. Bei einem tiefergehenden\/umfangreicheren Problem, dass von mehreren Codestellen verursacht wurde, kann man sich die Frustration bei dem Fixen mit dieser Wartezeit wahrscheinlich gut vorstellen.<\/li><li>Alle Funktionen mussten in einer einzigen file geschrieben werden. Es kam nicht selten vor, dass paar von uns parallel an der Datei gearbeitet haben, sodass wenn einer das Deployen gestartet hat, die \u00c4nderung des anderen verworfen wurden. Wenn eine Person das Deployen gestartet hat, konnten die anderen w\u00e4hrenddessen auch nichts abspeichern, da es sofort gecancelled wurde.<\/li><li>Der Inline-Editor ist eher rudiment\u00e4r aufgebaut und weit von einer vollwertigen IDE entfernt. Es f\u00e4ngt bei banalen Kleinigkeiten an, wie dass man nicht erkennt, welche \u00f6ffnende Klammer zu welcher schlie\u00dfenden geh\u00f6rt. Aber auch, dass keine Liste an verf\u00fcgbaren Funktionen vorgeschlagen wird und dass viele Syntaxfehler toleriert werden, die beim Deployen aber zu Errors f\u00fchren.<\/li><li>Die Dokumentation von Dialogflow ist unvollst\u00e4ndig und bleibt sehr oberfl\u00e4chlich. Wir haben viel Stackoverflow benutzt aber mussten letztendlich auch viel Herumprobieren.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Ausblick<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Rezepte<\/h3>\n\n\n\n<p>Unser Zeitplan ist gut aufgegangen. Da unser Zeitraum &#8211; u.a. wegen der limitierten Zeit der Testversion &#8211; jedoch begrenzt war, konnten&nbsp; wir nicht alle erdenklichen Intents in den Chatbot einbauen. Eine M\u00f6glichkeit den Chatbot zu erweitern w\u00e4re beispielsweise das Erstellen eines dritten FollowUpIntents auf die FilterBy Intents. Dieser w\u00fcrde daraus bestehen, dass der Endnutzer die Option w\u00e4hlt, drei weitere random Meals heraus zu filtern, sofern es genug weitere Gerichte gibt. Im Code m\u00fcsste ein Teil eingebaut werden, der garantiert, dass die ersten drei Gerichte sich nicht wiederholen und nicht noch einmal mit ausgegeben werden. Der Intent w\u00fcrde au\u00dferdem voraussetzen, dass vorher mindestens drei Gerichte ausgegeben wurden.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Webhook<\/h3>\n\n\n\n<p>Um Code nach der Zuordnung zu einem passenden Intent auszuf\u00fchren, haben wir in Dialogflow unter dem Punkt \u201eFulfillment\u201c den Inline-Edior benutzt. Dort gibt es eine index.js und eine index.json, in welchen der gesamte ben\u00f6tigte Code erstellt wird. Der Code wird dann automatisch in Form von einer Cloud Function bereitgestellt und wenn n\u00f6tig getriggert. Wie aber bereits erw\u00e4hnt, hat sich das Arbeiten an einer einzigen Datei schwer schwierig gestaltet und das lange Deployen die Arbeit zus\u00e4tzlich erschwert. Deshalb w\u00e4re es bei gr\u00f6\u00dferen Projekten mit mehr Intents durchaus eine \u00dcberlegung wert, den Webhook selbst zu hosten und die JSON Anfragen zu verarbeiten. So h\u00e4tte man mehr Kontrolle und kann au\u00dferdem besser zusammenarbeiten und debuggen, da das lange Deployen entf\u00e4llt. Um selbst den Webhook zu hosten, muss dieser ein paar Anforderungen erf\u00fcllen:<\/p>\n\n\n\n<p>\u00b7 &nbsp; Der Webhook muss HTTPS POST Anfragen verarbeiten, HTTP wird nicht unterst\u00fctzt<\/p>\n\n\n\n<p>\u00b7 &nbsp; Die URL f\u00fcr Anfragen muss \u00f6ffentlich zug\u00e4nglich sein<\/p>\n\n\n\n<p>\u00b7 &nbsp; JSON Anfragen m\u00fcssen verarbeitet werden und eine JSON Antwort muss zur\u00fcckkommen<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Projekt von Ronja Brauchle, Julia Cypra und Lara Winter Einleitung Gab es bereits drei Tage hintereinander Pasta mit Pesto? Ist das einzig abwechslungsreiche in deinem Speiseplan die Entscheidung ob die klassische Tiefk\u00fchlpizza mit Salami oder die extravagantere Wahl des Flammenkuchens nach Bauernart in den Ofen geschoben wird?&nbsp; Unser MealBot hilft genau bei diesen monotonen [&hellip;]<\/p>\n","protected":false},"author":1106,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[652,660,120,656,650],"tags":[79,7,613,280,614],"ppma_author":[875],"class_list":["post-23455","post","type-post","status-publish","format-standard","hentry","category-artificial-intelligence","category-chatgpt-and-language-models","category-cloud-technologies","category-databases","category-scalable-systems","tag-chatbot","tag-cloud","tag-dialogflow","tag-google-cloud","tag-mealdb"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":23713,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/11\/17\/vom-uni-projekt-in-den-app-store\/","url_meta":{"origin":23455,"position":0},"title":"Vom Uni-Projekt in den App Store","author":"Fabian Hiller","date":"17. November 2022","format":false,"excerpt":"An der HdM arbeiten jedes Semester unz\u00e4hlige Studierende an verschiedenen Ideen. Von Apps \u00fcber Videoproduktionen bis hin zu Verpackungstechnik ist dabei alles zu finden. Kaum eine Idee besteht jedoch \u00fcber das Semester hinaus. Mit der Abgabe zur Benotung enden leider bereits die meisten Projekte. Dieser Beitrag soll Inspiration bieten, falls\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/11\/unisex-app-screenshots.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":23579,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/","url_meta":{"origin":23455,"position":1},"title":"Google Geodata Visualizer","author":"sk331","date":"30. August 2022","format":false,"excerpt":"Ein Projekt von Kai Kustermann, Michael Litschko, Sarah Mauff und Sebastian K\u00f6pp Einleitung Im Sommersemester 2022 haben wir uns als 4-k\u00f6pfige Gruppe dazu entschlossen, einen Google Geodata Visualizer zu erstellen. Das Projekt ist aus der Idee einer McDonald\u2019s-Achievement-Card entstanden. Die Idee war eine Website, die dem Benutzer anzeigt, welche McDonald\u2019s\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":23517,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/29\/multiplayer-game-with-aws-stadtlandfluss\/","url_meta":{"origin":23455,"position":2},"title":"Multiplayer Game with AWS |\u00a0StadtLandFluss","author":"gi004","date":"29. August 2022","format":false,"excerpt":"Dieser Blogbeitrag soll einen Einblick in die Entwicklung unserer Webanwendung mit den unten definierten Funktionen geben sowie unsere L\u00f6sungsans\u00e4tze, Herausforderungen und Probleme aufzeigen.\u00a0 Cloud Computing VorlesungProjekt Idee & InspirationZielEinblick in das Spiel \u2013 DemoFrameworks - Cloud Services - InfrastructureArchitekturCloud KomponentenAWS ServicesDynamo DBS3LambdaAmazon API- GatewayAmazon CloudWatchTestingCI\/CD PipelineSchwierigkeitenFazit Cloud Computing Vorlesung Ziel\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":23412,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/22\/migration-einer-rest-api-in-die-cloud\/","url_meta":{"origin":23455,"position":3},"title":"Migration einer REST API in die Cloud","author":"Raphael Kienh\u00f6fer","date":"22. August 2022","format":false,"excerpt":"Im Rahmen der Vorlesung \"Software Development f\u00fcr Cloud Computing\" haben wir uns zum Ziel gesetzt, eine bereits bestehende REST API in die Cloud zu migrieren.","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":27939,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/11\/entwickeln-eines-ki-tools-zum-generieren-von-strukturierten-lerninhalten\/","url_meta":{"origin":23455,"position":4},"title":"Entwickeln eines KI-Tools zum Generieren von strukturierten Lerninhalten","author":"Jonathan Aupperle","date":"11. September 2025","format":false,"excerpt":"F\u00fcr den Kurs \"Software Development for Cloud Computing\" wollte ich eine Anwendung entwickeln, mit der konkrete Aufgaben f\u00fcr ein gegebenes Lernziel generiert werden k\u00f6nnen. Der Nutzer stellt dabei Informationen zum Lernziel, sowie seines aktuellen Niveaus und der geplanten Lerndauer zur Verf\u00fcgung. Auf dieser Basis k\u00f6nnen dann die konkreten Aufgaben, die\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":23679,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/31\/jobsuche-portal\/","url_meta":{"origin":23455,"position":5},"title":"Jobsuche Portal","author":"ag164","date":"31. August 2022","format":false,"excerpt":"SS22 - Dev4Cloud Projekt - von Robin H\u00e4rle und Anton Gerdts Ideenfindung \u00a0\u00a0\u00a0 Zu Beginn der Ideenfindungsphase f\u00fcr unser Projekt sahen wir uns die verschiedenen Apis auf Bund.dev an, um uns von der Thematik der verf\u00fcgbaren Daten inspirieren zu lassen. Wir entschieden uns ohne lange abzuw\u00e4gen daf\u00fcr ein Jobsuche-Portal mit\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":875,"user_id":1106,"is_guest":0,"slug":"lw109","display_name":"lw109","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/8b1e91a72a7b578ecbb3067d086b322ffae005fe067c634053c251d9bb9ec0da?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1106"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=23455"}],"version-history":[{"count":24,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23455\/revisions"}],"predecessor-version":[{"id":23525,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23455\/revisions\/23525"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=23455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=23455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=23455"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=23455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}