深度學習技術的快速發展推動了檢索增強生成(RAG)技術在無人機領域的應用。本文將探討根據索引的RAG技術如何應用於無人機影像辨識,並以「無人機如何識別車輛」為例,示範如何使用LlamaIndex建立向量儲存索引、樹狀索引、列表索引和關鍵字表索引,並結合OpenAI的大語言模型(LLM)合成查詢結果。同時,本文也將介紹如何使用SentenceTransformer模型計算餘弦相似度,以及如何利用時間加權平均指標評估查詢引擎的效能。透過這些技術的整合,我們可以有效地從大量的無人機資料中提取關鍵資訊,並應用於車輛識別等實際場景。
此圖示
graph LR;
A[定義向量儲存路徑] --> B[建立向量儲存];
B --> C[建立索引];
C --> D[載入資料集];
D --> E[轉換為Pandas DataFrame];
E --> F[顯示記錄詳細資訊];
圖表翻譯: 此圖表展示了建立向量儲存系統的主要步驟。首先定義向量儲存的路徑,接著建立向量儲存並在其上建立索引。然後載入資料集,並將其轉換為Pandas DataFrame。最後,顯示特定記錄的詳細資訊。整個流程清晰地呈現了從資料準備到資料檢視的完整過程。
根據索引的RAG技術在無人機領域的應用與實作
在人工智慧(AI)技術不斷進步的推動下,檢索增強生成(RAG)技術已經成為眾多領域中的重要工具。特別是在無人機技術領域,RAG技術的應用正逐漸展現出其強大的潛力與價值。本文將探討根據索引的RAG技術在無人機領域的應用,並詳細介紹其實作過程。
RAG資料集的結構與格式
RAG資料集的結構和格式會根據不同的領域或專案而有所不同。然而,在大多數情況下,資料集通常包含幾個關鍵的欄位,這些欄位為我們提供了有關AI演進的寶貴資訊。以本文所使用的資料集為例,其包含了以下四個主要的欄位:
-
id:這是資料集中每個文字區塊的索引,我們將利用這個索引來組織文字區塊,並將其轉換為節點。這些節點可以包含原始文字、文字摘要以及其他額外的資訊,如用於輸出的資料來源所儲存的後設資料。
-
metadata:後設資料是在資料載入和向量儲存建立過程中自動生成的。它包含了有關資料來源的重要資訊。
-
text:文字欄位包含了經過處理的文字內容。在向量儲存建立的過程中,文字被自動分塊處理,而無需手動組態區塊的大小。
-
embedding:嵌入向量是透過嵌入模型為每個資料區塊生成的。這些向量使得我們能夠進行高效的相似度搜尋。
Pipeline3:根據索引的RAG實作
在本文中,我們將使用LlamaIndex來實作一個根據索引的RAG管道。該管道利用了之前使用Deep Lake準備和處理的資料,從而能夠從包含噪聲的無人機相關檔案中檢索相關資訊,並透過OpenAI的LLM模型來合成回應。
索引引擎的實作
我們將實作四種不同的索引引擎:
-
向量儲存索引引擎(Vector Store Index Engine):建立一個向量儲存索引,以實作高效的相似度搜尋。
-
樹索引(Tree Index):構建一個層次化的樹索引,為檢索提供另一種結構選擇。
-
列表索引(List Index):建立一個簡單的列表索引,以便於檢索。
-
關鍵字表索引(Keyword Table Index):根據從檔案中提取的關鍵字建立索引。
使用LLM進行查詢
我們將使用LLM來查詢索引,並檢索相關檔案。查詢引擎將根據使用者輸入檢索相關檔案,並傳回合成的回應以及來源資訊。
評估指標
為了評估回應的品質,我們將使用一個時間加權平均指標,該指標結合了LLM評分和餘弦相似度。由於使用了隨機演算法,內容和執行時間可能會有所不同。
使用者輸入與查詢引數
使用者輸入將作為四個索引引擎的參考問題。我們將評估每個索引引擎的檢索結果,並使用時間和評分比率來衡量輸出結果。
使用者輸入為:
user_input="無人機如何識別車輛?"
查詢引擎將使用以下引數:
-
similarity_top_k:
k=3,表示查詢引擎將檢索前3個最相關的結果。 -
temperature:
temp=0.1,低溫度的設定鼓勵LLM產生更精確的結果。 -
num_output:
mt=1024,限制輸出結果的 token 數量為1024。
程式碼範例
# 設定查詢引數
similarity_top_k = 3
temperature = 0.1
num_output = 1024
# 使用者輸入
user_input = "無人機如何識別車輛?"
# 呼叫查詢引擎
response = query_engine.query(user_input, similarity_top_k, temperature, num_output)
#### 內容解密:
此段程式碼設定了查詢引擎的引數,並呼叫查詢引擎對使用者輸入的問題進行查詢。`similarity_top_k`引數控制了檢索結果的數量,`temperature`引數影響了LLM生成結果的創造性,而`num_output`則限制了輸出結果的長度。查詢引擎將根據這些引數檢索相關資訊,並生成回應。
此圖示
graph LR;
C[C]
A[使用者輸入] -->|查詢|> B(查詢引擎);
B --> C{索引型別};
C -->|向量儲存索引|> D[檢索結果];
C -->|樹索引|> E[檢索結果];
C -->|列表索引|> F[檢索結果];
C -->|關鍵字表索引|> G[檢索結果];
D --> H[合成回應];
E --> H;
F --> H;
G --> H;
圖表翻譯: 此圖示展示了根據索引的RAG技術的查詢流程。使用者輸入查詢後,查詢引擎根據不同的索引型別(向量儲存索引、樹索引、列表索引、關鍵字表索引)進行檢索,最終將檢索結果合成為回應。不同的索引型別提供了多樣化的檢索結構,以滿足不同的查詢需求。
餘弦相似度指標的建立與查詢引擎的應用
在前面的章節中,我們已經探討瞭如何使用不同的查詢引擎來檢索資料。本文將進一步建立餘弦相似度指標,並探討其在查詢引擎中的應用。
餘弦相似度指標
餘弦相似度指標是一種用於衡量兩個向量之間相似程度的指標。在本例中,我們將使用SentenceTransformer模型來生成文字的向量表示,並計算兩個文字之間的餘弦相似度。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def calculate_cosine_similarity_with_embeddings(text1, text2):
embeddings1 = model.encode(text1)
embeddings2 = model.encode(text2)
similarity = cosine_similarity([embeddings1], [embeddings2])
return similarity[0][0]
內容解密:
- 我們首先匯入必要的函式庫,包括
TfidfVectorizer、cosine_similarity和SentenceTransformer。 - 使用
SentenceTransformer模型來生成文字的向量表示。 - 定義了一個函式
calculate_cosine_similarity_with_embeddings,用於計算兩個文字之間的餘弦相似度。 - 在函式中,我們使用
model.encode方法來生成文字的向量表示。 - 使用
cosine_similarity函式來計算兩個向量之間的餘弦相似度。
向量儲存索引查詢引擎
向量儲存索引是一種使用向量嵌入來表示和檢索檔案的索引型別。在本例中,我們將使用VectorStoreIndex來建立一個向量儲存索引。
from llama_index.core import VectorStoreIndex
vector_store_index = VectorStoreIndex.from_documents(documents)
內容解密:
- 匯入
VectorStoreIndex類別。 - 使用
VectorStoreIndex.from_documents方法來建立一個向量儲存索引。 - 該方法接受一個檔案列表作為輸入,並生成一個向量儲存索引。
查詢引擎的建立與查詢
在建立了向量儲存索引之後,我們需要建立一個查詢引擎來檢索資料。
vector_query_engine = vector_store_index.as_query_engine(similarity_top_k=3)
內容解密:
- 使用
vector_store_index.as_query_engine方法來建立一個查詢引擎。 - 在本例中,我們設定了
similarity_top_k引數為3,表示傳回前3個最相似的結果。
查詢結果的處理
在執行查詢之後,我們需要處理查詢結果。
def index_query(input_query):
response = vector_query_engine.query(input_query)
node_data = []
for node_with_score in response.source_nodes:
node = node_with_score.node
node_info = {
'Node ID': node.id_,
'Score': node_with_score.score,
'Text': node.text
}
node_data.append(node_info)
df = pd.DataFrame(node_data)
return df, response
內容解密:
- 定義了一個函式
index_query,用於執行查詢並處理查詢結果。 - 在函式中,我們使用
vector_query_engine.query方法來執行查詢。 - 遍歷查詢結果的源節點,並提取節點的ID、評分和文字。
- 將提取的資訊儲存在一個DataFrame中。
效能指標的計算
為了評估查詢引擎的效能,我們需要計算一個效能指標。
import numpy as np
def info_metrics(response):
scores = [node.score for node in response.source_nodes if node.score is not None]
if scores:
weights = np.exp(scores) / np.sum(np.exp(scores))
# Calculate the weighted average score
weighted_average_score = np.sum(np.array(scores) * weights)
# Assuming elapsed_time is the time taken for the query
elapsed_time = response.elapsed_time # This should be set or retrieved appropriately
performance_metric = weighted_average_score / elapsed_time
return performance_metric
else:
return None
內容解密:
- 定義了一個函式
info_metrics,用於計算查詢的效能指標。 - 在函式中,我們提取查詢結果的源節點的評分。
- 計算評分的加權平均值。
- 將加權平均值除以查詢時間,得到效能指標。
樹狀索引查詢引擎的效能評估與實作
在前一章節中,我們探討了基本的查詢引擎實作及其效能評估。在本章節中,我們將探討樹狀索引(Tree Index)的查詢引擎,並評估其效能。
樹狀索引的工作原理
樹狀索引是一種階層式的資料結構,能夠有效地管理和查詢大量的文字資料。與傳統的階層式結構不同,樹狀索引會最佳化節點的階層、內容和順序,以實作高效的查詢。
樹狀索引的優點
- 能夠處理大規模的資料集,並將資料分解成可管理的區塊
- 能夠快速地檢索相關的節點,而不會浪費時間在無關的資料上
- 能夠根據查詢需求,動態地調整索引的結構和引數
實作樹狀索引查詢引擎
要實作樹狀索引查詢引擎,我們可以使用 LlamaIndex 提供的 TreeIndex 類別。以下是範例程式碼:
from llama_index.core import TreeIndex
# 建立樹狀索引
tree_index = TreeIndex.from_documents(documents)
# 將樹狀索引轉換為查詢引擎
tree_query_engine = tree_index.as_query_engine(similarity_top_k=3)
# 發出查詢請求
import time
import textwrap
# 開始計時
start_time = time.time()
response = tree_query_engine.query(user_input)
# 結束計時
end_time = time.time()
# 計算查詢時間
elapsed_time = end_time - start_time
print(f"Query execution time: {elapsed_time:.4f} seconds")
# 列印查詢結果
print(textwrap.fill(str(response), 100))
內容解密:
TreeIndex.from_documents(documents):使用documents建立樹狀索引。tree_index.as_query_engine(similarity_top_k=3):將樹狀索引轉換為查詢引擎,並設定similarity_top_k引數為 3。tree_query_engine.query(user_input):發出查詢請求,並取得查詢結果。time.time():用於計算查詢時間。
效能評估
為了評估樹狀索引查詢引擎的效能,我們可以使用餘弦相似度(Cosine Similarity)指標。以下是範例程式碼:
similarity_score = calculate_cosine_similarity_with_embeddings(user_input, response)
print(f"Cosine Similarity Score: {similarity_score:.3f}")
print(f"Query execution time: {elapsed_time:.4f} seconds")
performance = similarity_score / elapsed_time
print(f"Performance metric: {performance:.4f}")
內容解密:
calculate_cosine_similarity_with_embeddings(user_input, response):計算查詢輸入和查詢結果之間的餘弦相似度。similarity_score / elapsed_time:計算效能指標,即餘弦相似度除以查詢時間。
結果分析
執行上述程式碼後,我們可以得到查詢結果和效能指標。查詢結果顯示,樹狀索引查詢引擎能夠有效地檢索相關的資料。然而,查詢時間較長,這會影響效能指標。
查詢結果:
Query execution time: 4.3360 seconds
Drones identify vehicles using computer vision technology related technology involves detecting instances of semantic objects of a digital images and videos. Drones can be equipped with object detection models trained on datasets like COCO, to detect vehicles in real-time captured by the drone's cameras.
效能指標:
Cosine Similarity Score: 0.731
Query execution time: 4.3360 seconds
Performance metric: 0.1686
圖表翻譯:
此圖示呈現了樹狀索引的結構和查詢流程。樹狀索引能夠有效地管理和查詢大量的文字資料,並根據查詢需求動態地調整索引的結構和引數。
graph LR;
A[查詢輸入] --> B[樹狀索引];
B --> C[查詢引擎];
C --> D[查詢結果];
D --> E[效能評估];
圖表翻譯: 此圖表呈現了樹狀索引查詢引擎的流程,包括查詢輸入、樹狀索引、查詢引擎、查詢結果和效能評估。樹狀索引能夠有效地管理和查詢大量的文字資料,並根據查詢需求動態地調整索引的結構和引數。