載入中

文字分塊是建構 RAG(Retrieval Augmented Generation,檢索增強生成)管線中最關鍵的步驟之一。您如何拆分文件會直接影響整個系統的品質。不良的分塊策略可能導致不相關的上下文被插入到您的提示中,使您的 AI 給出完全錯誤的答案。

請考慮這個例子:您有一份文件,其中包含醫學研究和軟體工程的章節。如果分塊不當,使用者詢問「今年工程師修復了多少個 bug?」可能會得到關於醫學研究的資訊,而不是軟體工程的資訊,僅僅因為醫學章節恰好在不同的上下文中包含了「bug」這個詞。

這就是為什麼選擇正確的分塊策略如此重要的原因。讓我們探討三種主要方法。

基於大小的分塊

基於大小的分塊是最簡單的方法——您將文字分割成等長的字串。如果您有一份 325 個字元的文件,您可能會將其分割成三個大約各 108 個字元的區塊。

這種方法易於實作,並且適用於任何類型的文件,但它有明顯的缺點:

  • 單字可能在句子中間被截斷
  • 區塊會失去周圍文字的重要上下文
  • 章節標題可能與其內容分離

為了解決這些問題,您可以在區塊之間加入重疊。這意味著每個區塊都包含來自相鄰區塊的一些字元,從而提供更好的上下文,並確保完整的單字和句子。

以下是一個基本實作:

python
def chunk_by_char(text, chunk_size=150, chunk_overlap=20):
    chunks = []
    start_idx = 0
    
    while start_idx < len(text):
        end_idx = min(start_idx + chunk_size, len(text))
        chunk_text = text[start_idx:end_idx]
        chunks.append(chunk_text)
        
        start_idx = (
            end_idx - chunk_overlap if end_idx < len(text) else len(text)
        )
    
    return chunks

基於結構的分塊

基於結構的分塊根據文件的自然結構——標題、段落和章節——來劃分文字。當您擁有格式良好的文件(如 Markdown 檔案)時,這種方法效果很好。

對於 Markdown 文件,您可以根據標題標記進行分割:

python
def chunk_by_section(document_text):
    pattern = r"\n## "
    return re.split(pattern, document_text)

這種方法能為您提供最清晰、最有意義的區塊,因為每個區塊都代表一個完整的章節。然而,它只在您對文件結構有保證的情況下才有效。許多現實世界的文件是純文字或 PDF,沒有明確的結構標記。

基於語意的分塊

基於語意的分塊是最複雜的方法。您將文字分割成句子,然後使用自然語言處理來判斷連續句子之間的相關程度。您從相關句子的群組中建構區塊。

這種方法在計算上成本高昂,但能產生最相關的區塊。它需要理解個別句子的含義,並且比其他策略更複雜,實作難度更高。

基於句子的分塊

一個實用的折衷方案是按句子分塊。您使用正規表達式將文字分割成個別句子,然後將它們分組成帶有可選重疊的區塊:

python
def chunk_by_sentence(text, max_sentences_per_chunk=5, overlap_sentences=1):
    sentences = re.split(r"(?<=[.!?])\s+", text)
    
    chunks = []
    start_idx = 0
    
    while start_idx < len(sentences):
        end_idx = min(start_idx + max_sentences_per_chunk, len(sentences))
        current_chunk = sentences[start_idx:end_idx]
        chunks.append(" ".join(current_chunk))
        
        start_idx += max_sentences_per_chunk - overlap_sentences
        
        if start_idx < 0:
            start_idx = 0
    
    return chunks

選擇您的策略

您的選擇完全取決於您的使用案例和文件保證:

  • 基於結構:當您能控制文件格式時(例如內部公司報告),效果最佳
  • 基於句子:對大多數文字文件而言是不錯的折衷方案
  • 基於大小:最可靠的備用方案,適用於任何內容類型,包括程式碼

在生產環境中,帶有重疊的基於大小的分塊通常是首選,因為它簡單、可靠,並且適用於任何文件類型。雖然它可能無法給出完美的結果,但它始終能產生合理的區塊,不會破壞您的管線。

請記住:沒有單一的「最佳」分塊策略。正確的方法取決於您的特定文件、使用案例,以及您願意在實作複雜度和區塊品質之間做出的取捨。