Ausführliches Review von Azure Promptflow für das Entwickeln und Testen von LLM-Systemen 18. August 2020 | 9 Minuten zum Lesen

Ausführliches Review von Azure Promptflow für das Entwickeln und Testen von LLM-Systemen

Inhaltsverzeichnis

Die enorme Popularität von Large Language Models hat eine Reihe von Tools und Diensten hervorgebracht, die die Entwicklung und das Testen von LLM-Systemen erleichtern sollen. Neben Software-Frameworks wie langchain und Semantic Kernel gibt es auch Cloud Services von Microsoft, AWS und Google. In diesem Blog-Post betrachten wir den in die Microsoft Azure-Cloud eingebundenen Dienst “Promptflow” genauer. Wir erläutern die grundlegenden Konzepte und betrachten die Vor- und Nachteile, die uns beim praktischen Einsatz im KIVEDU-Projekt aufgefallen sind. Ein kurzer Vorabhinweis: Promptflow ist derzeit nur in einer Vorschauversion verfügbar, sodass sich einige der hier genannten Punkte in Zukunft noch ändern können.

Was ist Promptflow?

Promptflow ist als Teil von Azure ML ein Cloud-Dienst, der die Entwicklung, das Testen und das Deployment von LLM-Systemen, also Softwaresystemen mit Large Language Models als zentraler Bestandteil, erleichtert. Die Grundidee von Promptflow besteht darin, dass LLM-Systeme aus einer Vielzahl von Aktivitäten (Datenbereinigung, Erstellung von Prompts, Ausführung von LLMs, etc.) bestehen, die als miteinander verkettet werden, um ein Gesamtsystem zu bilden. Promptflow bietet eine webbasierte Benutzeroberfläche, mit der die einzelnen Aktivitäten definiert und miteinander zu “Flows” verknüpft werden können. Diese Flows können dann direkt ausgeführt, getestet und für den Produktivbetrieb deployt werden. Im Gegensatz zu anderen Tools aus dem LLM-Ökosystem wie langchain oder Semantic Kernel ist Promptflow ein reiner Cloud-basierter Dienst, mit dem (zumindest derzeit) nicht programmatisch interagiert werden kann.

Grundlegende Konzepte

Promptflow umfasst eine Reihe von grundlegenden Konzepten, die wir im Folgenden kurz erläutern wollen:

Flows

Wie bereits oben erläutert, beschreibt ein “Flow” einen ausführbaren Ablauf. Er besteht dabei aus einer Reihe von Inputs und Outputs sowie den Aktivitäten, die die bereitgestellten Inputs in Outputs transformieren. Promptflow kennt drei verschiedene Arten von Flows:

  • Standard Flow: Ein Standard Flow eignet sich für die Entwicklung herkömmlicher, d.h. nicht-interaktiver, LLM-Systeme. Auch wenn dieser Flow nicht für die Entwicklung interaktiver Systeme gedacht ist, können natürlich trotzdem Chat-LLMs wie ChatGPT verwendet werden. Wir konzentrieren uns in diesem Review auf diese Standard Flows.
  • Chat Flow: Ein Chat Flow ist speziell für die Entwicklung interaktiver LLM-Systeme (bspw. Chatbots) gedacht. Er baut auf dem Standard Flow auf und bietet zusätzlich noch verschiedene Chat-bezogene Features, wie z.B. das Verwalten von Chathistorien oder eine Oberfläche für die Interaktion mit dem Chatbot.
  • Evaluation Flow: Ein Evaluation Flow ermöglicht die Evaluation der Outputs eines Standard oder Chat Flows. Er nimmt die Outputs eines Flows als Inputs entgegen und berechnet verschiedene Evaluationsmetriken, um die Qualität der Outputs zu bewerten. Dabei können natürlich auch komplette Evaluationsdatensätze, bestehend aus mehreren Einträgen verwendet werden.
Tools

