生成式AI導論2024 — RAG 加餐

生成式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