Гайд · TNWS AI
Как получить список меток из русского текста через типизированную DSPy Signature
Класс Signature с InputField и OutputField задаёт структуру списка меток, который затем проверяется по допустимому словарю.
Задача и применимость
Актуальный поисковый вопрос: «как описать list str OutputField в dspy Signature для классификации». Разделить ожидаемый тип результата и разрешённые бизнес-категории в русской классификации обращений. Материал основан на текущем официальном руководстве DSPy, проверенном 20 сентября 2026 года, и предназначен для Python 3.10+ с совместимым установленным dspy. У разных провайдеров разные доступные модели, лимиты и права: укажите собственный реально работающий provider/model в переменных окружения. Фиксируйте установленную версию пакета при повторении опыта, поскольку API может меняться.
Как устроено решение
Официальный пример класса Signature использует docstring, описания полей, dspy.InputField и dspy.OutputField. Дополнительные типы помогают адаптеру оформить ответ, но не заменяют валидацию предметной области. Для тикетов справочной службы особенно важно различать синтаксическую и смысловую ошибку: строка вместо списка — нарушение контракта; список ["скидки"] соответствует типу, но выходит за допустимые метки. Проверяйте оба условия, не позволяя непредусмотренной категории попасть в аналитику.
Порядок действий
- Определите конечный словарь разрешённых категорий до вызова модели.
- Задайте класс Signature с InputField для текста и OutputField типа list[str].
- Сформулируйте инструкцию по выбору категорий в docstring, не предполагая автоматической безошибочности.
- Передайте вымышленное обращение в dspy.Predict и извлеките список.
- После модели проверьте тип и каждый элемент словарём допустимых значений.
Для сетевого запуска установите пакет командой pip install dspy, подготовьте свой доступ к модели и задайте DSPY_MODEL в форме provider/model и DSPY_API_KEY в окружении. Исключение — код, который только проверяет локальные настройки без сетевого вызова. Шаблон ниже содержит вымышленные входные данные и не включает секретов; перед запуском сверьте, что выбранная вами модель подходит для задачи и разрешена правилами провайдера.
Готовый пример программы
import os
import dspy
dspy.configure(lm=dspy.LM(os.environ["DSPY_MODEL"], api_key=os.environ["DSPY_API_KEY"]))
class TicketLabels(dspy.Signature):
"""Отнеси обращение к одной или нескольким темам из: доставка, возврат, оплата."""
text: str = dspy.InputField(desc="Текст обращения на русском языке")
labels: list[str] = dspy.OutputField(desc="Список тем без новых категорий")
result = dspy.Predict(TicketLabels)(text="Когда вернут деньги за заказ?")
allowed = {"доставка", "возврат", "оплата"}
assert isinstance(result.labels, list)
assert all(label in allowed for label in result.labels)
print(result.labels)
Вход и ожидаемый результат
Вход — фраза «Когда вернут деньги за заказ?». Разумная контрольная разметка включает «возврат», возможно «оплата» в зависимости от редакционной инструкции. Результат должен быть именно списком из допустимых строк; пример не обещает, что всякая LM непременно вернёт один и тот же набор. Зафиксируйте эталонный список отдельно для оценки точности.
Проверка качества, а не только запуска
Инструкция может задать несколько тем, если один запрос объединяет возврат и оплату. Если бизнес-процесс требует ровно одну тему, исправьте текст задания и добавьте assert len(result.labels)==1 — не оставляйте противоречия между примером и валидацией. Контрольный корпус должен включать вопросы без известной темы: решите заранее, будет ли пустой список допустимым ответом или нужен отдельный маркер «прочее». Без этой договорённости модель будет вынуждена угадывать одну из трёх известных категорий.
Для многозначной разметки меток заранее определите замкнутый словарь допустимых значений и политику текста, которому ни одна метка не подходит. Тип списка проверяет структуру результата, но не заменяет бизнес-валидацию: модель может вернуть грамматически правильный список с запрещённой категорией или несколькими синонимами одной категории. Проверяйте уникальность значений, принадлежность словарю и обоснованность метки на размеченных примерах. Отдельный отрицательный пример нужен для сообщения, где нет ни одной заявленной темы. Не следует воспринимать уверенный вид структурированного вывода как доказательство классификации; иногда такой ответ особенно убедительно маскирует ошибку в исходной разметке.
Особые случаи и границы
Не используйте присвоенные метки автоматически как разрешение на возврат денег или изменение статуса заказа. Тегирование — классификация, а не авторизация действий. Проверяйте русские склонения и разговорные формулировки, например «вернут деньги», «отказался от заказа», «не прошёл платёж». Для замера качества считайте ошибки на отложенном наборе с человеческой разметкой. В тексте статьи нет придуманного пути к интерфейсу: все вызовы происходят через Python API.
Критерии приёмки
- Получен list[str], а не одна строка с запятыми.
- Каждая метка входит в объявленный набор.
- Качество на фразе про возврат проверено по отдельному эталону.
Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.
Типичные ошибки и чего не делать
- Не путайте корректный тип с корректной категорией.
- Не игнорируйте вопросы вне словаря категорий.
- Не превращайте классификацию в автоматическое финансовое действие.
Частые вопросы
Гарантирует ли аннотация list[str] верную метку?
Нет, содержимое проверяется отдельно.
Где писать инструкцию?
В docstring класса Signature.
Можно ли добавить описание поля?
Да, параметром desc у Field.
Официальные источники
Частые вопросы
Гарантирует ли аннотация list[str] верную метку?
Нет, содержимое проверяется отдельно.
Где писать инструкцию?
В docstring класса Signature.
Можно ли добавить описание поля?
Да, параметром desc у Field.
Читайте также
Как дать DSPy ReAct только читающий инструмент для ответа по справке
Подключаем read-only функцию словаря к ReAct, ограничиваем число итераций и проверяем источник ответа.
Как задать простой русскоязычный вопрос через DSPy Predict и Signature
Пишем сигнатуру question -> answer и проверяем поля Prediction на безопасном тесте справочного ответа.
Как оптимизировать инструкции DSPy через GEPA без утечки тестового набора
Разделяем примеры, метрику и reflection LM перед компиляцией GEPA; оцениваем итог на отдельном отложенном наборе.
Комментарии
Пока тихо. Скажите первое слово