在 Azure AI 搜尋服務 中為 RAG 與向量搜尋將大型文件分段

Note

Azure AI 搜尋服務 可透過 Azure 入口網站、REST API 及 Azure SDK 取得。 它同時也是 Foundry IQ 的基礎,這是一個管理式知識層,能將企業內容轉化為可重複使用、權限感知的知識庫,供 Microsoft Foundry 入口網站中的代理使用。

將大型文件分割成較小的區塊,可以幫助你保持在聊天完成模型和嵌入模型的最大令牌輸入限制之下。 例如, Azure OpenAI 文本嵌入 3-small 模型的最大輸入文字長度為 8,191 個標記。 假設常用 OpenAI 模型的每個語彙基元是四個字元的文字,此上限相當於大約 6,000 字的文字。 如果您使用這些模型來產生內嵌,輸入文字必須維持在限制之下。

聊天完成模型有相同的輸入令牌限制,因此分塊對於 檢索增強生成(RAG) 或 代理檢索 也很有幫助。 將內容分割成區塊有助於滿足輸入令牌要求,並防止因截斷而遺失資料。

Azure AI 搜尋服務 內建了分塊內容的解決方案,如果你使用向量搜尋,也可以將分塊內容向量化。 內建方法依賴內建 索引器 與 技能組 ,以實現文本分割與嵌入生成。 如果您無法使用整合式向量化,本文說明一些將內容區塊化的替代方法。

小提示

如果你是為了代理檢索而分塊內容,多個知識來源可以產生完整的索引器管線,將內容分塊並可選擇向量化。 索引器、資料來源定義、技能組和索引都是根據你知識來源定義中的資訊為你建立的。 具備此功能的知識來源包括 Azure Blob 儲存體 或 Azure Data Lake Storage Gen2 以及 OneLake。

常見的區塊化技術

只有在來源文件太大而超過模型的輸入大小上限時,才需要進行區塊化,但如果內容無法完美地以單一向量表示,這樣做也會有幫助。 考慮一個涵蓋多種子主題的維基頁面。 整個頁面可能夠小,可符合模型輸入需求,但如果您以更小的精細度進行區塊化,可能會得到更好的結果。

如果您使用索引器和技能,以下是與內建功能相關聯的一些常見區塊化技術。

方法 用法 內建功能
固定大小的區塊 定義一個固定大小,其足以用於具語意意義的段落 (例如 200 個單字或 600 個字元),並允許某些重疊 (例如 10-15% 的內容) 可以產生良好的區塊作為內嵌向量產生器的輸入。 文字分割技能,依頁面分割(由字元長度定義)
根據內容特性變動大小的區塊 根據句子結尾標點符號、行結尾標記,或使用可偵測文件結構的自然語言處理 (NLP) 程式庫中的功能,分割您的資料。 內嵌標記,例如 HTML 或 Markdown,具有標題語法,可用來依區段分割數據。 Azure 內容理解技能 或 文字分割技能(按句子分割)。
語意區塊 將內容拆解成有意義的單元,保留句子與段落間的語意關係與上下文。 此方法產生的區塊能更好地維持語意一致性,並能跨越頁面邊界。 Azure 內容理解技能 (帶有 markdown 輸出的語意分塊)
自訂組合 使用固定和可變大小區塊化的組合,或擴充方法。 例如,處理大型文件時,您可以使用可變大小的區塊,但也會將文件標題附加至文件中間的區塊,以防止內容遺失。 沒有
文件剖析 索引器可以將較大的源檔剖析為較小的搜尋檔以進行索引編製。 嚴格來說,這種方法不是區塊化,但有時可以達到相同的目標。 索引 Markdown blobs 與檔案、一對多索引,或 索引 JSON blobs 與檔案

內容重疊考量

當你根據固定大小來分塊資料時,區塊間重疊少量文字有助於維持連貫性和脈絡。 我們建議從 512 個權杖 (約 2,000 個字元) 的區塊大小開始,初始重疊為 25%,這等於 128 個權杖。 這種重疊可確保區塊之間更平滑的過渡,而不會過度重複。

最佳的重疊可能會因你的內容類型和使用情境而異。 例如,高度結構化的資料可能需要較少重疊,而對話式或敘事式文字則可能需要更多重疊。

對資料進行區塊化的因素

在對資料進行區塊化時,請考慮這些因素:

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

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

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

區塊化如何融入工作流程

如果您有大型檔,請在分割大型文字的索引和查詢工作流程中插入區塊化步驟。 使用 整合向量化時,使用 文字分割技能 的預設區塊化策略很常見。 您也可以使用自訂技能來應用自訂區塊策略。 請參閱 此程式碼參考 ,以取得使用自訂技能的語意區塊化範例。 一些提供區塊化的外部連結庫包括:

大部分的程式庫都提供適用於固定大小、可變大小或這兩者之組合的常見區塊化技術。 您也可以指定重疊部分,能在每個區塊中複製少量內容以進行上下文保留。

區塊化範例

下列範例示範如何將區塊化策略套用至 NASA 的 Earth at Night 電子書 (英文) PDF 檔案:

文字分割技能範例

透過文字分割技能整合的資料區塊化已正式推出。

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

您可以在 azure-search-vector-samples (英文) 存放庫上找到此範例的範例筆記本。 將 textSplitMode 設定為將內容分成較小的區塊:

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

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

  • maximumPageLength 會在每個區塊中定義字元 1 或標記 2 的最大數目。 文字分割器會避免分割句子,因此實際的字元計數會取決於內容。
  • pageOverlapLength 會定義要將前一頁結尾的多少個字元包括到下一頁的開頭。 若設定,這必須少於頁面長度上限的一半。
  • maximumPagesToTake 會定義要從文件擷取多少頁面/區塊。 默認值為 0,表示從文件擷取所有頁面或區塊。

1 字元不符合標記的定義。 LLM 測量的記號數目可能與具有字元固定大小的「文字分割」技能所測量的字元大小不同。

2 最新預覽版 技能 - 建立或更新 (REST API) 提供權杖區塊化,並包含額外參數,可指定權杖化工具和區塊化期間不應分割的任何權杖。

下表顯示了參數的選擇會如何影響《Earth at Night》電子書的總區塊數量:

textSplitMode maximumPageLength pageOverlapLength 總區塊計數
pages 1000 0 172
pages 1000 200 216
pages 2000 0 85
pages 2000 500 113
pages 五千 0 34
pages 五千 500 38
sentences N/A N/A 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))

輸出指出 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-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 個語彙基元,而任何頁面的語彙基元計數上限為 1,583 個。

了解平均和最大分詞大小可讓您取得設定分段大小的見解。 雖然您可以使用 2,000 個字元搭配 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}