每天的專案會同步到 GitLab 上,可以前往 GitLab
查看,有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com。
在 Day 14 的時候,我們介紹了兩個常用的 Chunking Strategy,分別是 Character Splitting 以及 Recursive Splitting,而今天我們要來介紹如何使用 LLM 來重構段落,讓段落更加簡潔。
在昨天的例子當中,我們使用了「勞動基準法」作為範例,然而這種已經經過整理的文件,通常比較不會有邏輯問題,因此我們今天準備了一段使用 GPT 生成的文本,讓大家可以看到這樣的文本在進行 Chunking Strategy 的時候,可能會有一些問題。
可以看到下面切出來的兩個段落的內文,第二段的內容相對第一段,多了「因此」或是「反問問句」,這樣的東西是比較不利於搜索的,因此我們可以試著使用 GPT 將內容轉換成比較確定的語句。
解決的方法很簡單,同樣我們可以使用「Recursive Splitting」保留原始文本的前後文,再來直接將文本丟給 GPT 進行重構,讓我們看一下下面的程式碼:
from env_settings import BASE_DIR, EnvSettings
from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
env_settings = EnvSettings()
with open("./test.txt", "r") as f:
context = f.read()
spliter = RecursiveCharacterTextSplitter(
chunk_size=100,
chunk_overlap=5
)
texts = spliter.split_text(context)
llm = ChatOpenAI(
api_key=env_settings.OPENAI_API_KEY,
model_name="gpt-4o",
verbose=True
)
system_message = SystemMessage(
content="你是一個 RAG 知識檢索機器人,"
"請幫我把文本轉換成肯定的語句,"
"並去除任何關連詞且不要給我任何註解。"
)
for i in range(2):
human_message = HumanMessage(content=texts[i])
ai_message = llm.invoke(
input=[system_message, human_message],
)
print("----Document {}----".format(i+1))
print(ai_message.content)
有沒有發現這個概念其實有點像 Day 11 的 DataToWord 的概念?沒錯,兩者的概念基本上是一樣的,都是為了讓我們可以在檢索的時候更加精準、簡潔,有興趣的朋友也可以去看一下 DataToWord 中的程式碼是怎麼寫的。
讓我們看一下轉換後的內文:
可以看到轉換後的內文明顯比原本的內文語氣更加堅定。
今天我們介紹了第三種 Chunking Strategy,明天我們要來介紹 metadata 這個東西,以及他該如何被應用在查詢上。