Постановка задачи
Для построения Retrieval‑Augmented Generation (RAG) необходимо разбивать большие документы на смысловые фрагменты — чанки, которые потом индексируются в векторной базе. При работе с нормативными актами в строительстве команда Gramax столкнулась с тем, что ручная разметка более 5 000 страниц требовала полугода усилий и была подвержена человеческим ошибкам. Цель была ясна: создать полностью автоматический пайплайн, обеспечивающий стабильную точность поиска выше 90 % и минимизирующий затраты на подготовку данных.
Выбор подходов к чанкингу
Первым шагом стало сравнение традиционных методов разбиения текста:
| Метод | Принцип | Плюсы | Минусы |
|---|---|---|---|
| Статическое фиксированное окно (N‑gram) | Разделение по количеству токенов | Простота реализации | Нарушение семантической целостности |
| Разделение по заголовкам и структуре (Markdown/HTML) | Использование разметки | Сохранение логических границ | Требует чистой разметки |
| Семантическое разбиение (Sentence‑BERT) | Кластеризация предложений по эмбеддингам | Учет смысловой близости | Высокая вычислительная нагрузка |
Были проведены быстрые эксперименты с каждым вариантом на небольшом наборе ГОСТов. Статические окна показали низкую точность (≈ 68 %) из‑за разрыва тематических блоков, а разметка в оригинальных файлах часто была неполной, что снизило эффективность заголовочного метода. Оставалась только семантическая сегментация, но её реализация требовала оптимизации.
Прототипирование и первые результаты
Для семантического разбиения был выбран Sentence‑Transformers model all-MiniLM-L6-v2 — лёгкая модель, генерирующая 384‑мерные эмбеддинги за небольшое время. Пайплайн прототипа включал следующие шаги:
- Токенизация документа в предложения с помощью spaCy.
- Получение эмбеддингов каждого предложения.
- Кластеризация эмбеддингов с помощью алгоритма Agglomerative Clustering, ограничивая число предложений в кластере диапазоном 150‑250 токенов.
- Сборка чанков из предложений внутри кластера, проверка границ на разрывы пунктуации и сохранение метаданных (номер главы, номер страницы).
Тестовый набор из 200 000 предложений был обработан за 12 минут, а полученные чанки прошли базовую проверку на когерентность. На этапе оценки точности метки relevance использовалась модель cross‑encoder/msmarco-MiniLM-L6-v2, сравнивающая запрос и чанк. Средняя точность (Recall@10) составила 78 %, что уже превышало результаты фиксированного окна, но требовалось дальнейшее улучшение.
Оптимизация пайплайна
Улучшение кластеризации
Для повышения семантической согласованности чанков была введена динамическая оценка плотности кластера. Вместо фиксированного числа предложений в кластере использовалась метрика Silhouette Score, позволяющая автоматически определять оптимальное количество предложений, пока показатель не упал ниже 0.25. Это привело к более естественным границам, особенно в разделах с высоким уровнем детализации.
Интеграция правил бизнес‑логики
Структура ГОСТов подразумевает наличие нумерованных пунктов и таблиц. Были добавлены пост‑обработки:
- Сохранение нумерации: если в кластере оказался пункт с номером, он переносился в начало чанка.
- Объединение таблиц: таблицы, разбитые между двумя кластерами, автоматически объединялись в один чанк, чтобы избежать потери контекста.
Параллелизация и кэширование
Для работы с полным набором документов (≈ 30 GB текста) пайплайн был переписан на Dask, распределяя задачи токенизации и эмбеддингов по нескольким воркерам. Кэширование промежуточных эмбеддингов в Redis позволило сократить время повторных запусков на 40 %.
Метрики и оценка качества
После оптимизаций пайплайн был протестирован на полном наборе строительных ГОСТов (≈ 12 000 страниц). Основные метрики:
| Метрика | Значение |
|---|---|
| Recall@5 | 92 % |
| Recall@10 | 95 % |
| Средняя длина чанка | 210 токенов |
| Время обработки (полный набор) | 1 ч 15 мин |
| Потребление GPU | 2 × NVIDIA A100 (40 GB) |
Для контроля качества был построен скрипт, автоматически сравнивающий ответы RAG‑модели (GPT‑4‑turbo) с эталонными ответами, сформированными экспертами. Ошибки классифицировались по типу (неполный контекст, неверный ответ) и использовались для дальнейшего тонкого подгонки кластеризации.
Внедрение в продакшн
Автоматический пайплайн стал частью CI/CD процесса Gramax. При добавлении нового документа в репозиторий система запускает DAG в Airflow, который:
- Скачивает документ из хранилища.
- Запускает семантическое чанкование с актуальными параметрами.
- Индексирует полученные чанки в векторную базу Milvus.
- Обновляет метаданные в PostgreSQL для поиска по атрибутам (раздел, ГОСТ, дата публикации).
Мониторинг включает графики загрузки GPU, времени обработки и метрик Recall, которые записываются в Prometheus и визуализируются в Grafana. При падении точности ниже 90 % система автоматически генерирует тикет в Jira для пересмотра параметров кластеризации.
В результате полностью автоматизированный процесс чанкования сократил время подготовки данных с полугода до нескольких часов, а точность поиска стабильно держится выше 95 %. Такой подход доказал свою эффективность для крупных нормативных баз и может быть адаптирован к другим отраслям, где требуется быстрое и точное семантическое извлечение информации.