Гайд · TNWS AI
Как измерить точность русских FAQ-ответов через DSPy Evaluate
Формируем Example с with_inputs, метрику равенства ответов и тестовый Evaluate без подмены эталона генерацией.
Задача и применимость
Актуальный поисковый вопрос: «как посчитать долю правильных ответов через dspy Example Evaluate». Получить базовый измеримый показатель до оптимизации промпта или замены модели. Материал основан на текущем официальном руководстве DSPy, проверенном 20 сентября 2026 года, и предназначен для Python 3.10+ с совместимым установленным dspy. У разных провайдеров разные доступные модели, лимиты и права: укажите собственный реально работающий provider/model в переменных окружения. Фиксируйте установленную версию пакета при повторении опыта, поскольку API может меняться.
Как устроено решение
Официальная документация DSPy подчёркивает, что .with_inputs("question") отделяет данные, подаваемые модели, от ответа, удерживаемого для метрики. Без этого разделения вы рискуете передать эталон в запрос и получить самоисполняющуюся проверку. Функция metric получает исходный example и prediction; возвращаемое число обычно лежит между нулём и единицей. Это удобная отправная точка, но сравнение строк фиксирует только точный формат после strip и lower, а не полноту смысла.
Порядок действий
- Разметьте вручную маленький набор безопасных вопросов и правильных ответов.
- В каждом dspy.Example отметьте question как вход, оставляя answer для метрики.
- Создайте функцию, которая получает example и prediction и возвращает числовой балл.
- Запустите dspy.Evaluate с devset и metric на одной зафиксированной программе.
- Посмотрите не только среднюю оценку, но и фактические ответы ошибочных случаев.
Для сетевого запуска установите пакет командой 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"]))
examples = [
dspy.Example(question="Столица Франции?", answer="париж").with_inputs("question"),
dspy.Example(question="Столица Италии?", answer="рим").with_inputs("question"),
]
def exact_answer(example, prediction) -> float:
return float(prediction.answer.strip().lower() == example.answer)
program = dspy.Predict("question -> answer")
score = dspy.Evaluate(devset=examples, metric=exact_answer)(program)
print(score)
Вход и ожидаемый результат
Вход — вопросы о Франции и Италии, эталоны «париж» и «рим». Результаты «Париж» и «Рим» дадут два совпадения, фраза «Столица Франции — Париж» по строгой метрике не совпадёт. Следовательно показатель зависит от выбранного критерия и не утверждает, что развернутая фраза фактически неверна.
Проверка качества, а не только запуска
Строгий exact match подходит для однословных канонических ответов, а не для открытых объяснений. Для названий городов дополнительно продумайте «Санкт-Петербург» и сокращения, букву ё и варианты склонения. Если в ответе есть ссылки или приветствие, решение о нормализации принимайте до просмотра итогов, иначе метрика станет подгонкой. Отложенный набор тестов должен содержать случаи, которые не использовались при оптимизации, иначе повышение на обучающих вопросах выдаст ложное чувство прогресса.
Метрика FAQ особенно полезна, когда правильный ответ допускает несколько формулировок. Разделите структурные критерии, которые можно проверить автоматически, и фактические критерии, требующие эталона. Например, наличие обязательного номера заявки можно проверить регулярным выражением, но правомерность обещанного срока — только по актуальному документу. Посчитайте оценки также по категориям: среднее значение по всему набору может скрывать полный провал на редких вопросах. В оценочных примерах не смешивайте реальные персональные данные с вымышленными; замените их постоянными безопасными идентификаторами. Каждый новый случай ошибки добавляйте в отложенный набор, предварительно убедившись, что он не дублирует почти дословно обучающий пример.
Особые случаи и границы
Оценка на двух странах слишком мала для запуска FAQ в продукте. Добавляйте отрицательные вопросы без ответа в своей базе, редкие формулировки и вопросы с устаревшими данными. Сохраняйте модель, дату измерения и редакцию эталонного корпуса. Внешний провайдер может поменять поведение, а одинаковые вызовы не всегда дают побуквенно одинаковый ответ. Если цель — фактическая точность, дополняйте строковую проверку ручной или независимой предметной оценкой.
Критерии приёмки
- В model input попал question, но не поле answer с эталоном.
- Метрика выдаёт 1.0 для канонической строки и 0.0 для иного текста.
- Средний показатель интерпретируется с учётом двухкейсового объёма.
Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.
Типичные ошибки и чего не делать
- Не передавайте answer в список with_inputs.
- Не называйте строгий exact match полной оценкой истинности.
- Не оптимизируйте и не тестируйте на одних и тех же вопросах.
Частые вопросы
Что получает metric?
Исходный пример и предсказание программы.
Что делает with_inputs?
Обозначает поля, передаваемые программе.
Достаточно ли двух примеров для релиза?
Нет, это только учебная проверка пайплайна.
Официальные источники
Частые вопросы
Что получает metric?
Исходный пример и предсказание программы.
Что делает with_inputs?
Обозначает поля, передаваемые программе.
Достаточно ли двух примеров для релиза?
Нет, это только учебная проверка пайплайна.
Читайте также
Как дать DSPy ReAct только читающий инструмент для ответа по справке
Подключаем read-only функцию словаря к ReAct, ограничиваем число итераций и проверяем источник ответа.
Как задать простой русскоязычный вопрос через DSPy Predict и Signature
Пишем сигнатуру question -> answer и проверяем поля Prediction на безопасном тесте справочного ответа.
Как оптимизировать инструкции DSPy через GEPA без утечки тестового набора
Разделяем примеры, метрику и reflection LM перед компиляцией GEPA; оцениваем итог на отдельном отложенном наборе.
Комментарии
Пока тихо. Скажите первое слово