Поделиться через


Разбиение больших документов для векторных поисковых решений в Azure ИИ Поиск

Разделение больших документов на небольшие блоки может помочь вам оставаться в пределах максимальных ограничений ввода токенов для моделей внедрения. Например, максимальная длина входного текста для модели Azure OpenAI с внедрением текста ada-002 составляет 8 191 токенов. Учитывая, что каждый маркер составляет около четырех символов текста для распространенных моделей OpenAI, это максимальное ограничение эквивалентно около 6000 слов текста. Если вы используете эти модели для генерации эмбеддингов, важно, чтобы входной текст соответствовал лимиту. Секционирование содержимого на блоки помогает удовлетворить требования к модели внедрения и предотвратить потерю данных из-за усечения.

Рекомендуем интегрированную векторизацию для построения фрагментов данных и их встраивания. Встроенная векторизация зависит от индексаторов и наборов функций, которые разделяют текст и создают эмбеддинги. Если вы не можете использовать встроенную векторизацию, в этой статье описываются некоторые альтернативные подходы к фрагментации содержимого.

Распространенные методы группировки

Фрагментирование требуется только в том случае, если исходные документы слишком большие для максимального размера входных данных, введенных моделями, но это также полезно, если содержимое плохо представлено в виде одного вектора. Рассмотрим вики-страницу, которая охватывает множество различных подразделов. Вся страница может быть достаточно небольшой, чтобы соответствовать требованиям к входным данным модели, но вы можете получить лучшие результаты, если разобьете ее на более мелкие части.

Ниже приведены некоторые распространенные методы членения, связанные с использованием встроенных функций, если вы используете индексаторы и навыки.

Подход Использование Встроенные функции
Блоки фиксированного размера Определите фиксированный размер, достаточный для семантически значимых абзацев (например, 200 слов или 600 символов) и позволяет перекрывать некоторые (например, 10-15% содержимого) могут создавать хорошие блоки в качестве входных данных для внедрения генераторов векторов. Навык разделения текста, разделение по страницам (определяется длиной символов)
Блоки переменного размера на основе характеристик содержимого Секционируйте конечные знаки препинания на основе данных, маркеры конца строки или использование функций в библиотеках обработки естественного языка (NLP), которые определяют структуру документов. Внедренная разметка, например HTML или Markdown, имеет синтаксис заголовка, который можно использовать для объединения данных по разделам. Навык макета документа или навык разделения текста, разделенный по предложениям.
Настраиваемые сочетания Используйте сочетание блоков фиксированного и переменного размера или расширьте подход. Например, при работе с большими документами можно использовать блоки размера переменной размера, но также добавить заголовок документа в блоки с середины документа, чтобы предотвратить потерю контекста. Отсутствует
Разбор документа Индексаторы могут анализировать более крупные исходные документы в небольшие документы поиска для индексирования. Строго говоря, этот подход не представляет собой фрагментацию, но иногда может достичь той же цели. Индексация Markdown-блобов и файлов или индексирование с одним ко многим или индексация блобов JSON и файлов

Рекомендации по перекрытию содержимого

Если вы разбиваете данные на части фиксированного размера, перекрытие небольшого количества текста между частями может помочь сохранить контекст. Мы рекомендуем начинать с нахлёста примерно в 10 %. Например, учитывая фиксированный размер блока 256 токенов, вы начнете тестирование с перекрытием в 25 токенов. Фактическое количество перекрывающихся данных зависит от типа данных и конкретного варианта использования, но мы обнаружили, что 10-15% подходит для многих сценариев.

Факторы для разбиения данных на части

Когда дело доходит до разбиения данных на блоки, рассмотрите эти факторы:

  • Форма и плотность документов. Если вам нужен нетронутый текст или фрагменты, использование больших блоков и блоков переменного размера, сохраняющих структуру предложения, может привести к улучшению результатов.

  • Запросы пользователей: большие блоки и перекрывающиеся стратегии помогают сохранять контекст и семантические возможности для запросов, предназначенных для конкретных сведений.

  • Крупные языковые модели (LLM) имеют рекомендации по производительности для размера блока. Найдите размер блока, который лучше всего подходит для всех моделей, которые вы используете. Например, если вы используете модели для суммирования и внедрения, выберите оптимальный размер блока, который работает для обоих.

