Schreibst du noch Prompts?
Large Language Modelle (LLMs) brauchen Anweisungen, sogenannte Prompts. In den letzten Jahren hat sich gezeigt, dass es Eigenschaften gibt, die einen guten Prompt aus machen. So z.B. soll man dem Modell eine Rolle zuschreiben “Du bist ein Assistent…” oder “Du bist Experte für Marketing…”. Außerdem sollte der Prompt Beispiele enthalten, an denen sich das LLM orientieren kann. Die Grenzen sollten auch gut abgesteckt sein “Nutze ausschließlich…. “, “Schreibe immer freundlich und aufgeschlossen”, “Wenn du nicht weiter weißt, dann sag…. “. Zum Schluss muss natürlich noch das gewünschte Format der Antwort migegeben werden “Gib mir nur den Code, schreib keine Erklärungen”, “Ich brauche die Übersicht in einer Tabelle”.
Man sieht hier schon, dass diese Herangehensweise in Agenten Systemen zu Fehlern führen kann. Die Informatik hat nicht um sonst sehr viele formale Programmiersprachen hervorgebracht. Sie haben die Uneindeutigkeit aus aus der Gleichung gestrichen, die mit LLMs und Prompts wieder einzug gehalten hat. Es entstehen sehr lange Prompts, die dennoch nicht eindeutig sein können. Sogennante Edge Cases, also Fälle die selten auftreten und an die der Entwickler vielleicht nicht gedacht hat erfordern dann Anpassungen, das macht den Prompt noch länger und noch komplizierter. Large Language Modelle tendieren bei zu vielen Anweisungen und zu langen Prompts dazu, diese auch wieder zu missachten. Hinzu kommt dass Prompts die mit einem Model von OpenAI gut funktionieren, mit einem anderen Modell des gleichen Herstellers schon nicht mehr gut funktionieren können. Geschweige denn man wechselt den Anbieter und versucht evtl. von OpenAI auf Mistral oder Grok zu wechseln.
Aber wie lassen sich diese Probleme lösen? Das wollen wir in diesem Bericht ein bisschen genauer untersuchen.
Ein Praxis Beispiel
Für einen Kunden habe ich einen Agenten gebaut, der Texte übersetzt. Diese werden von einem professionellem Team vorher geschrieben und sollen wiederum den Kunden meines Kunden in mehreren Sprachen zur Verfügung stehen.
Nun kam es vor, dass in einem der Texte aus den Nachrichten zitiert wurde. Dort wurde ein General gegenüber dem Parlament ausfällig und sprach von der “Vergewaltigung der Nation”. Dieses Wort hat in unserem Model die eingebauten Sicherheitfilter ausgelöst und das Model hat die Übersetzung abgebrochen. Mit ein paar Anpassungen am Prompt war es mir möglich, dies zu umgehen, indem ich dem Model beigebracht habe, dass es sich um kuratierte Texte handelt, die aus Nachrichten zitieren und die absolut harmlos sind. ( ist das schon Prompt Hacking? :D)
Ein paar Wochen später ist in der Übersetzung der einleitende Text “Gerne, hier ist deine Übersetzung” in der Übersetzung aufgetaucht. Das ist natürlich auch nicht, was man erwartet. Hier konnte erstmal mit einem structured Output gearbeitet werden, um die reine Übersetzung zu bekommen, ohne den Fluff außenrum.
was Bleibt?
Es bleibt die Unsicherheit, dass das Modell dennoch bei anderen kritischen Worten wieder den Dienst verweigert. Man stelle sich vor, es würde von einem verhinderten Attentat berichtet in dem es darum geht das Bauanleitungen und Sprengstoff gefunden wurden. Wird der Text noch übersetzt?
Wir die Ausnahme in neueren Versionen des Models noch funktionieren? Was ist wenn der Kunde den Anbieter für das Hosten der Modelle wechselt? Was ist wenn der Kunde anfängt eigene Modelle zu hosten? Was ist, wenn sich das Ausgabeformat ändern soll?
Eine mögliche Lösung: DSPy
Diese Probleme wurden auch anderswo registriert und in Stanford hat man sich ein paar gute Gedanken dazu gemacht. Die These auf denen die Forschenden gearbeitet haben ist, dass die besten Agentensysteme derzeit nicht allzusehr von der initialen Eingabe des Nutzers abhängen, sondern sich oft selbst die Anweisungen geben. Als Beispiel lassen sich auch Reasoning Modelle nennen, die das angebebene Problem zuerst in kleinere Teilprobleme zerlegen und sich “Gedanken” dazu machen, wie sie das Problem lösen können.
Daraus ist die Python Bibliothek DSPy entstanden. DSPy steht dabei für Declarative Selfimproving Python. Es schafft eine weitere Abstraktion gegenüber dem LLM und erstellt selbst den besten Prompt. Im Programm des Agenten wird dafür lediglich das Ein- und Ausgabeformat und das Problem (RAG, Information Extraction, Agent) angegeben. Mit speziellen Optimierern werden dann verschiedene Prompts gebaut und der genutzt, der am Besten performt. Es lassen sich aber auch gleich die Gewichte des LLM (sofern es ein Open Weight Model ist) anpassen, also direkt Fine Tuning betreiben.
Wer sich DSPy mal selbst ansehen will: https://dspy.ai/
Ein Projekt das bereits darauf aufbaut ist Flock, ein Open Source Agent Framework.
DSPy lässt sich anscheinend auch mit Langgraph kombinieren. Ich werde das in den nächsten Tagen mal testen und dann ein Update dazu geben :)