Стратегии разбиения (фиксированные, по предложениям, семантические)
Изучите компромиссы между разбиением на фрагменты фиксированного размера, с учётом предложений и по смыслу для повышения качества поиска.
«Стратегии разбиения (фиксированные, по предложениям, семантические)» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Зачем нужны фрагменты
Нельзя преобразовать целый PDF объёмом 200 страниц в один вектор — вектор будет слишком абстрактным, чтобы соответствовать конкретным запросам. Разделите документ на небольшие фрагменты (примерно по 200–800 токенов), получите эмбеддинг каждого и выполняйте поиск на уровне фрагментов.
Разбиение на фрагменты фиксированного размера
Самый простой подход — разделять текст через каждые N символов или токенов:
def fixed_chunks(text, chunk_size=1000, overlap=200):
chunks = []
i = 0
while i < len(text):
chunks.append(text[i:i + chunk_size])
i += chunk_size - overlap
return chunks
sample_text = "A" * 2500
chunks = fixed_chunks(sample_text, chunk_size=1000, overlap=200)
print(f"Split {len(sample_text)} characters into {len(chunks)} chunks")
for i, c in enumerate(chunks):
print(f"Chunk {i+1}: {len(c)} chars")
Зачем нужно перекрытие
Перекрытие (обычно 10–20% размера фрагмента) гарантирует, что предложение, пересекающее границу, целиком попадёт хотя бы в один фрагмент. Без перекрытия важный факт, разделённый между фрагментами, может оказаться недоступным для извлечения.
Разбиение по предложениям
Разделяйте текст по границам предложений — никогда не разрывайте предложение посередине:
import re
def sentence_chunks(text, max_chars=1000):
sentences = re.split(r'(?<=[.!?])\s+', text)
chunks = []
current = ''
for s in sentences:
if len(current) + len(s) > max_chars and current:
chunks.append(current.strip())
current = s
else:
current += ' ' + s
if current:
chunks.append(current.strip())
return chunks
sample_text = "This is sentence one. This is sentence two! Is this sentence three? Yes it is."
chunks = sentence_chunks(sample_text, max_chars=40)
for i, c in enumerate(chunks):
print(f"Chunk {i+1}: {c!r}")
Рекурсивное разбиение (LangChain)
RecursiveCharacterTextSplitter из LangChain сначала пытается разделять текст по границам абзацев, затем предложений и слов, сохраняя структуру настолько, насколько это возможно.
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=100,
separators=['\n\n', '\n', '. ', ' ']
)
chunks = splitter.split_text(document)Семантическое разбиение
Разделяйте текст там, где меняется тема. Реализации получают эмбеддинг каждого предложения и выполняют разделение там, где эмбеддинги соседних предложений сильно различаются.
Вычисление занимает больше времени, но в результате получаются тематически связные фрагменты.
Разбиение с учётом Markdown
В документах Markdown разделяйте текст по границам заголовков, чтобы сохранять разделы целиком. Каждый фрагмент наследует родительские заголовки как контекст.
Разбиение с учётом кода
В исходном коде разделяйте текст по границам функций и классов, а не по количеству символов. Такие инструменты, как tree-sitter, позволяют выполнять разбиение с учётом AST.
Выбор размера фрагмента
Компромиссы:
- Маленькие фрагменты (примерно 200 токенов) — точные совпадения, но больше фрагментов для управления
- Большие фрагменты (примерно 1000 токенов) — больше контекста для каждого совпадения, но меньшая точность
По умолчанию: 500–800 токенов с перекрытием 10–20%.
Сохранение метаданных
Добавляйте метаданные к каждому фрагменту:
- Исходный URL / путь к файлу
- Номер страницы
- Название документа
- Раздел / заголовок
- Временные метки создания / обновления
Это полезно для фильтрации, ссылок на источники и переранжирования.
Контекстные фрагменты
Современный подход: добавлять к каждому фрагменту однострочный контекст, сгенерированный LLM (например, «Этот фрагмент взят из финансового отчёта компании за 2-й квартал 2024 года и посвящён выручке»). Это повышает качество извлечения на 30–50%.
Фрагменты с родителем и потомком
Индексируйте небольшие фрагменты для точного совпадения, но извлекайте их БОЛЬШИЙ (LARGER) родительский абзац для получения контекста:
- Получите эмбеддинги фрагментов на уровне предложений
- При совпадении верните родительский фрагмент размером 800 токенов
Зачем нужно перекрытие
Почему фрагменты обычно перекрываются на 10–20%?
Итоги
Начните с рекурсивного разбиения по символам примерно на фрагменты по 800 токенов с перекрытием 10%. По мере роста требований добавляйте семантический и структурный анализ.
Часто задаваемые вопросы
Урок «Стратегии разбиения (фиксированные, по предложениям, семантические)» бесплатный?
Да — полный текст урока «Стратегии разбиения (фиксированные, по предложениям, семантические)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «Стратегии разбиения (фиксированные, по предложениям, семантические)»?
Изучите компромиссы между разбиением на фрагменты фиксированного размера, с учётом предложений и по смыслу для повышения качества поиска. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Стратегии разбиения (фиксированные, по предложениям, семантические)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что решает RAG (ограниченность знаний, галлюцинации)
- Стратегии разбиения (фиксированные, по предложениям, семантические)
- Индексация набора документов
- Создание простого RAG с FAISS или Chroma