Als “Tools” werden die grundlegenden Baublöcke bezeichnet, die meitander verkettet einen Flow bilden. Jedes Tool führt eine bestimmte Funktion aus, wie z.B. das Erstellen eines Prompts oder das Ausführen eines LLMs. Promptflow bietet eine Reihe von vordefinierten Tools an:

  • LLM Tool: Dieses Tool ermöglicht die Ausführung eines LLMs. Anders als der Name aber vermuten mag, können hier derzeit nur OpenAI-Modelle verwendet werden.
  • Prompt Tool: Dieses Tool ermöglicht die Erstellung von Prompts unter Verwendung der Jinja-Templating Sprache. Dabei können Variablen verwendet werden, die dann zur Laufzeit durch konkrete Werte ersetzt werden. Die somit erstellten Prompts können dann wiederum als Inputs für andere Tools dienen.
  • Python Tool: Dieses Tool ermöglicht die Ausführung einer Python-Funktion. Dabei können die Inputs für die Funktion aus den Outputs anderer Tools stammen und die Outputs wiederum als Inputs für andere Tools dienen. Da mit diesem Tool beliebiger Python-Code ausgeführt werden kann, kann das Python Tool für das Laden externer Daten, die Datenbereinigung oder auch das Ausführen von Nicht-OpenAI-LLMs verwendet werden (gerade dieser Anwendungsfall ist auch in der offiziellen Dokumentation von Promptflow beschrieben).

Neben den oben beschriebenen Tools gibt es noch eine Reihe weiterer Tools, die Integrationen zu anderen Azure-Diensten wie Cognitive Search oder Vector Stores darstellen. Diese wollen wir hier aber nicht weiter betrachten.

Connections

Connections kapseln in Promptflow die erforderlichen Daten (bspw. API-Keys) zur Anbindung externer Dienste oder Datenquellen. Sie werden einmal definiert und können dann den entsprechenden Tools, die diese verwenden können, zur Verfügung gestellt werden. Promptflow bietet verschiedene Arten von Connections an, am wichtigsten sind jedoch die OpenAI- (bzw. Azure OpenAI-) und Custom-Connection. Eine OpenAI-Connection speichert Zugangsdaten für den Zugriff auf die OpenAI API, während eine Custom-Connection beliebige Daten speichern kann, die dann von einem Python Tool verwendet werden können. Damit können bspw. andere LLM-APIs wie Luminous von Aleph Alpha oder Claude von Anthropic verwendet werden.

Variants

Bei der Entwicklung eines LLM-Systems müssen häufig verschiedene LLM- oder Prompt-Konfigurationen getestet werden, um herauszufinden, welche Konfiguration die besten Ergebnisse hervorbringt. Promptflow unterstützt und vereinfacht dieses Vorgehen mit “Variants”. Eine “Variant” ist eine spezifische Konfiguration eines Tools. So kann bspw. die Variant eines LLM Tools ein anderes OpenAI-Modell, eine andere Temperature-Konfiguration oder einen ganz anderen Prompt verwenden. Eine Variant eines Prompt Tools hingegen kann ein komplett anderes Template oder andere Inputs verwenden. Variants können direkt in Promptflow definiert werden und über Evaluation Flows miteinander verglichen werden. Dadurch wird die Suche nach der besten LLM- bzw. Prompt-Konfiguration vereinfacht.

Runtimes

Runtimes stellen die Umgebung dar, in der die entwickelten Flows validiert, ausgeführt und getestet werden. Diese Runtimes sind dabei mit einer AzureML-Compute-Instanz sowie einem AzureML-Environment verknüpft. Dadurch kann die Umgebung für die Ausführung der Flows individuell konfiguriert werden. So kann bspw. eine GPU-beschleunigte Compute-Instanz mit einem Environment verwendet werden, das die erforderlichen Python-Abhängigkeiten für die Ausführung von LLMs enthält. Promptflow unterscheidet dabei zwischen der Managed Online Deployment Runtime und Compute Instance Runtime, die die gleichen Funktionen bieten, aber sich hinsichtlich der Skalierbarkeit und anderer Aspekte unterscheiden (mehr Informationen in der offiziellen Dokumentation).

