Document transformers¶
Info
查看 Integrations 以取得 langchain 內建的 document transformer 與第三方工具整合的文件。
載入文件後,您通常會想要對其進行轉換以更好地適合您的應用程式。最簡單的例子是,您可能想要將長文件分割成更小的區塊,以適合模型的上下文視窗(context window)。 LangChain 有許多內建的文件轉換器,可以輕鬆拆分、組合、過濾和以其他方式操作文件。
文字分割器¶
當您想要處理長文本時,有必要將該文字分割成區塊。這聽起來很簡單,但這裡存在著許多潛在的複雜性。理想情況下,您希望將語義相關的文字片段保留在一起。 「語意相關」的意思可能取決於文本的類型。本文展示了實現此目的的幾種方法。
在較高層面上,文本分割器的工作原理如下:
- 將文字分割成小的、具有語意意義的區塊(通常是句子)。
- 開始將這些小塊組合成一個更大的塊,直到達到一定的大小(透過某些函數測量)。
- 一旦達到該大小,請將該區塊設為自己的文字片段,然後開始建立具有一些重疊的新文字區塊(以保持區塊之間的上下文)。
這意味著您可以沿著兩個不同的設計軸線來自訂文字分割器:
- 文字如何分割
- 如何測量塊(chunk)大小
開始使用文字分割器¶
預設推薦的文字分割器是 RecursiveCharacterTextSplitter。此文字拆分器採用字元清單。它嘗試根據第一個字符的分割來創建塊,但如果任何塊太大,它就會移動到下一個字符,依此類推。預設情況下,它嘗試分割的字元是 ["\n\n", "\n", " ", ""]
除了控制可以分割的字元之外,您還可以控制其他一些事情:
length_function
:如何計算區塊的長度。預設僅計算字元數,但在這裡傳遞令牌計數器很常見。chunk_size
:區塊的最大大小(透過長度函數測量)。chunk_overlap
:區塊之間的最大重疊。最好有一些重疊來保持區塊之間的連續性(例如,做一個滑動視窗)。add_start_index
:是否在元資料中包含原始文件中每個區塊的起始位置。
使用範例:
# This is a long document we can split up.
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
# Set a really small chunk size, just to show.
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
結果:
page_content='Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and' metadata={'start_index': 0}
page_content='of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans.' metadata={'start_index': 82}
其他轉換¶
過濾冗餘文件、翻譯文件、提取元資料等等也是常見的文件轉換操作。
我們可以對文件執行許多轉換,而不僅僅是分割文字。透過 EmbeddingsRedundantFilter
,我們可以識別相似的文檔並過濾掉冗餘。透過 doctran
等集成,我們可以執行諸如將文件從一種語言翻譯為另一種語言、提取所需屬性並將其添加到元資料以及將對話對話轉換為 Q/A 格式的文件集等操作。