政府公開資料集的資料通常是長篇文章或完整的描述,對於AI模型的短時記憶體來說,一次處理這麼多資訊是非常困難的。
所以我們要將這些原始資料進行加工,轉成AI能夠利用的片段。這個過程主要分為資料清洗與文字切分。
資料清洗:移除雜訊,專注於核心內容。
文字切分:將長篇資料切成大小適中的片段,確保每個片段都具備獨立的意義,同時不會過長。
LangChain 提供了多種文字切分器,其中 RecursiveCharacterTextSplitter 是最常用且功能強大的選擇。
以下是程式碼範例,將昨天解析出的旅遊資料轉換為可用的文件片段。
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema.document import Document
from typing import List
# 昨天解析出來的原始資料
tourism_data = [
{'name': '士林夜市', 'description': '士林夜市是台北市範圍最大的夜市,也是國外觀光客造訪台北必去的觀光景點。…', 'address': '台北市士林區'},
{'name': '清境農場', 'description': '清境農場位於南投縣仁愛鄉,海拔約1700-2000公尺,以其綠色草坪、綿羊秀和壯麗的山景聞名。…', 'address': '南投縣仁愛鄉'},
# ... 其他資料
]
def split_and_format_documents(data: List[dict]) -> List[Document]:
documents = []
# 建立一個文字切分器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=256,
chunk_overlap=50,
length_function=len
)
# 迴圈處理每一筆資料
for item in data:
full_text = f"景點名稱:{item['name']}\n地址:{item['address']}\n介紹:{item['description']}"
# 使用切分器將完整文字切成片段
chunks = text_splitter.split_text(full_text)
# 將每個片段轉換為物件,加入metadata
for chunk in chunks:
documents.append(Document(
page_content=chunk,
metadata={
"source": "嘉義旅遊資料集",
"title": item['name'],
"address": item['address']
}
))
print(f"原始資料經處理後,共產生 {len(documents)} 個文件片段。")
return documents
# 執行函數並檢視結果
processed_documents = split_and_format_documents(tourism_data)
# 顯示第一個物件的內容
print("\n--- 第一個 Document 物件範例 ---")
print(f"內容:\n{processed_documents[0].page_content}")
print(f"\nMetadata:\n{processed_documents[0].metadata}")
chunk_size:每個片段的字元數上限
chunk_overlap:片段間的重疊字元數,有助於保持上下文連貫
今天我們將雜亂的原始資料,轉成許多知識塊。
明天會將這些知識塊向量化,成為AI顧問的記憶庫,謝謝各位今天的觀看。