Designprinzipien#
Als wir dieses Projekt starteten, war LangChain bereits populär, insbesondere nach dem Start von ChatGPT. Eine der Fragen, die uns gestellt wurden, ist, was der Unterschied zwischen Prompt Flow und LangChain ist. Dieser Artikel soll die Gründe für die Entwicklung von Prompt Flow und die bewussten Designentscheidungen beleuchten. Kurz gesagt, Prompt Flow ist eine Sammlung von Entwicklungswerkzeugen, mit denen Sie LLM-Apps erstellen können, wobei der Schwerpunkt auf Qualität durch Experimente liegt, kein Framework – was LangChain ist.
Während LLM-Apps sich meist noch im Erkundungsstadium befinden, hat Microsoft in diesem Bereich etwas früher angefangen und wir hatten die Gelegenheit zu beobachten, wie Entwickler LLMs in bestehende Systeme integrieren oder neue Anwendungen aufbauen. Diese unschätzbaren Einblicke haben die grundlegenden Designprinzipien von Prompt Flow geprägt.
1. Prompts offenlegen vs. verstecken#
Das Kernstück von LLM-Anwendungen sind die Prompts selbst, zumindest heute. Bei der Entwicklung einer einigermaßen komplexen LLM-Anwendung sollte der Großteil der Entwicklungsarbeit im „Tuning“ der Prompts liegen (beachten Sie die absichtliche Verwendung des Begriffs „Tuning“, auf den wir später noch eingehen werden). Jedes Framework oder Tool, das in diesem Bereich helfen soll, sollte sich darauf konzentrieren, das Prompt-Tuning einfacher und direkter zu gestalten. Andererseits sind Prompts sehr volatil, es ist unwahrscheinlich, einen einzigen Prompt zu schreiben, der über verschiedene Modelle oder sogar verschiedene Versionen desselben Modells hinweg funktioniert. Um eine erfolgreiche LLM-basierte Anwendung zu erstellen, müssen Sie jeden eingeführten Prompt verstehen, damit Sie ihn bei Bedarf anpassen können. LLMs sind einfach nicht leistungsfähig oder deterministisch genug, dass Sie einen von anderen geschriebenen Prompt wie Bibliotheken in herkömmlichen Programmiersprachen verwenden können.
In diesem Zusammenhang ist jedes Design, das versucht, eine intelligente Funktion oder einen Agenten bereitzustellen, indem es einige Prompts in einer Bibliothek kapselt, unwahrscheinlich, dass es in realen Szenarien günstige Ergebnisse liefert. Und das Verstecken von Prompts im Code einer Bibliothek erschwert es den Leuten, die Prompts zu verbessern oder anzupassen, um ihren spezifischen Bedürfnissen gerecht zu werden.
Prompt Flow, als Werkzeug positioniert, verzichtet darauf, Prompts in seinem Kerncode zu verpacken. Der einzige Ort, an dem Sie Prompts sehen werden, sind unsere Beispiel-Flows, die natürlich zur Übernahme und Nutzung zur Verfügung stehen. Jeder Prompt sollte von den Entwicklern selbst erstellt und kontrolliert werden, anstatt sich auf uns zu verlassen.
2. Eine neue Arbeitsweise#
LLMs verfügen über bemerkenswerte Fähigkeiten, die es Entwicklern ermöglichen, ihre Anwendungen zu verbessern, ohne tief in die Feinheiten des maschinellen Lernens einzudringen. In der Zwischenzeit machen LLMs diese Apps stochastischer, was neue Herausforderungen für die Anwendungsentwicklung mit sich bringt. Bloße Behauptungen wie „keine Ausnahme“ oder „Ergebnis == x“ in gated Tests reichen nicht mehr aus. Die Übernahme einer neuen Methodik und der Einsatz neuer Werkzeuge wird unerlässlich, um die Qualität von LLM-Anwendungen sicherzustellen – eine völlig neue Arbeitsweise ist erforderlich.
Im Mittelpunkt dieses Paradigmenwechsels steht die Evaluierung, ein Begriff, der häufig im Bereich des maschinellen Lernens verwendet wird und den Prozess der Bewertung der Leistung und Qualität eines trainierten Modells beschreibt. Es geht darum zu messen, wie gut das Modell eine gegebene Aufgabe oder einen Datensatz bewältigt, und spielt eine entscheidende Rolle beim Verständnis der Stärken, Schwächen und der Gesamteffektivität des Modells. Evaluierungsmetriken und -techniken variieren je nach spezifischer Aufgabe und Problemdomäne. Einige gängige Metriken sind Genauigkeit, Präzision und Rückruf, mit denen Sie wahrscheinlich bereits vertraut sind. LLM-Apps weisen nun Ähnlichkeiten mit Modellen des maschinellen Lernens auf; sie erfordern einen evaluierungsorientierten Ansatz, der in den Entwicklungsworkflow integriert ist, wobei ein robuster Satz von Metriken und Evaluierungen die Grundlage für die Sicherstellung der Qualität von LLM-Anwendungen bildet.
Prompt Flow bietet eine Reihe von Tools, um die neue Arbeitsweise zu optimieren.
Entwickeln Sie Ihr Evaluierungsprogramm als Evaluierungsfluss, um Metriken für Ihre App/Ihrem Fluss zu berechnen, lernen Sie von unseren Beispiel-Evaluierungsflüssen.
Iterieren Sie über Ihren Anwendungsfluss und führen Sie Evaluierungsflüsse über das SDK/CLI aus, damit Sie Metriken vergleichen und den optimalen Kandidaten für die Veröffentlichung auswählen können. Diese Iterationen umfassen das Ausprobieren verschiedener Prompts, verschiedener LLM-Parameter wie Temperatur usw. – dies wird als „Tuning“-Prozess bezeichnet, oder manchmal als Experimentation bezeichnet.
Integrieren Sie die Evaluierung in Ihre CI/CD-Pipeline und stimmen Sie die Assertions in Ihren gated Tests mit den ausgewählten Metriken ab.
Prompt Flow führt zwei konzeptionelle Komponenten ein, um diesen Workflow zu erleichtern.
Evaluierungsfluss: Ein Flusstyp, der anzeigt, dass dieser Fluss nicht zur Bereitstellung oder Integration in Ihre App dient, sondern zur Evaluierung der Leistung einer App/eines Flusses.
Run: Jedes Mal, wenn Sie Ihren Fluss mit Daten ausführen oder eine Evaluierung der Ausgabe eines Flusses durchführen, wird ein Run-Objekt erstellt, um den Verlauf zu verwalten und Vergleiche sowie zusätzliche Analysen zu ermöglichen.
Auch wenn neue Konzepte zusätzliche kognitive Belastung mit sich bringen, sind wir fest davon überzeugt, dass sie im Vergleich zur Abstraktion unterschiedlicher LLM-APIs oder Vektordatenbank-APIs von größerer Bedeutung sind.
3. Optimierung für „Sichtbarkeit“#
Aufgrund von LLMs entstehen einige interessante Anwendungsmuster wie Retrieval Augmented Generation (RAG), ReAct und mehr. Obwohl die Funktionsweise von LLMs für viele Entwickler rätselhaft bleiben mag, ist die Funktionsweise von LLM-Apps das nicht – sie beinhalten im Wesentlichen eine Reihe von Aufrufen an externe Dienste wie LLMs, Datenbanken und Suchmaschinen, die miteinander verbunden sind. Architektonisch gibt es nichts Neues, Muster wie RAG und ReAct sind beide einfach zu implementieren, sobald ein Entwickler sie verstanden hat – reine Python-Programme mit API-Aufrufen an externe Dienste können den Zweck voll und ganz erfüllen.
Durch die Beobachtung vieler interner Anwendungsfälle haben wir gelernt, dass tiefere Einblicke in die Details der Ausführung entscheidend sind. Die Einrichtung einer systematischen Methode zur Verfolgung von Interaktionen mit externen Systemen ist eine der Designprioritäten. Folglich haben wir einen unkonventionellen Ansatz gewählt – Prompt Flow verfügt über eine YAML-Datei, die beschreibt, wie Funktionsaufrufe (wir nennen sie Tools) ausgeführt und zu einem gerichteten azyklischen Graphen (DAG) verbunden werden.
Dieser Ansatz bietet mehrere wichtige Vorteile, die sich hauptsächlich auf die **verbesserte Sichtbarkeit** konzentrieren.
Während der Entwicklung kann Ihr Fluss auf verständliche Weise visualisiert werden, wodurch fehlerhafte Komponenten klar identifiziert werden können. Als Nebenprodukt erhalten Sie ein architektonisch beschreibendes Diagramm, das Sie mit anderen teilen können.
Jeder Knoten im Fluss hat seine internen Details in konsistenter Weise visualisiert.
Einzelne Knoten können einzeln ausgeführt oder debuggt werden, ohne dass vorherige Knoten erneut ausgeführt werden müssen.

Der Fokus auf Sichtbarkeit im Design von Prompt Flow hilft Entwicklern, ein umfassendes Verständnis der komplexen Details ihrer Anwendungen zu erlangen. Dies wiederum ermöglicht es Entwicklern, effektive Fehlersuche und Optimierung zu betreiben.
Obwohl es einige Kontrollflussfunktionen wie „activate-when“ gibt, um den Anforderungen von Verzweigungen/Switch-Cases gerecht zu werden, beabsichtigen wir nicht, den Flow selbst Turing-vollständig zu machen. Wenn Sie einen Agenten entwickeln möchten, der vollständig dynamisch und von LLM gesteuert ist, wäre die Nutzung von Semantic Kernel zusammen mit Prompt Flow eine günstige Option.