HI!大家好,我是 Shammi 😊
今天正式操作為我的 AI 對話機器人建立「知識庫」。
操作前,你有沒有想過為什麼 AI 能夠學習?
昨天認識了 RAG 這個強大的藍圖,我們知道如果要讓 AI 說實話,就必須提供它可靠的參考資料,這一步驟對我來說是推廣 SDGs 的項目,也是最重要的一個環節。
今天的篇幅就要來解鎖這個藍圖的第一塊基石:如何從 PDF 文件中提取知識。
我的 SDGs 知識庫是以 PDF 文件的形式存在。雖然 PDF 對人類來說易於閱讀,但對於機器來說,它卻是一種「非結構化資料」。
想像一下,PDF 文件就像一本精心排版的實體書,裡面有圖片、表格、不同的字體和分欄。而我需要做的,是把這本書的所有文字內容,乾淨地「複製貼上」到一個純文字檔案裡,並且不能遺漏任何資訊。這個過程,就需要一個專門的工具來處理。
PyPDF2
:將 PDF 轉化為 AI 知識的幕後功臣在此階段,我於 Day 3 安裝的 PyPDF2
套件就派上用場了。它的角色,就像是我們的專屬「PDF 閱讀器與翻譯機」,能將 PDF 的複雜格式,轉化為機器可以理解的簡單文字。
以下是使用 PyPDF2
進行資料處理的幾個關鍵步驟:
1️⃣ 導入套件:首先需要導入 PyPDF2
。
2️⃣ 開啟文件:接著,用 Python 的內建功能開啟 SDGs PDF 文件。
3️⃣ 逐頁讀取:PyPDF2
允許逐頁讀取 PDF 的內容。我將會寫一個迴圈,遍歷每一頁。
4️⃣ 提取文字:對於每一頁,PyPDF2
都能提取出其中的文字內容。
5️⃣ 合併與清理:最後,將所有頁面的文字合併成一個完整的長字串,並進行一些基本的清理,例如去除多餘的換行符號或空白。
準備好的PDF,假設PDF命名為「17SDGs.pdf」,接著請在 Colab 筆記本中新增一塊「程式碼區塊」,此階段有兩個方法可以使用,提供給讀者們參考囉😊
方法一:透過程式碼上傳檔案
這種方式最簡單,每次執行時都會跳出檔案選擇器。
import io
from google.colab import files
from PyPDF2 import PdfReader
#step1.上傳檔案
print("請選擇你要上傳的 PDF 文件:")
uploaded = files.upload() # {filename: bytes}
#step2.解析與切分
stored_chunks = []
for filename, data in uploaded.items():
if filename.lower().endswith('.pdf'):
reader = PdfReader(io.BytesIO(data))
text = ''.join(page.extract_text() or '' for page in reader.pages)#透過迴圈讀取每一頁的文字
else:
text = data.decode('utf-8') #如果上傳的不是 PDF,則直接當作文字檔處理
#將文字內容以每 1000 字為單位進行切分
for i in range(0, len(text), 1000):
stored_chunks.append(text[i:i+1000])
print(f"✅ 上傳並切分為 {len(stored_chunks)} 個文字區塊!")
參考結果:
補充:執行時,請記得「全部執行」哦!這樣才能重新安裝 DAY 3 的「PyPDF2 」套件。
(1)
(2)
方法二:從 Colab 側邊欄上傳
如果想避免每次執行都重新上傳檔案,可以將檔案直接拖曳到 Colab 介面左側的「檔案」欄位中。
優點: 一次上傳,多次使用。
缺點: 當 Colab 執行階段重新啟動時,檔案會被清空,需要重新上傳。
對應程式碼:
當檔案已經在 Colab 側邊欄中時,就不需要使用此語言 files.upload()
,而是直接讀取檔案路徑。
import io
from PyPDF2 import PdfReader
from pathlib import Path
#定義檔案路徑,確保路徑與上傳的檔案名稱相符
pdf_file_path = Path("/content/17SDGs.pdf")
#確認檔案是否存在
if not pdf_file_path.exists():
print(f"❌ 錯誤:找不到檔案在 {pdf_file_path},請檢查檔案是否已上傳。")
else:
with open(pdf_file_path, "rb") as file:
reader = PdfReader(file)
text = ''.join(page.extract_text() or '' for page in reader.pages)
stored_chunks = []
for i in range(0, len(text), 1000):
stored_chunks.append(text[i:i+1000])
#將文字內容以每 1000 字為單位進行切分
print(f"✅ 從側邊欄檔案讀取並切分為 {len(stored_chunks)} 個文字區塊!")
💡 重要提醒:無論使用哪種方法,在執行程式前,都需確保「執行階段」的「執行所有項目」被點擊過,這樣才能讀取到 Day 3 所安裝的 PyPDF2
套件。
第五天的內容主要是將 PDF 的「非結構化」知識庫,轉化為「結構化」的文字內容。這個長長的文字字串,就是我的機器人將要學習的「教科書」。有了這本教科書,才能進行下一步的關鍵任務:將文字轉換成向量。明天,我將會深入探討 Embedding 模型,並開始進行有趣的實測與選擇,為我的 AI 機器人建立它的「大腦」囉!🧠