深度學習技術的快速發展推動了檢索增強生成(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演進的寶貴資訊。以本文所使用的資料集為例,其包含了以下四個主要的欄位:

  1. id:這是資料集中每個文字區塊的索引,我們將利用這個索引來組織文字區塊,並將其轉換為節點。這些節點可以包含原始文字、文字摘要以及其他額外的資訊,如用於輸出的資料來源所儲存的後設資料。

  2. metadata:後設資料是在資料載入和向量儲存建立過程中自動生成的。它包含了有關資料來源的重要資訊。

  3. text:文字欄位包含了經過處理的文字內容。在向量儲存建立的過程中,文字被自動分塊處理,而無需手動組態區塊的大小。

  4. embedding:嵌入向量是透過嵌入模型為每個資料區塊生成的。這些向量使得我們能夠進行高效的相似度搜尋。

Pipeline3:根據索引的RAG實作

在本文中,我們將使用LlamaIndex來實作一個根據索引的RAG管道。該管道利用了之前使用Deep Lake準備和處理的資料,從而能夠從包含噪聲的無人機相關檔案中檢索相關資訊,並透過OpenAI的LLM模型來合成回應。

索引引擎的實作

我們將實作四種不同的索引引擎:

  1. 向量儲存索引引擎(Vector Store Index Engine):建立一個向量儲存索引,以實作高效的相似度搜尋。

  2. 樹索引(Tree Index):構建一個層次化的樹索引,為檢索提供另一種結構選擇。

  3. 列表索引(List Index):建立一個簡單的列表索引,以便於檢索。

  4. 關鍵字表索引(Keyword Table Index):根據從檔案中提取的關鍵字建立索引。

使用LLM進行查詢

我們將使用LLM來查詢索引,並檢索相關檔案。查詢引擎將根據使用者輸入檢索相關檔案,並傳回合成的回應以及來源資訊。

評估指標

為了評估回應的品質,我們將使用一個時間加權平均指標,該指標結合了LLM評分和餘弦相似度。由於使用了隨機演算法,內容和執行時間可能會有所不同。

使用者輸入與查詢引數

使用者輸入將作為四個索引引擎的參考問題。我們將評估每個索引引擎的檢索結果,並使用時間和評分比率來衡量輸出結果。

使用者輸入為:

user_input="無人機如何識別車輛?"

查詢引擎將使用以下引數:

  • similarity_top_kk=3,表示查詢引擎將檢索前3個最相關的結果。

  • temperaturetemp=0.1,低溫度的設定鼓勵LLM產生更精確的結果。

  • num_outputmt=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]

內容解密:

  1. 我們首先匯入必要的函式庫,包括TfidfVectorizercosine_similaritySentenceTransformer
  2. 使用SentenceTransformer模型來生成文字的向量表示。
  3. 定義了一個函式calculate_cosine_similarity_with_embeddings,用於計算兩個文字之間的餘弦相似度。
  4. 在函式中,我們使用model.encode方法來生成文字的向量表示。
  5. 使用cosine_similarity函式來計算兩個向量之間的餘弦相似度。

向量儲存索引查詢引擎

向量儲存索引是一種使用向量嵌入來表示和檢索檔案的索引型別。在本例中,我們將使用VectorStoreIndex來建立一個向量儲存索引。

from llama_index.core import VectorStoreIndex

vector_store_index = VectorStoreIndex.from_documents(documents)

內容解密:

  1. 匯入VectorStoreIndex類別。
  2. 使用VectorStoreIndex.from_documents方法來建立一個向量儲存索引。
  3. 該方法接受一個檔案列表作為輸入,並生成一個向量儲存索引。

查詢引擎的建立與查詢

在建立了向量儲存索引之後,我們需要建立一個查詢引擎來檢索資料。

vector_query_engine = vector_store_index.as_query_engine(similarity_top_k=3)

內容解密:

  1. 使用vector_store_index.as_query_engine方法來建立一個查詢引擎。
  2. 在本例中,我們設定了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

內容解密:

  1. 定義了一個函式index_query,用於執行查詢並處理查詢結果。
  2. 在函式中,我們使用vector_query_engine.query方法來執行查詢。
  3. 遍歷查詢結果的源節點,並提取節點的ID、評分和文字。
  4. 將提取的資訊儲存在一個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

內容解密:

  1. 定義了一個函式info_metrics,用於計算查詢的效能指標。
  2. 在函式中,我們提取查詢結果的源節點的評分。
  3. 計算評分的加權平均值。
  4. 將加權平均值除以查詢時間,得到效能指標。

樹狀索引查詢引擎的效能評估與實作

在前一章節中,我們探討了基本的查詢引擎實作及其效能評估。在本章節中,我們將探討樹狀索引(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))

內容解密:

  1. TreeIndex.from_documents(documents):使用 documents 建立樹狀索引。
  2. tree_index.as_query_engine(similarity_top_k=3):將樹狀索引轉換為查詢引擎,並設定 similarity_top_k 引數為 3。
  3. tree_query_engine.query(user_input):發出查詢請求,並取得查詢結果。
  4. 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}")

內容解密:

  1. calculate_cosine_similarity_with_embeddings(user_input, response):計算查詢輸入和查詢結果之間的餘弦相似度。
  2. 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[效能評估];

圖表翻譯: 此圖表呈現了樹狀索引查詢引擎的流程,包括查詢輸入、樹狀索引、查詢引擎、查詢結果和效能評估。樹狀索引能夠有效地管理和查詢大量的文字資料,並根據查詢需求動態地調整索引的結構和引數。