Dies ist Teil einer fortlaufenden Serie: siehe ersten Beitrag hier .
KI-Prinzip II: Eingabeaufforderungen sicher laden (wenn es wirklich sein muss)
Möchten Sie, dass Ihr Chatbot über Taylor Swifts Songtexte diskutiert, anstatt technischen Support zu leisten? Genau das hat unser Chatbot getan, als wir gegen das oben genannte Prinzip verstoßen haben. Wenn Sie Ihre Anwendung von Swift befreien und Ihre KI-Architektur sicherer machen möchten, lesen Sie weiter. (Sorry, Taylor-Fans!)
Wo werden Eingabeaufforderungen gespeichert?
Speichern Sie Ihre Eingabeaufforderungen mit dem restlichen Code? Oder laden Sie sie aus einer anderen Quelle? Vielleicht eine Kombination aus beidem? Nachfolgend finden Sie den Rahmen für die Überlegungen zu dieser Entscheidung.
Option A – Eingabeaufforderungen in Git speichern
Die erste Frage, die Sie sich stellen sollten, lautet: Gibt es einen unmittelbaren Grund, die Eingabeaufforderungen getrennt vom Code zu speichern? Falls nein, belassen Sie die Eingabeaufforderungen in Git zusammen mit dem restlichen Code, wo sie hingehören. Dies ist die mit Abstand einfachste und sicherste Konfiguration. Es ist die Standardoption.
Zurück zu Prinzip Nr. 1: Prompts sind Code . Das Speichern von Teilen Ihrer Codebasis außerhalb von Git ist möglich und manchmal notwendig, aber nicht trivial. Treffen Sie die Entscheidung, Prompts auszulagern, nicht leichtfertig.
Option B – Laden von Eingabeaufforderungen von einer versionskontrollierten Plattform
Was passiert, wenn einige Ihrer Eingabeaufforderungen von Nicht-Ingenieuren bearbeitet werden müssen? Dies kann der Fall sein, wenn tiefgreifendes Fachwissen in einem Bereich erforderlich ist. Oder wenn eine Eingabeaufforderung sehr häufig geändert werden muss und Sie nicht auf die technische Abteilung warten können.
In diesem Fall müssen Sie die Eingabeaufforderung zur Laufzeit aus einer versionskontrollierten Quelle laden. Ich habe gesehen, dass Confluence und Google Docs hierfür erfolgreich eingesetzt werden. Es gibt auch viele andere versionskontrollierte, API-zugängliche Plattformen.
Unterschätzen Sie bei der Planung der Prompt-Loading-Logik nicht den Aufwand für diese Integration. Sie müssen verschiedene Fehlerbedingungen und Szenarien berücksichtigen, um Vertrauen in Ihre Anwendung zu haben. Zugriffsberechtigungen müssen konfiguriert und verwaltet werden. Automatisierte Tests und zusätzliche Überwachung sollten erweitert werden, um Fehler so früh wie möglich zu erkennen.
Hier sind einige der Szenarien, für die Sie planen müssen:
- Die Anwendung kann zur Laufzeit keine Eingabeaufforderungen laden. Soll die Bereitstellung beendet werden? Auf eine Sicherungsversion der Eingabeaufforderung umgestellt werden?
- Die Eingabeaufforderungssyntax wird nach einer Änderung ungültig und gibt unbrauchbare Datenstrukturen zurück. Automatisierte Tests konnten das Problem nicht erkennen, da während der Testausführung keine Eingabeaufforderungen geladen wurden. Welche zusätzliche Testinfrastruktur und Überwachung muss hinzugefügt werden, um dies zu erkennen und die Auswirkungen auf die Kunden zu minimieren?
- Die Eingabeaufforderung muss dringend zurückgesetzt werden. Ist hierfür eine neue Codebereitstellung erforderlich? Oder erstellen Sie eine separate Benutzeroberfläche für die sofortige Bereitstellung?
- Von Plattformen wie Confluence hinzugefügte Syntax kann in die Laufzeiteingabe eindringen und deren Leistung beeinträchtigen. Filtern Sie diese Unstimmigkeiten mit Tools wie Beautiful Soup heraus.
Alle diese Probleme sind zu 100 % lösbar. Man verfällt jedoch leicht in das Denkmuster, das Laden einer Eingabeaufforderung aus einem Google-Dokument sei ein trivialer Vorgang, der die Anwendungsarchitektur nicht wesentlich beeinflusse. Wie ich oben gezeigt habe, ist das Laden einer externen Eingabeaufforderung eine ernste Angelegenheit, die bei Anwendungen mit hoher Zuverlässigkeit mit Vorsicht angegangen werden muss.
Option C – Laden von Eingabeaufforderungen von einer Plattform ohne Versionskontrolle
Das ist eine schlechte Idee, und Sie werden es bereuen. Die Quelle der Wahrheit für die Eingabeaufforderungen muss versionskontrolliert sein und über eine geeignete API und Zugriffskontrollen verfügen. Hier darf nicht gespart werden.
Option D – Hybridansatz
Der hybride Ansatz kombiniert das Speichern einiger Eingabeaufforderungen direkt in Ihrer Codebasis und das Laden anderer Eingabeaufforderungen aus externen, versionskontrollierten Quellen. Obwohl die Verwaltung eines einheitlichen Speicherorts für alle Eingabeaufforderungen oft einfacher und zuverlässiger ist, gibt es Szenarien, in denen eine hybride Strategie Vorteile bieten kann.
Erwägen Sie die Einführung eines hybriden Ansatzes unter Bedingungen wie:
- Gemischte Verwendung : Bestimmte Eingabeaufforderungen erfordern häufige Aktualisierungen durch Fachexperten ohne Programmierkenntnisse, wodurch externes Laden praktisch ist, während andere nur von Ingenieuren geändert werden.
- Risikomanagement : Kritische Eingabeaufforderungen (z. B. Leitplanken) sollten für maximale Zuverlässigkeit im Hauptrepository gespeichert werden. Weniger kritische Eingabeaufforderungen, insbesondere solche, die häufig angepasst werden, können sicher extern gespeichert werden.
- Flexibilität bei der Auswertung : Eingabeaufforderungen für die Auswertung im ML-Stil können extern verwaltet werden, um ihre Integration in ein Auswertungsframework zu vereinfachen.
Leitplanken-Eingabeaufforderungen
Leitplanken (auch Zensur-Eingabeaufforderungen genannt) dienen dazu, Antworten zu prüfen, bevor sie den Benutzer erreichen, und so angemessene, sichere und konforme Ergebnisse zu gewährleisten. Leitplanken dienen als Schutzmechanismus, insbesondere in Anwendungen, bei denen Benutzerinteraktionen erhebliche rechtliche oder ethische Risiken bergen. Sie bilden eine zweite Verteidigungslinie und fangen unangemessene Ergebnisse ab, die durchrutschen.
Laden Sie keine Guardrail-Eingabeaufforderungen aus einem externen Dokument – dies birgt ein erhebliches, unnötiges Risiko. Bewahren Sie sie entweder zusammen mit Ihrem Code in Git auf oder verwenden Sie ein dediziertes Drittanbietertool wie Fiddle Guardrails . Die Guardrail-Logik ändert sich nicht sehr oft, daher wird dieser Ansatz Sie nicht allzu sehr verlangsamen.
Die Verwendung von Guardrails ist ein eigenständiges Prinzip, das in einem späteren Beitrag ausführlicher erläutert wird. Es ist ein großartiges Muster, das die Sicherheit Ihrer Anwendung verbessert und Ihnen hilft, nachts besser zu schlafen. Laden Sie sie jedoch nicht aus Google Docs.
Ladeaufforderungen für eine einfachere Auswertung
Teams laden Prompts häufig extern, um sie in Auswertungs-Engines wie ML Flow zu integrieren. Die zugrunde liegende Annahme hinter dieser Vorgehensweise ist, dass Prompts ML-Modellen ähneln und eine separate, statistische Bewertung benötigen. Sie fügen einen Prompt ein, messen den F1-Score der Ausgabe (oder eine beliebige Metrik Ihrer Wahl) und iterieren.
Dieser Ansatz ist manchmal sinnvoll – beispielsweise bei Klassifizierungsaufforderungen, die sich wie ML-Modelle verhalten sollen. Die meisten Aufforderungen unterscheiden sich jedoch grundlegend, wie in Prinzip 1: LLM-Aufforderungen sind Code beschrieben. Typische Aufforderungen ähneln eher der Anwendungslogik als ML-Modellen. Sie eignen sich eher für eine Pass-Fail-Bewertung zusammen mit dem umgebenden Code als für einen statistischen Bewertungsansatz.
Externe Evaluierungs-Engines helfen Ihnen bei den meisten Eingabeaufforderungen nicht weiter. Stattdessen sollten Sie automatisierte KI-gesteuerte Tests verwenden, ähnlich wie herkömmliche Unit-Tests. Diese werden im Mittelpunkt der folgenden Beiträge stehen.
Beachten Sie die folgenden Vorgehensweisen:
- Nur Eingabeaufforderungen, deren Funktionalität explizit Modelle des maschinellen Lernens nachahmt (z. B. Klassifizierungs- oder Bewertungsaufgaben), sollten extern bewertet werden.
- Behalten Sie die Mehrheit der Eingabeaufforderungen der Geschäftslogik in der Hauptcodebasis bei und verwenden Sie dabei herkömmliche automatisierte Testverfahren, die eher Unit-Tests als ML-Validierungstechniken ähneln.
- Wenn eine externe Bewertung erforderlich ist, isolieren Sie nach Möglichkeit nur diese Eingabeaufforderungen.
Fallstudie
Das zentrale Problem beim Laden von Eingabeaufforderungen ist die Verfügbarkeit – was sollten Sie tun, wenn die Eingabeaufforderung nicht zum erwarteten Zeitpunkt geladen wird?
Genau das ist uns im Taylor-Swift-Beispiel passiert. Aufgrund eines Problems mit den Confluence-Anmeldeinformationen wurde keine der Eingabeaufforderungen einer technischen Support-App geladen, einschließlich der Guardrail-Eingabeaufforderung. Dies löste irgendwie keine Laufzeitfehler aus, und der Bot reagierte ohne Anweisungen oder Eingabe (da die Formatierungszeichenfolge Teil der Eingabeaufforderung war). Und was möchte OpenAIs LLM ohne Eingaben kommunizieren? Es stellte sich heraus: die Texte von „I Want to Break Free“ von Queen und verschiedene Taylor-Swift-Songs. Glücklicherweise wurde dies fast sofort erkannt und behoben, und die Nutzer genossen die Musikdiskussion – zumindest rede ich mir das ein.
Warum kam es zu diesem Vorfall? Es wurden zwei Fehler gemacht:
- Es wurde nicht überprüft, ob die Eingabeaufforderungen erfolgreich geladen wurden. Beim Laden der Eingabeaufforderungen hätte ein Fehler auftreten müssen, da die App ohne geladene Eingabeaufforderungen nicht funktionieren würde.
- Die Leitplanken-Eingabeaufforderung wurde extern mit den übrigen Eingabeaufforderungen geladen. Diese Eingabeaufforderung sollte nicht auf diese Weise geladen werden. Sie hätte als letzte Verteidigungslinie in Git gespeichert werden sollen.
Nach dem Vorfall wurde die Leitplanken-Eingabeaufforderung erneut zu Git migriert und eine Ausnahmelogik hinzugefügt, um die Bereitstellung zu verhindern, wenn eine Eingabeaufforderung nicht geladen werden konnte oder ungültig war. Sie können sich eine Post-Mortem-Analyse ersparen, indem Sie diese Empfehlungen proaktiv befolgen.
Abschluss
In diesem Beitrag habe ich wichtige Aspekte zur Speicherung und zum Laden von Eingabeaufforderungen in KI-Anwendungen untersucht. Standardmäßig werden Eingabeaufforderungen zusammen mit dem Code in versionskontrollierten Repositories gespeichert. Weichen Sie davon nur ab, wenn es einen zwingenden Grund gibt, z. B. häufige Bearbeitung durch Nicht-Ingenieure oder spezifische Evaluierungsanforderungen.
Wenn Eingabeaufforderungen extern geladen werden müssen, wählen Sie zuverlässige und streng versionskontrollierte Quellen und führen Sie Tests und Überwachungen durch, um die Ausfallsicherheit zu gewährleisten. Leitplankeneingabeaufforderungen sollten aufgrund ihrer entscheidenden Rolle für die Anwendungssicherheit in Ihrer Codebasis verbleiben, um schwerwiegende Zuverlässigkeitsrisiken zu vermeiden.
Die meisten Eingabeaufforderungen ähneln eher Code als ML-Modellen. Verwenden Sie daher ML-ähnliche Tools nur dort, wo Sie sie benötigen. Speichern Sie nicht alle Eingabeaufforderungen extern, nur um die Integration mit einem Auswertungstool für einige davon zu vereinfachen.
Wenn Ihnen dieser Beitrag gefallen hat, verfolgen Sie die Serie für weitere Einblicke.