Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Разделение больших документов на небольшие части может помочь вам оставаться в пределах максимальных ограничений по количеству токенов для завершения чата и встраивания моделей. Например, максимальная длина входного текста для модели Azure OpenAI text-embedding-3-small составляет 8 191 токенов. Учитывая, что каждый маркер составляет около четырех символов текста для распространенных моделей OpenAI, это максимальное ограничение эквивалентно около 6000 слов текста. Если вы используете эти модели для генерации эмбеддингов, важно, чтобы входной текст соответствовал лимиту.
Модели завершения чата имеют одинаковые ограничения маркера ввода, поэтому фрагментирование полезно для retrieval augmented generation (RAG) или agentic retrieval. Секционирование содержимого на блоки помогает соответствовать требованиям к входным маркерам и предотвращает потерю данных из-за усечения.
Поиск ИИ Azure имеет встроенные решения для фрагментирования содержимого, а также для векторизации векторного содержимого, если вы используете векторный поиск. Встроенный подход зависит от встроенных индексаторов и наборов навыков, которые обеспечивают разделение текста и генерацию внедрений. Если вы не можете использовать встроенную векторизацию, в этой статье описываются некоторые альтернативные подходы к фрагментации содержимого.
Подсказка
Если вы разбиваете содержимое для агентного извлечения, несколько источников знаний могут создать полный процесс индексирования с разделением и, при необходимости, векторизацией содержимого. Индексатор, определение источника данных, набор навыков и другие элементы создаются на основе сведений в определении источника знаний. Источники знаний с этой возможностью включают Azure Blob Storage и OneLake.
Распространенные методы группировки
Фрагментирование требуется только в том случае, если исходные документы слишком большие для максимального размера входных данных, введенных моделями, но это также полезно, если содержимое плохо представлено в виде одного вектора. Рассмотрим вики-страницу, которая охватывает множество различных подразделов. Вся страница может быть достаточно небольшой, чтобы соответствовать требованиям к входным данным модели, но вы можете получить лучшие результаты, если разобьете ее на более мелкие части.
Ниже приведены некоторые распространенные методы членения, связанные с использованием встроенных функций, если вы используете индексаторы и навыки.
| Подход | Использование | Встроенные функции |
|---|---|---|
| Блоки фиксированного размера | Определите фиксированный размер, достаточный для семантически значимых абзацев (например, 200 слов или 600 символов) и позволяет перекрывать некоторые (например, 10-15% содержимого) могут создавать хорошие блоки в качестве входных данных для внедрения генераторов векторов. | Навык разделения текста, разделение по страницам (определяется длиной символов) |
| Блоки переменного размера на основе характеристик содержимого | Секционируйте конечные знаки препинания на основе данных, маркеры конца строки или использование функций в библиотеках обработки естественного языка (NLP), которые определяют структуру документов. Внедренная разметка, например HTML или Markdown, имеет синтаксис заголовка, который можно использовать для объединения данных по разделам. | Навык макета документа или навык разделения текста (разделение по предложениям). |
| Семантические блоки | Разделение содержимого на значимые единицы, которые сохраняют контекстные и семантические связи между предложениями и абзацами. Этот подход создает блоки, которые лучше поддерживают семантическую согласованность и могут охватывать границы страниц. | Навык распознавания содержимого Azure (семантическое сегментирование с выводом в формате markdown) |
| Настраиваемые сочетания | Используйте сочетание блоков фиксированного и переменного размера или расширьте подход. Например, при работе с большими документами можно использовать блоки размера переменной размера, но также добавить заголовок документа в блоки с середины документа, чтобы предотвратить потерю контекста. | Отсутствует |
| Разбор документа | Индексаторы могут анализировать более крупные исходные документы в небольшие документы поиска для индексирования. Строго говоря, этот подход не представляет собой фрагментацию, но иногда может достичь той же цели. | Индексирование БОЛЬШИХ двоичных объектов Markdown и файлов, индексирование одно ко многим или индексирование БОЛЬШИХ двоичных объектов и файлов JSON |
Рекомендации по перекрытию содержимого
При фрагментации данных на основе фиксированного размера перекрывание небольшого количества текста между блоками может помочь обеспечить непрерывность и контекст. Мы рекомендуем начать с размера блока 512 токенов (примерно 2000 символов) и начального перекрытия 25%, то есть 128 токенов. Это перекрытие обеспечивает более плавный переход между блоками без чрезмерного дублирования.
Оптимальное перекрытие может отличаться в зависимости от типа контента и варианта использования. Например, для высокоструктурированных данных может потребоваться меньше перекрытия, а текст беседы или повествования может воспользоваться большим преимуществом.
Факторы для разбиения данных на части
Когда дело доходит до разбиения данных на блоки, рассмотрите эти факторы:
Форма и плотность документов. Если вам нужен нетронутый текст или фрагменты, использование больших блоков и блоков переменного размера, сохраняющих структуру предложения, может привести к улучшению результатов.
Запросы пользователей: большие блоки и перекрывающиеся стратегии помогают сохранять контекст и семантические возможности для запросов, предназначенных для конкретных сведений.
Крупные языковые модели (LLM) имеют рекомендации по производительности для размера блока. Найдите размер блока, который лучше всего подходит для всех моделей, которые вы используете. Например, если вы используете модели для суммирования и внедрения, выберите оптимальный размер блока, который работает для обоих.
Как фрагментирование вписывается в рабочий процесс
Если у вас есть большие документы, добавьте этап разбиения в рабочие процессы индексирования и запроса, чтобы разделить большой текст на части. При использовании встроенной векторизации часто используется стратегия блокирования по умолчанию с помощью навыка разделения текста. Вы также можете применить настраиваемую стратегию разбиения на части с помощью пользовательского навыка. См. эту ссылку на код для примера семантического фрагментирования с помощью пользовательского навыка. Некоторые внешние библиотеки, обеспечивающие разбиение на блоки, предоставляют:
Большинство библиотек предоставляют распространенные методы разбиения на части для фиксированного размера, переменного размера или их сочетания. Можно также указать перекрытие, дублирующее небольшое количество содержимого в каждом блоке для сохранения контекста.
Примеры фрагментирования
В следующих примерах показано, как стратегии фрагментирования применяются к PDF-файлу электронной книги НАСА «Земля в ночное время».
Пример навыка разделения текста
Интеграция разделения данных с помощью навыка Text Split общедоступна.
В этом разделе описано встроенное разбиение данных с помощью подхода на основе навыков и параметров навыка Text Split.
Пример записной книжки для этого примера можно найти в репозитории azure-search-vector-samples .
Установите textSplitMode для разбиения содержимого на небольшие блоки:
-
pages(по умолчанию). Блоки состоят из нескольких предложений. -
sentences. Блоки состоят из отдельных предложений. То, что представляет собой "предложение", зависит от языка. В английском языке предложения заканчиваются стандартными знаками препинания, такими как.или!. Язык управляется параметромdefaultLanguageCode.
Параметр pages добавляет дополнительные параметры:
-
maximumPageLengthопределяет максимальное число символов 1 или токенов 2 в каждом блоке. Разделитель текста избегает разбиения предложений, поэтому фактическое число символов зависит от содержимого. -
pageOverlapLengthопределяет количество символов из конца предыдущей страницы в начале следующей страницы. Если задано, это должно быть меньше половины максимальной длины страницы. -
maximumPagesToTakeопределяет, сколько страниц и блоков требуется принимать из документа. Значение по умолчанию равно 0, что означает, что будут обрабатываться все страницы или блоки документа.
1 Символы не соответствуют определению маркера. Количество токенов, измеряемых при помощи LLM, может отличаться от количества символов, определяемого с помощью навыка разделения текста с фиксированным размером для каждого символа.
2 Фрагментирование маркеров доступно в 2025-11-01-preview и включает дополнительные параметры для указания токенизатора и любых маркеров, которые не должны разделяться во время фрагментирования.
В следующей таблице показано, как выбор параметров влияет на общее количество фрагментов в электронной книге 'Земля ночью'.
textSplitMode |
maximumPageLength |
pageOverlapLength |
Общее количество блоков |
|---|---|---|---|
pages |
1000 | 0 | 172 |
pages |
1000 | 200 | 216 |
pages |
2000 | 0 | 85 |
pages |
2000 | 500 | 113 |
pages |
5 000 | 0 | 34 |
pages |
5 000 | 500 | 38 |
sentences |
Неприменимо | Неприменимо | 13361 |
Использование textSplitMode из pages приводит к тому, что в большинстве блоков общее число символов близко к maximumPageLength. Количество символов в фрагменте зависит от того, где границы предложений попадают в фрагмент. Длина маркера блока зависит от различий в содержимом блока.
Оптимальный выбор параметров зависит от того, как используются блоки. Для большинства приложений рекомендуется начать со следующих параметров по умолчанию при использовании числа символов:
textSplitMode |
maximumPageLength |
pageOverlapLength |
|---|---|---|
pages |
2000 | 500 |
Пример фрагментирования данных LangChain
LangChain предоставляет загрузчики документов и разделители текста. В этом примере показано, как загрузить PDF-файл, подсчитать количество токенов и настроить разделитель текста. Получение количеств маркеров помогает принять обоснованное решение по размеру частей.
Пример записной книжки для этого примера можно найти в репозитории azure-search-vector-samples .
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("./data/earth_at_night_508.pdf")
pages = loader.load()
print(len(pages))
Выходные данные указывают на 200 документов или страниц в ФОРМАТЕ PDF.
Чтобы получить оценочное количество токенов для этих страниц, используйте TikToken.
import tiktoken
tokenizer = tiktoken.get_encoding('cl100k_base')
def tiktoken_len(text):
tokens = tokenizer.encode(
text,
disallowed_special=()
)
return len(tokens)
tiktoken.encoding_for_model('gpt-4.1-mini')
# create the length function
token_counts = []
for page in pages:
token_counts.append(tiktoken_len(page.page_content))
min_token_count = min(token_counts)
avg_token_count = int(sum(token_counts) / len(token_counts))
max_token_count = max(token_counts)
# print token counts
print(f"Min: {min_token_count}")
print(f"Avg: {avg_token_count}")
print(f"Max: {max_token_count}")
Выходные данные указывают на то, что на страницах нет нулевых маркеров, средняя длина токена на страницу составляет 189 маркеров, а максимальное количество маркеров любой страницы — 1583.
Знание среднего и максимального размера токенов помогает определить настройку размера блока. Хотя вы можете использовать стандартную рекомендацию 2000 символов с перекрытием в 500 символов, в этом случае имеет смысл снизить число, учитывая количество токенов примера документа. На самом деле, установка значения перекрытия, которое слишком велико, может привести к тому, что никакого перекрытия вообще не будет видно.
from langchain.text_splitter import RecursiveCharacterTextSplitter
# split documents into text and embeddings
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len,
is_separator_regex=False
)
chunks = text_splitter.split_documents(pages)
print(chunks[20])
print(chunks[21])
Выходные данные для двух последовательных блоков показывают текст из первого блока, перекрывающегося на второй блок. Выходные данные легко редактируются для удобства чтения.
'x Earth at NightForeword\nNASA’s Earth at Night explores the brilliance of our planet when it is in darkness. \n It is a compilation of stories depicting the interactions between science and \nwonder, and I am pleased to share this visually stunning and captivating exploration of \nour home planet.\nFrom space, our Earth looks tranquil. The blue ethereal vastness of the oceans \nharmoniously shares the space with verdant green land—an undercurrent of gentle-ness and solitude. But spending time gazing at the images presented in this book, our home planet at night instantly reveals a different reality. Beautiful, filled with glow-ing communities, natural wonders, and striking illumination, our world is bustling with activity and life.**\nDarkness is not void of illumination. It is the contrast, the area between light and'** metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}
'**Darkness is not void of illumination. It is the contrast, the area between light and **\ndark, that is often the most illustrative. Darkness reminds me of where I came from and where I am now—from a small town in the mountains, to the unique vantage point of the Nation’s capital. Darkness is where dreamers and learners of all ages peer into the universe and think of questions about themselves and their space in the cosmos. Light is where they work, where they gather, and take time together.\nNASA’s spacefaring satellites have compiled an unprecedented record of our \nEarth, and its luminescence in darkness, to captivate and spark curiosity. These missions see the contrast between dark and light through the lenses of scientific instruments. Our home planet is full of complex and dynamic cycles and processes. These soaring observers show us new ways to discern the nuances of light created by natural and human-made sources, such as auroras, wildfires, cities, phytoplankton, and volcanoes.' metadata={'source': './data/earth_at_night_508.pdf', 'page': 9}
Пользовательский навык
Пример разбиения на блоки фиксированного размера и генерации встраиваний демонстрирует и разбиение на блоки, и генерацию векторных встраиваний с помощью моделей для векторов встраивания Azure OpenAI. В этом примере пользовательский навык поиска ИИ Azure используется в репо Power Skills для обёртывания шага фрагментирования.