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
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
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
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 |
Weitere ErweiterungenDas 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.