Проблема, которая сводит с ума
Вы поставили Qwen3-VL-8B на свой ноутбук. Настроили пайплайн извлечения данных из PDF. Попросили модель выдать результат в JSON. А она выдает вам это:
{
"name": "Иван Петров",
"age": 35,
"profession": "Разработчик",
// Модель решила добавить комментарий
"skills": ["JavaScript", "TypeScript", "Python"
// Забыла закрыть массив
}Или еще лучше:
Конечно, вот данные в JSON:
{
"title": "Отчет",
"date": "2026-02-03",
"content": "Текст с кавычками \"внутри\" и переносами\nстрок"
}
Надеюсь, это поможет!JSON.parse() сломается. Ваш пайплайн остановится. Вы потратите час на отладку. Знакомо? Именно для этого создали Loot-JSON.
Что такое Loot-JSON на самом деле
Не очередной парсер. Это хирургический инструмент для извлечения JSON из текстового хаоса. Библиотека на TypeScript, которая делает три вещи:
- Вырезает JSON из окружающего текста (убирает предисловия, комментарии модели)
- Исправляет синтаксические ошибки (незакрытые скобки, кавычки, запятые)
- Экранирует спецсимволы внутри строк
Установка проще некуда:
npm install loot-json
# или
bun add loot-jsonКак это работает на практике
Допустим, вы используете локальную LLM для парсинга PDF. Модель выдает смесь текста и JSON. Ваш код до Loot-JSON выглядел так:
try {
const data = JSON.parse(llmResponse);
// В 40% случаев здесь будет ошибка
} catch (error) {
// Привет, ручная обработка
}С Loot-JSON:
import { lootJson } from 'loot-json';
const dirtyResponse = `Пользователь запросил данные. Вот JSON:
{
\"name\": \"Анна\",
\"age\": 28
}`;
const cleanJson = lootJson(dirtyResponse);
// {"name":"Анна","age":28}
const data = JSON.parse(cleanJson); // Без ошибокЧто делает библиотека под капотом
Алгоритм проходит четыре стадии:
1 Поиск JSON-фрагмента
Ищет паттерны { и [ в тексте. Определяет границы объекта или массива. Отбрасывает все, что за пределами.
2 Балансировка скобок
Считает открывающие и закрывающие скобки. Если не хватает закрывающих - добавляет. Если лишние - убирает. Простая математика, которая спасает 60% сломанных JSON.
3 Очистка строк
Экранирует кавычки внутри строковых значений. Преобразует одинарные кавычки в двойные (если нужно). Убирает нестандартные символы.
Библиотека не исправляет логические ошибки. Если модель написала "age": "двадцать пять" вместо числа, это останется строкой. Loot-JSON чинит синтаксис, не семантику.
4 Валидация
Пробует пропустить результат через JSON.parse. Если не проходит - повторяет процесс с более агрессивными правилами очистки.
Сравнение с другими способами
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Loot-JSON | Специализированный, легкий (9KB), TypeScript-first | Только JSON, не исправляет семантику | Когда нужен простой и надежный инструмент для чистки вывода LLM |
| Ручные regex | Полный контроль | Хрупкие, сложные в поддержке, ломаются на edge cases | Для одноразовых скриптов или очень специфичных форматов |
| LLM-доочистка | Может исправить семантические ошибки | Медленно, дорого, требует второй вызов модели | Когда критична точность данных, а не скорость |
| Строгие промпты | Предотвращает ошибки на этапе генерации | Не всегда работают с маленькими моделями | Вместе с Loot-JSON для максимальной надежности |
Если вы уже используете строгие схемы вывода, Loot-JSON станет последней линией защиты. Когда даже грамматика JSON-LM не спасает.
Реальные кейсы из 2026 года
Разработчики медицинского софта используют библиотеку для парсинга врачебных записей. Локальная модель на базе Llama 3.2 3B распознает почерк, но иногда путает структуру JSON. Loot-JSON чинит ответ перед сохранением в базу.
Сервис автоматизации отчетов. Каждый день обрабатывает 5000 PDF через Qwen3-VL-8B. Без очистки JSON пайплайн падал бы 30 раз в день. С Loot-JSON - ни одного падения за месяц.
Версия 2.1.0 (январь 2026) добавила поддержку JSON Lines и частичный парсинг. Теперь можно обрабатывать потоки, где модель выдает несколько JSON-объектов подряд.
Кому это нужно прямо сейчас
- Разработчикам RAG-систем, которые используют локальные модели для извлечения фактов. Когда нужен чистый JSON для эмбеддингов.
- Создателям датасетов для LoRA. Когда вы генерируете разметку автоматически и каждая ошибка в JSON портит обучение.
- Инженерам, которые запускают модели на edge-устройствах. Когда нет доступа к мощным API, а Mistral-Nemo иногда сбоит.
- Всем, кто устал писать try-catch вокруг JSON.parse после каждого вызова LLM.
Ограничения (чтобы не было сюрпризов)
Библиотека не волшебная. Она не исправит:
- Логические ошибки (неправильные типы данных)
- Пропущенные обязательные поля
- Некорректные значения (даты в странном формате)
- Вложенные структуры с глубиной больше 100 уровней (зачем вам такое?)
И да, если модель выдала чистый текст без намека на JSON, библиотека вернет null. Это фича, а не баг.
Что делать, если Loot-JSON не справляется
Сначала проверьте промпты. Возможно, проблема в том, как вы просите модель генерировать JSON. Есть техники, которые заставляют даже маленькие модели слушаться.
Если модель постоянно ошибается в одном месте (например, забывает закрывать массивы), добавьте явное указание в промпт: "Закройте все массивы и объекты".
Для сложных случаев используйте двухэтапную обработку: Loot-JSON для базовой очистки, затем валидация по схеме (например, с Zod).
И последний совет: иногда проще выбрать более подходящую модель. Если вам критически важен стабильный JSON-вывод, посмотрите в сторону специализированных моделей с тренировкой на структурированных данных. Или используйте ISON вместо JSON для экономии токенов и упрощения парсинга.
Loot-JSON - это пластырь. Хороший, качественный, стерильный. Но лечить нужно причину. А причина в том, что маленькие LLM все еще учатся точно следовать форматам. До 2028 года такие инструменты будут нужны каждому, кто работает с локальными моделями. Просто примите это и установите npm install loot-json.