Гайд · TNWS AI
Как сохранить и загрузить состояние DSPy-программы через JSON
Сохраняем state-only JSON и восстанавливаем его в новой программе; учитываем, что конфигурация модели в файл не включена.
Задача и применимость
Актуальный поисковый вопрос: «как сохранить оптимизированную dspy программу save json load после перезапуска». Восстановить утверждённые инструкции и few-shot примеры без небезопасной загрузки исполняемого pickled-пакета. Материал основан на текущем официальном руководстве DSPy, проверенном 20 сентября 2026 года, и предназначен для Python 3.10+ с совместимым установленным dspy. У разных провайдеров разные доступные модели, лимиты и права: укажите собственный реально работающий provider/model в переменных окружения. Фиксируйте установленную версию пакета при повторении опыта, поскольку API может меняться.
Как устроено решение
Официальное руководство DSPy различает JSON state-only и save_program=True в каталог. JSON содержит изученное состояние, инструкции и примеры, но не структуру Python-класса; восстановление требует заново создать ту же программу и вызвать .load. Конфигурация клиента LM, его ключ, провайдер и параметры генерации не сохраняются в этом файле. Поэтому перезапуск без dspy.configure либо запуск с другой моделью может дать иной результат даже при том же состоянии. Для продакшн-проверки фиксируйте обе части конфигурации отдельно.
Порядок действий
- Подготовьте рабочую программу и получите её утверждённое состояние; в демонстрации используйте обычный Predict.
- Сохраните программу в .json через save.
- В новом процессе снова объявите тот же программный контракт и настройте доступную LM.
- Примените .load к созданному экземпляру и выполните контрольный вопрос.
- Проверьте версию файла в исходном контроле и откажитесь от неизвестных артефактов.
Для сетевого запуска установите пакет командой pip install dspy, подготовьте свой доступ к модели и задайте DSPY_MODEL в форме provider/model и DSPY_API_KEY в окружении. Исключение — код, который только проверяет локальные настройки без сетевого вызова. Шаблон ниже содержит вымышленные входные данные и не включает секретов; перед запуском сверьте, что выбранная вами модель подходит для задачи и разрешена правилами провайдера.
Готовый пример программы
import os
import dspy
lm = dspy.LM(os.environ["DSPY_MODEL"], api_key=os.environ["DSPY_API_KEY"])
dspy.configure(lm=lm)
original = dspy.Predict("question -> answer")
original.save("faq_state.json")
# После перезапуска создайте тот же класс/сигнатуру и настройте LM заново.
fresh = dspy.Predict("question -> answer")
fresh.load("faq_state.json")
result = fresh(question="Какой город является столицей Италии?")
print(result.answer)
Вход и ожидаемый результат
Вход — файл faq_state.json, созданный локальным trusted-кодом, и вопрос об Италии. Ожидается созданный JSON-файл и доступное поле answer после load; фактически верный ответ должен назвать Рим. Пример сохраняет неоптимизированный Predict, поэтому не демонстрирует улучшения качества, а проверяет операцию round-trip состояния.
Проверка качества, а не только запуска
После оптимизации сохраняйте именно возвращённый optimized, а не исходный baseline. Поменяв схему поля с answer на summary, нельзя просто рассчитывать, что старое состояние подойдет новой сигнатуре: проведите тест совместимости и повторную оценку. JSON текстовый и удобен для diff, но он может содержать демонстрационные запросы и ответы, в которых оказались личные сведения; проверяйте содержимое до публикации репозитория. Делайте резервную копию только проверенной версии после измерения качества.
Сохранённое состояние полезно проверить не только на успешную загрузку, но и на эквивалентность поведения в контролируемых условиях. Возьмите два безопасных запроса, выполните их до сохранения и после загрузки при той же модели и настройках; сравните доступные поля и фактическую правильность, не требуя буквального совпадения произвольных формулировок. Зафиксируйте контрольную сумму своего файла и версию кода вместе с артефактом отдельно от секретов. Если структура класса была изменена между выпусками, сначала проверяйте загрузку в тестовой среде. Никогда не подменяйте проверку происхождения файла утверждением, что расширение JSON автоматически делает любое содержимое доверенным.
Особые случаи и границы
Каталог с save_program=True включает сериализованный исполняемый Python, поэтому не загружайте подобные артефакты из непроверенных источников. Учебный JSON тоже следует получать из доверенного процесса; это не замена аудиту данных. Если при восстановлении иной provider/model, сравнивайте не только факт появления поля answer, но и качество на прежнем отложенном наборе. Сохранённое состояние гарантирует наличие того же содержимого файла, но не тождество всех будущих генераций.
Критерии приёмки
- JSON существует и fresh.load применяет его без ошибки.
- Новая программа имеет ту же сигнатуру и отдельно настроенную LM.
- Факт о Риме проверен вне сериализованного файла.
Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.
Типичные ошибки и чего не делать
- Не загружайте save_program=True из чужого каталога.
- Не думайте, что ключ API находится в state-only JSON.
- Не сохраняйте baseline вместо оптимизированной версии по ошибке.
Частые вопросы
Хранит ли JSON исполняемый код модуля?
Нет, это режим сохранения состояния.
Нужна ли LM после загрузки?
Да, клиент настраивается заново.
Можно ли проверить изменения файла?
Да, JSON пригоден для сравнения в контроле версий.
Официальные источники
Частые вопросы
Хранит ли JSON исполняемый код модуля?
Нет, это режим сохранения состояния.
Нужна ли LM после загрузки?
Да, клиент настраивается заново.
Можно ли проверить изменения файла?
Да, JSON пригоден для сравнения в контроле версий.
Читайте также
Как дать DSPy ReAct только читающий инструмент для ответа по справке
Подключаем read-only функцию словаря к ReAct, ограничиваем число итераций и проверяем источник ответа.
Как задать простой русскоязычный вопрос через DSPy Predict и Signature
Пишем сигнатуру question -> answer и проверяем поля Prediction на безопасном тесте справочного ответа.
Как оптимизировать инструкции DSPy через GEPA без утечки тестового набора
Разделяем примеры, метрику и reflection LM перед компиляцией GEPA; оцениваем итог на отдельном отложенном наборе.
Комментарии
Пока тихо. Скажите первое слово