<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prompt Engineering on kenji.blog</title><link>http://kenji.blog/de/categories/prompt-engineering/</link><description>Recent content in Prompt Engineering on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 20:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/de/categories/prompt-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Für Ingenieure: Grundlagen des Prompt Engineering und Anwendungen in der Entwicklung</title><link>http://kenji.blog/de/p/prompt-engineering-for-engineers/</link><pubDate>Fri, 11 Sep 2026 20:00:00 +0900</pubDate><guid>http://kenji.blog/de/p/prompt-engineering-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/prompt-engineering-for-engineers/img/eyecatch.jpg" alt="Featured image of post Für Ingenieure: Grundlagen des Prompt Engineering und Anwendungen in der Entwicklung" />&lt;h1 id="einführung-warum-ingenieure-prompt-engineering-lernen-sollten">Einführung: Warum Ingenieure Prompt Engineering lernen sollten
&lt;/h1>&lt;p>Die Welt der Softwareentwicklung befindet sich aufgrund der rasanten Entwicklung von Large Language Models (LLMs) inmitten eines beispiellosen Paradigmenwechsels. Es ist keine Übertreibung zu sagen, dass wir vom „Software 2.0“ (Entwicklung durch neuronale Netze), wie es von Andrejs Karpathy propagiert wurde, nun zum „Software 3.0“ (natürlichsprachliche, prompt-gesteuerte Entwicklung) übergehen.&lt;/p>
&lt;p>Mit der Verbreitung von KI-Assistenten-Tools wie GitHub Copilot, Cursor oder verschiedenen LLM-APIs hat sich die Hauptaufgabe von Ingenieuren vom „Schreiben von Code von Grund auf“ hin zum „Entwerfen von Anweisungen, um die KI dazu zu bringen, den beabsichtigten Code zu generieren, und der anschließenden Überprüfung und Integration des generierten Codes“ gewandelt.&lt;/p>
&lt;p>Die wichtigste Fähigkeit in dieser neuen Entwicklungsmethode ist das &lt;strong>Prompt Engineering&lt;/strong>. Prompt Engineering wird oft als Schlagwort für Nicht-Ingenieure im Sinne von &amp;ldquo;geschicktem Plaudern mit der KI&amp;rdquo; abgetan, aber im Kern ist es eine &lt;strong>neue Art von Programmiersprache für nicht-deterministische (Non-deterministic) Rechensysteme&lt;/strong>.&lt;/p>
&lt;p>In diesem Artikel, der sich an Software-Ingenieure und Architekten richtet, wird auf etwa 10.000 Zeichen sehr detailliert auf die mathematischen und architektonischen Grundlagen von LLMs, fortgeschrittene Prompt-Engineering-Methoden wie Few-Shot, Chain-of-Thought und ReAct sowie deren Einbindung in tatsächliche Entwicklungs-Workflows und APIs eingegangen.&lt;/p>
&lt;hr>
&lt;h2 id="1-grundlagen-und-mathematischer-hintergrund-von-large-language-models-llms">1. Grundlagen und mathematischer Hintergrund von Large Language Models (LLMs)
&lt;/h2>&lt;p>Um Prompts zu optimieren und die beabsichtigte Ausgabe stabil zu erhalten, ist es unerlässlich, das &amp;ldquo;Innere der Blackbox&amp;rdquo; mathematisch und strukturell zu verstehen, also wie LLMs intern Text oder Code verarbeiten und generieren. Die meisten modernen LLMs sind autoregressive Sprachmodelle, die die Transformer-Architektur verwenden.&lt;/p>
&lt;h3 id="11-tokenisierung-tokenization-und-bpe">1.1 Tokenisierung (Tokenization) und BPE
&lt;/h3>&lt;p>LLMs verarbeiten rohe Textzeichenfolgen nicht direkt. Text wird in kleine Einheiten unterteilt, die &lt;strong>Token&lt;/strong> genannt werden. Viele Modelle verwenden einen Algorithmus namens Byte-Pair Encoding (BPE).&lt;/p>
&lt;p>Das Verständnis der Tokenisierung ist für Ingenieure wichtig. Denn die Art und Weise, wie Einrückungen (Leerzeichen) und Sonderzeichen in Programmiersprachen tokenisiert werden, wirkt sich direkt auf die Qualität der Codegenerierung aus. Bei der Codegenerierung für Python beispielsweise wird die Anzahl der Leerzeichen (ob es sich um vier Leerzeichen oder einen Tabulator handelt) oft als unabhängiges Token behandelt. Wenn die Einrückungsregeln im Prompt nicht klar definiert sind, kann dies zu Syntaxfehlern führen.&lt;/p>
&lt;h3 id="12-vorhersage-des-nächsten-tokens-next-token-prediction">1.2 Vorhersage des nächsten Tokens (Next Token Prediction)
&lt;/h3>&lt;p>Die grundlegende Aufgabe eines autoregressiven LLMs besteht darin, für eine gegebene Eingabesequenz (Kontext) das „wahrscheinlichste nächste Token“ vorherzusagen. Mathematisch ausgedrückt ist dies ein Maximierungsproblem für folgende bedingte Wahrscheinlichkeit:&lt;/p>
$$ P(w_t | w_{1}, w_{2}, \dots, w_{t-1}) $$
&lt;p>Hierbei repräsentiert $w_i$ ein Token und $t$ den aktuellen Zeitschritt. Das Modell berechnet über sein internes neuronales Netz die Wahrscheinlichkeitsverteilung des nächsten Tokens aus der Gruppe der Eingabetoken. Das generierte Token wird als Eingabe für den nächsten Schritt autoregressiv hinzugefügt, und dieser Prozess wiederholt sich, bis ein End-Token (wie &lt;code>&amp;lt;EOS&amp;gt;&lt;/code>) ausgegeben wird.&lt;/p>
&lt;h3 id="13-aufmerksamkeitsmechanismus-attention-mechanism-und-kontextfenster">1.3 Aufmerksamkeitsmechanismus (Attention Mechanism) und Kontextfenster
&lt;/h3>&lt;p>Der Kern der Transformer-Architektur ist der Self-Attention-Mechanismus. Dieser ermöglicht es dem Modell, die Abhängigkeiten zwischen weit entfernten Token in einer Sequenz zu berechnen.&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>Hierbei sind $Q$ (Query), $K$ (Key) und $V$ (Value) Matrizen, die aus den Eingaberepräsentationen generiert werden, und $d_k$ ist ein Skalierungsfaktor. Diese Formel bedeutet: „Berechne, auf welche vergangenen Wörter (Key) das aktuell verarbeitete Wort (Query) achten (Attention) soll, und beziehe diese Informationen (Value) ein.“&lt;/p>
&lt;p>Warum ist das Verständnis dieses Mechanismus im Prompt Engineering so wichtig? Weil es direkt mit dem Konzept des &lt;strong>Kontextfensters (Context Window)&lt;/strong> zusammenhängt. Wenn der Eingabe-Prompt zu lang wird, gehen wichtige Anweisungen in der Mitte des Kontexts verloren, das Gewicht der Attention verteilt sich und es tritt das Phänomen „Lost in the middle (Verlust von Mittelinformationen)“ auf. Anstatt gewaltige Dokumente oder Codebasen im Ganzen als Prompt zu übergeben, ist es erforderlich, nur die notwendigen Blöcke gezielt zu extrahieren und zu übergeben.&lt;/p>
&lt;h3 id="14-sampling-steuerung-durch-den-temperaturparameter-temperature">1.4 Sampling-Steuerung durch den Temperaturparameter (Temperature)
&lt;/h3>&lt;p>In der Ausgabeschicht wird normalerweise die Softmax-Funktion verwendet, um die Logits (Rohausgaben des Modells) in eine Wahrscheinlichkeitsverteilung umzuwandeln. Hier wird die &lt;strong>Temperatur (Temperaturparameter $T$)&lt;/strong> eingeführt, um die Vielfalt (Zufälligkeit) der Generierung zu steuern.&lt;/p>
$$ p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} $$
&lt;ul>
&lt;li>$z_i$ ist das Logit (der Score) des Tokens $i$ im Vokabular.&lt;/li>
&lt;li>Wenn $T = 1.0$, handelt es sich um die Standard-Softmax-Funktion.&lt;/li>
&lt;li>Wenn sich $T \to 0$ nähert, wird die Wahrscheinlichkeitsverteilung schärfer, und es wird zunehmend nur das Token mit der höchsten Wahrscheinlichkeit ausgewählt (deterministisch, Greedy Decoding).&lt;/li>
&lt;li>Wenn $T > 1.0$, wird die Wahrscheinlichkeitsverteilung flacher, und unauffällige Token, die normalerweise nicht ausgewählt werden, werden leichter gewählt (die Kreativität steigt).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Praktischer Ansatz für Ingenieure:&lt;/strong>
Wenn Codegenerierung oder JSON-Datenextraktion (Structured Output) über eine API durchgeführt wird, ist es üblich, einen extrem niedrigen Wert von $T=0.0 \sim 0.2$ festzulegen, um Halluzinationen zu vermeiden und die Reproduzierbarkeit zu erhöhen. Bei explorativen Aufgaben wie Architektur-Brainstorming oder der Ideenfindung für Namenskonventionen wird der Wert auf $T=0.7 \sim 1.0$ gesetzt.&lt;/p>
&lt;hr>
&lt;h2 id="2-strukturarchitektur-von-prompts-system-prompt-vs-user-prompt">2. Strukturarchitektur von Prompts: System Prompt vs User Prompt
&lt;/h2>&lt;p>Beim Aufbau von KI-Anwendungen unter Verwendung von APIs von OpenAI (wie GPT-4) oder Anthropic (wie Claude) wird der Prompt nicht als einzelner Textblock, sondern strukturiert als Array von Nachrichten aufgebaut. Das Wichtigste dabei ist die Trennung von „System Prompt“ und „User Prompt“.&lt;/p>
&lt;h3 id="21-system-prompt-definition-globaler-einschränkungen-und-personas">2.1 System Prompt: Definition globaler Einschränkungen und Personas
&lt;/h3>&lt;p>Der System Prompt definiert die &lt;strong>globalen Einschränkungen, die Persona (Rolle) und die grundlegenden Verhaltensregeln&lt;/strong> für das LLM. Um es mit Softwaredesign zu vergleichen, spielt er eine Rolle wie „Umgebungsvariablen“ oder „Basisklasse“ einer Anwendung oder wie ein „Dockerfile“ eines Containers.&lt;/p>
&lt;p>Ein hervorragender System Prompt stabilisiert die Ausgabqualität und das Format drastisch.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Beispiel für einen System Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Du bist ein erstklassiger Senior Go-Entwickler, der bestens mit Nebenläufigkeit (Goroutine/Channel) vertraut ist.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bitte generiere Antworten unter strikter Einhaltung der folgenden Regeln.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Regeln]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Wenn du Code bereitstellst, muss dieser immer als ausführbare, vollständige Funktion bereitgestellt werden.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Fehlerbehandlung darf nicht weggelassen werden und muss den Go-Konventionen entsprechend explizit mit `if err != nil` behandelt werden.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Erklärungen außerhalb von Codeblöcken sollten Aufzählungspunkte verwenden und nicht mehr als 3 Sätze umfassen.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. Falls eine Implementierung verlangt wird, die Sicherheitsbedenken aufwirft (SQL-Injection, Race Condition usw.), muss eine sichere Alternative vorgeschlagen werden.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. Das Ausgabeformat darf nur aus Erklärungen und Markdown-Codeblöcken bestehen.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="22-user-prompt-temporäre-aufgaben-und-dateninjektion">2.2 User Prompt: Temporäre Aufgaben und Dateninjektion
&lt;/h3>&lt;p>Der User Prompt liefert spezifische Aufgaben, Fragen oder Eingabedaten für die Verarbeitung. Er entspricht einem „Funktionsaufruf (Übergabe von Argumenten an eine Funktion)“, der innerhalb der vom System Prompt geschaffenen Kontextumgebung ausgeführt wird.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Beispiel für einen User Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bitte implementiere eine Funktion, die asynchron Bilder aus einer Liste vieler URLs herunterlädt und auf der lokalen Festplatte speichert.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Die Anzahl der Worker sollte über ein Argument steuerbar sein, und das Timeout-Handling mit dem Kontext (context.Context) sollte in der Implementierung enthalten sein.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Durch das robuste Einstellen des System Prompts kann die Stabilität der Ausgabe gegenüber stark variierenden User Prompts, die von Benutzern (oder anderen Komponenten des Systems) injiziert werden, sichergestellt werden. Es fungiert auch als erste Verteidigungslinie gegen „Prompt Injection“-Angriffe durch böswillige Benutzereingaben.&lt;/p>
&lt;hr>
&lt;h2 id="3-kerntechnologien-des-prompt-engineerings">3. Kerntechnologien des Prompt Engineerings
&lt;/h2>&lt;p>Ab hier werden spezifische Prompting-Paradigmen erläutert, die die Präzision von Softwareentwicklungsaufgaben drastisch verbessern.&lt;/p>
&lt;h3 id="31-zero-shot-prompting-und-few-shot-prompting">3.1 Zero-Shot Prompting und Few-Shot Prompting
&lt;/h3>&lt;p>&lt;strong>Zero-Shot Prompting&lt;/strong> ist eine Methode, bei der dem Modell nur Aufgabenanweisungen gegeben werden und es um eine Antwort gebeten wird, ohne dass Beispiele angegeben werden. Bei allgemeinen Anforderungen wie „Schreibe einen Quicksort in Python“ funktionieren heutige hoch entwickelte LLMs auch mit Zero-Shot recht gut.&lt;/p>
&lt;p>Wenn Sie jedoch möchten, dass das Modell projektspezifischen Codierrichtlinien folgt oder ein bestimmtes JSON-Schema ausgibt, ist die Wahrscheinlichkeit hoch, dass die Formatierung bei Zero-Shot fehlerhaft ist. Dies wird durch &lt;strong>Few-Shot Prompting&lt;/strong> gelöst.&lt;/p>
&lt;p>Few-Shot Prompting ist eine Methode, bei der dem Modell einige &amp;ldquo;Paare aus Eingabe und erwarteter Ausgabe (Demonstrationen)&amp;rdquo; im Prompt präsentiert werden. Es nutzt das Phänomen des &amp;ldquo;In-Context Learning&amp;rdquo;, bei dem das Modell Muster innerhalb des Kontextes des Prompts lernt, ohne dass die Modellparameter aktualisiert werden müssen.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Beispiel für Few-Shot Prompting (Protokollanalyse)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bitte analysiere das folgende Rohprotokoll und extrahiere ein strukturiertes JSON-Objekt.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Beispiel 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Eingabe: &amp;#34;[2023-10-01 10:00:05] ERROR [AuthService] Failed to authenticate user id=12345: Invalid password&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ausgabe: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:00:05Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;ERROR&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;AuthService&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Failed to authenticate user&amp;#34;, &amp;#34;user_id&amp;#34;: 12345}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Beispiel 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Eingabe: &amp;#34;[2023-10-01 10:05:12] WARN [DBPool] Connection timeout approaching for query_id=987&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ausgabe: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:05:12Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;WARN&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;DBPool&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Connection timeout approaching&amp;#34;, &amp;#34;query_id&amp;#34;: 987}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Aufgaben-Eingabe:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Eingabe: &amp;#34;[2023-10-01 10:15:30] FATAL [PaymentGateway] API rate limit exceeded. Retry after 60s&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ausgabe:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Indem Beispiele auf diese Weise bereitgestellt werden, lernt das Modell implizit das Format für &lt;code>timestamp&lt;/code> (Konvertierung nach ISO 8601) und die Namenskonventionen für Schlüssel und gibt perfektes JSON aus.&lt;/p>
&lt;h3 id="32-chain-of-thought-cot-und-zero-shot-cot">3.2 Chain-of-Thought (CoT) und Zero-Shot CoT
&lt;/h3>&lt;p>Der Durchbruch bezüglich der Denkfähigkeit von LLMs war &lt;strong>Chain-of-Thought (CoT: Gedankenkette)&lt;/strong>. Bei Aufgaben, die komplexe Logik erfordern (z. B. Implementierung komplexer Algorithmen, Verfolgung obskurer Bugs, Erstellung regulärer Ausdrücke), treten oft logische Sprünge oder Fehler (Halluzinationen) auf, wenn man das LLM anweist, direkt den endgültigen Code auszugeben.&lt;/p>
&lt;p>CoT ist eine Methode, bei der der mittlere Denkprozess verbalisiert wird, bevor die endgültige Antwort ausgegeben wird. Wenn das Modell die Situation Schritt für Schritt analysiert, wird der Kontext mit jedem generierten Token reicher, was die Genauigkeit der endgültigen Schlussfolgerung drastisch verbessert.&lt;/p>
&lt;p>Die einfachste und wirkungsvollste Technik ist &lt;strong>Zero-Shot CoT&lt;/strong>, bei der einfach das Zauberwort „&lt;strong>Lass uns Schritt für Schritt denken (Let&amp;rsquo;s think step by step)&lt;/strong>“ am Ende des Prompts hinzugefügt wird.&lt;/p>
&lt;p>In der Entwicklung wird dieses Konzept angewendet und der Prompt folgendermaßen strukturiert:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bitte erstelle eine React-Komponente, die die folgenden Spezifikationen erfüllt.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Spezifikationen]...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bevor du den Code generierst, beschreibe bitte deinen Denkprozess in den folgenden Schritten (innerhalb des &amp;lt;thinking&amp;gt;-Tags).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Identifizierung der benötigten Zustände (State) und Entwurf der Datenstruktur
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Betrachtung möglicher Edge-Cases und Fehlerbehandlung
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Überlegung zur Aufteilung der Komponente in Einheiten
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nachdem der Denkprozess abgeschlossen ist, schreibe bitte den endgültigen TypeScript-Code.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="mermaid">graph TD
A["User-Prompt: Komplexe Anforderungsdefinition"] --> B["Start des LLM-Inferenzprozesses"]
B --> C["Schritt 1: Logische Zerlegung der Anforderungen"]
C --> D["Schritt 2: Entwurf der Datenstrukturen und Typen"]
D --> E["Schritt 3: Algorithmenauswahl und Komplexitätsbewertung"]
E --> F["Schritt 4: Betrachtung von Corner-Cases und Sicherheit"]
F --> G["Generierung des endgültigen, optimierten Codes"]&lt;/div>
&lt;h3 id="33-tree-of-thoughts-tot">3.3 Tree of Thoughts (ToT)
&lt;/h3>&lt;p>Eine weitere Erweiterung des CoT-Konzepts ist der &lt;strong>Tree of Thoughts (ToT)&lt;/strong>. Während CoT einem linearen Pfad (Einweg-Pfad) von Überlegungen folgt, ist ToT ein Ansatz, bei dem mehrere Denkpfade (Zweige) parallel wie in einem Suchbaum entwickelt werden. Jeder Pfad wird vom Modell selbst bewertet, und durch Backtracking wird die optimale Lösung ermittelt.&lt;/p>
&lt;p>ToT ist äußerst effektiv für Probleme mit großem Suchraum und der Gefahr, in ein lokales Optimum zu fallen, wie z.B. Systemarchitekturdesign, komplexes Datenbank-Schema-Design oder große Refactoring-Pläne.&lt;/p>
&lt;div class="mermaid">graph TD
Root["Ursprüngliches Problem: Strategie zur Aufteilung von einem Monolithen in Microservices"]
Root --> Path1["Denkpfad A: Aufteilung basierend auf Domain-Driven Design (DDD)"]
Root --> Path2["Denkpfad B: Aufteilung nach Datenbanktabellen"]
Root --> Path3["Denkpfad C: Traffic-/Lastbasierte Aufteilung"]
Path1 --> Eval1["Selbstbewertung: Hohe Kohäsion erreichbar, aber die Modellierungskosten in der frühen Entwicklungsphase sind hoch."]
Path2 --> Eval2["Selbstbewertung: Einfache Implementierung, aber hohes Risiko, dass die Kopplung zwischen Diensten in Zukunft zunimmt."]
Path3 --> Eval3["Selbstbewertung: Skalierbarkeit kann sichergestellt werden, aber das Transaktionsmanagement wird komplex."]
Eval1 --> Select["Entscheidung: Betont die langfristige Wartbarkeit und wählt Pfad A (DDD-basiert)."]
Eval2 --> Discard1["Verworfen"]
Eval3 --> Discard2["Verworfen"]
Select --> Detail["Gibt basierend auf der gewählten Strategie einen konkreten Vorschlag für die Dienstaufteilung und das API-Design aus."]&lt;/div>
&lt;p>Um ToT im Prompt umzusetzen, geben Sie die Anweisung: „Bitte schlage mehrere Ansätze vor, bewerte deren jeweilige Vor- und Nachteile und implementiere dann den besten Ansatz.“&lt;/p>
&lt;hr>
&lt;h2 id="4-agentic-workflow-und-react-reasoning-and-acting">4. Agentic Workflow und ReAct (Reasoning and Acting)
&lt;/h2>&lt;p>Die Anwendung von LLMs entwickelt sich rasant weiter – von einfachen Textein- und -ausgaben hin zu &lt;strong>KI-Agenten (AI Agents)&lt;/strong>, die autonom planen und Aufgaben erledigen, indem sie mit ihrer Umgebung interagieren. Das Kernparadigma dieser Agentenarchitektur ist &lt;strong>ReAct (Reasoning and Acting)&lt;/strong>.&lt;/p>
&lt;h3 id="41-konzept-des-react-frameworks">4.1 Konzept des ReAct-Frameworks
&lt;/h3>&lt;p>Während herkömmliche LLMs zwar „denken können, bevor sie antworten“ (CoT), konnten sie nicht „handeln“, um Lücken in ihrem Wissen zu schließen. Das ReAct-Framework überwindet diese Einschränkung, indem es LLMs anweist, abwechselnd zu „denken (Thought)“ und zu „handeln (Action)“.&lt;/p>
&lt;p>Das Modell analysiert das Problem (Thought), und wenn es feststellt, dass Informationen fehlen, führt es externe Werkzeuge aus (z.B. Websuche, Datenbankabfrage, Shell-Befehl, API-Aufruf) (Action). Es erhält das Ausführungsergebnis des Werkzeugs (Observation), nutzt es als neuen Kontext, um weiter nachzudenken, und durchläuft diese Schleife, bis es die endgültige Antwort (Finish) erreicht.&lt;/p>
&lt;div class="mermaid">graph LR
Start["Start der Aufgabe"] --> Thought["Thought (Situationsanalyse und Planung)"]
Thought --> Action["Action (Auswahl und Ausführung geeigneter Werkzeuge)"]
Action --> Environment["Externe Umgebung (API / DB / Shell / Code Interpreter)"]
Environment --> Observation["Observation (Ausführungsergebnisse und Fehlerprotokolle der Werkzeuge)"]
Observation --> Thought
Thought -->|Genug Informationen gesammelt| Finish["Finish (Ausgabe der endgültigen Antwort/des Codes)"]&lt;/div>
&lt;h3 id="42-implementierung-durch-function-calling-tool-use">4.2 Implementierung durch Function Calling (Tool Use)
&lt;/h3>&lt;p>Die Standard-Schnittstelle zur Einbindung von ReAct in Systeme ist das &lt;strong>Function Calling (Funktionsaufruf / Werkzeugverwendung)&lt;/strong>, das von OpenAI oder Anthropic bereitgestellt wird.&lt;/p>
&lt;p>Ingenieure stellen dem LLM zusammen mit dem System Prompt „Definitionen der verfügbaren Werkzeuge (JSON-Schema)“ zur Verfügung. Das LLM analysiert den Kontext des Prompts und wenn es entscheidet, dass ein Werkzeug verwendet werden soll, gibt es nicht normalen Text aus, sondern den „aufzurufenden Funktionsnamen“ und die „zugehörigen Argumente als JSON“. Die Anwendung führt diese Funktion aus, gibt das Ergebnis an das LLM zurück und so wird eine Schleife gebildet.&lt;/p>
&lt;p>&lt;strong>Anwendungsbeispiel für die Entwicklung (Autonomer Debugging-Agent):&lt;/strong>
Wenn ein Agent erstellt wird, der bei einem fehlgeschlagenen Test in einer CI/CD-Pipeline die Ursache untersucht und einen Patch generiert, stellt man dem LLM folgende Tools zur Verfügung:&lt;/p>
&lt;ol>
&lt;li>&lt;code>search_codebase(regex_pattern)&lt;/code>: Durchsucht den Code im Repository mit regulären Ausdrücken.&lt;/li>
&lt;li>&lt;code>view_file_content(file_path, start_line, end_line)&lt;/code>: Liest den Inhalt einer angegebenen Datei.&lt;/li>
&lt;li>&lt;code>run_unit_test(test_file_path)&lt;/code>: Führt einen bestimmten Unit-Test aus und ruft den Traceback ab.&lt;/li>
&lt;li>&lt;code>propose_patch(file_path, diff_content)&lt;/code>: Schlägt einen Patch zur Behebung vor.&lt;/li>
&lt;/ol>
&lt;p>Das LLM schlussfolgert und handelt autonom wie folgt:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Thought&lt;/strong>: Das Testprotokoll zeigt, dass in Zeile 45 in &lt;code>src/auth.py&lt;/code> ein &lt;code>KeyError: 'user_id'&lt;/code> aufgetreten ist. Ich muss den umgebenden Code überprüfen.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>view_file_content(file_path=&amp;quot;src/auth.py&amp;quot;, start_line=30, end_line=60)&lt;/code>&lt;/li>
&lt;li>&lt;strong>Observation&lt;/strong>: (Anwendung liest den Dateiinhalt und gibt ihn an das LLM zurück)&lt;/li>
&lt;li>&lt;strong>Thought&lt;/strong>: Verstehe. Es fehlt eine Validierung für den Fall, dass die Antwort-JSON von der API keine &lt;code>user_id&lt;/code> enthält. Ich werde einen Patch erstellen, der es in die sicherere Methode &lt;code>.get()&lt;/code> umschreibt.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>propose_patch(...)&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Auf diese Weise hat das Prompt Engineering eine neue Dimension erreicht – von der „Steuerung der Textgenerierung“ hin zur „Definition von Werkzeugen und Gestaltung von Agenten-Schleifen (Orchestrierung)“.&lt;/p>
&lt;hr>
&lt;h2 id="5-rag-retrieval-augmented-generation-und-integration-in-die-codebasis">5. RAG (Retrieval-Augmented Generation) und Integration in die Codebasis
&lt;/h2>&lt;p>Eine der größten Schwächen von LLMs ist, dass sie keine „privaten Informationen“ oder „aktuellsten Informationen“ kennen, die nicht in ihren Trainingsdaten enthalten waren. Wenn man nach unternehmensinternen, privaten Repositories oder spezifischen API-Spezifikationen fragt, halluzinieren LLMs oft gelassen oder geben nur allgemeine Antworten.&lt;/p>
&lt;p>Die Architektur zur Lösung dieses Problems ist &lt;strong>RAG (Retrieval-Augmented Generation)&lt;/strong>. RAG ist eine Technologie, die den Informationsabruf (Retrieval) mit der Generierungsfähigkeit von LLMs kombiniert.&lt;/p>
&lt;h3 id="51-einbettungen-embeddings-und-vektorsuche">5.1 Einbettungen (Embeddings) und Vektorsuche
&lt;/h3>&lt;p>Die Grundlage von RAG ist ein mathematisches Vektorraummodell. Quellcode und interne Dokumente werden durch ein Embedding-Modell (z.B. &lt;code>text-embedding-3-small&lt;/code>) in hochdimensionale Vektoren (z.B. ein Array von 1536 Fließkommazahlen) umgewandelt und in einer Vector Database gespeichert.&lt;/p>
&lt;p>Wenn ein Benutzer eine Frage (Query) eingibt, wird die Query mit dem gleichen Modell vektorisiert und die &lt;strong>Kosinus-Ähnlichkeit (Cosine Similarity)&lt;/strong> mit den Dokumentenvektoren in der Datenbank berechnet.&lt;/p>
$$ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
&lt;p>Die relevantesten (semantisch ähnlichsten) Code-Snippets oder Dokumente werden als „Kontext“ dynamisch in den User-Prompt eingefügt.&lt;/p>
&lt;h3 id="52-anwendung-von-rag-im-entwicklungs-workflow">5.2 Anwendung von RAG im Entwicklungs-Workflow
&lt;/h3>&lt;p>Durch die Einbindung von RAG in Entwicklungstools lassen sich sehr leistungsstarke Funktionen direkt in der IDE realisieren.&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Engineer["Ingenieur"]
participant RAG_System["IDE Plugin (RAG)"]
participant VectorDB["Vector Database (Codebasis)"]
participant LLM["LLM API"]
Engineer->>RAG_System: "Wo ist die Transaktions-Rollback-Verarbeitung im aktuellen Zahlungsablauf implementiert?"
RAG_System->>VectorDB: "Query wird vektorisiert und semantische Suche ausgeführt"
VectorDB-->>RAG_System: "Relevante Codeblöcke (payment_service.go, db_tx.go usw.)"
RAG_System->>LLM: "System-Prompt + abgerufene Codeblöcke + Frage des Ingenieurs"
LLM-->>RAG_System: "Präzise Erklärung und Auflösung der Architektur basierend auf dem extrahierten Code"
RAG_System-->>Engineer: "Antwort und Links zu den entsprechenden Zeilen im Quellcode werden bereitgestellt"&lt;/div>
&lt;p>Eine wichtige Prompt-Engineering-Technik beim Aufbau von RAG für Codebasen ist, nicht nur den Code aufzuteilen (Chunking), sondern auch „Zusammenfassungen aus Docstrings von Funktionen und abstrakten Syntaxbäumen (AST) von Klassen“ in die Vektorisierung einzubeziehen. Dies verbessert die Suchgenauigkeit enorm.&lt;/p>
&lt;hr>
&lt;h2 id="6-praktische-anwendungsfälle-im-engineering-und-beispiele-für-fortgeschrittene-prompts">6. Praktische Anwendungsfälle im Engineering und Beispiele für fortgeschrittene Prompts
&lt;/h2>&lt;p>Im Folgenden werden praktische Anwendungsfälle und Prompt-Techniken vorgestellt, die zeigen, wie die Theorie des Prompt Engineerings angewendet werden kann, um den täglichen Entwicklungsalltag zu automatisieren und zu optimieren.&lt;/p>
&lt;h3 id="61-automatisierung-von-code-reviews-und-ergänzung-der-statischen-analyse">6.1 Automatisierung von Code-Reviews und Ergänzung der statischen Analyse
&lt;/h3>&lt;p>Binden Sie LLMs in CI-Pipelines ein, um automatische Code-Reviews bei der Erstellung von Pull Requests (PR) durchzuführen. Ziel ist es, Geschäftsanforderungs-Inkonsistenzen und Design-Anti-Pattern aufzuzeigen, die von Linter- oder statischen Analysetools nicht erkannt werden können.&lt;/p>
&lt;p>&lt;strong>Prompt-Beispiel (Anforderung von strukturierten Ausgaben):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Du bist ein strenger, erfahrener Senior-Software-Ingenieur.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bitte analysiere die Diff (Git Diff) des bereitgestellten Pull Requests und führe ein Code-Review durch.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Fokusbereiche des Reviews]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. Sicherheitslücken (Injection, XSS, Autorisierungsumgehungen usw.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Performance-Engpässe (N+1 Query-Problem, ineffiziente Schleifenberechnungen usw.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Wartbarkeit und Lesbarkeit (Verletzungen der SOLID-Prinzipien, zu tiefe Verschachtelung usw.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Einschränkungen]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Weisen Sie nicht auf bloße Formatverstöße (wie Einrückungen) hin, da dies die Aufgabe von Linter-Tools ist.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Wenn es keine Probleme gibt, versuchen Sie nicht krampfhaft, Fehler zu finden, sondern geben Sie ein leeres Array zurück.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Die Ausgabe muss strikt dem folgenden JSON-Schema entsprechen. Schließen Sie es NICHT in Markdown-Backticks (```json) ein.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Erwartetes JSON-Ausgabeformat]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;review_comments&amp;#34;: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;file_path&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;line_number&amp;#34;: &amp;#34;integer&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;severity&amp;#34;: &amp;#34;High | Medium | Low&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;issue_title&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;detailed_description&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;suggested_code_fix&amp;#34;: &amp;#34;string&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Git Diff Data]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{PR_DIFF}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Der Schlüssel dieses Prompts ist, dass das LLM gezwungen wird, leicht zu parsende JSON auszugeben, und dass die Rolle von Linting-Tools und LLMs klar getrennt wird (Definition von Systemgrenzen).&lt;/p>
&lt;h3 id="62-defensive-prompting-bei-zero-shot-codegenerierung">6.2 &amp;ldquo;Defensive Prompting&amp;rdquo; bei Zero-Shot Codegenerierung
&lt;/h3>&lt;p>Ein häufig auftretendes Problem bei der Codegenerierung durch KI ist, dass sie „eigenständig nicht existierende Bibliotheken importiert (Halluzination)“ oder „notwendige Variablendefinitionen weglässt (etwa durch Platzhalter wie &lt;code># Hier Code einfügen&lt;/code>)“. Um dies zu verhindern, verwenden wir ein „defensives Prompting“, das starke Leitplanken innerhalb des Prompts setzt.&lt;/p>
&lt;p>&lt;strong>Wichtige Elemente des defensiven Promptings:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Verbot von Auslassungen:&lt;/strong> „Bitte generiere eine vollständige Datei, die den Code nicht auslässt, keine Platzhalter (&lt;code>// ...&lt;/code> etc.) verwendet und direkt durch Kopieren und Einfügen ausgeführt werden kann.“&lt;/li>
&lt;li>&lt;strong>Vermeidung von Halluzinationen:&lt;/strong> „Wenn es keine Standardbibliothek gibt, die die Anforderungen erfüllt, erfinde bitte keine nicht existierende Drittanbieter-Bibliothek. Wenn dies der Fall ist, gib explizit an, dass eine externe Bibliothek installiert werden muss, und schlage einen Code vor, der die standardmäßigste Bibliothek (z.B. requests) verwendet.“&lt;/li>
&lt;li>&lt;strong>Forderung nach Eigenständigkeit:&lt;/strong> „Alle Variablen und Funktionen müssen ordnungsgemäß im Codeblock definiert sein.“&lt;/li>
&lt;/ol>
&lt;h3 id="63-automatische-generierung-von-property-basierten-tests--edge-case-tests">6.3 Automatische Generierung von Property-basierten Tests / Edge-Case-Tests
&lt;/h3>&lt;p>Lassen Sie das LLM nach Corner-Cases suchen und Testcode für die von Ingenieuren implementierten Funktionen generieren. Dies ist äußerst effektiv, um menschliche Vorurteile auszuschließen.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Die folgende Python-Funktion bestimmt, ob eine gegebene Zeichenfolge eine gültige IPv4-Adresse ist.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Schreiben Sie eine umfassende, auf pytest basierende Unit-Test-Suite für diese Funktion.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Bedingungen]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Decken Sie nicht nur normale Testfälle ab, sondern auch die folgenden Edge-Cases gründlich ab:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Grenzwerte (0, 255, 256 etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Eingaben von unterschiedlichen Typen (Ganzzahlen, None, Listen etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Zeichenfolgen mit Leerzeichen oder Sonderzeichen
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Fälle mit einer ungewöhnlichen Anzahl von Punkten (weniger als 3, 4 oder mehr)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- Verwenden Sie parametrisierte Tests (`@pytest.mark.parametrize`), um den Testcode kompakt zu halten.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Funktionscode]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">def is_valid_ipv4(ip_str):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> # Implementierung...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-bewertung-von-prompts-und-llmops-eval">7. Bewertung von Prompts und LLMOps (Eval)
&lt;/h2>&lt;p>In der Welt des Software-Engineerings wird Code, der nicht getestet ist, als Legacy-Code bezeichnet. Beim Prompt Engineering gilt genau dasselbe. Es ist extrem gefährlich, einen Prompt in der Produktionsumgebung bereitzustellen, der „ein paar Mal lokal gut funktioniert hat“.&lt;/p>
&lt;p>Mit Upgrades der Basismodelle oder Änderungen in den verarbeiteten Domaindaten kann das Verhalten von Prompts leicht brechen. Um dies zu verhindern, ist es unerlässlich, Mechanismen (LLMOps) für die &lt;strong>Evaluation (Eval)&lt;/strong> zu etablieren, die die Ausgaben des Prompts quantitativ bewerten.&lt;/p>
&lt;h3 id="71-llm-as-a-judge-llm-bewertet-llm">7.1 LLM-as-a-Judge (LLM bewertet LLM)
&lt;/h3>&lt;p>Bei Aufgaben wie Codegenerierung oder Textzusammenfassung ist das Testen auf genaue Übereinstimmung (Exact Match) unmöglich. Selbst klassische Bewertungsmetriken in der Verarbeitung natürlicher Sprache (BLEU und ROUGE) sind oft nicht leistungsfähig genug, um semantische Genauigkeit zu messen.&lt;/p>
&lt;p>Der aktuelle Industriestandard ist eine Methode namens &lt;strong>LLM-as-a-Judge&lt;/strong>, bei der ein starkes Modell (z. B. GPT-4o oder Claude 3.5 Sonnet) als „Richter (Judge)“ agiert und die Ausgabe des Ziel-LLMs bewertet.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Vorbereitung des Testsets&lt;/strong>: Bereiten Sie Dutzende bis Hunderte von Paaren aus Eingabedaten und idealen Ausgaben (oder Bewertungskriterien) vor.&lt;/li>
&lt;li>&lt;strong>Ausführung&lt;/strong>: Lassen Sie das zu bewertende Modell und den Prompt Ausgaben für das Testset generieren.&lt;/li>
&lt;li>&lt;strong>Bewertung&lt;/strong>: Verwenden Sie einen Bewertungsprompt (Meta-Prompt), um das Judge-LLM anzuweisen: „Bewerte die generierte Ausgabe mit 1 bis 5 Punkten, basierend darauf, ob sie die Anforderungen erfüllt.“&lt;/li>
&lt;/ol>
&lt;p>Dies ermöglicht es, Leistungsrückgänge (Regressionen) beim Anpassen von Prompts in CI/CD-Pipelines automatisch zu erkennen. Das Prompt Engineering entwickelt sich von der handwerklichen „Prompt-Bastelei“ hin zum datengesteuerten, reproduzierbaren „Engineering“.&lt;/p>
&lt;hr>
&lt;h2 id="8-fazit-prompts-sind-die-neuen-komponenten-der-software">8. Fazit: Prompts sind die neuen Komponenten der Software
&lt;/h2>&lt;p>In einer Zeit, in der KI Code schreibt, hört man oft vom „Ende des Programmierens“, aber die Realität sieht anders aus. Für Ingenieure hat sich lediglich die erforderliche Abstraktionsebene um eine Stufe erhöht.&lt;/p>
&lt;p>In der Vergangenheit haben wir den Übergang von der Assemblersprache zu C und dann zu höheren Programmiersprachen mit Garbage Collection vollzogen, was uns von der mühsamen Speicherverwaltung befreite und es uns ermöglichte, uns auf komplexere Geschäftslogik zu konzentrieren. LLMs und Prompt Engineering sind die nächste Welle der Abstraktion, die darauf folgt.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Verständnis der Architektur&lt;/strong>: Verstehen Sie die probabilistische Natur von LLMs (Autoregression, Attention, Temperature), um die Nicht-Determiniertheit des Systems zu steuern.&lt;/li>
&lt;li>&lt;strong>Kontextdesign&lt;/strong>: Klare Übermittlung der Absicht durch Einschränkungen im System Prompt und die Nutzung von Few-Shot/CoT.&lt;/li>
&lt;li>&lt;strong>Agentenhaftes Denken und Werkzeugintegration&lt;/strong>: Das ReAct-Paradigma voll ausschöpfen und LLMs als Orchestratoren des Systems nutzen.&lt;/li>
&lt;li>&lt;strong>Kontinuierliche Evaluation&lt;/strong>: Versionierung von Prompts als Teil des Codes und deren testgetriebene kontinuierliche Verbesserung durch Eval.&lt;/li>
&lt;/ol>
&lt;p>Indem Sie diese Prinzipien meistern, werden Prompts nicht mehr nur Zeichenfolgen sein, sondern robuste, skalierbare Softwarekomponenten. Ich hoffe, dass Sie die in diesem Artikel erläuterten fortgeschrittenen Prompt-Engineering-Methoden in Ihre Entwicklungs-Workflows und Produkte einbinden und so eine führende Rolle in der nächsten Generation von „Software 3.0“ spielen werden.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Generated using Prompt Engineering Techniques.&lt;/em>&lt;/p></description></item></channel></rss>