Гайд · TNWS AI

Как задать простой русскоязычный вопрос через DSPy Predict и Signature

4 мин—

Пишем сигнатуру question -> answer и проверяем поля Prediction на безопасном тесте справочного ответа.

Задача и применимость

Актуальный поисковый вопрос: «как сделать dspy Predict сигнатура question answer для русского FAQ». Получить минимальную вызываемую программу, вход и выход которой можно проверить отдельно от текста подсказки. Материал основан на текущем официальном руководстве DSPy, проверенном 20 сентября 2026 года, и предназначен для Python 3.10+ с совместимым установленным dspy. У разных провайдеров разные доступные модели, лимиты и права: укажите собственный реально работающий provider/model в переменных окружения. Фиксируйте установленную версию пакета при повторении опыта, поскольку API может меняться.

Как устроено решение

Согласно учебнику DSPy, строка "subject -> haiku" превращается в Signature, а Predict организует вызов модели и возвращает Prediction с полем результата. В нашем случае "question -> answer" — учебная адаптация того же механизма. Имена полей участвуют в инструкциях для модели, поэтому они не просто декоративные переменные Python. Переименование answer в summary меняет доступ к результату и сигнал для LM. Если скрипт обращается к result.answer, а в сигнатуре вы назвали поле response, проблема не в модели.

Порядок действий

  1. Настройте действительную LM по официальному руководству DSPy.
  2. Определите ровно два осмысленных поля: вопрос на входе и ответ на выходе.
  3. Создайте dspy.Predict по строковой сигнатуре.
  4. Передайте учебный вопрос именованным аргументом question.
  5. Проверьте поле result.answer и дополнительно достоверность самого ответа по эталону.

Для сетевого запуска установите пакет командой 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"]))
faq = dspy.Predict("question -> answer")
result = faq(question="Какой город является столицей Франции?")
print(result.answer)
assert isinstance(result.answer, str) and result.answer.strip()

Вход и ожидаемый результат

Вход — вопрос «Какой город является столицей Франции?». Ожидается непустое строковое поле answer; фактически верный ответ должен назвать Париж. Проверка isinstance подтверждает лишь структурный контракт, а не правильность факта. В записях проекта сохраняйте обе оценки отдельно, чтобы форматный успех не скрывал ошибку содержания.

Проверка качества, а не только запуска

Минимальная сигнатура удобна для прототипа, но плоха для задачи, где запрещены догадки: отсутствуют контекст, политика отказа и ссылка на источник. Не добавляйте в статью ложный «готовый RAG» только на основании такого примера. Для FAQ с частной документацией понадобятся дополнительные входы и тесты на отсутствие сведений. Отдельно проверьте русский язык на нескольких контрольных фразах: тот факт, что в вопросе русские слова, не гарантирует, что доступная LM ответит на русском.

Для приёмки простого Predict подготовьте три карточки вопросов: однозначный, неоднозначный и вопрос, ответа на который в исходной информации нет. Контракт должен проверять имя поля ответа, а отдельно редактор решает, соответствует ли его содержание фактам. Например, если пользователь спрашивает о сроке доставки без указания региона, корректная система не должна обещать конкретный день. Формулировку Signature стоит менять по одной переменной: сначала описание задачи, затем имена полей и только затем варианты входного текста. Иначе при улучшении результата нельзя установить причину. Сохраните исходный набор вопросов вне программы, чтобы повторная проверка действительно обнаруживала регрессию, а не только подтверждала знакомые ответы модели.

Особые случаи и границы

Если вместо ответа в поле result.answer появляется необработанный технический шаблон, рассмотрите реальный формат ответа провайдера и адаптер DSPy, а не делайте string split по произвольному маркеру. Прямой вызов LM из предыдущего шага позволяет понять, исправен ли транспорт. Даже правильный общеизвестный факт не делает систему готовой к медицинским, финансовым или юридическим утверждениям: для таких областей нужен специальный набор данных и дополнительные проверки.

Критерии приёмки

  1. Результат доступен по тому же имени, что указано справа от стрелки.
  2. Текст непустой и факт о столице проверен независимо.
  3. Ошибка неверно названного входного аргумента диагностируется до публикации.

Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.

Типичные ошибки и чего не делать

  • Не выдавайте успешный парсинг за точность ответа.
  • Не используйте result.response при поле answer.
  • Не отправляйте частные вопросы без политики обработки данных.

Частые вопросы

Обязателен ли класс Signature?

Нет, для простого контракта подходит строка.

Что означает стрелка?

Она отделяет поля входа от полей выхода.

Нужен ли реальный вызов LM?

Да, Predict вызывает настроенную модель.

Официальные источники

Частые вопросы

Обязателен ли класс Signature?

Нет, для простого контракта подходит строка.

Что означает стрелка?

Она отделяет поля входа от полей выхода.

Нужен ли реальный вызов LM?

Да, Predict вызывает настроенную модель.

Читайте также

Комментарии

Пока тихо. Скажите первое слово