在 Azure AI 搜尋服務中為向量搜尋解決方案分割大型檔

將大型檔分割成較小的區塊,可協助您保持在內嵌模型的最大令牌輸入限制之下。 例如,Azure OpenAI 內嵌模型的輸入文字長度上限為 8,191 個標記。 假設每個令牌大約是通用 OpenAI 模型的四個字元文字,此上限相當於大約 6,000 字的文字。 如果您使用這些模型來產生內嵌,輸入文字必須保持在限制之下。 將內容分割成區塊可確保數據可以透過用來填入向量存放區和文字到向量查詢轉換的內嵌模型來處理。

本文說明數種數據區塊化的方法。 只有當源檔太大,模型所強加的輸入大小上限時,才需要區塊化。

注意

如果您使用一般可用的向量搜尋版本,數據區塊化和內嵌需要外部程序代碼,例如連結庫或自定義技能。 目前處於預覽狀態的整合向量化新功能提供內部數據區塊化和內嵌。 整合向量化相依於索引器、技能集、文字分割技能,以及 AzureOpenAiEmbedding 技能(或自定義技能)。 如果您無法使用預覽功能,本文中的範例會提供替代路徑。

常見的區塊化技術

以下是一些常見的區塊化技術,從最廣泛使用的方法開始:

  • 固定大小的區塊:定義一個固定大小,足以用於語意有意義的段落(例如 200 個字),並允許某些重疊(例如,10-15% 的內容)可以產生良好的區塊作為內嵌向量產生器的輸入。

  • 以內容為基礎的可變大社區塊:根據內容特性分割您的數據,例如句子結尾標點符號、行尾標記,或使用自然語言處理 (NLP) 連結庫中的功能。 Markdown 語言結構也可以用來分割數據。

  • 自定義或逐一查看上述其中一種技術。 例如,處理大型檔時,您可以使用可變大小的區塊,但也會將文件標題附加至文件中間的區塊,以防止內容遺失。

內容重疊考慮

當您區塊數據時,在區塊之間重疊少量文字有助於保留內容。 建議您從大約 10% 的重疊開始。 例如,假設固定區塊大小為256個令牌,您會開始測試25個令牌的重疊。 實際重疊數量會因數據類型和特定使用案例而有所不同,但我們發現 10-15% 適用於許多案例。

區塊化數據的因素

在區塊化數據方面,請考慮這些因素:

  • 您檔案的圖形和密度。 如果您需要完整的文字或段落,保留句子結構的較大區塊和變數區塊化可能會產生更好的結果。

  • 用戶查詢:較大的區塊和重疊策略有助於保留以特定資訊為目標之查詢的內容和語意豐富性。

  • 大型語言模型 (LLM) 具有區塊大小的效能指導方針。 您必須設定最適合您使用的所有模型區塊大小。 例如,如果您使用模型進行摘要和內嵌,請選擇適用於兩者的最佳區塊大小。

區塊化如何融入工作流程

如果您有大型檔,您必須將區塊化步驟插入索引編製和查詢工作流程,以分割大型文字。 使用 整合向量化(預覽)時,會套用使用 文字分割技能 的預設區塊化策略。 您也可以使用自定義技能來套用自定義區塊化策略。 提供區塊化的一些連結庫包括:

大部分的連結庫都提供固定大小、可變大小或組合的常見區塊化技術。 您也可以指定重疊,在內容保留的每個區塊中複製少量內容。

區塊化範例

下列範例示範如何在夜間電子書中將區塊化策略套用至 NASA 的地球:

文字分割技能 (預覽)

本節說明使用技能驅動方法和 文字分割技能參數的內建數據區塊化。

設定 textSplitMode 為將內容分成較小的區塊:

  • pages (預設值)。 區塊是由多個句子所組成。
  • sentences. 區塊是由單一句子所組成。 構成「句子」的項目與語言有關。 在英文中,會使用 標準句子結尾標點符號,例如 .! 。 語言是由 defaultLanguageCode 參數所控制。

參數 pages 會新增額外的參數:

  • maximumPageLength 定義每個區塊中的字元 數上限 1 。 文字分隔器會避免分拆句子,因此實際字元計數取決於內容。
  • pageOverlapLength 會定義下一頁開頭包含上一頁結尾的字元數。 如果設定,這必須小於頁面長度上限的一半。
  • maximumPagesToTake 會定義要從檔擷取多少頁/區塊。 默認值為 0,表示從文件擷取所有頁面或區塊。

1 個字元不符合令牌的定義。 LLM 測量的令牌數目可能與文字分割技能測量的字元大小不同。

下表顯示參數的選擇如何影響夜間電子書中地球的總區塊計數:

textSplitMode maximumPageLength pageOverlapLength 區塊計數總計
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 N/A N/A 13361

textSplitModepages在大部分區塊中使用 的結果,其總字元計數接近 maximumPageLength。 區塊字元計數會因句子界限落在區塊內的差異而有所不同。 區塊令牌長度因區塊內容的差異而有所不同。

下列直方圖顯示區塊字元長度的分佈如何與 gpt-35-turbo 使用 maximumPageLengthpagestextSplitMode 的 、2000 pageOverlapLength 和 500 在夜間地球上的 500 個區塊標記長度進行比較:

Histogram of chunk character count for maximumPageLength 2000 and pageOverlapLength 500.

Histogram of chunk token count for maximumPageLength 2000 and pageOverlapLength 500.

textSplitModesentences使用 會產生大量區塊,其中包含個別句子。 這些區塊明顯小於 所產生的 pages區塊,而區塊的令牌計數更符合字元計數。

下列直方圖顯示區塊字元長度的分佈與 gpt-35-turbo 在夜間電子書上使用 時 gpt-35-turbosentencestextSplitMode 的區塊標記長度比較:

Histogram of chunk character count for sentences.

Histogram of chunk token count for sentences.

參數的最佳選擇取決於區塊的使用方式。 針對大部分的應用程式,建議從下列預設參數開始:

textSplitMode maximumPageLength pageOverlapLength
pages 2000 500

LangChain

LangChain 提供檔載入器和文字分隔器。 此範例示範如何載入 PDF、取得令牌計數,以及設定文字分隔器。 取得令牌計數可協助您針對區塊大小做出明智的決策。

from langchain_community.document_loaders import PyPDFLoader
 
loader = PyPDFLoader("./data/earth_at_night_508.pdf")
pages = loader.load()

print(len(pages))

輸出指出 PDF 中的 200 份文件或頁面。

若要取得這些頁面的估計令牌計數,請使用 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個令牌,而任何頁面的令牌計數上限為1,583。

瞭解平均和最大令牌大小可讓您深入了解設定區塊大小。 雖然您可以使用 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 內嵌模型進行區塊化和向量內嵌產生。 此範例會使用Power Skills存放庫中Azure AI 搜尋自定義技能來包裝區塊化步驟。

另請參閱