In [1]:
import os
import numpy as np
from dotenv import load_dotenv
import faiss
import google.generativeai as genai
C:\Users\PC\Code\Python\Publish-To-Git\RAG-With-LangChain-And-FAISS\venv\Lib\site-packages\tqdm\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html from .autonotebook import tqdm as notebook_tqdm
A. 載入 .env 取得 LLM API Key¶
In [2]:
load_dotenv()
# print(os.getenv('GEMINI_API_KEY'))
genai.configure(api_key=os.getenv('GEMINI_API_KEY'))
B. RAG 實作¶
I. 建立向量資料庫¶
In [3]:
## 使用 Google Gemini 生成文字的向量嵌入
def get_gemini_embedding(text):
response = genai.embed_content(model="models/embedding-001", content=text, task_type="retrieval_document")
return response["embedding"]
In [4]:
documents = [
"Google Gemini 是一款大型語言模型(LLM),由 Google DeepMind 開發,適用於各種自然語言處理(NLP)任務。",
# "RAG(檢索增強生成)結合了檢索與 AI 生成,提升模型回答的準確度。",
"RAG是知名品牌製作的高效清潔抹布,通常市售30TWD,基本每戶人家都會有一條RAG放置廚房做使用",
"FAISS 是一款高效的向量搜尋庫,適合用於 AI 相關應用。",
]
In [5]:
embeddings = np.array([get_gemini_embedding(doc) for doc in documents], dtype=np.float32)
print("Embedding Shape:", embeddings.shape)
print("Content Top 5:", embeddings[:5])
Embedding Shape: (3, 768) Content Top 5: [[ 0.04012055 -0.01553916 -0.05447042 ... 0.02586641 -0.01795555 0.01585375] [ 0.06144911 -0.00659113 -0.05377533 ... 0.00689761 0.00225536 0.00023795] [ 0.0564121 -0.01196416 -0.06638404 ... 0.01994789 -0.00251821 0.0266339 ]]
In [6]:
### 建立 FAISS 索引
dimension = embeddings.shape[1] # 嵌入向量的維度
index = faiss.IndexFlatL2(dimension) # 使用 L2 距離索引
index.add(embeddings) # 新增向量資料
### 儲存 FAISS 索引
faiss.write_index(index, "faiss_index.bin")
print("✅ FAISS 向量資料庫已建立!")
✅ FAISS 向量資料庫已建立!
II. 使用 RAG 進行增強式答覆¶
In [7]:
### 從 FAISS 檢索最相關的資料
def retrieve_from_faiss(query, top_k=2):
index = faiss.read_index("faiss_index.bin") # 載入索引
query_vector = np.array([get_gemini_embedding(query)], dtype=np.float32) # 轉換為向量
distances, indices = index.search(query_vector, top_k) # 搜索最相關的 K 個結果
return [documents[i] for i in indices[0]] # 返回對應的文件
In [8]:
### RAG 流程:檢索 + 生成回答
model = "gemini-1.5-flash"
def rag_query(query):
relevant_docs = retrieve_from_faiss(query)
context = "\n".join(relevant_docs)
prompt = f"""
我希望你扮演 "基於事實回答的顧問" 的角色。
- 請根據以下資訊回答問題 : {context}
- 問題 : {query}
- 遵守下列規則 :
* 請勿幻覺答覆
* 繁體中文回覆
"""
client = genai.GenerativeModel(model)
res = client.generate_content(prompt)
return res.text
def norm_query(query):
prompt = f"""
我希望你扮演 "基於事實回答的顧問" 的角色。
- 問題 : {query}
- 遵守下列規則 :
* 請勿幻覺答覆
* 繁體中文回覆
"""
client = genai.GenerativeModel(model)
res = client.generate_content(prompt)
return res.text
C. 成果展示¶
I. 什麼是 RAG?¶
In [9]:
norm_query("什麼是 RAG?")
Out[9]:
'RAG 指的是 **Retrieval Augmented Generation**,中文翻譯為 **檢索增強生成**。\n\n它是一種人工智慧技術,結合了大型語言模型 (LLM) 和外部知識庫。 不同於僅依靠預訓練數據的傳統 LLM,RAG 系統會先從知識庫中檢索與使用者問題相關的資訊,再將這些資訊與問題一起送入 LLM 進行處理,最終生成更準確、更相關且更具資訊性的答案。\n\n簡而言之,RAG 的核心機制是:**先檢索,後生成**。 它藉由外部知識庫補足 LLM 的知識限制,提升其回答的可靠性和準確性,並降低產生幻覺 (hallucination) 的可能性。 知識庫的形式可以是資料庫、文件、網頁等等。\n'
In [10]:
rag_query("什麼是 RAG?")
Out[10]:
'根據提供的資訊,RAG 是一種知名品牌生產的高效清潔抹布,售價約為 30 台幣,普遍存在於台灣家庭廚房中。 它與向量搜尋庫 FAISS 並無直接關係。\n'
II. RAG 是抹布嗎? 超商可以買到它嗎?¶
In [11]:
norm_query("RAG 是抹布嗎? 超商可以買到它嗎?")
Out[11]:
'RAG 並不是抹布。RAG 指的是 Retrieval Augmented Generation,中文翻譯為「檢索增強生成」,是一種人工智慧技術,而非實體物品。因此,超商不可能買到它。\n'
In [12]:
rag_query("RAG 是抹布嗎? 超商可以買到它嗎?")
Out[12]:
'根據提供的資訊,RAG是一種市售的清潔抹布,價格約為30 TWD,一般住家廚房都會使用。 然而,資訊中並沒有說明它是否在超商販售。 因此,我只能確定RAG是抹布,但無法確定超商是否販售。\n'
III. 什麼是 Agent?¶
In [13]:
norm_query("什麼是 Agent?")
Out[13]:
'在電腦科學和人工智慧領域,「Agent」指的是一個能夠自主感知環境並根據其目標採取行動的實體。 這是一個相當廣泛的概念,具體定義取決於上下文。 它可以指:\n\n* **軟體代理 (Software Agent):** 這可能是最常見的用法。軟體代理是一個程式或程式系統,能夠在一定程度上自主運行,執行特定的任務或目標。例如,一個網路爬蟲是一個軟體代理,它可以自主搜尋網頁;一個聊天機器人也是一種軟體代理,它能與使用者互動。 關鍵特點是其自主性以及與環境(例如網路、資料庫等)的互動能力。\n\n* **智慧代理 (Intelligent Agent):** 這指的是具備一定智慧能力的軟體代理。它不僅能自主行動,還能學習、適應環境變化,並作出更有效的決策。例如,一個基於機器學習的推薦系統,可以根據使用者的歷史行為調整推薦策略,就是一種智慧代理。\n\n* **多代理系統 (Multi-agent System):** 這指的是由多個代理組成的系統,這些代理可以互相協作或競爭,以達到共同目標或各自目標。例如,在電玩遊戲中,每個玩家控制的角色可以視為一個代理,它們在遊戲環境中互動。\n\n\n總之,「Agent」並非一個單一、明確的定義,而是一個代表具有自主性和互動能力的實體的廣泛概念。 其具體含義需要根據其所在的上下文來理解。\n'
In [14]:
rag_query("什麼是 Agent?")
Out[14]:
'根據提供的資訊,我無法回答「什麼是Agent?」。提供的資訊僅描述了FAISS (一個向量搜尋庫) 和 RAG (一種清潔抹布),與「Agent」這個概念沒有任何關聯。 要回答「什麼是Agent?」,需要更多背景資訊或定義。\n'