Как фрагментирование вписывается в рабочий процесс

Если у вас есть большие документы, добавьте этап разбиения в рабочие процессы индексирования и запроса, чтобы разделить большой текст на части. При использовании встроенной векторизации часто используется стратегия блокирования по умолчанию с помощью навыка разделения текста. Вы также можете применить настраиваемую стратегию разбиения на части с помощью пользовательского навыка. Некоторые внешние библиотеки, обеспечивающие разбиение на блоки, предоставляют:

Большинство библиотек предоставляют распространенные методы разбиения на части для фиксированного размера, переменного размера или их сочетания. Можно также указать перекрытие, дублирующее небольшое количество содержимого в каждом блоке для сохранения контекста.

Примеры фрагментирования

В следующих примерах показано, как стратегии фрагментирования применяются к PDF-файлу электронной книги НАСА «Земля в ночное время».

Пример навыка разделения текста

Интеграция разделения данных с помощью навыка Text Split общедоступна.

В этом разделе описано встроенное разбиение данных с помощью подхода на основе навыков и параметров навыка Text Split.

Пример записной книжки для этого примера можно найти в репозитории azure-search-vector-samples . Установите textSplitMode для разбиения содержимого на небольшие блоки:

  • pages (по умолчанию). Блоки состоят из нескольких предложений.
  • sentences. Блоки состоят из отдельных предложений. То, что представляет собой "предложение", зависит от языка. В английском языке предложения заканчиваются стандартными знаками препинания, такими как . или !. Язык управляется параметром defaultLanguageCode .

Параметр pages добавляет дополнительные параметры:

  • maximumPageLengthопределяет максимальное число символов 1 или токенов 2 в каждом блоке. Разделитель текста избегает разбиения предложений, поэтому фактическое число символов зависит от содержимого.
  • pageOverlapLength определяет количество символов из конца предыдущей страницы в начале следующей страницы. Если задано, это должно быть меньше половины максимальной длины страницы.
  • maximumPagesToTake определяет, сколько страниц и блоков требуется принимать из документа. Значение по умолчанию равно 0, что означает, что будут обрабатываться все страницы или блоки документа.

1 Символы не соответствуют определению маркера. Количество токенов, измеряемых LLM, может отличаться от количества символов, измеряемого функцией разделения текста.

2 Разбиение токенов доступно в предварительном просмотре 2024-09-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. Количество символов в фрагменте зависит от того, где границы предложений попадают в фрагмент. Длина маркера блока зависит от различий в содержимом блока.

В следующих гистограммах показано, как сравнивается распределение длины символов в чанке с длиной токенов в чанке для gpt-35-turbo при использовании textSplitMode, pages, maximumPageLength 2000 и pageOverlapLength 500 в книге "Земля ночью":

Гистограмма количества символов блока для максимального значенияPageLength 2000 и pageOverlapLength 500.

Гистограмма количества маркеров блока для максимального значенияPageLength 2000 и pageOverlapLength 500.

Использование textSplitMode от sentences приводит к большому количеству блоков, состоящих из отдельных предложений. Эти блоки меньше, чем те, которые создаются с помощью pages, и число токенов в блоках более тесно соответствует количеству символов.

Следующие гистограммы показывают, как распределение длины символов блока сравнивается с длиной токенов блока для gpt-35-turbo при использовании textSplitModesentences в электронной книге «Земля ночью»:

Гистограмма количества символов фрагментов в предложениях.

Гистограмма числа токенов в блоке для предложений.

Оптимальный выбор параметров зависит от того, как используются блоки. Для большинства приложений рекомендуется начать со следующих параметров по умолчанию:

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-3.5-turbo')

# 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 для обёртывания шага фрагментирования.

См. также