СОЗДАНИЕ ДС С ЛОКАЛЬНОЙ LLM. ЧАСТЬ 6: ГЕНЕРАЦИЯ DOCX И ИТОГИ

Мы прошли долгий путь. Данные собраны, структурированы, проверены алгоритмами, обработаны нейросетью и очищены от мусора. У нас на руках идеальный JSON-объект с информацией для Дополнительного Соглашения. Остался последний шаг — превратить этот JSON в документ, который можно распечатать и подписать.

1. ПОДХОД К ГЕНЕРАЦИИ: XML ШАБЛОНЫ

Многие используют библиотеку python-docx для создания документов “с нуля”, добавляя параграф за параграфом. Это рабочий, но трудоемкий метод. Сложно настроить отступы, шрифты, колонтитулы и таблицы кодом.

Я выбрал другой путь: XML-шаблонизация. Формат .docx — это, по сути, архив ZIP, внутри которого лежат XML-файлы. Главный текст находится в файле word/document.xml.

Идея проста:

  1. Мы создаем красивый шаблон ДС в обычном Word. Настраиваем стили, логотипы, шрифты.
  2. В нужных местах пишем уникальные плейсхолдеры, например НОМЕР_ДС, ЗАКАЗЧИК_РОД_ПАДЕЖ, ТЕКСТ_ИЗМЕНЕНИЙ.
  3. Сохраняем этот файл как шаблон.

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. [фразаединицыпредмет_вин] Договора дополнить [фразапунктпредмет_твор] следующего содержания: ”[текстцитатыпредмет]”

Когда скрипт подставляет данные, это превращается в идеальный юридический текст:

“1. Статью 3 Договора дополнить пунктом 3.5 следующего содержания: …”

ИЛИ

“1. Раздел 5 Договора дополнить пунктом 5.1 следующего содержания: …”

Грамматическая согласованность, которую мы заложили на этапах 3 и 4, здесь дает свои плоды.

4. РЕЗУЛЬТАТЫ И ВЫВОДЫ

Что мы получили в итоге? Полностью автономную систему, работающую на локальном компьютере без интернета.

Экономика решения:

  • Стоимость запроса: 0 руб. (только электричество).
  • Время генерации: ~40-60 секунд на документ (зависит от GPU).
  • Точность: ~98% (благодаря жесткой схеме JSON и структурным подсказкам).

Главный урок: Искусственный интеллект в энтерпрайзе — это не “волшебная кнопка”. Это инженерная конструкция. LLM здесь играет роль лишь одного из модулей — “лингвистического процессора”. Всю ответственность за структуру, логику и факты несет классический код на Python.

Именно такая связка — Жесткий Алгоритм + Мягкая Нейросеть — позволяет создавать надежные инструменты для реального бизнеса, а не просто игрушки для чата.


Спасибо, что читали этот цикл статей. Надеюсь, мой опыт поможет вам в создании собственных локальных AI-решений!

enes