Документы по образцу нейросетью: заполнение шаблонов из данных

Шаблон Word, таблица с данными и скрипт: сотни типовых документов за один запуск. Что поручить модели, что считать кодом и как проверить поля перед отправкой.

4 мин · · автоматизация · бизнес

Нейросеть для генерации документов по образцу полезна там, где у вас десятки однотипных бумаг: договоры, акты, доверенности, письма, справки. Шаблон один, меняются данные. Главная ловушка в том, что многие просят модель «написать документ по образцу целиком» и получают незаметно изменённые реквизиты и суммы. Правильная схема другая: шаблон остаётся жёстким, данные берутся из таблицы, а модель отвечает только за то, что требует понимания русского языка. Ниже такая схема на Python.

Нейросеть для генерации документов по образцу: что делает код, а что модель

Что нужно в документеКто делает
Реквизиты, номера, даты, суммыКод, из таблицы без изменений
Сумма прописью, НДС, итогиКод (расчёт и библиотека)
ФИО и должность в родительном падеже, «в лице ... действующего на основании ...»Модель
Описание услуги или предмета по краткой пометке менеджераМодель, с последующей проверкой человеком
Структура и юридические формулировкиШаблон, составленный юристом

Юридический текст в шаблоне не должна писать модель, а ваш юрист. Нейросеть здесь нужна только для склонений и деловых формулировок, а всё остальное остаётся за шаблоном и кодом.

Шаг 1. Подготовьте шаблон Word

Возьмите готовый образец документа и замените переменные части метками. Для Python удобна библиотека docxtpl (Jinja-метки в документе Word):

bash
ДОГОВОР № {{ number }} от {{ date }}
{{ client_org }}, именуемое в дальнейшем «Заказчик», в лице {{ signer_genitive }},
действующего на основании {{ basis_genitive }}, ...
Стоимость услуг составляет {{ amount }} руб. ({{ amount_words }}).

Важная деталь: метку нужно набирать в Word сразу целиком, без смены форматирования внутри. Иначе внутри метки появятся разрывы, и подстановка сломается. Если метка не срабатывает, перепечатайте её в одном проходе или вставьте как простой текст.

Шаг 2. Данные в таблице

В CSV или Excel (его читают csv или openpyxl) держите «сырые» данные: number, date, client_org, inn, signer (в именительном падеже), position, basis («Устав»), amount, service_note. Каждая строка это один будущий документ.

Шаг 3. Модель готовит текстовые поля

Модель получает ФИО, должность и основание, возвращает строгий JSON. Берите структурированный вывод по статье как получать строго структурированный JSON.

bash
import csv
import json
import os
from decimal import Decimal
from docxtpl import DocxTemplate
from num2words import num2words
from openai import OpenAI

client = OpenAI(base_url="https://api.zukko.pro/v1",
                api_key=os.environ["ZUKKO_API_KEY"])

SYSTEM = (
    "Ты редактор деловых документов. Тебе дают данные подписанта. "
    "Верни JSON с полями: signer_genitive (должность и ФИО в родительном "

Для склонений достаточно недорогой модели, но склонение фамилий бывает коварным (иностранные, несклоняемые, женские фамилии), поэтому проверка выборкой обязательна. Подробнее о вызовах из Python — в справке по Python.

Шаг 4. Числа и проверки считает код

bash
def money_fields(row):
    amount = Decimal(row["amount"].replace(" ", "").replace(",", "."))
    rub = int(amount)
    kop = int((amount - rub) * 100)
    words = num2words(rub, lang="ru")
    return {"amount": f"{amount:,.2f}".replace(",", " ").replace(".", ","),
            "amount_words": f"{words} руб. {kop:02d} коп."}

def validate(row, ctx):
    errors = []
    inn = row["inn"].strip()
    if not (inn.isdigit() and len(inn) in (10, 12)):
        errors.append("ИНН: нужно 10 или 12 цифр")
    for key in ("number", "date", "client_org", "signer_genitive"):
        if not ctx.get(key):
            errors.append(f"пустое поле {key}")
    return errors

Для числа прописью используйте библиотеку, а не модель: слова для суммы модель может исказить, а библиотека детерминирована. Проверьте её на своих значениях, особенно на копейках и рублях в разных падежах, при необходимости уточните вывод. Контрольную сумму ИНН тоже можно проверять кодом, если нужна строгая валидация.

Шаг 5. Сборка документов и финальная проверка

bash
with open("clients.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        ctx = {**row, **text_fields(row), **money_fields(row)}
        problems = validate(row, ctx)
        if problems:
            print(row["number"], "пропущен:", problems)
            continue
        doc = DocxTemplate("template.docx")
        doc.render(ctx)
        doc.save(f"out/dogovor_{row['number']}.docx")

После сборки откройте итоговый файл тем же кодом и убедитесь, что в тексте не осталось {{, None и пустых мест; случайную выборку из 5–10 документов прочитайте глазами целиком. Сравнивайте не только поля, но и сумму цифрами с суммой прописью. Если нужно извлекать данные из присланных сканов или текстов, этому посвящена статья извлечение данных из документов.

Что с персональными данными

Фамилии подписантов и реквизиты это данные. Решите заранее, что вы вправе отправлять внешнему сервису. Минимальный вариант: модели отправляются только поля для склонения (должность, ФИО, основание), а ИНН, суммы и адреса остаются у вас. Условия хранения данных у поставщиков моделей прочитайте отдельно, мы по ним ничего не заявляем.

Сколько стоит

Формула: (вход × цена входа + выход × цена выхода) / 1 000 000, цены на 18 октября 2026 за 1M токенов. Допущения: на документ 700 токенов входа и 300 токенов выхода, всего 200 документов, то есть 140 000 токенов входа и 60 000 выхода. Это верхняя оценка, потому что мы отправляем только короткие поля.

  • deepseek-v4.1-flash: 140 000 × 0.013 / 1 000 000 + 60 000 × 0.038 / 1 000 000 = 0.00182 + 0.00228, около $0.004.
  • gpt-6.1-sol: 140 000 × 0.27 / 1 000 000 + 60 000 × 1.32 / 1 000 000 = 0.0378 + 0.0792, около $0.12.
  • claude-sonnet-5-5: 0.056 + 0.12, около $0.18.

Проверьте несколько моделей на 30 трудных фамилиях и выберите самую дешёвую, которая не ошибается. Актуальные цены: GET https://api.zukko.pro/v1/models.

Подключение

Создайте ключ в кабинете, сохраните его в переменной ZUKKO_API_KEY и укажите base URL https://api.zukko.pro/v1. Баланс пополняется от $1: СБП (комиссия платёжной страницы 8,5% сверху), криптовалюта или карта MasterCard.

Частые вопросы

Можно ли просто загрузить образец и попросить нейросеть сделать такой же документ?

Можно для черновика, но реквизиты и суммы так легко исказить. Для типовых документов надёжнее жёсткий шаблон с подстановкой.

Подходит ли схема для заполнения документов в PDF-форме?

Принцип тот же: поля готовит код и модель, а заполнение зависит от формата формы. Для PDF обычно нужна отдельная библиотека работы с формами.

Как проверить склонения?

Сделайте тестовый набор из 30 сложных фамилий и должностей, сравните вывод с эталоном и держите его для повторных проверок при смене модели.

Кто отвечает за юридическую силу документа?

Вы. Модель не даёт юридических заключений, а итоговый текст проверяет юрист.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.