Text splitters¶
Text splitters разбивают большие документы на более мелкие фрагменты, которые можно извлекать по отдельности и которые укладываются в ограничение контекстного окна модели.
Существует несколько стратегий разбиения документов, каждая из которых имеет свои преимущества.
На основе структуры текста¶
Текст естественным образом организован в иерархические единицы, такие как абзацы, предложения и слова. Мы можем использовать эту врождённую структуру для определения стратегии разбиения, создавая фрагменты, которые сохраняют естественный языковой поток, семантическую целостность внутри фрагмента и адаптируются к различным уровням детализации текста. RecursiveCharacterTextSplitter из LangChain реализует эту концепцию:
- RecursiveCharacterTextSplitter пытается сохранить более крупные единицы (например, абзацы) нетронутыми.
- Если единица превышает размер фрагмента, он переходит на следующий уровень (например, предложения).
- Этот процесс продолжается вплоть до уровня слов, если это необходимо.
Пример использования:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)
Доступные text splitters:
На основе длины¶
Интуитивная стратегия — разбивать документы на основе их длины. Этот простой, но эффективный подход гарантирует, что каждый фрагмент не превышает заданного ограничения по размеру. Основные преимущества разбиения на основе длины:
- Простота реализации
- Последовательные размеры фрагментов
- Лёгкая адаптация под требования различных моделей
Типы разбиения на основе длины:
- На основе токенов: разбиение текста по количеству токенов, что полезно при работе с языковыми моделями.
- На основе символов: разбиение текста по количеству символов, что может быть более последовательным для разных типов текста.
Пример реализации с использованием CharacterTextSplitter из LangChain с разбиением по токенам:
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(document)
Доступные text splitters:
На основе структуры документа¶
Некоторые документы имеют встроенную структуру, например HTML-, Markdown- или JSON-файлы. В таких случаях выгодно разбивать документ в соответствии с его структурой, так как она часто естественным образом группирует семантически связанный текст. Основные преимущества разбиения на основе структуры:
- Сохранение логической организации документа
- Поддержание контекста внутри каждого фрагмента
- Может быть эффективнее для последующих задач, таких как поиск или суммаризация
Примеры разбиения на основе структуры:
- Markdown: разбиение по заголовкам (например,
#,##,###) - HTML: разбиение по тегам
- JSON: разбиение по элементам объекта или массива
- Код: разбиение по функциям, классам или логическим блокам
Доступные text splitters:
Специфичные для провайдера¶
Source: https://docs.langchain.com/oss/python/integrations/splitters