原先苦無比較適合的題目來做示範,這次跟上草鴞議題,找了一些資料來和大家一起練習RAG順便認識草鴞。
我使用農業部林業及自然保育署 自然保育網-草鴞近年相關研究成果報告的資料來作為文本,一步一步進行完整RAG。
1. PDF Parsing: 延續先前撰寫的extract_text_and_tables
function
pages = extract_text_and_tables("全臺南市沙崙地區草鴞出現分布現況調查.pdf", out_dir="out_tables", dpi=300, ocr_lang="eng+chi_tra")
for p in pages:
print("PAGE", p["page"], "TEXT snippet:", p["text"][:200])
for t in p["tables"]:
print(" table image:", t["image_path"], " -> parsed tables count:", len(t["tables"]))
2. Chunking
這邊一樣延續先前撰寫的convert_pages_to_documents
function來進行Chunking
GrassOwel_recursive=convert_pages_to_documents(pages,source_name="grassOwel")
3. 存入ChromaDB
這邊我們創建一個叫做GrassOwl_Report的collection來存放相關資料
#如尚未創建collection,先創建
collection = client.create_collection(
name="GrassOwl_Report", # collection名稱
embedding_function=BGE_embedding_fn,
metadata={"hnsw:space": "cosine"}
)
# 存入
successful, failed = store_documents_in_batches(
collection=collection,
chunks=GrassOwel_recursive,
embedding_function=BGE_embedding_fn,
batch_size=10 # 因為要生成 embeddings,建議減小批次大小
)
1. 啟用LLM
目前先做快速demo,所以我們先使用openAI來作為我們的LLM模型(請自行替換成自己的OpenAI key)
rom openai import OpenAI
# 設定 OpenAI API key
client = OpenAI(api_key="你的openAI key")
2. 查詢階段的Retrieval
在這個階段,我們會取得使用者的問題(query),並將這個問題使用embedding model去做encode,取得向量。
接下來我們使用這個向量進入向量資料庫(ChromaDB)進行相似度檢索,並指定取回前5筆最相似的資料。
query = "草鴞吃什麼呀?"
query_vec = embedding_model.encode(query)
results = collection.query(
query_embeddings=[query_vec],
n_results=5
)
3. 生成模組的Augmented: 增強階段
下面的prompt是最簡單的示範,讓LLM知道要參考哪些內容(result)來回答什麼問題(query),並要求避免幻覺現象。
# 構建 prompt
prompt = f"""
基於以下檢索到的文檔內容,回答用戶問題:
文檔內容:
{results['documents'][0]}
用戶問題:{query}
請根據文檔內容提供準確的答案,並明確說明是參考你一個段落,如果文檔內沒有明確寫出內容,不要捏造。
"""
4. 生成模組的Generation: 生成階段
使用剛剛準備的Prompt打給openAI,就完成了基本RAG的最後階段:Generation
# 調用 OpenAI API
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "user", "content": prompt}
],
max_tokens=1024,
temperature=0.1
)
# 輸出結果
answer = response.choices[0].message.content
print(f"問題:{query}")
print(f"參考資料:{retrieved_docs}")
print(f"答案:{answer}")
問題:沙崙土地開發對草鴞會有影響嗎?
參考資料:摘要
國內已知草鴞活動頻繁目擊的地點在臺南歸仁區沙崙里由台糖
公司所管理的沙崙農場及其鄰近範圍。儘管草鴞在沙崙出現的紀錄次
數相當多,不過目前為止仍未有進行相關調查,對於草鴞在當地的活
動現況所知有限。本計畫目的在了解草鴞在沙崙地區出沒的分布位置
和活動情形。今年度夜間目視觀察累計執行 234 個工作小時,其中有
151 個小時有草鴞紀錄,出現率為 64.5%。草鴞活動位置的土地利用
型態以牧草種植區出現目擊頻度最高,佔 82.1%。日間棲息點合計發
現 6 處,分別位於調查範圍東側和南側二仁溪高灘地:另外紀綠 4
處繁殖巢區,其中 2 巢在發現不久後不明原因棄巢失敗,另外 2 巢最
後分別有 4 隻幼雛和 1 隻幼雛成功離巢。目前規劃進行中的沙崙農場
北側土地開發計畫預期會直接造成現有牧草種植區的全面消失,不但
對於草鴞在內的當地生態帶來衝擊,甚至國內酪農產業牛隻所需芻料
供給也會產生深遠影響,需要儘早提出合適的因應對策,用以兼顧經
濟發展與稀有物種保育工作的落實推動。
IV
的頻繁紀錄,間接就能夠在調查點附近找到草鴞日棲點和巢區位置。
今年度的調查結果顯示,草鴞在沙崙農場主要集中出現於北側牧
草種植區域活動(附錄 3),目前本區規劃中的土地開發工程在未來將
無可避免的會衝擊到當地草鴞族群的存續,儘管沙崙農場內目前尚未
發現有繁殖巢區,但是大面積牧草種植區長期以來就是草鴞夜間活動
覓食的主要場所,也是幼鳥離巢後向外擴散階段學習捕捉獵物和練習
飛行的重要緩衝地區,目前透過繫放個體和衛星追蹤資料也顯示沙崙
地區是草鴞頻繁造訪的生態熱點,土地開發將直接造成現有牧草種植
...
答案:是的,沙崙土地開發將對草鴞產生影響。根據文檔內容,沙崙農場北側的土地開發計畫將直接導致現有的牧草種植區全面消失,這不僅對草鴞在內的當地生態產生衝擊,也會影響國內酪農產業牛隻所需的芻料供應。此外,大面積的牧草種植區長期以來一直是草鴞夜間活動覓食的主要場所,也是幼鳥離巢後向外擴散階段學習捕捉獵物和練習飛行的重要緩衝地區。因此,土地開發將對草鴞族群的存續產生衝擊。這些資訊來自於文檔的"摘要"和"IV"段落。
以上就是實作補充,接下來會針對相關資料和大家分享哪些問題陽春的RAG是比較無法處理,又該如何解決!
同時也會和大家一起順便認識一下草鴞這個珍貴的台灣物種!