DEV Community

Jambo
Jambo

Posted on

用 LangChain 構建基於資料庫的問答機器人(二):從資料源中提取文本信息

大家好,我是學生大使 Jambo。這個系列的目標是做出一個根據資料回答問題的機器人,那麼從資料源中提取文本信息就是一件必要的事。但我們的資料源格式是多樣的,比如 PDF、Word、HTML、PPT 等等,甚至有的資料源來自於網絡,這些格式都不能直接提取出文本,但好在 Python 有很多第三方庫可以幫助我們提取文本信息,並且 LangChain 也幫我們整合到了一起,我們只需要調用 LangChain 的接口就可以了。

我在公開網絡上找到了一份 PDF 格式的合同,我們就以這份合同為例,介紹一下如何提取文本信息。

文本提取

LangChain 針對 PDF 包含了許多第三方庫,比如 PyPDF2PyPDFium2PDFMiner 等等,這裡我們以 PyPDF2 為例,介紹一下如何提取文本信息。

pip install pypdf
Enter fullscreen mode Exit fullscreen mode

我們使用 PyPDFLoader 來加載 PDF 文件,然後調用 load 方法就可以得到文本信息了。 PDF 的讀取器會將 PDF 文件中的每一頁轉換成一段文本,然後將這些文本段組成一個列表返回。

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("./contract.pdf")
documents = loader.load()
Enter fullscreen mode Exit fullscreen mode

文本分割

但僅僅是按頁進行分割,仍然是不夠的,因為一頁中仍然包含了太多的字數,如果將來將這些文本放在 prompt 的上下文中,會佔據大量的 token,而這些文本對於當下所問的問題不一定都是有用的,所以我們需要將這些文本再進行分割。

LangChain 提供了幾種分割器,可以分割代碼、段落、Markdown 標題。這裡我們使用 RecursiveCharacterTextSplitter ,他會把文本按照字符進行分割,直到每個文本段的長度足夠小。它默認的分割列表是 ["\n\n", "\n", " ", ""],這樣它可以盡可能把段落、句子或單詞放在一起。

其中 chunk_size 限制了每段文本的最大長度。 chunk_overlap 則是兩個文本段之間的重疊長度,如果一個段落實在太長而被強制分割成了兩段,那麼這兩段之間就會有一段重疊的文本,這樣可以保證上下文的連貫性。

它還有個參數 length_function,用來計算文本的長度,默認是 len。如果你想按照 token 的數量來分割,那麼可以結合 tiktoken 庫來使用。

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
Enter fullscreen mode Exit fullscreen mode

這樣我們就很容易的得到了一個文本列表,而不用考慮具體的分割細節了。

當然,這裡只是簡單的帶大家了解一下 LangChain 的文本提取功能,還有其他很多格式和對應的細節沒有介紹到,比如 Word、HTML、PPT 等等,如果你想了解更多,還是要自己去看看官方的文檔

Top comments (0)