生成式AI導論2024 — RAG 加餐
生成式AI導論2024 — RAG 加餐¶
先前討論到為何我們需要Fine tune微調模型,今天來討論RAG
📌 RAG 是什麼?¶
Retrieval-Augmented Generation (RAG) ,主要目的是解決純生成模型在知識過時、幻覺(hallucination)等問題。RAG 把語言模型與資料庫結合,讓模型可以「查資料」再回答,而不是憑空生成。
✅ RAG vs Fine-tuning 選擇評估問卷(共 10 題)
先想像你有一個想做的專案,再來閱讀以下題目並計算總分
1. 你的知識資料是否會頻繁更新?¶
- A. 是(1 分)
- B. 否(0 分)
2. 你是否需要答案來源(可追溯的依據)?¶
- A. 是,我希望用戶可以看到答案的原始文件(1 分)
- B. 否,不需要顯示來源(0 分)
3. 你的預算有限,無法進行長時間訓練或雲端微調?¶
- A. 是(1 分)
- B. 否,我有預算與資源進行微調(0 分)
4. 你打算將模型應用在多個領域(如客服、法務、技術)?¶
- A. 是,需要多種資料庫彈性組合(1 分)
- B. 否,單一任務(0 分)
5. 使用者可能會問到模型訓練時沒有見過的知識?¶
- A. 是(1 分)
- B. 否,所有問答都包含在訓練集裡(0 分)
6. 你的資料是結構化或格式良好的文件(如手冊、FAQ、SOP)?¶
- A. 是(1 分)
- B. 否,是非結構化文字或其他格式(0 分)
7. 你是否希望未來「新增內容」無須重新訓練模型?¶
- A. 是(1 分)
- B. 否,可以接受每次更新都要訓練(0 分)
8. 模型的回答風格、語氣、格式需強烈客製化嗎?¶
- A. 否,回答格式彈性可接受(1 分)
- B. 是,必須符合品牌語氣、格式等(0 分)
9. 你是否期望快速部署一個 MVP(最小可行產品)?¶
- A. 是,想要快速驗證(1 分)
- B. 否,可以接受開發週期較長(0 分)
10. 你的應用場景是否有資料外洩風險(例如醫療、金融)?¶
- A. 是,需要在封閉環境運行(0 分)
- B. 否,可以查詢外部知識庫或使用開放向量庫(1 分)
計算好分數後,我們來看看你假想的評分與建議
分數範圍 適合方案 說明
8–10分: ✅ RAG ,知識動態更新、可追溯、低成本、快速部署,RAG 是首選。
5–7 分: ⚖️ 視情況而定 可考慮 Hybrid 模型,先用 RAG 再針對高頻問題做 fine-tune。
0–4分: ✅ Fine-tuning 知識固定、風格需求高、或需離線處理時,fine-tune 更適合。
RAG 的架構組成¶
檢索器(Retriever)
- 輸入使用者的問題或提示,從知識庫(例如文件、網頁、FAQ)中找出最相關的資料。
-
常用技術:Dense Passage Retrieval (DPR)、BM25、FAISS(向量搜尋)。
生成器(Generator) -
使用檢索回來的文件作為上下文,生成最終答案。
- 常用模型:BART、T5、GPT 等。
運作流程¶
- 使用者輸入問題:「什麼是量子糾纏?」
- Retriever 從一個大規模文檔庫(如維基百科、公司內部知識庫)中找出相關段落。
- Generator 將問題和這些段落作為上下文輸入,生成自然語言的答案。
特點¶
- 更新性:知識來自外部資料庫,可以定期更新,不受模型訓練時間限制。
- 可控性:你可以指定模型只能查某個資料庫(如公司內部文件)。
- 減少幻覺:有資料佐證的生成內容更可信。
實作¶
1.需要有一到多份PDF或是txt檔案,有鮮明主題(我使用Linedin上的一些個人介紹,accomplishment),之後就可以做成embedding
save_directory = '...\\genAI_HW' #指定生成位置file_paths = ['...\\genAI_HW\\dan_intro.txt',] #用來做embedding的檔案名稱 listembedding_manager = EmbeddingManager(save_directory) #指定生成物存放位置embedding_manager.gemini_model_init()embedding_manager.create_embedding(file_paths) #生成 embedding#這邊使用的是SentenceTransformer('all-MiniLM-L6-v2')
2.再來就可以呼叫先前使用過的Gemini API,把embedding 給他去回應,就可以拿到回答了
def flow_for_answering(self, query): #拿到優化好的檔案 documents = self.load_documents(os.path.join(self.save_directory, 'processed_rag_text.json')) #拿到embedding embeddings = np.load(os.path.join(self.save_directory, 'embeddings.npy')) best_document = self.retrieve_documents(query, embeddings, documents) # Retrieve relevant documents based on the query #針對prompt做優化 query_prompt = self.add_prompt(query) response = self.generate_response(self.chat_model, query_prompt, best_document) # Generate response using the retrieved documents as context response = self.extract_content(response) self.historical_conversations.append({"user": query, "model": response}) return response
最後的對答如下:
User: Who is Dan
Model: Dan is a highly skilled data analyst with a strong online presence showcasing his expertise. For detailed information on his experience and skills, check his LinkedIn and blog.
User: Is he suitable for a data analyst role?
Model: Based on his LinkedIn profile and blog, Dan demonstrates strong potential for a data analyst role. His skills and experience appear relevant.
可以發現透過RAG gemini得知Dan的資訊,並且透過prompt增強自肥,也可以觀察到gemini模型回答問題較為謹慎(例如appear relevant),以上為一個簡易的RAG實作。
Comments
Loading comments…
Leave a Comment