fix(gtm): Final robust prompt construction to eliminate SyntaxError and update migration guide

This commit is contained in:
2025-12-31 15:04:45 +00:00
parent be4cd3365b
commit 0d02072eb6
2 changed files with 37 additions and 46 deletions

View File

@@ -51,36 +51,29 @@ Das Projekt nutzt ein geteiltes `helpers.py`, das auf der alten OpenAI Python Li
openai==0.28.1
# weitere deps...
### 1.5 Python Syntax & F-Strings
Multi-Line f-Strings sind in Docker-Umgebungen fehleranfällig, besonders wenn sie JSON-Strukturen oder komplexe Texte enthalten.
Multi-Line Prompts können in Docker-Umgebungen zu **sehr hartnäckigen Syntaxfehlern** führen, selbst wenn sie lokal korrekt aussehen.
* **Wiederkehrender Fehler: `SyntaxError: invalid decimal literal` (oft bei `2. Derive` oder ähnlichen Zeilen in Prompts)**
* **Symptom:** Python meldet einen Syntaxfehler innerhalb eines scheinbar korrekten Multi-Line-Strings (`f"""..."""`).
* **Ursachen:**
1. **Falsches Escaping von `{}`:** Wenn geschweifte Klammern (`{}`) als Teil eines JSON-Beispiels in einem f-String verwendet werden, müssen sie oft **doppelt** escaped werden (`{{` und `}}`). Wenn es aber kein f-String ist oder die Klammern nicht zur Variableneinfügung dienen, dürfen sie nicht escaped werden (ein `dict()`-Literal ist `{}`). Das ist eine häufige Quelle für Verwirrung.
2. **Fehlende/Falsche String-Delimiter:** Der Multi-Line-String wurde nicht korrekt mit `"""` geöffnet oder geschlossen, oder eine Zeile davor/danach bricht die String-Definition.
3. **Unsichtbare Zeichen:** Manchmal können unsichtbare Unicode-Zeichen (z.B. Zero-Width Space) den Parser stören.
4. **Ternary Operators in f-Strings:** Das ist ein bekannter Anti-Pattern (siehe unten).
* **Das Problem:** Der Python-Parser (insbesondere bei `f-strings` in Kombination mit Zahlen/Punkten am Zeilenanfang oder verschachtelten Klammern) kann Multi-Line-Strings (`f"""..."""`) falsch interpretieren, was zu Fehlern wie `SyntaxError: invalid decimal literal` oder `unmatched ')'` führt, auch wenn der Code scheinbar korrekt ist.
* **Best Practice zur Fehlervermeidung bei Prompts:**
1. **Nutze explizite `if/else` Blöcke** zur Definition des Prompts, anstatt Ternary Operators (`... if x else ...`) innerhalb von Multi-Line f-Strings. Dies ist die **sicherste Methode**.
2. **Definiere komplexe JSON-Strukturen** oder sehr lange Textblöcke **vorher als separate Variablen** und füge sie dann in den f-String ein (siehe Beispiel unten).
3. **Prüfe akribisch die `"""` Delimiter** und die Einrückung des Multi-Line-Strings.
* **ULTIMATIVE LÖSUNG (Maximale Robustheit):**
1. **Vermeide `f"""` komplett für komplexe Multi-Line-Prompts.** Definiere stattdessen den Prompt als normalen Multi-Line-String (ohne `f` Präfix).
2. **Nutze die `.format()` Methode** zur Variablen-Injektion. Dies trennt die String-Definition komplett von der Variablen-Interpolation und ist die robusteste Methode.
```python
# Beispiel: So sollte es NICHT gemacht werden (fehleranfällig)
# prompt = f"""Daten: {json.dumps(data)}""" if lang=='de' else f"""Data: ..."""
# Schlecht (fehleranfällig, auch wenn es manchmal funktioniert):
# prompt = f"""
# 1. Mache dies: {var1}
# 2. Mache das: {var2}
# """
# Beispiel: So ist es robust (bevorzugte Methode)
json_data_for_prompt = json.dumps(data) # JSON vorformatieren
if lang == 'de':
prompt_template = f"""
Dies ist ein deutscher Prompt mit Daten: {json_data_for_prompt}
"""
else:
prompt_template = f"""
This is an English prompt with data: {json_data_for_prompt}
"""
prompt = sys_instr + "\n\n" + prompt_template # System-Instruktion voranstellen
# Gut (maximal robust):
prompt_template = """
1) Mache dies: {variable_1}
2) Mache das: {variable_2}
"""
prompt = prompt_template.format(variable_1=wert1, variable_2=wert2)
# System-Instruktion muss immer noch vorangestellt werden:
full_prompt = sys_instr + "\n\n" + prompt
```
* **Signaturen prüfen:** Shared Libraries (`helpers.py`) haben oft ältere Signaturen. Immer die tatsächliche Definition prüfen!