СОЗДАНИЕ ДС С ЛОКАЛЬНОЙ LLM. ЧАСТЬ 6: ГЕНЕРАЦИЯ DOCX И ИТОГИ
Мы прошли долгий путь. Данные собраны, структурированы, проверены алгоритмами, обработаны нейросетью и очищены от мусора. У нас на руках идеальный JSON-объект с информацией для Дополнительного Соглашения. Остался последний шаг — превратить этот JSON в документ, который можно распечатать и подписать.
1. ПОДХОД К ГЕНЕРАЦИИ: XML ШАБЛОНЫ
Многие используют библиотеку python-docx для создания документов “с нуля”, добавляя параграф за параграфом. Это рабочий, но трудоемкий метод. Сложно настроить отступы, шрифты, колонтитулы и таблицы кодом.
Я выбрал другой путь: XML-шаблонизация.
Формат .docx — это, по сути, архив ZIP, внутри которого лежат XML-файлы. Главный текст находится в файле word/document.xml.
Идея проста:
- Мы создаем красивый шаблон ДС в обычном Word. Настраиваем стили, логотипы, шрифты.
- В нужных местах пишем уникальные плейсхолдеры, например
НОМЕР_ДС,ЗАКАЗЧИК_РОД_ПАДЕЖ,ТЕКСТ_ИЗМЕНЕНИЙ. - Сохраняем этот файл как шаблон.
2. ФУНКЦИЯ ЗАМЕНЫ
В коде (функция build_docx_from_template) мы делаем следующее:
- Распаковываем структуру XML.
- Ищем текстовые узлы.
- Заменяем наши плейсхолдеры на реальные данные из JSON.
Но есть нюанс. Я пошел еще дальше и реализовал гибридный метод.
Если шаблон есть — мы его используем. Если шаблона нет (или он поврежден) — скрипт автоматически генерирует простой, но валидный DOCX “на лету” через функцию build_fallback_xml.
def build_fallback_xml(values):
body = "".join([
p("Дополнительное соглашение № " + values.get("agreement_number")),
p("Заказчик: " + values.get("customer_full_name")),
...
])
return "...<w:body>" + body + "</w:body>..." Это обеспечивает отказоустойчивость. Пользователь всегда получит файл, даже если удалит шаблон с диска.
3. УНИВЕРСАЛЬНЫЙ КОНСТРУКТОР ФРАЗ
Самое интересное происходит в момент заполнения тела соглашения. Помните наши подготовленные фразы? В шаблон вставляется такая конструкция:
- [фразаединицыпредмет_вин] Договора дополнить [фразапунктпредмет_твор] следующего содержания: ”[текстцитатыпредмет]”
Когда скрипт подставляет данные, это превращается в идеальный юридический текст:
“1. Статью 3 Договора дополнить пунктом 3.5 следующего содержания: …”
ИЛИ
“1. Раздел 5 Договора дополнить пунктом 5.1 следующего содержания: …”
Грамматическая согласованность, которую мы заложили на этапах 3 и 4, здесь дает свои плоды.
4. РЕЗУЛЬТАТЫ И ВЫВОДЫ
Что мы получили в итоге? Полностью автономную систему, работающую на локальном компьютере без интернета.
Экономика решения:
- Стоимость запроса: 0 руб. (только электричество).
- Время генерации: ~40-60 секунд на документ (зависит от GPU).
- Точность: ~98% (благодаря жесткой схеме JSON и структурным подсказкам).
Главный урок: Искусственный интеллект в энтерпрайзе — это не “волшебная кнопка”. Это инженерная конструкция. LLM здесь играет роль лишь одного из модулей — “лингвистического процессора”. Всю ответственность за структуру, логику и факты несет классический код на Python.
Именно такая связка — Жесткий Алгоритм + Мягкая Нейросеть — позволяет создавать надежные инструменты для реального бизнеса, а не просто игрушки для чата.
Спасибо, что читали этот цикл статей. Надеюсь, мой опыт поможет вам в создании собственных локальных AI-решений!