Навыки Проектирование спецификации ввода/вывода
Отличный навык не только выполняет задачи, но и чётко определяет, «что он принимает» и «что он выдаёт».
Хорошие спецификации ввода/вывода — основа надёжной работы навыка.
Зачем определять спецификации ввода/вывода
Навыки работают с реальными запросами пользователей, и форматы ввода бесконечно разнообразны.
Без чётких спецификаций Claude будет самостоятельно догадываться о смысле входных данных, что приведёт к нестабильному поведению.
Спецификации — это не ограничения, а чёткие границы действий для Claude, снижающие неоднозначность и повышающие согласованность вывода.
Четыре элемента спецификаций ввода
| Элемент | Описание | Пример |
|---|---|---|
| Тип ввода | Файлы, текст, URL, параметры и т. д. | PDF-файл, загруженный пользователем |
| Требования к формату | Расширение файла, кодировка, структура | .csv, кодировка UTF-8, первая строка — заголовок |
| Обязательный/Необязательный | Какие входные данные обязательны | Путь к файлу обязателен, имена столбцов необязательны |
| Поведение по умолчанию | Как обрабатывать, когда необязательные параметры не указаны | Анализировать все столбцы, если имена столбцов не указаны |
Определение спецификаций входных данных в SKILL.md
Пример
### Обязательные входные данные
- **Файл данных**: загруженный пользователем`.csv`или`.xlsx`файл
- Кодировка: UTF-8(CSV) или стандартный формат Excel
- Первая строка должна содержать заголовки столбцов
- Размер файла не должен превышать 50MB
### Необязательные входные данные
- **Целевые столбцы**: Укажите, какие столбцы анализировать; по умолчанию анализируются все числовые столбцы
- **Формат вывода**:`table`(таблица) или`text`(текстовая сводка), по умолчанию`table`
- **Точность**: Количество сохраняемых десятичных знаков, по умолчанию2bits
### Обработка отсутствующих входных данных
Если файл не загружен, сообщите пользователю:"Пожалуйста, загрузите CSV или Excel файл для анализа."
Если формат файла не поддерживается, сообщите пользователю и перечислите поддерживаемые форматы.
Три измерения спецификаций вывода
Измерение 1: Содержание вывода
Чётко указывайте, какое содержимое нужно выводить, избегая пропусков или избыточного вывода.
Пример
После завершения анализа предоставьте следующее:
1. **Сводная статистическая таблица**: Количество строк, среднее, максимум для каждого столбца/Минимальное значение, количество null-значений
2. **Отчёт о качестве данных**: Перечислите обнаруженные проблемы (например, слишком много null-значений, смешанные типы данных)
3. **Путь к файлу**: Если создаются выходные файлы, укажите пути для скачивания
Измерение 2: Формат вывода
Укажите формат, в котором представляется вывод, и где он хранится.
| Место вывода | Формат | Путь хранения |
|---|---|---|
| Отображение в диалоге | Таблицы Markdown, блоки кода | Хранение не требуется |
| Файл для скачивания | .xlsx、.pdf、.html | /mnt/user-data/outputs/ |
| Промежуточный результат | JSON、CSV | /home/claude/(временный) |
Измерение 3: Момент вывода
Укажите, когда выводить данные, выводить ли всё сразу или отображать постепенно по шагам.
Пример
1. **После чтения файла**: Немедленно сообщите пользователю базовую информацию о файле (количество строк, количество столбцов, размер)
2. **Во время анализа**: Если анализ занимает больше10секунд, сначала выведите уведомление о ходе выполнения
3. **После завершения анализа**: Выведите полную статистическую сводку
4. **После создания файла**: Отобразите путь к файлу и вызовите инструмент present_files
Пример полной спецификации ввода/вывода
Ниже приведена полная спецификация ввода/вывода для навыка суммирования документов:
Пример
имя: doc-summarizer
описание: >
Извлекайте краткие содержания из загруженных пользователем документов, поддерживая PDF, Word (.docx) и обычный текст.
Используйте, когда пользователям нужно быстро понять содержимое документа, извлечь ключевую информацию или создать краткое содержание документа.
---
# Суммаризатор документов
## Спецификации входных данных
### Обязательно
- Файл документа (.pdf, .docx или .txt)
### Необязательно
- **Длина резюме**:`короткая`(3предложения)/ `средняя`(1абзац(ы))/ `длинная`(3абзацев), по умолчанию`средний`
- **Язык**: Язык вывода, по умолчанию совпадает с языком исходного текста
- **Направление фокусировки**: Например"Сосредоточьтесь на разделе с выводами"、"Извлеките числовые данные"
### Обработка исключений
- Файл превышает 10MB: сообщите пользователю, что файл слишком большой, и предложите загрузить его после разделения
- Неподдерживаемый формат: перечислите поддерживаемые форматы и попросите пользователя загрузить файл повторно
- Документ является отсканированным изображением, и текст не может быть распознан: сообщите пользователю, что его нельзя обработать, и рекомендуйте предварительную обработку с помощью OCR-инструмента
## Спецификации вывода
### Содержание вывода (по порядку)
1. Базовая информация о документе: заголовок (если есть), количество страниц, примерное количество слов
2. Основная сводка: выводите в соответствии с указанной пользователем длиной
3. Ключевые слова:5-8ключевые слова темы
### Формат вывода
- Отображайте всё в диалоге, используя формат Markdown
- Не создавайте дополнительные файлы, если пользователь явно не запросит их сохранение
### Пример вывода
---
**Документ**:example-annual-report.pdf(24страниц, примерно12,000 слов)
**Резюме**: В этом отчёте рассматриваются годовые бизнес-показатели example, при этом число пользователей растёт год к году35%,
Покрытие технической документации выросло до98%. Структура выручки становится более диверсифицированной, при этом доли выручки от рекламы и членства примерно равны.
**Ключевые слова**: Годовой отчёт, рост пользователей, техническая документация, структура выручки, диверсификация
---
Соглашения по вводу/выводу на уровне скрипта
Если Skill поставляется со скриптами, рекомендуется использовать JSON в качестве структурированного формата ввода/вывода, чтобы Claude мог легко разбирать результаты.
Пример
# Стандартизированный шаблон ввода/вывода JSON
import json
import sys
def summarize(file_path: str, length: str = "medium") -> dict:
"""
Суммировать документ
Параметры:
file_path: Путь к документу (обязательно)
length: Длина сводки, short/medium/long (необязательно, по умолчанию medium)
Возвращает:
dict, содержащий поля status, data или error
"""
try:
# Имитация чтения документа
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# Имитация создания сводки
summary = content[:200] + "..." # Здесь следует вызвать реальную логику суммирования
return {
"status": "success",
"data": {
"word_count": len(content),
"summary": summary,
"length": length
}
}
except FileNotFoundError:
return {"status": "error", "error": f"Файл не найден: {file_path}"}
except Exception as e:
return {"status": "error", "error": str(e)}
if __name__ == "__main__":
file_path = sys.argv[1] if len(sys.argv) > 1 else ""
length = sys.argv[2] if len(sys.argv) > 2 else "medium"
result = summarize(file_path, length)
# Вывод унифицированного JSON для парсинга Claude
print(json.dumps(result, ensure_ascii=False, indent=2))
{
"status": "success",
"data": {
"word_count": 12480,
"summary": "example 年度报告回顾了平台在过去一年的业务表现...",
"length": "medium"
}
}
Другие расширенияИспользование JSON в качестве формата вывода скрипта позволяет Claude стабильно разбирать результаты без необходимости прибегать к догадкам при интерпретации свободного текста.