Как я обучил русский RAG-сплиттер, который режет документы по индексам, а не по тексту
Документ сначала делится на нумерованные юниты: предложения, заголовки, таблицы и блоки кода. Модель возвращает JSON со списком границ, после чего хост режет оригинал по этим индексам и проверяет их валидность. Текст остаётся неизменным, поэтому не ломаются цитирование, подсветка фрагментов и оффсеты.
Основой стала T-lite-it-2.1 с более экономным для русского токенайзером: в тесте автора она использовала 1,74 токена на слово против 2,71 у Qwen2.5-7B и 3,17 у Llama-2. Модель обучили через bf16 LoRA на RTX 5090 за примерно 3,5 часа, а затем развернули в GGUF Q5_K_M на AMD Strix Halo через llama.cpp Vulkan. На одном тестовом документе из девяти юнитов полный проход занял около 1,2 секунды при 35 токенах вывода.
Метрика boundary-F1@±1 достигла 0,821 на сравнении с разметкой модели-учителя DeepSeek-V4-Flash, но это не оценка качества RAG. Downstream-тестов по hit-rate и faithfulness пока нет; кроме того, модель иногда пере-сегментирует, а очень большие таблицы требуют отдельного retrieval-пайплайна с саммари, группами строк и parent-document retrieval.
Коротко
- Сплиттер возвращает индексы границ чанков, а исходный текст режет хост, поэтому результат совпадает с документом байт-в-байт.
- В тесте автора T-lite-it-2.1 кодировала русский текст в 1,74 токена на слово против 2,71 у Qwen2.5 и 3,17 у Llama-2.
- Обучение bf16 LoRA заняло около 3,5 часа на RTX 5090, пиковое потребление памяти составило 25,4 ГБ VRAM.
- GGUF Q5_K_M размером около 5,9 ГБ работал на AMD Strix Halo через Vulkan без CUDA и обрабатывал тестовый документ примерно за 1,2 секунды.
- Boundary-F1@±1 равен 0,821 относительно разметки учителя, но downstream-оценки качества retrieval и faithfulness ещё не проводились.
FAQ
Зачем возвращать индексы границ вместо готового текста чанков и какую проблему это решает в RAG-пайплайне?
Модель не переписывает документ и не меняет символы, пробелы или кавычки. Это сохраняет точные цитаты и оффсеты, а также сокращает объём генерации до короткого JSON.
Почему таблицы сохраняются целиком и при каком условии эта гарантия перестаёт работать?
Таблица заранее становится одним атомарным юнитом, поэтому граница может пройти только до неё или после неё. Если upstream-парсер неправильно распознал структуру таблицы, сплиттер восстановить её не сможет.
Доказывает ли boundary-F1@±1 = 0,821, что новый сплиттер улучшает ответы RAG-системы?
Нет. Метрика показывает согласие с границами модели-учителя, а не рост hit-rate, faithfulness или качества конечных ответов; для этого нужен отдельный downstream-eval.
Читайте также
Как перенести расчёт абсолютных валютных курсов на Kaggle и автоматизировать обзоры через Gemini API
Три четверти сотрудников рекламных агентств готовы уйти из-за тендеров
Waze получит несколько новых функций на базе искусственного интеллекта
ИИ-агенты для бизнеса в России: обзор 10 локальных платформ и решений
Как дообучить LLM: пошаговый разбор
- Нарезка RAG-документов по индексам границ: LLM-сплиттер может возвращать не переписанные чанки, а индексы юнитов, после которых проходит граница. Хост затем режет исходный документ сам, что сохраняет текст байт-в-байт и не ломает цитирование, подсветку фрагментов и оффсеты.
[RAG и поиск по знаниям]
Зарегистрированные пользователи видят только два тезиса.
Зарегистрироваться
Автор обучил русский RAG-сплиттер, который не переписывает текст, а возвращает индексы границ чанков. Такой подход сохраняет исходный документ байт-в-байт, сокращает вывод до короткого JSON и не разрывает таблицы, если парсер заранее выделил их как отдельные блоки.