Udostępnij przez


Fragmentowanie dużych dokumentów na potrzeby przeszukiwania wektorowego i agentowego pobierania w usłudze Azure AI Search

Podział dużych dokumentów na mniejsze fragmenty może pomóc w utrzymaniu się poniżej maksymalnych limitów wejściowych dla tokenów modeli uzupełniania czatu i modeli osadzania. Na przykład maksymalna długość tekstu wejściowego dla modelu osadzania tekstu text-embedding-3-small w usłudze Azure OpenAI to 8 191 tokenów. Biorąc pod uwagę, że każdy token zawiera około czterech znaków tekstu dla typowych modeli OpenAI, ten maksymalny limit odpowiada około 6000 wyrazom tekstu. Jeśli używasz tych modeli do generowania osadzania, ważne jest, aby tekst wejściowy pozostał w limicie.

Modele wypełniania czatów mają te same ograniczenia tokenu wejściowego, więc fragmentowanie jest przydatne w przypadku generowania wspomaganego odzyskiwaniem (RAG) lub odzyskiwania agentowego. Partycjonowanie zawartości na fragmenty pomaga spełnić wymagania dotyczące tokenu wejściowego i zapobiega utracie danych z powodu obcinania.

Usługa Azure AI Search ma wbudowane rozwiązania do fragmentowania zawartości, a także do wektoryzacji fragmentowanej zawartości, jeśli używasz wyszukiwania wektorowego. Wbudowane podejście ma zależność od wbudowanych indeksatorów i zestawów funkcji które umożliwiają dzielenie tekstu i generowanie osadzeń. Jeśli nie możesz użyć zintegrowanej wektoryzacji, w tym artykule opisano niektóre alternatywne podejścia do fragmentowania zawartości.

Wskazówka

Jeśli fragmentujesz zawartość na potrzeby agentowego pobierania, kilka źródeł wiedzy może wygenerować pełny potok indeksatora, który fragmentuje ją i opcjonalnie wektoryzuje. Indeksator, definicja źródła danych oraz zestaw umiejętności są tworzone dla Ciebie na podstawie informacji w definicji źródła wiedzy. Źródła wiedzy dysponujące tą funkcjonalnością obejmują obiekty blob platformy Azure i usługę OneLake.

Typowe techniki fragmentowania

Fragmentowanie jest wymagane tylko wtedy, gdy dokumenty źródłowe są zbyt duże dla maksymalnego rozmiaru wejściowego nałożonego przez modele, ale jest również korzystne, jeśli zawartość jest słabo reprezentowana jako pojedynczy wektor. Rozważ stronę typu wiki obejmującą wiele różnych tematów podrzędnych. Cała strona może być wystarczająco mała, aby spełnić wymagania dotyczące danych wejściowych modelu, ale możesz uzyskać lepsze wyniki, jeśli dokonasz podziału na bardziej szczegółowe fragmenty.

Poniżej przedstawiono kilka typowych technik fragmentowania skojarzonych z wbudowanymi funkcjami, jeśli używasz indeksatorów i umiejętności.

Metoda Użycie Wbudowane funkcje
Fragmenty o stałym rozmiarze Zdefiniuj stały rozmiar, który jest wystarczający dla semantycznie znaczących akapitów (na przykład 200 słów lub 600 znaków) i umożliwia nakładanie się (na przykład 10–15% zawartości) może generować dobre fragmenty jako dane wejściowe do osadzania generatorów wektorów. Umiejętność dzielenia tekstu, dzielenie według stron (definiowane przez długość znaku)
Fragmenty o zmiennym rozmiarze na podstawie cech zawartości Podziel swoje dane, opierając się na znakach interpunkcyjnych na końcu zdania, znacznikach końca linii lub użyciem funkcji w bibliotekach przetwarzania języka naturalnego (NLP), które wykrywają strukturę dokumentu. Osadzone znaczniki, takie jak HTML lub Markdown, mają składnię nagłówka, która może służyć do fragmentowania danych według sekcji. Umiejętność układu dokumentu lub umiejętność dzielenia tekstu (dzielenie według zdań).
Fragmenty semantyczne Podziel zawartość na znaczące jednostki, które zachowują relacje kontekstowe i semantyczne między zdaniami i akapitami. Takie podejście tworzy fragmenty, które lepiej utrzymują spójność semantyczną i mogą obejmować granice stron. Umiejętność usługi Azure Content Understanding (semantyczne dzielenie na fragmenty z wynikiem w formacie Markdown)
Kombinacje niestandardowe Użyj kombinacji fragmentów o stałym i zmiennym rozmiarze lub rozszerz podejście. Na przykład podczas pracy z dużymi dokumentami można użyć fragmentów o zmiennym rozmiarze, ale także dołączyć tytuł dokumentu do fragmentów z środka dokumentu, aby zapobiec utracie kontekstu. Żaden
Analizowanie dokumentów Indeksatory mogą analizować większe dokumenty źródłowe, dzieląc je na mniejsze dokumenty wyszukiwania na potrzeby indeksowania. Mówiąc ściśle, takie podejście nie jest fragmentujące , ale czasami może osiągnąć ten sam cel. Indeksowanie obiektów blob i plików Markdown, indeksowanie jeden-do-wielu lub indeksowanie obiektów blob i plików JSON

