生成式 AI 模型的效能提升關鍵之一在於輸入的強化。向量搜尋技術能有效提升查詢相關檔案的速度,但面對大規模資料集時,效能瓶頸仍難以避免。索引搜尋技術則透過預先計算和儲存 TF-IDF 矩陣,提供更快速的檔案檢索方案。本文將探討如何結合向量搜尋和索引搜尋等技術,增強生成式 AI 模型的輸入,並以 Python 程式碼示例展示根據 TF-IDF 的向量搜尋和索引搜尋的實作方式。同時,我們也將探討模組化 RAG 架構如何提升系統的靈活性、可擴充套件性和效能。透過增強輸入,生成式 AI 模型能更精確地理解使用者查詢,並產生更具資訊價值的輸出,有效解決初始查詢模糊的問題。
增強輸入與生成式AI模型的反應
讓我們現在來看看生成式AI模型如何對增強輸入做出反應。
生成
我們現在呼叫GPT-4o並傳入增強輸入,然後顯示格式化後的輸出:
# 呼叫函式並列印結果
augmented_input = query + best_matching_record
llm_response = call_llm_with_full_text(augmented_input)
print_formatted_response(llm_response)
回應是有意義的,如下所示:
回應:
---
-
---
-
---
-
---
當然!讓我們來解析並闡述提供的內容。
雖然向量搜尋透過順序遍歷每個記錄來顯著加快查詢相關檔案的速度,但隨著資料集大小的增加,其效率可能會降低。為瞭解決這個可擴充套件性問題,索引搜尋提供了一個更先進的解決方案。現在讓我們看看根據索引的搜尋如何加速檔案檢索。
3.2 根據索引的搜尋
根據索引的搜尋將使用者查詢的向量與檔案內容的索引向量進行比較,而不是直接與檔案內容的向量進行比較。
程式首先匯入所需的類別和函式:
```python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
TfidfVectorizer 匯入了一個將文字檔案轉換為TF-IDF特徵矩陣的類別。TF-IDF將透過檔案中的詞頻量化詞在檔案中的相關性。該函式使用餘弦相似度函式計算查詢和矩陣的加權向量之間的相似度,以找到最佳匹配:
def find_best_match(query, vectorizer, tfidf_matrix):
query_tfidf = vectorizer.transform([query])
similarities = cosine_similarity(query_tfidf, tfidf_matrix)
best_index = similarities.argmax() # 取得最高的相似度索引
best_score = similarities[0, best_index]
return best_score, best_index
內容解密:
此函式的主要任務是:
- 轉換查詢:使用提供的向量化工具將輸入查詢轉換為TF-IDF向量格式。
- 計算相似度:計算查詢向量與
tfidf_matrix中所有向量之間的餘弦相似度。 - 識別最佳匹配:在結果中找到最高相似度分數的索引(
best_index)。 - 檢索最佳分數:提取最高的餘弦相似度分數(
best_score)。 輸出的結果是找到的最佳相似度分數和最佳索引。
以下程式碼首先呼叫資料集向量化工具,然後透過其索引搜尋最相似的記錄:
vectorizer, tfidf_matrix = setup_vectorizer(db_records)
best_similarity_score, best_index = find_best_match(query, vectorizer, tfidf_matrix)
best_matching_record = db_records[best_index]
最後,顯示結果:
print_formatted_response(best_matching_record)
系統找到了與使用者輸入查詢最相似的檔案:
回應:
---
-
---
-
---
-
---
一個RAG向量儲存是一個包含向量化資料點的資料函式庫或資料集。
---
-
---
-
---
-
---
我們可以看到,在執行GPT-4o之前,模糊的使用者查詢在檢索級別上產生了可靠的輸出。
特徵提取
在增強輸入之前,先執行以下單元格,該單元格再次呼叫 setup_vectorizer(records) 函式,但顯示矩陣,以便您可以看到其格式。如下所示的是詞語“accurate”和“additional”在其中一個句子中的格式:
圖1.4:矩陣格式
增強輸入
我們將簡單地以最小的方式將查詢新增到最佳匹配記錄中,以檢視GPT-4o將如何反應並顯示輸出:
augmented_input = query + ": " + best_matching_record
print_formatted_response(augmented_input)
輸出結果接近或與向量搜尋相同,但檢索方法更快:
回應:
---
-
---
-
---
-
---
定義一個RAG儲存:一個RAG向量儲存是一個包含向量化資料點的資料函式庫或資料集。
---
-
---
-
---
-
---
生成
我們現在呼叫GPT-4o並傳入增強輸入,然後顯示輸出:
# 呼叫函式並列印結果
llm_response = call_llm_with_full_text(augmented_input)
print_formatted_response(llm_response)
對於輸入初始模糊查詢的使用者來說,輸出是有意義的:
回應:
---
-
---
-
---
-
---
當然!讓我們來解析並闡述給定的內容:
這種方法在特定領域的封閉環境中運作良好。在開放環境中,使用者可能需要在提交請求之前進行闡述。
在本文中,我們看到TF-IDF矩陣預先計算了檔案向量,從而實作了更快的同時比較,而無需重複的向量轉換。我們已經看到了向量和根據索引的搜尋如何改進檢索。然而,在一個專案中,我們可能需要根據需要檢索的檔案應用簡單和先進的RAG。現在讓我們看看模組化RAG如何改進我們的系統。
4. 模組化RAG
在實施RAG時,我們應該使用關鍵字搜尋、向量搜尋還是根據索引的搜尋?每種方法都有其優點。選擇將取決於幾個因素:
- 關鍵字搜尋適用於簡單檢索。
- 向量搜尋適用於語義豐富的檔案。
- 根據索引的搜尋在大資料集上提供更快的速度。
然而,這三種方法可以在一個專案中完美地結合在一起。例如,在一種場景中,關鍵字搜尋可以幫助找到明確定義的檔案標籤,例如PDF檔案的標題和帶標籤的影像,然後對它們進行處理。然後,根據索引的搜尋將檔案分組為索引子集。最後,檢索程式可以搜尋索引資料集,找到子集,並且僅使用向量搜尋來遍歷有限數量的檔案,以找到最相關的檔案。
在本文中,我們將建立一個 `RetrievalComponent` 類別,可以在專案的每個步驟中呼叫以執行所需任務。程式碼總結了我們在本章中構建的三種方法,並且我們可以透過其主要成員對 `RetrievalComponent` 進行求和。
以下程式碼初始化類別,並根據搜尋方法的選擇進行初始化,如果需要,還會準備一個向量化工具。`self` 指的是當前類別例項,用於存取其變數、方法和函式:
```python
def __init__(self, method='vector'):
self.method = method
if self.method == 'vector' or self.method == 'indexed':
self.vectorizer = TfidfVectorizer()
self.tfidf_matrix = None
內容解密:
在這種情況下,向量搜尋被啟用。fit 方法從記錄中構建一個TF-IDF矩陣,並且適用於向量或根據索引的搜尋方法:
def fit(self, records):
if self.method == 'vector' or self.method == 'indexed':
# 實作細節
未來方向
未來的研究可以集中在進一步最佳化模組化RAG系統,探索新的特徵提取方法和改進現有的搜尋演算法。此外,將這些技術應用於實際場景,例如智慧客服系統或大規模檔案管理系統,將具有重要的實踐價值。透過不斷改進和創新,我們可以期待在AI驅動的資訊檢索領域看到更多的突破和進展。
####### 圖表翻譯: 此圖展示了TF-IDF矩陣的格式,說明瞭詞語“accurate”和“additional”在其中一個句子中的表示方式。透過這個圖表,我們可以清晰地看到TF-IDF如何量化詞語在檔案中的重要性,為後續的相似度計算奠定了基礎。
圖表翻譯: 此圖展示了從使用者查詢到最終回應的整個流程。首先,使用者查詢被轉換為TF-IDF向量,然後計算與檔案向量之間的餘弦相似度,以找出最佳匹配記錄。接著,將最佳匹配記錄與使用者查詢結合,形成增強輸入,最後輸入到生成式AI模型中,生成最終回應。整個流程清晰地展示瞭如何透過根據索引的搜尋和模組化RAG技術提高檔案檢索的效率和準確性。
RAG 技術深度解析與實作應用
RAG 技術的核心架構與元件
RAG(Retrieval-Augmented Generation)技術結合了檢索與生成兩大核心元件,為生成式人工智慧(Generative AI)提供了強大的資訊增強能力。RAG 系統主要由兩個關鍵部分組成:檢索器(Retriever)和生成器(Generator)。
檢索器(Retriever)
檢索器負責處理資料並定義搜尋方法,其實作方式多樣,可根據不同的需求選擇合適的搜尋策略。主要包含以下三種搜尋方法:
關鍵字搜尋(Keyword Search)
- 透過計算查詢與檔案中共同的關鍵字數量來進行匹配
- 實作簡單直接,適用於小型資料集
向量搜尋(Vector Search)
- 使用 TF-IDF 將查詢和檔案轉換為向量表示
- 透過餘弦相似度(Cosine Similarity)計算查詢與檔案的相似程度
- 能捕捉語義層次的相似性,效果優於簡單的關鍵字匹配
索引搜尋(Indexed Search)
- 預先計算並儲存 TF-IDF 矩陣,加速搜尋過程
- 適合用於大規模資料集的快速檢索
程式碼實作:檢索元件
class RetrievalComponent:
def __init__(self, method='keyword'):
self.method = method
self.vectorizer = TfidfVectorizer()
self.tfidf_matrix = None
self.documents = []
def fit(self, documents):
self.documents = documents
self.tfidf_matrix = self.vectorizer.fit_transform(documents)
def retrieve(self, query):
if self.method == 'keyword':
return self.keyword_search(query)
elif self.method == 'vector':
return self.vector_search(query)
elif self.method == 'indexed':
return self.indexed_search(query)
def keyword_search(self, query):
best_score = 0
best_record = None
query_keywords = set(query.lower().split())
for index, doc in enumerate(self.documents):
doc_keywords = set(doc.lower().split())
common_keywords = query_keywords.intersection(doc_keywords)
score = len(common_keywords)
if score > best_score:
best_score = score
best_record = self.documents[index]
return best_record
def vector_search(self, query):
query_tfidf = self.vectorizer.transform([query])
similarities = cosine_similarity(query_tfidf, self.tfidf_matrix)
best_index = similarities.argmax()
return self.documents[best_index]
def indexed_search(self, query):
query_tfidf = self.vectorizer.transform([query])
similarities = cosine_similarity(query_tfidf, self.tfidf_matrix)
best_index = similarities.argmax()
return self.documents[best_index]
內容解密:
RetrievalComponent類別封裝了不同的搜尋方法,提供統一的介面。fit方法用於初始化檔案集並計算 TF-IDF 矩陣。retrieve方法根據選擇的搜尋方法呼叫相應的搜尋函式。- 三種搜尋方法各有其特點和適用場景:
- 關鍵字搜尋簡單直接
- 向量搜尋能捕捉語義相似性
- 索引搜尋適合大規模資料集
RAG 技術的進階應用與模組化設計
RAG 技術不僅限於單一的檢索方法,而是可以根據需求靈活組合不同的檢索策略,形成模組化的 RAG 系統。
模組化 RAG 的優勢
- 靈活性:可根據不同的應用場景選擇最合適的檢索策略。
- 可擴充套件性:易於整合新的檢索方法或機器學習模型。
- 效能最佳化:可針對特定的資料集和查詢型別進行最佳化。
程式碼實作:模組化 RAG 使用範例
retrieval = RetrievalComponent(method='vector')
retrieval.fit(db_records)
best_matching_record = retrieval.retrieve(query)
print_formatted_response(best_matching_record)
內容解密:
- 建立
RetrievalComponent例項並選擇向量搜尋方法。 - 使用
fit方法初始化資料集。 - 透過
retrieve方法取得最佳匹配記錄。 - 將結果格式化輸出。
RAG 生態系統的重要組成
RAG 系統的運作依賴於完整的生態系統,主要包含以下關鍵元件:
- 檢索器(Retriever):負責資料的檢索和匹配。
- 生成器(Generator):根據檢索到的資訊生成最終輸出。
- 訓練器(Trainer):用於訓練和最佳化模型引數。
- 評估器(Evaluator):評估系統的效能和輸出品質。
RAG 系統的工作流程圖示
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 增強生成式AI模型輸入與反應
package "生成式 AI 輸入增強" {
package "檢索方法" {
component [關鍵字搜尋] as keyword
component [向量搜尋] as vector
component [索引搜尋] as indexed
}
package "TF-IDF 處理" {
component [TfidfVectorizer] as tfidf
component [餘弦相似度] as cosine
component [最佳匹配] as best
}
package "模組化 RAG" {
component [RetrievalComponent] as retrieval
component [增強輸入] as augment
component [GPT-4o 生成] as generate
}
}
keyword --> vector : 簡單檢索
vector --> indexed : 語義搜尋
indexed --> tfidf : 大規模資料
tfidf --> cosine : 向量矩陣
cosine --> best : 相似度計算
best --> retrieval : 最佳記錄
retrieval --> augment : 查詢組合
augment --> generate : LLM 輸出
note right of indexed
索引搜尋優勢:
- 預計算 TF-IDF
- 快速檢索
- 大規模資料集
end note
note right of retrieval
模組化設計:
- 靈活性
- 可擴充性
- 效能最佳化
end note
@enduml
圖表翻譯: 此圖示呈現了 RAG 系統的工作流程:
- 使用者輸入查詢請求。
- 檢索器從資料集中檢索相關資訊。
- 生成器根據檢索結果生成最終輸出。
- 訓練器負責最佳化生成模型。
- 評估器對系統輸出進行品質評估。