Управление контекстом и состоянием Skills
Каждый вызов Claude API не сохраняет состояние; он не запоминает автоматически содержимое предыдущей сессии.
Но в непрерывной беседе все исторические сообщения находятся в пределах контекстного окна. Понимание этого помогает писать Skills, которые стабильно работают в беседах.
Где хранится состояние Skills?
| Тип состояния | Место хранения | Область действия |
|---|---|---|
| История диалогов | Контекстное окно | Текущий сеанс, исчезает при закрытии |
| Промежуточные файлы | /home/claude/ |
Текущий сеанс, может быть очищен после завершения задачи |
| Выходные файлы | /mnt/user-data/outputs/ |
Постоянные, доступные для скачивания пользователем |
| Установленный навык | /mnt/skills/ |
Персистентность между сессиями |
Сами навыки не имеют возможностей базы данных или постоянного хранилища. Данные, которые нужно сохранять между сеансами, должны сохраняться пользователем (например, скачанные файлы) или записываться в постоянный каталог вывода.
Управление состоянием многоходового диалога в SKILL.md
Для навыков, требующих многоходового взаимодействия, логика потока состояния диалога должна быть чётко определена в SKILL.md.
Пример
Этот навык выполняется в три этапа:
### Этап 1: Сбор информации
Попросите пользователя предоставить следующую информацию:
1. Путь к файлу данных
2. Цель анализа
Не выполняйте анализ, пока не будет получена вся информация.
Отобразите собранную информацию в виде списка и сообщите пользователю, чего еще не хватает.
### Этап 2: Подтверждение и выполнение
После завершения сбора отобразите план выполнения и дождитесь подтверждения пользователя:
>Я буду{имя файла}выполнять{цель анализа}, ориентировочно это займет около{время}секунд. Подтвердите, чтобы продолжить?
### Этап 3: Выполнение и вывод
Выполните после подтверждения пользователя, сообщайте о ходе выполнения в реальном времени и выведите результат по завершении.
Если пользователь на любом этапе скажет"Restart", очистите текущую собранную информацию и вернитесь к этапу 1.
Используйте файлы для сохранения промежуточного состояния
Для сложных многошаговых задач промежуточное состояние можно записать в JSON-файл, чтобы реализовать передачу состояния между шагами.
Пример
import json
import os
from datetime import datetime
# Путь хранения файла состояния (рабочий каталог текущей сессии)
STATE_FILE = "/home/claude/skill_state.json"
def save_state(state: dict) -> None:
"""Сохранить текущее состояние выполнения в файл"""
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"Состояние сохранено: {STATE_FILE}")
def load_state() -> dict:
"""Загрузить последнее сохраненное состояние; вернуть начальное состояние, если оно не существует"""
if not os.path.exists(STATE_FILE):
return {
"phase": "collecting", # Текущая фаза: 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:
"""Очистить состояние (для сценария "Restart")"""
if os.path.exists(STATE_FILE):
os.remove(STATE_FILE)
print("Состояние очищено, перезапуск")
# Пример использования
if __name__ == "__main__":
# Загрузить или инициализировать состояние
state = load_state()
print(f"Текущая фаза: {state['phase']}")
# Обновить состояние: собранный путь к файлу
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
Предотвратить загрязнение контекста
Когда пользователь запускает Skill несколько раз в одном и том же разговоре, старые параметры в истории разговора могут "загрязнить" новое выполнение.
Чёткое указание приоритета в SKILL.md может помочь избежать таких проблем.
Пример
Если в одном и том же разговоре существует несколько наборов параметров, обрабатывайте их в соответствии со следующим приоритетом:
1. **Параметры, явно указанные в последнем сообщении пользователя**→ Наивысший приоритет, всегда использовать
2. **Файлы, загруженные в этом запросе**→ Высокий приоритет
3. **Параметры, упомянутые в истории диалога**→ Низкий приоритет, использовать только если не указаны в текущем сообщении
4. **Значения по умолчанию, определённые навыком**→ Резервный вариант
Если есть сомнения относительно источника параметров, подтвердите у пользователя перед выполнением:«Я буду использовать example_v2.csv (файл, который вы только что загрузили) вместо предыдущего example_v1.csv, верно?»
Связь между длиной контекста и производительностью
По мере увеличения длины диалога содержимое контекстного окна растёт, и затраты Claude на его обработку также увеличиваются.
Для длительно работающих многоходовых навыков следует учитывать следующие стратегии оптимизации:
| Стратегия | Метод | Эффект |
|---|---|---|
| Избегайте повторного вывода больших фрагментов содержимого | Ссылайтесь на ранее выведенные пути к файлам вместо повторного вывода содержимого | Сократите использование контекста |
| Используйте файлы для передачи промежуточных данных | Записывайте большие наборы данных в файлы и передавайте в разговоре только пути | Не допускайте, чтобы большие данные заполняли контекст |
| Своевременно сообщайте пользователю о завершении этапа | После каждого этапа явно говорите "Первый шаг завершён" | Сообщайте пользователю о прогрессе и сокращайте количество уточняющих вопросов |
Другие расширенияОкно контекста — ограниченный ресурс. Чем больше объём данных, передаваемых в Skill, тем меньше остаётся места для рассуждений и генерации, и качество ответов может снижаться. Для больших файлов всегда передавайте через пути к файлам, а не содержимое.