Vorteile und Stärken von Promptflow

Promptflow bietet eine Reihe von Vorteilen und Stärken, die wir im Folgenden kurz erläutern wollen:

  • Flow-Konzept eignet sich gut für die LLM-Entwicklung: Es ist kein Zufall, dass sich verschiedene Lösungen im LLM-Ökosystem dazu entschieden haben, das Konzept der Abläufe als eine Verkettung einzelner Komponenten ins Zentrum stellen (bspw. auch Chains in langchain). Denn dieses Konzept eigent sich wirklich hervorragend für die Entwicklung von LLM-Systemen. Der Entwicklungsprozess in Promptflow fühlt sich dementsprechend intuitiv an, ist durch die zusätzliche visuelle Darstellung übersichtlich und kann auch kollaborativ erfolgen. Die verfügbaren Konzepte wirken durchdacht und sind flexibel genug, dass auch komplexere Projekte umgesetzt werden können.
  • Integration in andere Azure-Tools: Wie erwartet ist Verwendung unterstützter Azure-Dienste wie OpenAI oder Cognitive Search durch die zur Verfügung gestellten Tools denkbar einfach. Es muss lediglich eine entsprechende Connection mit Zugangsdaten definiert werden und schon können die Dienste nach Belieben in den bestehenden Flow eingebunden werden.
  • Erweiterbarkeit durch Python: Durch die Tatsache, dass die bereits vorgestellten Python Tools beliebigen Python-Code ausführen können, ist Promptflow sehr flexibel und kann auch mit LLMs, Cloud-Diensten oder Datenquellen verwendet werden, die nicht explizit unterstützt werden. Kombiniert mit der Möglichkeit, benutzerdefinierte Environments mit den benötigten Abhängigkeiten zu definieren, lässt Promptflow hier kaum Wünsche offen.
  • Evaluierung von Flows mit Variants: Aus meiner Sicht stellt dies die größte Stärke von Promptflow dar, da andere Frameworks wie langchain diesen Punkt nicht genügend abdecken. Die Möglichkeit, erstellte Flows mit benutzerdefinierten Abläufen zu evaluieren und die Ergebnisse verschiedener LLM- oder Prompt-Variants miteinander zu vergleichen, erleichtert die Suche nach der optimalen Konfiguration wirklich enorm und stellt eine Übersichtlichkeit her, die bei der Entwicklung von LLM-Systemen sonst oft fehlt.

Nachteile und Schwächen von Promptflow

