Teil 6: Wir bauen einen Logikgraph
Hast du dir schon mal überlegt, wo die Grenze zwischen einem Programmcode und den Daten liegt, die verarbeitet werden sollen? Lass uns diese Grenze auflösen, indem wir einen Logikgraph bauen!
In den letzten Artikeln hast du gelernt, was ein Graph ist, wie ein Chatbot darin Wissen ablegt und wie man dieses wieder auslesen kann. Heute wirst du lernen, dass ein Graph noch zu viel mehr in der Lage ist.
Wenn du bereits etwas programmiert hast, wirst du wissen, dass ein Programmcode in der Regel in irgendeiner Form Daten verarbeitet. Das Programm nimmt Daten entgegen, verarbeitet diese mithilfe fester Prozeduren und gibt anschließend wieder Daten zurück. Derartige Daten können wir als Wissen in Form von Nodes und Edges bereits im Graph ablegen. Aber ein Graph kann noch viel mehr. Er kann auch den Programmcode selbst enthalten. Bereits die Verbindungen zwischen einzelnen Nodes reichen aus, um einen Teil des Programms zu beschreiben. Eine solche Struktur bezeichne ich als logischen Graph oder Logikgraph. Denn dieser enthält neben Wissensdaten auch logische Informationen auf Graph-Ebene. Dadurch wird unser Programm flexibel und lernfähig. Es kann sogar ganz einfach visuell gebaut und angepasst werden.
Was ist ein Programm eigentlich?
Um dir zu erklären, warum Daten und Programmlogik nicht so einfach voneinander zu trennen sind, möchte ich zunächst den Begriff des "Programms" definieren:
Bei einem Programm handelt es sich um Wissen, welches beschreibt, wann andere Daten gültig sind und wie diese verarbeitet werden sollen.
Das bedeutet, dass die Anweisungen eines Programms letztlich auch nur aus Wissen bzw. Daten bestehen. Genauer gesagt aus dem Wissen darüber, wie andere Daten verarbeitet werden sollen und wann diese wahr sind. An dieser Stelle verschwimmt die Grenze zwischen Daten und Logik. Denn beides sind Formen von Wissen, welches sich mit Nodes und Edges in einem Graph beschreiben lässt.
Logikgatter in Graphdatenbanken
Das Hetzstück eines Logikgraphen sind logische Gatter. Sieh dir die folgende Grafik an. Du erkennst drei Fragen. Diese stellen zusammen mit ihren Antwortmöglichkeiten statisches Wissen in Form von Expertise bzw. Faktenwissen dar. Die Verbindungen zwischen den Antworten und der nächsten Frage ganz unten definieren bereits einen Teil der gespeicherten Logik. In diesem Fall müssen entweder zwei Antwortmöglichkeiten der linken Frage ODER aber eine Antwortmöglichkeit der rechten Frage im Gespräch erfüllt werden, damit die dritte Frage überhaupt Sinn ergibt.
Wir haben dadurch ganz nebenbei ein logisches ODER definiert, welches mitsamt den verknüpften Daten im Graph gespeichert ist. Ein solches logisches ODER ist eine Variante eines Logikgatters. Denkbar sind hier natürlich auch UND Logiken, bei denen alle eingehenden Items erfüllt bzw. wahr sein müssen.
Im Laufe dieser Serie werde ich dir zeigen, wie weitaus komplexere und zugleich sehr überschaubare logische Strukturen abbildbar sind, indem wir die Logik in eigene Knoten auslagern. Das kann zum Beispiel so aussehen:
Auch die Verarbeitung von Daten ist theoretisch möglich. Dazu genügt es jedoch kleinste Programmschnipsel in die Nodes zu integrieren. Ab diesem Punkt gibt es starke Überschneidungen mit dem Flow-based programming Paradigma. In diesem besteht ein Programm aus Nodes, welche Programmcode enthalten und Daten über Input-Edges empfangen und über Output-Edges weiterleiten können.
Warum das alles?
Warum nicht einfach wie bisher Programm und Daten trennen? Wie du nun weißt, handelt es sich bei dem Programm, welches die Daten verarbeitet, auch lediglich um eine spezielle Form von Expertenwissen. Indem wir dieses gemeinsam mit den zu verarbeitenden Daten in einer Datenbank ablegen, eröffnen sich neue faszinierende Möglichkeiten. Das Programm wird flexibel. Nicht mehr nur Daten können gelernt werden. Auch die Logik selbst wird flexibel und kann erlernt werden. Außerdem eröffnet sich eine ganz neue Möglichkeit Programmcode visuell sichtbar zu machen und zu gestalten. Zudem sind Expertenwissen und Logik ohnehin stark miteinander verbunden. So passt die Logik in einem klassischen Programmcode oft nur auf spezielle Datenformate oder vorbereitete Muster.
Dieser Artikel gehört zu einer Serie von Beiträgen, die den Bau eines Open Source Chatbot-Builders beschreiben. Wegen der hohen Komplexität möglicher Konversationsverläufe und dem abgebildeten Wissen sind Chatbots neben vielen anderen Technologien sehr gut für die Abbildung in Logikgraphen geeignet. Oft muss hier auf umständliche Programmierung zurückgegriffen werden, um komplexe Logik zu ermöglichen. Hier eröffnet der Logikgraph eine elegante Lösung.
Ein Logikgraph ergibt überall da Sinn, wo komplexer Kontext verarbeitet werden muss und wo Wissen und logische Strukturen zusammen gespeichert und gewartet werden müssen. Ein Logikgraph kann daher in vielen KI-bezogene Anwendungsfällen zum Einsatz kommen.
Im nächsten Artikel erfährst du, wie du die Logik in deinem Graph mit logischem Graph Traversal ausführen kannst.