Skip to content

Latest commit

 

History

History
281 lines (172 loc) · 13.2 KB

File metadata and controls

281 lines (172 loc) · 13.2 KB

檢索增強生成 (RAG) 和向量數據庫

檢索增強生成 (RAG) 和向量數據庫

在搜索應用的課程中,我們簡要學習了如何將自己的數據整合到大型語言模型 (LLMs) 中。在本課程中,我們將深入探討如何在 LLM 應用中基於自己的數據進行操作的概念、過程的機制以及存儲數據的方法,包括嵌入和文本。

影片即將推出

簡介

在本課程中,我們將涵蓋以下內容:

  • RAG 的介紹,它是什麼以及為什麼在人工智慧 (AI) 中使用它。

  • 理解什麼是向量數據庫並為我們的應用創建一個。

  • 如何將 RAG 整合到應用中的實際範例。

學習目標

完成本課程後,您將能夠:

  • 解釋 RAG 在數據檢索和處理中的重要性。

  • 設置 RAG 應用並將您的數據基於 LLM。

  • 在 LLM 應用中有效整合 RAG 和向量數據庫。

我們的場景:使用自己的數據增強 LLM

在本課程中,我們希望將自己的筆記添加到教育初創公司中,讓聊天機器人能夠獲取更多有關不同主題的信息。使用我們的筆記,學習者將能夠更好地學習和理解不同的主題,從而更容易準備考試。為了創建我們的場景,我們將使用:

  • Azure OpenAI: 我們用來創建聊天機器人的 LLM

  • AI 初學者課程中的神經網絡課程: 我們基於 LLM 的數據

  • Azure AI SearchAzure Cosmos DB: 用於存儲數據並創建搜索索引的向量數據庫

用戶將能夠根據筆記創建練習測驗、複習閃卡並將其摘要為簡潔的概述。讓我們開始了解什麼是 RAG 以及它如何運作:

檢索增強生成 (RAG)

一個由 LLM 驅動的聊天機器人處理用戶的提示以生成回應。它旨在與用戶進行互動,涵蓋廣泛的主題。然而,它的回應僅限於提供的上下文及其基礎訓練數據。例如,GPT-4 的知識截止日期是 2021 年 9 月,這意味著它缺乏對此日期之後發生事件的了解。此外,用於訓練 LLM 的數據不包括機密信息,例如個人筆記或公司的產品手冊。

RAG(檢索增強生成)如何運作

展示 RAG 運作方式的圖示

假設您想部署一個聊天機器人來根據您的筆記創建測驗,您需要與知識庫建立連接。這就是 RAG 的用武之地。RAG 的運作方式如下:

  • 知識庫: 在檢索之前,這些文檔需要被導入並進行預處理,通常是將大型文檔分解為較小的部分,轉換為文本嵌入並存儲在數據庫中。

  • 用戶查詢: 用戶提出問題。

  • 檢索: 當用戶提出問題時,嵌入模型從我們的知識庫中檢索相關信息,以提供更多上下文,並將其整合到提示中。

  • 增強生成: LLM 根據檢索到的數據增強其回應。這使得生成的回應不僅基於預訓練數據,還基於添加的上下文中的相關信息。檢索到的數據用於增強 LLM 的回應。LLM 然後返回用戶問題的答案。

展示 RAG 架構的圖示

RAG 的架構使用由兩部分組成的 transformer:編碼器和解碼器。例如,當用戶提出問題時,輸入文本被“編碼”為捕捉詞義的向量,這些向量被“解碼”到我們的文檔索引中,並根據用戶查詢生成新文本。LLM 使用編碼器-解碼器模型生成輸出。

根據提出的論文:檢索增強生成用於知識密集型 NLP(自然語言處理軟件)任務,實現 RAG 的兩種方法是:

  • RAG-Sequence 使用檢索到的文檔來預測用戶查詢的最佳答案。

  • RAG-Token 使用文檔生成下一個 token,然後檢索它們以回答用戶的查詢。

為什麼要使用 RAG?

  • 信息豐富性: 確保文本回應是最新的。它因此通過訪問內部知識庫來提高特定領域任務的性能。

  • 通過利用知識庫中的 可驗證數據 減少虛構,為用戶查詢提供上下文。

  • 它是 成本效益高的,因為與微調 LLM 相比,它更經濟。

創建知識庫

我們的應用基於我們的個人數據,即 AI 初學者課程中的神經網絡課程。

向量數據庫

向量數據庫與傳統數據庫不同,是一種專門設計用於存儲、管理和搜索嵌入向量的數據庫。它存儲文檔的數值表示。將數據分解為數值嵌入使得我們的 AI 系統更容易理解和處理數據。

我們將嵌入存儲在向量數據庫中,因為 LLM 對接受作為輸入的 token 數量有限制。由於無法將整個嵌入傳遞給 LLM,我們需要將它們分解為小塊,當用戶提出問題時,最接近問題的嵌入將與提示一起返回。分塊還可以降低通過 LLM 傳遞 token 的成本。

一些流行的向量數據庫包括 Azure Cosmos DB、Clarifyai、Pinecone、Chromadb、ScaNN、Qdrant 和 DeepLake。您可以使用以下命令通過 Azure CLI 創建 Azure Cosmos DB 模型:

az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>

從文本到嵌入

在存儲數據之前,我們需要將其轉換為向量嵌入,然後存儲在數據庫中。如果您正在處理大型文檔或長文本,可以根據預期的查詢進行分塊。分塊可以在句子級別或段落級別進行。由於分塊從周圍的詞中獲取意義,您可以向分塊添加一些其他上下文,例如添加文檔標題或在分塊前後包含一些文本。您可以按以下方式分塊數據:

