0Pricing
AI Agents · Урок

Стратегии разбиения (фиксированные, по предложениям, семантические)

Изучите компромиссы между разбиением на фрагменты фиксированного размера, с учётом предложений и по смыслу для повышения качества поиска.

«Стратегии разбиения (фиксированные, по предложениям, семантические)» — бесплатный урок 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) родительский абзац для получения контекста:

  1. Получите эмбеддинги фрагментов на уровне предложений
  2. При совпадении верните родительский фрагмент размером 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что решает RAG (ограниченность знаний, галлюцинации)
  2. Стратегии разбиения (фиксированные, по предложениям, семантические)
  3. Индексация набора документов
  4. Создание простого RAG с FAISS или Chroma
← Назад к AI Agents