Zagadnienia dotyczące nakładania się zawartości

W przypadku fragmentowania danych na podstawie stałego rozmiaru nakładanie się na niewielką ilość tekstu między fragmentami może pomóc zachować ciągłość i kontekst. Zalecamy rozpoczęcie od rozmiaru fragmentu 512 tokenów (około 2000 znaków) oraz początkowego nakładania się w wysokości 25%, co odpowiada 128 tokenom. To nakładanie się zapewnia bezproblemowe przejścia między fragmentami bez nadmiernej duplikacji.

Optymalne nakładanie się może się różnić w zależności od typu zawartości i przypadku użycia. Na przykład wysoce ustrukturyzowane dane mogą wymagać mniejszego nakładania się, podczas gdy tekst konwersacji lub narracji może przynieść więcej korzyści.

Czynniki fragmentacji danych

Jeśli chodzi o fragmentowanie danych, zastanów się nad następującymi czynnikami:

  • Kształt i gęstość dokumentów. Jeśli potrzebujesz nienaruszonego tekstu lub fragmentów, większe części tekstu i zmienne segmenty, które zachowują strukturę zdań, mogą przynieść lepsze wyniki.

  • Zapytania użytkowników: większe fragmenty i nakładające się strategie pomagają zachować kontekst i semantyczne bogactwo zapytań ukierunkowanych na określone informacje.

  • Duże modele językowe (LLM) mają wytyczne dotyczące wydajności dotyczące rozmiaru fragmentu. Znajdź rozmiar fragmentu, który działa najlepiej dla wszystkich używanych modeli. Jeśli na przykład używasz modeli do podsumowania i osadzania, wybierz optymalny rozmiar fragmentu, który działa dla obu tych elementów.

Jak fragmentowanie pasuje do przepływu pracy

Jeśli masz duże dokumenty, wstaw krok fragmentowania do procesów indeksowania i zapytań, które dzielą duży tekst. W przypadku korzystania ze zintegrowanej wektoryzacji często stosowana jest domyślna strategia dzielenia za pomocą umiejętności Text Split. Możesz również zastosować niestandardową strategię fragmentowania przy użyciu niestandardowych umiejętności. Zapoznaj się z tym odwołaniem do kodu, aby zobaczyć przykład semantycznego fragmentowania przy użyciu niestandardowej umiejętności. Niektóre biblioteki zewnętrzne, które zapewniają fragmentowanie, obejmują:

Większość bibliotek udostępnia typowe techniki fragmentowania dla stałego rozmiaru, zmiennego rozmiaru lub kombinacji. Można również określić nakładanie się, które duplikuje niewielką ilość zawartości w każdym fragmentie na potrzeby zachowywania kontekstu.

Przykłady fragmentowania

W poniższych przykładach pokazano, w jaki sposób techniki dzielenia na części są stosowane do pliku PDF e-booka NASA 'Ziemia nocą':

Przykład umiejętności dzielenia tekstu

Zintegrowane dzielenie danych za pośrednictwem umiejętności dzielenia tekstu jest ogólnie dostępne.

W tej sekcji opisano wbudowane fragmentowanie danych przy użyciu podejścia opartego na umiejętnościach i parametrów umiejętności podziału tekstu.

Przykładowy notes dla tego przykładu można znaleźć w repozytorium azure-search-vector-samples . Ustaw textSplitMode podział zawartości na mniejsze fragmenty:

  • pages (wartość domyślna). Fragmenty składają się z wielu zdań.
  • sentences. Fragmenty składają się z pojedynczych zdań. To, co stanowi "zdanie", jest zależne od języka. W języku angielskim używane jest standardowe zdanie kończące znaki interpunkcyjne, takie jak . lub ! . Język jest kontrolowany przez parametr defaultLanguageCode.

