Мы предлагаем решение задачи генерации сценариев для художественных биографических фильмов/сериалов с помощью LLM.
-
С целью унификации использования различных API для работы с LLM мы создали класс ModelWrapper (см. model.py), который позволяет общаться с агентом в режиме текстовой генерации.
Замечание. На данный момент поддерживается только Mistral AI API.
-
Для создания форматированных промптов (запросов) мы создали класс RequestManager (см. request_utils.py), который позволяет структурировать запрос на основе "сырых данных".
Замечание. На данный момент класс позволяет составлять запрос о генерации сценария фильма о конкретном человеке.
-
"Сырые данные" представляют из себя таблицы с атрибутами, свойствами и характеристиками о конкретной персоне. Они хранятся в базе данных biography_storage.db. На данный момент имеются следующие таблицы:
-
person
содержит в себе имя человека и краткую информацию о нём (поля name и info)
-
facts
содержит факты о персонах, которые либо нужно освещать в сценарии, либо не нужно (поля person_id, fact и include)
-
histories
содержит истории о персонах (поля person_id и history)
Замечание. На данный момент в базе данных лежат истории и сюжеты из источников https://www.culture.ru/ и https://biographe.ru/
-
Перед тем как запускать программу, необходимо зарегистрироваться на платформе Mistral AI и получить API ключ. Сделать это может бесплатно любой желающий, следуя официальной инструкции. Полученный ключ необходимо скопировать в config.py.
Для запуска приложения используйте следующую команду (из корневой директории репозитория):
python ./main.py --use_histories=1 --use_facts=1
где флаги use_histories и use_facts отвечают за использование/неиспользование историй и фактов о персоне в запросе.
Вы процессе работы с программой вам доступны 4 опции:
- "Quit"
- "Generate screenplay"
- "Print available persons"
- "Get person info by id"
Таким образом, для генерации сценария о персоне вам нужно выбрать первую опцию и ввести id персоны. Сгенерированные промпт и сценарий сохранятся в текстовых файлах result_prompt.txt и result_script.txt соответственно.
Мы замерили время генерации сценария для 13 персон. Результаты:
- Константин Циолковский: 256.6s
- Софья Ковалевская: 136.6s
- Александр Бородин: 207.1s
- Иван Павлов: 180.3s
- Дмитрий Менделеев: 313.5s
- Михаил Ломоносов: 148.4s
- Илья Мечников: 70.9s
- Александр Фридман: 138.8s
- Николай Вавилов: 155.9s
- Сергей Королев: 158.2s
- Андрей Колмогоров: 356.4s
- Игорь Курчатов и Анатолий Александров: 126.9s
- Юрий Кнорозов: 81.9s
Замечание. Для генерация сценариев в скрипте main.py используется бейзлайн-модель (см. Attempt 1 ниже).
Первая попытка – бейзлайн-модель для генерации. Mistral AI генерирует относительно слабые сценарии, решения OpenAI генерируют куда более качественные постановки:
-
Пример генерации модели mistral-large-latest: results v1
Команда для генерации сценариев:
python ./v1_generate_scripts.py --use_histories=1 --use_facts=1
-
Пример генерации модели o1-preview: google-drive
Сценарии генерились на основе тех же промптов, но вручную в веб-версии агента o1-preview от OpenAI (опять же, API стоит денег).
Попробовали улучшить сценарии путём обогащения каждой из сцен отдельным запросом в мистраль: results v2
Команда для улучшения сценариев первой версии:
python ./v2_improve_scripts.py
Вместо попыток сгенерировать полный сценарий со всеми подробностями мы решили разбить задачу на 2 части:
-
Сгенерировать подробный план по сценарию через MistralAI и GPT-4 от OpenAI (пока что вручную, т.к. нет доступа к API). Планы тут:
-
Сгенерировать подробное описание для каждой сцены плана с использованием MistralAI на основе планов от OpenAI
Результаты: results v3
Команда для генерации сценариев на основе планов:
python ./v3_enrich_script_outlines.py