GenAIOps mit Prompt Flow und Azure DevOps
Da die Nachfrage nach LLM-basierten Anwendungen weiter steigt, benötigen Organisationen einen einheitlichen und optimierten Prozess für die Verwaltung des End-to-End-Lebenszyklus dieser Apps. GenAIOps oder Generative Artificial Intelligence Operations (manchmal als LLMOps bezeichnet) ist ein Eckpfeiler für effizientes Prompt Engineering und die Entwicklung und Bereitstellung von LLM-basierten Anwendungen.
In diesem Artikel wird erläutert, wie Azure Machine Learning Ihnen die Integration mit Azure DevOps ermöglicht, um den Lebenszyklus der LLM-basierten Anwendungsentwicklung mit Prompt Flow zu automatisieren. Prompt Flow bietet einen optimierten und strukturierten Ansatz für die Entwicklung von LLM-basierten Anwendungen. Der klar definierte Prozess und Lebenszyklus führt Sie durch den Prozess des Erstellens, Testens, Optimierens und Bereitstellens von Flows, an dessen Ende die Erstellung voll funktionsfähiger LLM-basierter Lösungen steht.
Prompt Flow-Features für GenAIOps
GenAIOps mit Prompt Flow nutzt eine Vorlage und einen Leitfaden für GenAIOps, um Ihnen beim Erstellen von LLM-basierten Apps mithilfe von Prompt Flow zu helfen. GenAIOps mit Prompt Flow verfügt über Funktionen für einfache oder komplexe LLM-basierte Apps und kann an die Anforderungen der Anwendung angepasst werden.
Die Plattform für GenAIOps mit Prompt Flow bietet die folgenden Features:
Zentralisiertes Codehosting. Das Repository unterstützt das Hosten von Code für mehrere Prompt Flows und stellt ein einzelnes Repository für alle Ihre Flows bereit. Es ist wie eine Bibliothek für Ihre Flows. So können Sie einfacher verschiedene Projekte durchsuchen, auf sie zugreifen und daran zusammenarbeiten.
Lebenszyklusverwaltung. Jeder Flow hat einen eigenen Lebenszyklus, der einen reibungslosen Übergang von lokalen Experimenten zur Produktionsbereitstellung ermöglicht.
Experimentieren mit Varianten und Hyperparametern. Varianten und Hyperparameter sind wie Zutaten in einem Rezept. Mit dieser Plattform können Sie in einem Flow mit verschiedenen Kombinationen von Varianten in mehreren Knoten experimentieren. Sie können mit mehreren Varianten und Hyperparametern experimentieren, um Flowvarianten einfach auszuwerten.
Mehrere Bereitstellungsziele. Die Plattform generiert Docker-Images, die mit Ihrem Flow und der Computesitzung für die Bereitstellung auf beliebigen Zielplattformen und Betriebssystemen bereitgestellt werden, die Docker unterstützen. Sie können Flows für Azure App Services, Kubernetes und verwaltete Azure-Computeressourcen bereitstellen und sie nach Bedarf für die Skalierung konfigurieren.
A/B-Bereitstellung. GenAIOps mit Prompt Flow implementiert nahtlos A/B-Bereitstellungen, sodass Sie verschiedene Flowversionen ganz einfach vergleichen können. Diese Plattform erleichtert die A/B-Bereitstellung für Prompt Flow so wie bei herkömmlichen A/B-Tests für Websites. Sie können verschiedene Versionen eines Flows in einer realen Umgebung ganz einfach vergleichen, um die Version mit der besten Leistung zu bestimmen.
m:n-Beziehungen zwischen Datasets/Flows. GenAIOps mit Prompt Flow verwendet mehrere Datasets für jeden Standard- und Auswertungsflow, um Flexibilität bei Flowtests und -auswertungen zu gewährleisten.
Bedingte Daten und Modellregistrierung. Die Plattform registriert eine neue Datasetversion für die Azure Machine Learning-Datenressource und Flows in der Modellregistrierung nur dann, wenn sich das Dataset ändert.
Umfassende Berichte. GenAIOps mit Prompt Flow erstellt detaillierte Berichte für jede Variantenkonfiguration, sodass Sie fundierte Entscheidungen treffen können. Die Plattform bietet eine detaillierte Metriksammlung sowie Massenausführungen von Experimenten und Varianten, wodurch datengesteuerte Entscheidungen in CSV- und HTML-Dateien ermöglicht werden.
GenAIOps mit Prompt Flow bietet die folgenden weiteren Features zur Anpassung:
- Bring-your-own-flows (BYOF) bietet eine vollständige Plattform für die Entwicklung mehrerer Anwendungsfälle im Zusammenhang mit LLM-basierten -Anwendungen.
- Konfigurationsbasierte Entwicklung bedeutet, dass es nicht erforderlich ist, umfangreiche Codebausteine zu schreiben.
- Experimentieren mit und Bewerten von Prompts wird sowohl lokal als auch in der Cloud ausgeführt.
- Notebooks für die lokale Promptauswertung bieten eine Bibliothek mit Funktionen für lokale Experimente.
- Endpunkttests innerhalb der Pipeline nach der Bereitstellung überprüfen die Verfügbarkeit und Bereitschaft von Endpunkten.
- Optionale menschliche Beteiligung (Human-in-the-Loop), um Prompt-Metriken vor der Bereitstellung zu überprüfen.
GenAIOps-Phasen
Der GenAIOps-Lebenszyklus umfasst vier verschiedene Phasen:
Initialisierung. In dieser Phase wird das Geschäftsziel eindeutig definiert, relevante Datenbeispiele werden erfasst, eine grundlegende Promptstruktur wird eingerichtet, und es wird ein Flow zur Verbesserung der Funktionalität erstellt.
Experimentieren. In dieser Phase wird ein Flow zum Erfassen von Stichproben aus den Daten angewendet, die Promptleistung wird bewertet und der Prompt bei Bedarf optimiert. Diese Schritte werden so lange durchlaufen, bis zufriedenstellende Ergebnisse erreicht werden.
Auswertung und Verfeinerung. In dieser Phase wird die Flowleistung mithilfe eines größeren Datasets gemessen, die Prompteffektivität ausgewertet und der Prompt entsprechend optimiert. Die nächste Phase wird eingeleitet, sobald die Ergebnisse den gewünschten Standards entsprechen.
Bereitstellung. In dieser Phase wird der Flow hinsichtlich seiner Effizienz und Effektivität optimiert, er wird in einer Produktionsumgebung einschließlich A/B-Bereitstellung bereitgestellt, seine Leistung wird überwacht, Benutzerfeedback wird gesammelt, und diese Informationen werden zur weiteren Verbesserung des Flows verwendet.
Durch die Einhaltung dieser strukturierten Vorgehensweise ermöglicht Prompt Flow ein sicheres Entwickeln sowie ein gründliches Testen, Optimieren und Bereitstellen von Flows, was zur Erstellung stabiler und ausgereifter KI-Anwendungen führt.
Die Vorlage für GenAIOps Prompt Flow formalisiert diese strukturierte Vorgehensweise mithilfe eines Code-First-Ansatzes und hilft Ihnen beim Erstellen LLM-basierter Apps mithilfe von Prompt Flow-Tools und -Prozessen sowie GenAIOps-Prompt Flow-Funktionen. Diese Vorlage ist unter Vorlage für GenAIOps mit Prompt Flow verfügbar.
GenAIOps-Prozessflow
- In der Initialisierungsphase entwickeln Sie Flows, bereiten Daten vor und stellen sie zusammen und aktualisieren GenAIOps-bezogene Konfigurationsdateien.
- Nach der lokalen Entwicklung mithilfe von Visual Studio Code mit der Prompt Flow-Erweiterung lösen Sie einen Pull Request (PR) vom Featurebranch in den Entwicklungsbranch aus, der die Buildüberprüfungspipeline und die Experimentierflows ausführt.
- Der PR wird manuell genehmigt, und der Code wird mit dem Entwicklungsbranch gemergt.
- Nachdem der PR mit dem Entwicklungsbranch zusammengeführt wurde, wird die CI-Pipeline (Continuous Integration) für die Entwicklungsumgebung ausgeführt. Die CI-Pipeline führt die Experimentier- und Auswertungsflows nacheinander aus und registriert diese in der Azure Machine Learning-Registrierung neben anderen Schritten in der Pipeline.
- Nach Abschluss der CI-Pipelineausführung führt ein CD-Trigger (Continuous Deployment) die CD-Pipeline aus, die den Standardflow aus der Azure Machine Learning-Registrierung als Azure Machine Learning-Onlineendpunkt bereitstellt. Die Pipeline führt dann Integrationstests und Feuerproben für den bereitgestellten Flow aus.
- Aus dem Entwicklungsbranch wird ein Releasebranch erstellt, oder es wird ein Pull Request vom Entwicklungs- zum Releasebranch ausgelöst.
- Der PR wird manuell genehmigt, und der Code wird mit dem Releasebranch gemergt. Nachdem der PR mit dem Releasebranch gemergt wurde, wird die CI-Pipeline für die Produktionsumgebung ausgeführt. Die Pipeline führt die Experimentier- und Auswertungsflows nacheinander aus und registriert diese in der Azure Machine Learning-Registrierung neben anderen Schritten in der Pipeline.
- Nach Abschluss der CI-Pipelineausführung führt ein CD-Trigger die CD-Pipeline aus, die den Standardflow aus der Azure Machine Learning-Registrierung als Azure Machine Learning-Onlineendpunkt bereitstellt. Die Pipeline führt dann Integrationstests und Feuerproben für den bereitgestellten Flow aus.
Erstellen eines GenAIOps-Prompt Flows
Der Rest dieses Artikels zeigt Ihnen, wie Sie GenAIOps mit Prompt Flow verwenden können, indem Sie das End-to-End-Beispiel im Repository zur Vorlage für GenAIOps mit Prompt Flow verwenden. Hiermit können Sie LLM-basierte Anwendungen mithilfe von Prompt Flow und Azure DevOps erstellen. Das Hauptziel ist es, Unterstützung bei der Entwicklung derartiger Anwendungen zu bieten und dazu die Funktionen von Prompt Flow und GenAIOps zu nutzen.
Voraussetzungen
- Ein Azure-Abonnement mit einer kostenlosen oder kostenpflichtigen Version von Azure Machine Learning.
- Ein Azure Machine Learning-Arbeitsbereich.
- Git Version 2.27 oder höher, das auf Ihrem lokalen Computer ausgeführt wird.
- Eine Azure DevOps-Organisation, in der Sie ein Projekt, ein Azure Repos-Quellcodeverwaltungsrepository und Azure Pipelines-Pipelines erstellen können. Eine Azure DevOps-Organisation hilft Ihnen bei der Zusammenarbeit, beim Planen und Nachverfolgen Ihrer Arbeit, Ihres Codes und Ihrer Probleme sowie beim Einrichten von CI und CD.
- Kenntnisse zum Integrieren von GenAIOps mit Prompt Flow.
Hinweis
Wenn Sie Azure DevOps und Terraform verwenden, um die Infrastruktur einzurichten, muss die Terraform-Erweiterung für Azure DevOps installiert sein.
Einrichten einer Prompt Flow-Verbindung
Prompt Flow verwendet eine Verbindungsressource, um eine Verbindung mit Azure OpenAI-, OpenAI- oder Azure KI-Suche-Endpunkten herzustellen. Sie können eine Verbindung über die Benutzeroberfläche des Prompt Flow-Portals oder mithilfe der REST-API erstellen. Weitere Informationen finden Sie unter Verbindungen in Prompt Flow.
Um die Verbindung zu erstellen, befolgen Sie die Anweisungen zum Einrichten von Verbindungen für Prompt Flow. Bei den Beispielflows wird eine Verbindung namens aoai
verwendet, weisen Sie daher Ihrer Verbindung diesen Namen zu.
Einrichten einer Computesitzung
Prompt Flow verwendet eine Computesitzung, um den Flow auszuführen. Erstellen und starten Sie die Computesitzung, bevor Sie den Prompt Flow ausführen.
Einrichten des Azure Repos-Repositorys
Um ein verzweigtes Repository in Ihrer Azure DevOps-Organisation zu erstellen, befolgen Sie die Anweisungen zum Einrichten des GitHub-Repositorys. Dieses Repository verwendet zwei Branches, main
und development
, für Codehöherstufung und Pipelineausführung.
Um ein neues lokales Repository zu erstellen, folgen Sie den Anweisungen zum Klonen des Repositorys. Dieser Klon ermöglicht das Erstellen eines neuen Featurebranches aus dem Entwicklungsbranch sowie das Integrieren von Änderungen.
Einrichten eines Azure-Dienstprinzipals
Bei einem Azure-Dienstprinzipal handelt es sich um eine Sicherheitsidentität, die Anwendungen, Dienste und Automatisierungstools für den Zugriff auf Azure-Ressourcen verwenden. Die Anwendung oder der Dienst authentifiziert sich bei Azure für den Zugriff auf Ressourcen in Ihrem Auftrag.
Erstellen Sie anhand der Anweisungen zum Erstellen eines Azure-Dienstprinzipals einen Dienstprinzipal. Sie verwenden diesen Dienstprinzipal, um die Azure DevOps-Dienstverbindung zu konfigurieren und Azure DevOps das Authentifizieren bei Azure-Diensten sowie das Herstellen einer Verbindung mit Azure-Diensten zu erlauben. Das Prompt Flow-Experiment und die Auswertungsaufträge werden beide unter der Identität des Dienstprinzipals ausgeführt.
Bei der Einrichtung erhält der Dienstprinzipal Eigentümer-Berechtigungen, damit die CD-Pipeline dem neu bereitgestellten Azure Machine Learning-Endpunkt zum Lesen von Verbindungsinformationen automatisch Zugriff auf den Azure Machine Learning-Arbeitsbereich bereitstellen kann. Die Pipeline fügt den Endpunkt außerdem der dem Azure Machine Learning-Arbeitsbereich zugeordneten Schlüsseltresorrichtlinie mit den Geheimnisberechtigungen get
und list
hinzu. Besitzer-Berechtigungen können zu Berechtigungen der Ebene Mitwirkender geändert werden, indem Sie den YAML-Code der Pipeline ändern und den Schritt im Zusammenhang mit den Berechtigungen entfernen.
Erstellen eines neuen Azure DevOps-Projekts
Um ein neues Projekt in der Azure DevOps-Benutzeroberfläche zu erstellen, befolgen Sie die Anweisungen zum Erstellen eines neuen Azure DevOps-Projekts.
Einrichten der Authentifizierung zwischen Azure DevOps und Azure
In diesem Schritt wird eine neue Azure DevOps-Dienstverbindung konfiguriert, die die Informationen des Dienstprinzipals speichert. Die Projektpipelines können die Verbindungsinformationen mithilfe des Verbindungsnamens lesen, um automatisch eine Verbindung mit Azure herzustellen. Um den Dienstprinzipal zu verwenden, den Sie zum Einrichten der Authentifizierung zwischen Azure DevOps und Azure-Diensten erstellt haben, befolgen Sie die Anweisungen zum Einrichten der Authentifizierung mit Azure und Azure DevOps.
Erstellen einer Azure DevOps-Variablengruppe
Um eine neue Variablengruppe zu erstellen und eine Variable im Zusammenhang mit der Azure DevOps-Dienstverbindung hinzuzufügen, befolgen Sie die Anweisungen zum Erstellen einer Azure DevOps-Variablengruppe. Der Dienstprinzipalname ist dann automatisch für die Pipelines als Umgebungsvariable verfügbar.
Konfigurieren von Azure Repos und Azure Pipelines
Das Beispielrepository verwendet zwei Branches, main
und development
, für Codehöherstufung und Pipelineausführung. Befolgen Sie die Anweisungen zum Konfigurieren lokaler und Remoterepositorys in Azure DevOps, um eigene lokale Repositorys und Remoterepositorys für die Verwendung von Code aus dem Beispielrepository einzurichten.
Sie klonen die Branches main
und development
aus dem Beispielrepository und ordnen Sie dem Code zu, um auf das neue Azure Repos-Repository zu verweisen. Sowohl die PR- als auch die Entwicklungspipeline werden so konfiguriert, dass sie automatisch basierend auf PR-Erstellungs- und Zusammenführungstriggern ausgeführt werden.
Die Branchrichtlinie für den development
-Branch ist so konfiguriert, dass die PR-Pipeline für alle Pull Requests ausgeführt wird, die von einem Featurebranch aus auf einem Entwicklungsbranch ausgelöst werden. Die dev
-Pipeline wird ausgeführt, wenn der PR- mit dem Entwicklungsbranch zusammengeführt wird, und besteht aus CI- und CD-Phasen.
Zudem ist der Human-in-the-Loop-Ansatz in die Pipelines implementiert. Nachdem die CI-Phase in der dev
-Pipeline ausgeführt wurde, folgt die CD-Phase nach der manuellen Genehmigung in der Benutzeroberfläche für die Buildausführung von Azure Pipelines.
Die Standardzeit für das Warten auf die Genehmigung beträgt 60 Minuten. Danach wird die Pipeline abgelehnt, und die CD-Phase wird nicht ausgeführt. Durch die manuelle Genehmigung der Ausführung werden die CD-Schritte der Pipeline ausgeführt.
Die manuelle Genehmigung in der Beispielpipeline ist so konfiguriert, dass Benachrichtigungen an replace@youremail.com
gesendet werden. Ersetzen Sie den Platzhalter durch eine geeignete E-Mail-Adresse.
Testen der Pipeline
Um die Pipelines zu testen, befolgen Sie die Anweisungen zum Testen der Pipelines. Der vollständige Prozess beinhaltet die folgenden Schritte:
- Sie lösen einen PR (Pull Request) von einem Feature- zu einem Entwicklungsbranch aus.
- Die PR-Pipeline wird aufgrund der Branchrichtlinienkonfiguration automatisch ausgeführt.
- Der PR wird mit dem Entwicklungsbranch gemergt.
- Die zugeordnete
dev
-Pipeline wird ausgeführt. Dies führt zur vollständigen CI- und CD-Ausführung sowie zur Bereitstellung oder Aktualisierung der Azure Machine Learning-Endpunkte.
Die Ausgaben sollten ungefähr den Beispielen im Szenario zu Promptausführung, Auswertung und Bereitstellung entsprechen.
Verwenden der lokalen Ausführung
Führen Sie die folgenden Schritte aus, um lokale Ausführungsfunktionen zu verwenden.
Klonen Sie das Repository wie folgt:
git clone https://github.com/microsoft/genaiops-promptflow-template.git
Erstellen Sie eine .env-Datei auf oberster Ordnerebene. Fügen Sie Zeilen für jede Verbindung hinzu, und aktualisieren Sie die Werte für die Platzhalter. Die Beispiele im Beispiel-Repository verwenden die AzureOpenAI-Verbindung namens
aoai
und API-Version2024-02-01
.aoai={ "api_key": "<api key>","api_base": "<api base or endpoint>","api_type": "azure","api_version": "2024-02-01"} <connection2>={ "api_key": "<api key>","api_base": "<api base or endpoint>","api_type": "<api type>","api_version": "<api_version>"}
Bereiten Sie die lokale Conda-Umgebung oder die virtuelle Umgebung vor, um die Abhängigkeiten zu installieren.
python -m pip install promptflow promptflow-tools promptflow-sdk jinja2 promptflow[azure] openai promptflow-sdk[builtins] python-dotenv
Übernehmen oder schreiben Sie Ihre Flows in die Vorlage, basierend auf Anweisungen zum Onboarden von neuen Flows.
Schreiben Sie Python-Skripts im Ordner local_execution, die den bereitgestellten Beispielen ähneln.