def split_text(text, max_length, min_length):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
            chunks.append(' '.join(current_chunk))
            current_chunk = []

    # If the last chunk didn't reach the minimum length, add it anyway
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

分塊後,我們可以使用不同的嵌入模型嵌入文本。您可以使用的一些模型包括:word2vec、OpenAI 的 ada-002、Azure Computer Vision 等。選擇使用的模型將取決於您使用的語言、編碼的內容類型(文本/圖像/音頻)、它可以編碼的輸入大小以及嵌入輸出的長度。

使用 OpenAI 的 text-embedding-ada-002 模型嵌入文本的範例是: 嵌入單詞 cat 的範例

檢索和向量搜索

當用戶提出問題時,檢索器使用查詢編碼器將其轉換為向量,然後在我們的文檔搜索索引中搜索與輸入相關的文檔的相關向量。完成後,它將輸入向量和文檔向量都轉換為文本並通過 LLM 傳遞。

檢索

檢索發生在系統嘗試快速從索引中找到滿足搜索條件的文檔時。檢索器的目標是獲取將用於提供上下文並基於您的數據建立 LLM 的文檔。

在我們的數據庫中執行搜索有幾種方法,例如:

  • 關鍵字搜索 - 用於文本搜索。

  • 語義搜索 - 使用詞語的語義。

  • 向量搜索 - 使用嵌入模型將文檔從文本轉換為向量表示。檢索將通過查詢與用戶問題最接近的文檔的向量表示來完成。

  • 混合搜索 - 結合關鍵字和向量搜索。

檢索的挑戰在於當數據庫中沒有與查詢相似的回應時,系統將返回它能找到的最佳信息。然而,您可以使用一些策略,例如設置相關性的最大距離或使用結合關鍵字和向量搜索的混合搜索。在本課程中,我們將使用混合搜索,即結合向量和關鍵字搜索。我們將數據存儲到包含分塊和嵌入的列的數據框中。

向量相似性

檢索器將在知識數據庫中搜索彼此接近的嵌入,最近的鄰居,因為它們是相似的文本。在用戶提出查詢的情況下,首先進行嵌入,然後與相似的嵌入進行匹配。用於測量不同向量相似度的常見方法是基於兩個向量之間角度的餘弦相似性。

我們可以使用其他替代方法來測量相似性,例如歐幾里得距離(向量端點之間的直線)和點積(測量兩個向量的對應元素的乘積之和)。

搜索索引

進行檢索時,我們需要在執行搜索之前為知識庫構建搜索索引。索引將存儲我們的嵌入,並且即使在大型數據庫中也可以快速檢索最相似的分塊。我們可以使用以下方式在本地創建索引:

from sklearn.neighbors import NearestNeighbors

embeddings = flattened_df['embeddings'].to_list()

# Create the search index
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# To query the index, you can use the kneighbors method
distances, indices = nbrs.kneighbors(embeddings)

重排序

在查詢數據庫後,您可能需要根據最相關的結果對結果進行排序。重排序 LLM 利用機器學習通過從最相關的結果排序來提高搜索結果的相關性。使用 Azure AI Search,重排序會自動為您完成,使用語義重排序器。以下是使用最近鄰居進行重排序的範例:

# Find the most similar documents
distances, indices = nbrs.kneighbors([query_vector])

index = []
# Print the most similar documents
for i in range(3):
    index = indices[0][i]
    for index in indices[0]:
        print(flattened_df['chunks'].iloc[index])
        print(flattened_df['path'].iloc[index])
        print(flattened_df['distances'].iloc[index])
    else:
        print(f"Index {index} not found in DataFrame")

整合所有內容

最後一步是將 LLM 添加到其中,以便能夠獲得基於我們數據的回應。我們可以按以下方式實現:

user_input = "what is a perceptron?"

def chatbot(user_input):
    # Convert the question to a query vector
    query_vector = create_embeddings(user_input)

    # Find the most similar documents
    distances, indices = nbrs.kneighbors([query_vector])

    # add documents to query  to provide context
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # combine the history and the user input
    history.append(user_input)

    # create a message object
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": history[-1]}
    ]

    # use chat completion to generate a response
    response = openai.chat.completions.create(
        model="gpt-4",
        temperature=0.7,
        max_tokens=800,
        messages=messages
    )

    return response.choices[0].message

chatbot(user_input)

評估我們的應用

評估指標

  • 提供回應的質量,確保其自然流暢且像人類。

  • 數據的基礎性:評估回應是否來自提供的文檔。

  • 相關性:評估回應是否與所提問題匹配並相關。

  • 流暢性:回應在語法上是否合理。

使用 RAG(檢索增強生成)和向量數據庫的應用場景

使用函數調用可以改善您的應用的許多不同場景,例如:

  • 問答系統:將公司數據基於聊天,供員工用於提問。

  • 推薦系統:您可以創建一個系統,匹配最相似的值,例如電影、餐廳等。

  • 聊天機器人服務:您可以存儲聊天記錄並根據用戶數據個性化對話。

  • 基於向量嵌入的圖像搜索,對於圖像識別和異常檢測非常有用。

總結

我們已經涵蓋了 RAG 的基本領域,包括將數據添加到應用、用戶查詢和輸出。為了簡化 RAG 的創建,您可以使用 Semanti Kernel、Langchain 或 Autogen 等框架。

作業

為了繼續學習檢索增強生成 (RAG),您可以:

  • 使用您選擇的框架為應用構建前端。

  • 使用框架(LangChain 或 Semantic Kernel)重新創建您的應用。

恭喜您完成本課程 👏。

學習不止於此,繼續您的旅程

完成本課程後,請查看我們的 生成式 AI 學習合集,繼續提升您的生成式 AI 知識!


免責聲明
本文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,機器翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。