Зачем в 2026 году вообще возиться с локальными моделями?
Отправлять конфиденциальный договор или отчёт в сторонний API — всё равно что оставлять ключи от квартиры под ковриком. Особенно, если речь о финансовых документах или медицинских историях. К апрелю 2026 года приватность стала не просто модным словом, а жёстким требованием регуляторов. Облачные LLM? Спасибо, но нет.
Локальные модели дают контроль. И вот тут появляется он — Qwen 3.5 9B в формате GGUF. Это не просто очередная маленькая моделька. Это специально заточенный под извлечение данных инструмент, который спокойно живёт на ноутбуке с 16 ГБ ОЗУ. Почему именно он, а не что-то другое? Давайте разбираться.
Qwen 3.5 9B GGUF: Секретное оружие для структурирования хаоса
Qwen 3.5 — семейство моделей от Alibaba Cloud. На апрель 2026 года это всё ещё одна из самых сбалансированных по качеству и размеру серий для локального использования. Версия на 9 миллиардов параметров (9B) — золотая середина: достаточно умная для сложных задач, но достаточно лёгкая для запуска без видеокарты за 2000 долларов.
GGUF — это наследник GGML, формат для llama.cpp. Его главный козырь — эффективное квантование. Модель можно сжать с минимальной потерей качества. Для нашей задачи идеально подходит квантование Q4_K_M — баланс между точностью и размером. Файл весит около 5.5 ГБ. Это меньше, чем многие игры на телефоне.
На заметку: В 2026 году появились более новые квантования, но Q4_K_M для задачи извлечения данных из текста остаётся оптимальным выбором. Более агрессивные сжатия (вроде Q2_K) могут терять важные числовые детали в таблицах.
1 Готовим поле боя: установка llama.cpp
Всё начинается с llama.cpp. Это C++ инференс-движок, который и запускает GGUF-модели. К апрелю 2026 года проект активно развивается, но базовые шаги не поменялись.
# Клонируем репозиторий и собираем
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j4
Если `make` завершился без ошибок, у вас появится бинарник `main`. Это наша рабочая лошадка.
2 Находим и загружаем правильную модель
Не все GGUF-файлы одинаково полезны. Ищите проверенные квантования от сообщества. Хорошие источники — Hugging Face и специализированные репозитории. Для нашего гайда возьмём qwen2.5-9b-instruct-q4_k_m.gguf (название может меняться, но суть та же).
# Пример загрузки через huggingface-cli (установите пакет `huggingface-hub`)
huggingface-cli download TheBloke/qwen2.5-9B-Instruct-GGUF qwen2.5-9b-instruct-q4_k_m.gguf --local-dir ./models
Положите файл модели в папку `./models`. Всё, железо готово.
3 Магия начинается: пишем промпт для извлечения
Вот где Qwen 3.5 показывает характер. Модель обучена на инструкциях, поэтому нужно чётко объяснить задачу. Не просите "проанализировать документ". Говорите конкретно: "извлеки следующие поля".
### Инструкция:
Извлеки структурированные данные из текста договора ниже.
Верни ответ в формате JSON со следующими ключами:
- "стороны_договора": [массив имен]
- "сумма_договора": число (только цифры)
- "валюта": код валюты (RUB, USD, EUR)
- "срок_действия": {"начало": "YYYY-MM-DD", "окончание": "YYYY-MM-DD"}
- "ответственное_лицо": ФИО
Если какая-то информация отсутствует, укажи null.
### Текст договора:
{ВСТАВЬТЕ_СЮДА_ТЕКСТ_ВАШЕГО_ДОКУМЕНТА}
### Ответ (только JSON):
Этот промпт — основа. Qwen 3.5 9B отлично справляется с подобными шаблонами и редко начинает "творить" лишний текст.
4 Запускаем пайплайн: от текста к JSON
Допустим, у вас есть PDF. Сначала конвертируем его в текст. Для этого в 2026 году всё ещё отлично работает `pdftotext` (poppler-utils).
# Конвертируем PDF в текст
pdftotext ваш_документ.pdf - | head -c 8000 > document.txt
# Ограничиваем длину, контекстное окно модели не бесконечное
Теперь создаём Python-скрипт, который соберёт промпт и отправит его в модель через llama.cpp.
import subprocess
import json
import sys
model_path = "./models/qwen2.5-9b-instruct-q4_k_m.gguf"
llama_bin = "./llama.cpp/main"
def extract_data_from_text(text: str) -> dict:
prompt_template = """### Инструкция:
Извлеки структурированные данные из текста договора ниже.
Верни ответ в формате JSON со следующими ключами:
- \"стороны_договора\": [массив имен]
- \"сумма_договора\": число (только цифры)
- \"валюта\": код валюты (RUB, USD, EUR)
- \"срок_действия\": {\"начало\": \"YYYY-MM-DD\", \"окончание\": \"YYYY-MM-DD\"}
- \"ответственное_лицо\": ФИО
Если какая-то информация отсутствует, укажи null.
### Текст договора:
{text}
### Ответ (только JSON):"""
full_prompt = prompt_template.format(text=text[:6000]) # Учитываем контекст
# Запускаем llama.cpp
cmd = [
llama_bin,
"-m", model_path,
"-p", full_prompt,
"-n", "512", # Максимальная длина ответа
"-t", "6", # Количество потоков CPU
"-c", "8192", # Размер контекста
"--temp", "0.1", # Низкая температура для детерминированности
"--silent-prompt"
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
output = result.stdout
# Пытаемся найти JSON в выводе
start = output.find('{')
end = output.rfind('}') + 1
if start != -1 and end != 0:
json_str = output[start:end]
return json.loads(json_str)
else:
print("Не удалось найти JSON в ответе модели", file=sys.stderr)
return {}
except subprocess.TimeoutExpired:
print("Таймаут выполнения модели", file=sys.stderr)
return {}
if __name__ == "__main__":
with open("document.txt", "r", encoding="utf-8") as f:
doc_text = f.read()
extracted = extract_data_from_text(doc_text)
print(json.dumps(extracted, ensure_ascii=False, indent=2))
Запускаете скрипт и получаете готовый JSON. Всё работает оффлайн. Никаких API-ключей, никаких лимитов на запросы.
А что, если взять не Qwen 3.5? Сравниваем альтернативы
Llama 3.2 3B? Слишком глупая для сложных документов. Command R+? Отличная модель, но её GGUF-квантования на 2026 год могут быть менее стабильными. Claude 3.5 Haiku? Только облако, забыли.
| Модель / Инструмент | Плюсы для извлечения данных | Минусы |
|---|---|---|
| Qwen 3.5 9B GGUF + llama.cpp | Полный оффлайн контроль, низкие требования к RAM (от 10 ГБ), отличное понимание русского и английского. | Требует ручной подготовки пайплайна (PDF -> текст -> промпт). Скорость на CPU: 2-5 токенов/сек. |
| Ollama с Qwen 3.5 9B | Проще установка, есть готовый API. Автоматическое скачивание моделей. | Меньше контроля над квантованием. Может занимать больше памяти в фоне. |
| Платформы вроде LangChain + локальный эмбеддинг | Мощнее для больших объёмов документов (см. локальный RAG для миллионов PDF). | Чудовищно сложная настройка. Из пушки по воробьям для задачи простого извлечения полей. |
Вывод простой: если вам нужно регулярно вытаскивать одни и те же поля из сотен однотипных документов (скажем, суммы из счетов или даты из актов), то связка Qwen 3.5 9B GGUF + простой скрипт — идеальный свайп. Не нужен GraphRAG и не нужен облачный API.
Кому этот инструмент зайдёт, а кому нет?
Берите, если вы: Финансовый аналитик, который устал вручную копировать цифры из отчётов в Excel. Юрист, которому нужно сравнить условия в десятке договоров. Малый бизнес, который не хочет платить за облачные сервисы обработки документов.
Даже не смотрите в эту сторону, если: Вам нужно обрабатывать тысячи документов в час. Точность должна быть 100% (а она никогда не будет, всегда нужна проверка). Вы боитесь командной строки. Для вас проще заплатить стороннему сервису.
Главный миф: локальные модели работают так же хорошо, как GPT-4 Turbo. Не работают. Qwen 3.5 9B может ошибиться в дате или пропустить пункт. Но его ошибки предсказуемы и их легко отловить. Он не выдумает новую сторону договора, а скорее вернёт null. Это уже лучше, чем полная ручная работа.
Что дальше? Соберите скрипт в исполняемый файл, настройте запуск по папке с PDF-ками и забудьте о рутинном копипасте. А если нужно работать с изображениями документов (сканами), то сначала прогоните их через Qwen2.5-VL для OCR. Но это уже другая история.
Кстати, к концу 2026 года ждите появления Qwen 4.0. Слухи говорят, что её 7B-версия будет умнее текущей 9B. Когда выйдет — первым делом проверьте, не стала ли она ещё жаднее до оперативной памяти.