Neben den vielen Stärken hat Promptflow aber auch einige Schwächen, die wir im Folgenden kurz erläutern wollen:

  • Keine APIs oder SDKs: Promptflow ist ein reiner Cloud-Dienst, der derzeit nicht programmatisch angesprochen werden kann. Das bedeutet, dass die Entwicklung von Flows ausschließlich über die webbasierte Benutzeroberfläche erfolgen kann. Dies schränkt die Flexibilität und die Möglichkeiten zur Automatisierung der Entwicklung von Flows stark ein. Auch die Integration in andere Tools ist dadurch erschwert, da die Flows nicht direkt angesprochen werden können. Update: Mittlerweile gibt es ein Open-Source-Projekt, das Tools für das Arbeiten mit Flows enthält. Sie ist auf GitHub zu finden.
  • Keine Prompt-Registry: In jedem LLM-System stellen die Prompts einen zentralen Bestandteil dar, der zentral verwaltet werden sollte. Leider bietet Promptflow derzeit keine Möglichkeit, Prompts zentral anzulegen und per Referenz zu verwenden. Stattdessen müssen Prompts in jedem Flow einzeln definiert werden. Dies ist nicht nur fehleranfällig, sondern führt auch zu Redundanzen, da Prompts, die in mehreren Flows verwendet werden, mehrfach definiert werden müssen.
  • Verwendung anderer LLMs aufwendig: Wie bereits erwähnt, können über die Python Tools auch andere (Open Source als auch proprietäre) LLMs als die nativ unterstützten Modelle verwendet werden, jedoch ist deren Anbindung recht aufwendig, da sie von Grund auf über Python implementiert und in den Flow eingebunden werden müssen. Eine Integration von Promptflow in den Azure Model Catalog oder AzureML Batch bzw. Online Endpoints, was die Verwendung anderer LLMs stark vereinfachen würde, gibt es derzeit nicht.
  • Keine Variants für Nicht-OpenAI-LLMs: Neben dem erhöhten Aufwand, der mit der manuellen Implementierung von LLMs über Python Tools einhergeht, hat diese Vorgehensweise einen weiteren kritischen Nachteil gegenüber den nativ unterstützten OpenAI-Modellen: Für mit Python Tools implementierte LLMs können keine Variants definiert werden. Das bedeutet, dass für jedes zu testende Modell und jede Konfiguraton ein komplett neuer Flow erstellt werden muss. In dem sehr häufigen Fall, dass ein bestimmter Flow unter Verwendung unterschiedlicher LLMs und Konfigurationen evaluiert werden soll, ist dies sehr umständlich und führt zu Flows, die sich nur in wenigen Details unterscheiden. Es gibt auch keine Möglichkeit, Variants über Python zu erstellen oder zu modifizieren.
  • Kombinationen von Variants können nicht evaluiert werden: Zwar ist die grundlegende Idee, Variants verschiedener Tools zu definieren und diese nach der Evaluierung miteinander zu vergleichen, gut. Leider ist es derzeit aber nicht möglich, die Variants mehrerer Tools im gleichen Evaluationslauf zu testen. Besteht der Flow bspw. aus einem Prompt Tool und einem LLM Tool mit jeweils drei verschiedenen Variants, dann können in einem Evaluationslauf nur die Variants des Prompt oder des LLM Tools evaluiert werden. Für das Tool, dessen Variants nicht evaluiert werden, wird entsprechend dann die Default-Variant gewählt. Diese Einschränkung führt nicht nur dazu, dass eine Vielzahl von Evaluationsläufen manuell gestartet werden muss, sodass die Ergebnisse der einzelnen Evaluationsläufe auch nicht direkt miteinander verglichen werden können, sondern auch dazu, dass keine Kombinationen von Variants verglichen werden können. Bei dem genannten Beispiel können entsprechend nur die Variants des Prompt und LLM Tools unabhängig voneinander evaluiert werden. Ein Evaluation der Leistung des Flows unter Verwendung von Variante 1 des Prompt Tools und Variante 2 des LLM Tools ist entsprechend nicht möglich, sondern müsste manuell implementiert werden.

Fazit

Insgesamt bietet Promptflow eine vielversprechende Plattform zur Entwicklung von LLM-Systemen in der Microsoft Azure-Cloud. Sein Flow-Konzept und die Integration mit anderen Azure-Diensten erleichtern die Entwicklung und das Testing von LLM-Systemen erheblich. Es bietet Entwicklern die Möglichkeit, komplexe Projekte umzusetzen und verschiedene LLM- und Prompt-Konfigurationen zu evaluieren und miteinander zu vergleichen.

Trotz seiner Stärken hat Promptflow noch Raum für Verbesserungen. Eine API- oder SDK-Unterstützung würde die Flexibilität erhöhen und die Integration mit anderen Tools erleichtern. Eine zentrale Prompt-Registry und eine bessere Unterstützung für Nicht-OpenAI-LLMs würden die Effizienz und Vielseitigkeit des Systems weiter steigern. Da sich Promptflow bisher jedoch in einer Vorschauversion befindet, ist davon auszugehen, dass Microsoft in den kommenden Monaten weitere Verbesserungen einführen wird, die sicherlich einige der hier genannten Schwächen beheben werden. Entscheidend wird jedoch sein, wie schnell Microsoft hier Features nachschieben wird und wie gut sich Promptflow gegenüber anderen Tools im schnell wandelnden LLM-Ökosystem behaupten kann.