iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

每天的專案會同步到 GitLab 上,可以前往 GitLab
查看,有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com

Day 14 的時候,我們介紹了兩個常用的 Chunking Strategy,分別是 Character Splitting 以及 Recursive Splitting,而今天我們要來介紹如何使用 LLM 來重構段落,讓段落更加簡潔。

為什麼要使用 LLM 重構段落?

在昨天的例子當中,我們使用了「勞動基準法」作為範例,然而這種已經經過整理的文件,通常比較不會有邏輯問題,因此我們今天準備了一段使用 GPT 生成的文本,讓大家可以看到這樣的文本在進行 Chunking Strategy 的時候,可能會有一些問題。

before

可以看到下面切出來的兩個段落的內文,第二段的內容相對第一段,多了「因此」或是「反問問句」,這樣的東西是比較不利於搜索的,因此我們可以試著使用 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 中的程式碼是怎麼寫的。

讓我們看一下轉換後的內文:

after

可以看到轉換後的內文明顯比原本的內文語氣更加堅定。

內容預告

今天我們介紹了第三種 Chunking Strategy,明天我們要來介紹 metadata 這個東西,以及他該如何被應用在查詢上。


上一篇
Day 14 - Chunking Strategy 與檢索段落的成效
下一篇
Day 16 - 檔案與 metadata
系列文
初探 Langchain 與 LLM:打造簡易問診機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言