Dela via


Dela upp stora dokument för vektorsökningslösningar i Azure AI Search

Om du partitionerar stora dokument i mindre segment kan du hålla dig under de maximala tokeninmatningsgränserna för inbäddningsmodeller. Till exempel är den maximala längden på indatatext för modellen Azure OpenAI text-embedding-ada-002 8 191 token. Med tanke på att varje token är cirka fyra tecken med text för vanliga OpenAI-modeller motsvarar den här maxgränsen cirka 6 000 textord. Om du använder dessa modeller för att generera inbäddningar är det viktigt att indatatexten ligger under gränsen. Genom att partitionera innehållet i segment ser du till att dina data kan bearbetas av inbäddningsmodellerna och att du inte förlorar information på grund av trunkering.

Vi rekommenderar integrerad vektorisering för inbyggd datasegmentering och inbäddning. Integrerad vektorisering är beroende av indexerare, kompetensuppsättningar, kunskaper om textdelning och en inbäddningsfärdighet som Inbäddningsfärdighet i Azure OpenAI. Om du inte kan använda integrerad vektorisering beskrivs några metoder för segmentering av innehållet i den här artikeln.

Vanliga segmenteringstekniker

Segmentering krävs endast om källdokumenten är för stora för den maximala indatastorlek som anges av modeller.

Här följer några vanliga segmenteringstekniker som börjar med den mest använda metoden:

  • Segment med fast storlek: Definiera en fast storlek som räcker för semantiskt meningsfulla stycken (till exempel 200 ord) och tillåter viss överlappning (till exempel 10–15 % av innehållet) kan producera bra segment som indata för inbäddning av vektorgeneratorer.

  • Segment med variabel storlek baserat på innehåll: Partitionera dina data baserat på innehållsegenskaper, till exempel skiljetecken i slutet av meningen, markörer i slutet av raden eller användning av funktioner i NLP-biblioteken (Natural Language Processing). Markdown-språkstrukturen kan också användas för att dela upp data.

  • Anpassa eller iterera över någon av ovanstående tekniker. När du till exempel hanterar stora dokument kan du använda segment med variabel storlek, men även lägga till dokumentrubriken i segment från mitten av dokumentet för att förhindra kontextförlust.

Överväganden för överlappning av innehåll

När du delar upp data kan överlappning av en liten mängd text mellan segment bidra till att bevara kontexten. Vi rekommenderar att du börjar med en överlappning på cirka 10 %. Med en fast segmentstorlek på 256 token skulle du till exempel börja testa med överlappande 25 token. Den faktiska mängden överlappning varierar beroende på typen av data och det specifika användningsfallet, men vi har upptäckt att 10–15 % fungerar för många scenarier.

Faktorer för segmentering av data

När det gäller segmentering av data bör du tänka på följande faktorer:

  • Form och densitet för dina dokument. Om du behöver intakt text eller passager kan större segment och variabel segmentering som bevarar meningsstrukturen ge bättre resultat.

  • Användarfrågor: Större segment och överlappande strategier bidrar till att bevara kontext och semantisk rikedom för frågor som riktar sig mot specifik information.

  • Stora språkmodeller (LLM) har prestandariktlinjer för segmentstorlek. du måste ange en segmentstorlek som fungerar bäst för alla modeller som du använder. Om du till exempel använder modeller för sammanfattning och inbäddning väljer du en optimal segmentstorlek som fungerar för båda.

Hur segmentering passar in i arbetsflödet

Om du har stora dokument måste du infoga ett segmenteringssteg i indexerings- och frågearbetsflöden som delar upp stor text. När du använder integrerad vektorisering tillämpas en standardstrategi för segmentering med hjälp av färdigheten Textdelning. Du kan också använda en anpassad segmenteringsstrategi med hjälp av en anpassad färdighet. Några bibliotek som tillhandahåller segmentering är:

De flesta bibliotek tillhandahåller vanliga segmenteringstekniker för fast storlek, variabel storlek eller en kombination. Du kan också ange en överlappning som duplicerar en liten mängd innehåll i varje segment för kontextbevarande.

Segmenteringsexempel

Följande exempel visar hur segmenteringsstrategier tillämpas på NASA:s PDF-fil Earth at Night e-book :

Exempel på textdelningsfärdighet

Integrerad datasegmentering via kunskaper om textdelning är allmänt tillgänglig.

I det här avsnittet beskrivs inbyggda datasegmentering med hjälp av en kunskapsdriven metod och parametrar för textdelningsfärdighet.

