Skills-Kontext und Zustandsverwaltung

Jeder Claude-API-Aufruf ist zustandslos; er erinnert sich nicht automatisch an den Inhalt der vorherigen Sitzung.

Aber in einer fortlaufenden Konversation befinden sich alle historischen Nachrichten innerhalb des Kontextfensters. Dies zu verstehen hilft dir, Skills zu schreiben, die in Konversationen stabil funktionieren.


Wo befindet sich der Zustand von Skills?

Zustandstyp Speicherort Gültigkeitsbereich
Gesprächsverlauf Kontextfenster Aktuelle Sitzung, verschwindet beim Schließen
Zwischendateien /home/claude/ Aktuelle Sitzung, kann nach Aufgabenabschluss gelöscht werden
Ausgabedateien /mnt/user-data/outputs/ Dauerhaft, vom Benutzer herunterladbar
Installierter Skill /mnt/skills/ Sitzungsübergreifende Persistenz

Skills selbst verfügen nicht über Datenbank- oder dauerhafte Speicherfunktionen. Daten, die sitzungsübergreifend gespeichert werden müssen, sollten vom Benutzer gespeichert werden (z. B. heruntergeladene Dateien) oder in ein persistentes Ausgabeverzeichnis geschrieben werden.


Mehrstufigen Konversationszustand in SKILL.md verwalten

Für Skills, die mehrstufige Interaktion erfordern, sollte die Ablauflogik des Konversationszustands in SKILL.md klar definiert werden.

Beispiel

## Mehrstufiger Interaktionsprozess

Dieser Skill läuft in drei Phasen ab:

### Phase 1: Informationssammlung
Bitten Sie den Benutzer, die folgenden Informationen bereitzustellen:
1. Pfad zur Datendatei
2. Analyseziel

Führen Sie keine Analyse durch, bis alle Informationen vorliegen.
Zeigen Sie die gesammelten Informationen als Liste an und teilen Sie dem Benutzer mit, was noch fehlt.

### Phase 2: Bestätigung und Ausführung
Nach Abschluss der Sammlung den Ausführungsplan anzeigen und auf die Bestätigung durch den Benutzer warten:
>Ich werde{Dateiname}ausführen:{Analyseziel}, voraussichtliche Dauer etwa{Zeit}Sekunden. Bestätigen, um fortzufahren?

### Phase 3: Ausführen und Ausgeben
Nach der Benutzerbestätigung ausführen, den Fortschritt in Echtzeit mitteilen und das Ergebnis nach Abschluss ausgeben.

Wenn der Benutzer in irgendeiner Phase"Restart"sagt, löschen Sie die aktuell gesammelten Informationen und kehren Sie zu Phase 1 zurück.

Verwenden Sie Dateien, um den Zwischenzustand zu speichern

Bei komplexen mehrstufigen Aufgaben kann der Zwischenzustand in eine JSON-Datei geschrieben werden, um die Zustandsübertragung zwischen Schritten zu realisieren.

Beispiel

# Dateipfad: scripts/state_manager.py
import json
import os
from datetime import datetime

# Speicherpfad der Zustandsdatei (aktuelles Arbeitsverzeichnis der Sitzung)
STATE_FILE = "/home/claude/skill_state.json"

def save_state(state: dict) -> None:
    """Aktuellen Ausführungszustand in Datei speichern"""
    state["updated_at"] = datetime.now().isoformat()
    with open(STATE_FILE, "w", encoding="utf-8") as f:
        json.dump(state, f, ensure_ascii=False, indent=2)
    print(f"Zustand gespeichert: {STATE_FILE}")

def load_state() -> dict:
    """Lade den zuletzt gespeicherten Zustand; gib den Anfangszustand zurück, falls er nicht existiert"""
    if not os.path.exists(STATE_FILE):
        return {
            "phase":      "collecting",  # Aktuelle Phase: collecting / confirming / executing / done
            "file_path":  None,
            "target":     None,
            "result":     None,
            "created_at": datetime.now().isoformat()
        }
    with open(STATE_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

def clear_state() -> None:
    """Zustand löschen (für das Szenario "Neustart")"""
    if os.path.exists(STATE_FILE):
        os.remove(STATE_FILE)
    print("Zustand gelöscht, Neustart")

# Verwendungsbeispiel
if __name__ == "__main__":
    # Zustand laden oder initialisieren
    state = load_state()
    print(f"Aktuelle Phase: {state['phase']}")

    # Zustand aktualisieren: erfasster Dateipfad
    state["file_path"] = "/mnt/user-data/uploads/example_data.csv"
    state["phase"]     = "confirming"
    save_state(state)
状态已保存:/home/claude/skill_state.json
当前阶段:collecting
状态已保存:/home/claude/skill_state.json

Kontextverschmutzung verhindern

Wenn der Benutzer einen Skill mehrmals in derselben Konversation auslöst, können alte Parameter im Konversationsverlauf die neue Ausführung "verunreinigen".

Eine klare Angabe der Rangfolge in SKILL.md kann solche Probleme vermeiden.

Beispiel

## Regeln zur Parameterrangfolge

Wenn mehrere Parametersätze in derselben Konversation vorhanden sind, behandeln Sie sie gemäß der folgenden Rangfolge:

1. **Parameter, die in der letzten Nachricht des Benutzers explizit angegeben wurden**→ Höchste Priorität, immer verwenden
2. **In dieser Anfrage hochgeladene Dateien**→ Hohe Priorität
3. **Im Gesprächsverlauf erwähnte Parameter**→ Niedrige Priorität, nur verwenden, wenn sie nicht in der aktuellen Nachricht angegeben wurden
4. **Vom Skill definierte Standardwerte**→ Fallback

Bei Zweifeln an der Quelle der Parameter vor der Ausführung beim Benutzer bestätigen:"Ich werde example_v2.csv (die Datei, die Sie gerade hochgeladen haben) anstelle der vorherigen example_v1.csv verwenden, ist das korrekt?"

Zusammenhang zwischen Kontextlänge und Leistung

Wenn das Gespräch länger wird, nimmt der Inhalt im Kontextfenster zu, und die Kosten für Claude, ihn zu verarbeiten, steigen ebenfalls.

Bei lang laufenden Multi-Turn-Skills sollten die folgenden Optimierungsstrategien beachtet werden:

Strategie Methode Wirkung
Vermeiden Sie, große Inhaltsblöcke wiederholt auszugeben Auf zuvor ausgegebene Dateipfade verweisen, anstatt Inhalte erneut auszugeben Kontextnutzung reduzieren
Dateien verwenden, um Zwischendaten weiterzugeben Schreibe große Datensätze in Dateien und übergib in der Konversation nur Pfade Vermeide, dass große Daten den Kontext füllen
Informiere den Benutzer umgehend über den Abschluss einer Phase Sage nach jeder Phase ausdrücklich "Erster Schritt abgeschlossen" Informiere den Benutzer über den Fortschritt und reduziere Rückfragen

Das Kontextfenster ist eine begrenzte Ressource. Je größer die Datenmenge ist, die in einem Skill übergeben wird, desto weniger Platz bleibt für Schlussfolgerungen und Generierung, und die Antwortqualität kann sich verschlechtern. Bei großen Dateien immer über Dateipfade statt über Inhalte übergeben.

Weitere Erweiterungen