Late Chunking
При отложенном чанкинге весь документ кодируется моделью с длинным контекстом, а затем векторы токенов объединяются отдельно для каждого фрагмента, поэтому эмбеддинг каждого фрагмента сохраняет контекст документа.
Поздняя нарезка на фрагменты — это способ создавать векторные представления фрагментов документа: модель векторизации с длинным контекстом сначала кодирует весь документ, затем полученные векторы токенов разделяются по границам фрагментов и усредняются, чтобы получить по одному векторному представлению на фрагмент. К моменту усреднения каждый токен уже учитывает весь документ, поэтому в предложении «его нужно заменить» сохраняется информация о том, к чему относится «его». Метод предложили исследователи Jina AI в статье 2024 года Поздняя нарезка на фрагменты: контекстные векторные представления фрагментов с помощью моделей векторизации с длинным контекстом. Он применяется к уже существующим моделям векторизации и не требует дополнительного обучения.
Почему векторные представления фрагментов теряют контекст#
Системы генерации с дополнением извлечёнными данными (RAG) делят документы на фрагменты, чтобы каждый вектор представлял отдельный тематический отрывок, а извлечённый текст помещался в контекстное окно модели. При обычной нарезке каждый фрагмент векторизуется отдельно, из-за чего теряются все связи с предыдущим текстом. Возьмём два соседних предложения из руководства: «Насос XR-12 циркулирует охлаждающую жидкость через линию прессования». и «Его нужно заменить после 10 000 часов работы». При отдельной векторизации во втором предложении не упоминается насос XR-12, поэтому при поиске по векторному представлению оно лишь слабо соответствует вопросу о замене этого насоса, хотя содержит ответ.
Как работает позднее разбиение на фрагменты#
Весь документ токенизируется, и для каждого фрагмента записывается диапазон токенов; границы может задавать любой разделитель, в том числе фиксированный размер или семантическое разбиение. Затем вся последовательность токенов проходит через модель векторизации на основе трансформера, где механизм самовнимания смешивает информацию каждого токена с информацией всех остальных. Наконец, векторы токенов внутри каждого диапазона усредняются, образуя векторное представление фрагмента. Документы длиннее предельного размера входных данных модели — например, 8192 токенов в моделях jina-embeddings-v2 от Jina — кодируются перекрывающимися макрофрагментами. В статье этот подход называется длинной поздней нарезкой на фрагменты.
В примере ниже предложение о насосе векторизуется обоими способами с помощью небольшой модели Sentence Transformers, а затем каждый вариант сравнивается с вопросом:
import torch
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
chunks = [
"The XR-12 pump circulates coolant through the press line.",
"It must be replaced after 10,000 operating hours.",
]
query = model.encode("When should the XR-12 pump be replaced?", convert_to_tensor=True)
# Обычная нарезка: отдельно векторизовать второй фрагмент
naive = model.encode(chunks[1], convert_to_tensor=True)
# Поздняя нарезка: кодировать весь документ, затем усреднить только токены второго фрагмента
tokens = model.encode(" ".join(chunks), output_value="token_embeddings")
start = len(model.tokenizer(chunks[0])["input_ids"]) - 1 # токены [CLS] + фрагмента 1
late = tokens[start:-1].mean(dim=0) # удалить последний [SEP]
for name, emb in [("naive", naive), ("late", late)]:
print(name, round(torch.cosine_similarity(query, emb, dim=0).item(), 3))Отдельно векторизованный фрагмент получает оценку 0,382 при сравнении с вопросом, а тот же фрагмент после поздней нарезки — 0,62, поскольку его токены учитывали «Насос XR-12» до усреднения.
Обнаружение объектов претерпело такое же изменение в 2015 году. R-CNN запускала свёрточную сеть отдельно для каждого предложенного фрагмента изображения, а Fast R-CNN запускала её один раз на всём изображении и усредняла признаки каждого фрагмента по общим картам признаков. С backbone VGG16 это ускорило обнаружение при тестировании в 213 раз. Ultralytics YOLO26 тоже один раз запускает backbone на всём изображении и предсказывает все рамки по общим признакам, поэтому обнаружение не выполняется на изолированном фрагменте.
Поздняя нарезка на фрагменты и связанные методы#
- Контекстный поиск: перед индексацией добавляет к каждому фрагменту заметку, написанную LLM. Для этого нужен один вызов LLM на фрагмент; метод также помогает при поиске по ключевым словам, поскольку добавленный контекст представлен текстом.
- Позднее взаимодействие ColBERT: сохраняет один вектор на токен и сравнивает их с запросом во время поиска. При поздней нарезке получается один вектор на фрагмент, поэтому результат совместим с любым стандартным векторным индексом.
- Перекрытие фрагментов: повторяет несколько предложений в соседних фрагментах. Сохраняет только ближайший контекст и увеличивает размер индекса.
- Модели переранжирования: упорядочивают найденные кандидаты с помощью более мощной модели после первого поиска и хорошо сочетаются с поздней нарезкой на фрагменты.
Когда полезна поздняя нарезка на фрагменты#
Преимущество особенно велико, когда фрагменты зависят от предыдущего текста: например, содержат местоимения, аббревиатуры, определённые ранее, и повествования из отчётов и руководств. Оно минимально для коротких самодостаточных записей, таких как названия товаров. Для метода нужна модель векторизации, которая усредняет токены и предоставляет доступ к выходным векторам токенов. Кроме того, документ нужно кодировать заново после любого изменения. Векторы фрагментов после поздней нарезки без изменений помещаются в обычную векторную базу данных. API векторизации Jina предоставляет этот метод через параметр late_chunking, который кодирует список последовательных фрагментов как один документ.