En exempelanteckningsbok för det här exemplet finns på lagringsplatsen azure-search-vector-samples . Konfigurera textSplitMode för att dela upp innehåll i mindre segment:

  • pages (standard). Segment består av flera meningar.
  • sentences. Segment består av enstaka meningar. Vad som utgör en "mening" är språkberoende. På engelska används standardord som avslutar skiljetecken, till exempel . eller ! . Språket styrs av parametern defaultLanguageCode .

Parametern pages lägger till extra parametrar:

  • maximumPageLength definierar det maximala antalet tecken 1 eller token 2 i varje segment. Textdelningen undviker att dela upp meningar, så det faktiska teckenantalet beror på innehållet.
  • pageOverlapLength definierar hur många tecken från slutet av föregående sida som ingår i början av nästa sida. Om detta anges måste det vara mindre än hälften av den maximala sidlängden.
  • maximumPagesToTake definierar hur många sidor/segment som ska hämtas från ett dokument. Standardvärdet är 0, vilket innebär att alla sidor eller segment tas från dokumentet.

1 Tecken justeras inte efter definitionen av en token. Antalet token som mäts av LLM kan skilja sig från teckenstorleken som mäts av skickligheten Textdelning.

2 Token-segmentering är tillgängligt i förhandsversionen 2024-09-01 och innehåller extra parametrar för att ange en tokenizer och eventuella token som inte ska delas upp under segmentering.

Följande tabell visar hur valet av parametrar påverkar det totala antalet segment från e-boken Earth at Night:

textSplitMode maximumPageLength pageOverlapLength Totalt antal segment
pages 1000 0 172
pages 1000 200 216
pages 2000 0 85
pages 2000 500 113
pages 5000 0 34
pages 5000 500 38
sentences Saknas Saknas 13361

Med hjälp av ett textSplitMode resultat pages i en majoritet av segment som har totalt antal tecken nära maximumPageLength. Antalet segmenttecken varierar på grund av skillnader om var meningsgränser hamnar inom segmentet. Segmenttokens längd varierar på grund av skillnader i innehållet i segmentet.

Följande histogram visar hur fördelningen av segmentteckenlängden jämförs med segmenttokens längd för gpt-35-turbo när du använder en textSplitMode av pages, en maximumPageLength av 2 000 och en pageOverlapLength av 500 på earth at night-e-boken:

Histogram över antalet segmenttecken för maximumPageLength 2000 och pageOverlapLength 500.

Histogram över antalet segmenttoken för maximumPageLength 2000 och pageOverlapLength 500.

Om du använder ett textSplitMode antal sentences resultat i ett stort antal segment som består av enskilda meningar. Dessa segment är betydligt mindre än de som produceras av pages, och antalet token för segmenten överensstämmer närmare med teckenantalet.

Följande histogram visar hur fördelningen av segmentteckenlängden jämförs med segmenttokens längd för gpt-35-turbo när du använder en textSplitMode av sentences på jorden på natten e-bok:

Histogram över antalet segmenttecken för meningar.

Histogram över antalet segmenttoken för meningar.

Det optimala valet av parametrar beror på hur segmenten ska användas. För de flesta program rekommenderar vi att du börjar med följande standardparametrar:

textSplitMode maximumPageLength pageOverlapLength
pages 2000 500

Exempel på LangChain-datasegmentering

LangChain tillhandahåller dokumentinläsare och textdelningsdelare. Det här exemplet visar hur du läser in en PDF, hämtar tokenantal och konfigurerar en textdelning. Om du hämtar tokenantal kan du fatta ett välgrundat beslut om segmentstorlek.

En exempelanteckningsbok för det här exemplet finns på lagringsplatsen 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))

Utdata anger 200 dokument eller sidor i PDF-filen.

Om du vill få ett uppskattat tokenantal för dessa sidor använder du 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}")

Utdata anger att inga sidor har noll token, den genomsnittliga tokenlängden per sida är 189 token och det maximala antalet token för en sida är 1 583.

Att känna till den genomsnittliga och maximala tokenstorleken ger dig insikt i att ange segmentstorlek. Även om du kan använda standardrekommenditeten på 2 000 tecken med överlappning på 500 tecken, är det i det här fallet klokt att gå lägre med tanke på antalet token i exempeldokumentet. Faktum är att om du anger ett överlappande värde som är för stort kan det leda till att ingen överlappning visas alls.

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

Utdata för två på varandra följande segment visar texten från det första segmentet som överlappar det andra segmentet. Utdata redigeras lätt för läsbarhet.

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

Anpassad färdighet

Ett generationsexempel för segmentering och inbäddning i fast storlek visar både segmenterings- och vektorinbäddningsgenerering med inbäddningsmodeller i Azure OpenAI . Det här exemplet använder en anpassad Azure AI Search-färdighet i Power Skills-lagringsplatsen för att omsluta segmenteringssteget.

Se även