Parametr pages dodaje dodatkowe parametry:

  • maximumPageLength definiuje maksymalną liczbę znaków 1 lub tokenów 2 w każdym kawałku. Rozdzielacz tekstu unika dzielenia zdań, więc rzeczywista liczba znaków zależy od zawartości.
  • pageOverlapLength określa, ile znaków od końca poprzedniej strony jest uwzględnionych na początku następnej strony. W przypadku ustawienia ta wartość musi być mniejsza niż połowa maksymalnej długości strony.
  • maximumPagesToTake definiuje liczbę stron/fragmentów do przejęcia z dokumentu. Wartość domyślna to 0, co oznacza, że wszystkie strony lub fragmenty zostaną pobrane z dokumentu.

1 Znaki nie pasują do definicji tokenu. Liczba tokenów mierzonych przez LLM może różnić się od rozmiaru znaków mierzonego przez funkcję podziału tekstu o określonej wielkości znaków.

2 Fragmentowanie tokenu jest dostępne w wersji 2025-11-01-preview i zawiera dodatkowe parametry do określania tokenizatora i wszystkich tokenów, które nie powinny być dzielone podczas fragmentowania.

W poniższej tabeli pokazano, jak wybór parametrów wpływa na łączną liczbę fragmentów ogółem z e-booka Ziemia nocą.

textSplitMode maximumPageLength pageOverlapLength Łączna liczba fragmentów
pages 1000 0 172
pages 1000 200 216
pages 2000 0 85
pages 2000 500 113
pages pięć tysięcy 0 34
pages pięć tysięcy 500 38
sentences N/A N/A 13361

Użycie textSplitMode z pages skutkuje tym, że liczba znaków w większości fragmentów jest zbliżona do maximumPageLength. Liczba znaków fragmentów różni się ze względu na różnice w położeniu granic zdań wewnątrz fragmentu. Długość tokenu w fragmencie różni się z powodu różnic w jego zawartości.

Optymalny wybór parametrów zależy od sposobu użycia fragmentów. W przypadku większości aplikacji zaleca się rozpoczęcie od następujących parametrów domyślnych w przypadku używania liczby znaków:

textSplitMode maximumPageLength pageOverlapLength
pages 2000 500

Przykład fragmentowania danych langchain

Usługa LangChain udostępnia moduły ładuwcze dokumentów i rozdzielacze tekstu. W tym przykładzie pokazano, jak załadować plik PDF, pobrać liczby tokenów i skonfigurować rozdzielacz tekstu. Uzyskiwanie liczby tokenów pomaga podjąć świadomą decyzję o określaniu rozmiaru fragmentów.

Przykładowy notes dla tego przykładu można znaleźć w repozytorium 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))

Dane wyjściowe wskazują 200 dokumentów lub stron w pliku PDF.

Aby uzyskać szacowaną liczbę tokenów dla tych stron, użyj tokenu 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}")

Dane wyjściowe wskazują, że żadne strony nie mają tokenów zerowych, średnia długość tokenu na stronę wynosi 189 tokenów, a maksymalna liczba tokenów dowolnej strony wynosi 1583.

Znajomość średniego i maksymalnego rozmiaru tokenu zapewnia wgląd w ustawianie rozmiaru fragmentu. Choć można użyć standardowej rekomendacji 2000 znaków z nakładającymi się 500 znakami, w tej sytuacji warto zmniejszyć liczbę znaków, biorąc pod uwagę liczbę tokenów w przykładowym dokumencie. W rzeczywistości ustawienie nakładającej się wartości, która jest zbyt duża, może spowodować, że w ogóle nie pojawią się nakładające się wartości.

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])

Dane wyjściowe dla dwóch kolejnych fragmentów pokazują tekst z pierwszego fragmentu nakładający się na drugi fragment. Dane wyjściowe są lekko edytowane w celu zapewnienia czytelności.

'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}

Umiejętność niestandardowa

Przykład generowania fragmentów o stałym rozmiarze i tworzenia osadzeń demonstruje zarówno fragmentowanie, jak i generowanie osadzeń wektorów przy użyciu modeli osadzeń Azure OpenAI. W tym przykładzie użyto niestandardowej umiejętności usługi Azure AI Search w repozytorium Power Skills, aby opakować etap segmentacji.

Zobacz także