《翻譯》LLM Zoomcamp 2025 第二堂課(上)

▌Qdrant 向量搜尋

以下為 Claude 協助的教學影片逐字稿翻譯

2-1 Qdrant 向量搜尋介紹

  • 向量搜尋 vs 傳統關鍵字搜尋的差異說明
  • Qdrant 的功能和優勢介紹
  • Docker 環境設置和庫安裝指導
  • Web UI 功能介紹

2-2 語意搜尋實作與嵌入模型選擇

  • 數據組織策略和分析方法
  • 嵌入模型選擇考量(FastEmbed、BGE 模型)
  • 餘弦相似性的概念和視覺化解釋
  • 離線索引和線上搜尋的流程說明

2-3 建立 Qdrant 集合與資料索引

  • Qdrant 集合和點(points)的概念
  • 集合創建和配置設定
  • 數據上傳和索引的完整過程
  • Web UI 視覺化功能的使用和數據分析

2-4 執行語意相似性搜尋

  • 語意搜尋的實際操作演示
  • 搜尋結果的驗證和比較
  • 帶過濾器的進階搜尋功能
  • 不同課程數據的過濾搜尋示例

翻譯原則:

  1. 專有名詞保持原文:Qdrant、FastEmbed、Web UI、BGE、payload 等
  2. 技術術語中文翻譯:向量搜尋、語意相似性、嵌入、集合、餘弦相似性等

▌2-1 Qdrant 向量搜尋介紹

很高興知道你加入了這堂課程,我是來自 Qdrant 的 Jenny,是 Qdrant 的開發者倡導者。今天我要帶你們了解一個使用 Qdrant 進行向量搜尋的簡單範例。我將解釋並視覺化展示向量搜尋如何透過語意相似性運作,以及如何使用 Qdrant 實現語意搜尋、向量搜尋。

今天我將使用這個筆記本,這是一個用 Python 寫的簡單 Jupyter 筆記本。我會使用終端執行兩個指令,還會用我不太美觀的畫圖來說明,請原諒我的藝術技巧可能不太完美,但我堅信視覺化解釋是最好的解釋方式。

我相信現在你已經知道什麼是向量搜尋,但讓我再重申一次,因為重複總是有助於理解發生的事情。

你已經了解傳統的關鍵字搜尋,例如,如果你搜尋像「蝙蝠」這樣的東西,比如果蝠(一種動物),如果你要尋找符合這個查詢的文件,使用傳統的關鍵字搜尋方法,你會找到像「洞穴中的蝙蝠」這樣的內容,所以在傳統的文字關鍵字搜尋中,匹配是基於關鍵字匹配。

向量搜尋的運作範圍更廣,它為搜尋引入了新的能力。例如,你想找一張圖片,讓我畫一張非常美麗的蝙蝠圖片,雖然看起來像蝙蝠但很有爭議性,向量搜尋能夠匹配這個查詢和這張圖片,或者影片(如果有蝙蝠的影片),甚至聲音,比如蝙蝠的尖叫聲。

此外,即使我們只處理文字,向量搜尋也能夠匹配兩個不同的想法,這些想法用不同的詞語表達但具有相同的意思。所以基本上這裡可能是像「飛鼠」這樣的東西,我想這是描述蝙蝠的一種方式,向量搜尋能夠匹配這兩個文本,因為向量搜尋在語意層面運作,也就是意義的層面。

當關鍵字或文字方法直接處理文字並匹配這兩個「蝙蝠」時,在向量搜尋中,我們將處理這些文字的向量化表示,所以這裡會是某個向量,這裡會是某個向量,我們稍後會看到如何獲得這些向量。這些文字、圖片、影片或音訊的相似性或接近性將透過數值方式測量,也就是這些向量之間的相似性,使用不同的相似性指標,我們稍後也會在實踐中看到。這就是向量搜尋。

現在我們可以談論 Qdrant 如何融入這個圖景。Qdrant 讓向量搜尋變得可擴展,當你製作大規模解決方案時,比如數百萬或數十億個向量,你需要讓搜尋變得快速、可用於生產環境且可行。

Qdrant 是一個搜尋引擎,一個開源的向量搜尋引擎,是用 Rust 寫的專門解決方案,它允許快速且可擴展的向量搜尋。

至於為什麼一般需要向量搜尋的專門解決方案,我們特別在這篇文章中收集了所有答案,我會留給你們閱讀。一般來說,向量搜尋的專門解決方案是為了向量搜尋的可擴展性、與向量搜尋最新趨勢保持同步(這些趨勢隨著持續的研究而變化和適應),以及充分利用向量搜尋的能力,這些能力比語意相似性搜尋還要多一些。

如果你想研究向量搜尋除了相似性之外還能做什麼,你也可以在我們網站的文章部分查看。然而,今天主要講的是語意相似性搜尋以及如何在你的應用程序中使用它,Qdrant 絕對可以用於此目的。

我將帶你們了解,我希望一切都會非常容易理解,但如果你們有任何問題,請隨時在我們的開源 Discord 社群中聯繫我們,我們總是很樂意回答任何問題。

讓我停止廢話,切換到實踐。使用 Qdrant 進行向量搜尋的第一件事是設置 Qdrant。Qdrant 是完全開源的,所以你可以用不同的方式運行它,非常靈活,可以在你自己的基礎設施、Kubernetes 或託管雲端上運行。

今天我們將使用 Docker 中的 Qdrant 實例,所以在 Docker 容器中,我假設現在你已經知道如何安裝 Docker,所以我們只是要拉取 Qdrant 映像並運行容器,基本上然後我們就準備好連接到 Qdrant 實例了。

讓我們首先在終端中拉取我們的 Qdrant 映像,我已經在我的課程資料夾中,這是我今天要用於所有東西的資料夾,包括我展示給你們的筆記本。在這裡我們正在拉取最新的映像,現在我們可以使用這個命令運行這個 Qdrant 實例,這個 Qdrant 容器。

你可以看到一切都已經成功運行,這裡有一個美麗的標誌。如果你想知道這個命令中到底發生了什麼,我在筆記本中寫了一些詳細信息。有趣的是這一行,它基本上將我們的本地存儲掛載到容器中,所以如果你刪除或以任何方式更改容器,你不會失去任何數據,上傳到 Qdrant 存儲的所有數據都將在本地存儲。

現在我們有了運行的實例,我們基本上準備好切換到構建向量搜尋。我想向你們展示的最後一件事是,首先,當我們運行 Docker 時,我們立即可以訪問我們的 Web UI,不僅在本地,在其他解決方案中也是如此。

這個 Web UI 是我最喜歡的功能之一,因為它還允許你視覺化研究你的數據,視覺化研究向量搜尋中的語意相似性,我稍後會向你們展示,正如我已經說過的,我是一個忠實粉絲,因為我認為這是理解語意搜尋如何在實踐中和視覺上發生的最佳方式。

在開始使用 Qdrant 之前,最後一件事是安裝兩個庫,在這裡我們將它們安裝在你為這門課程創建的虛擬環境中,這些庫是兩個庫。

第一個是 Qdrant 客戶端,這裡我們將使用 Python 客戶端,但我們也有其他語言的官方客戶端,所以如果你喜歡,你可以使用它們。

還有一個 FastEmbed 套件,這是一個專門用於數據向量化的套件,使其能夠進行向量搜尋,這是我們自己的庫,與 Qdrant 集成,所以它使數據向量化和上傳到 Qdrant 的過程變得非常簡單,不會讓你頭痛地理解從哪裡獲取這些向量。

總而言之,現在我們已經設置好並準備就緒,我們可以切換到下一步,當我們準備好設置一切來創建我們簡單的語意搜尋解決方案。


▌2-2 語意搜尋實作與嵌入模型選擇

在安裝了所有必要的庫之後,我們可以切換到直接圍繞使我們的語意搜尋成為可能的工作。首先,我們需要導入我們剛剛安裝的必要庫,這是一個 Qdrant 庫,將用於連接到 Qdrant,其中包含不同的配置。

然後在我們導入了必要的庫之後,我們可以初始化我們的客戶端,這裡我們使用我們的 Python 客戶端,我們連接到這個本地主機,所以我們在本地工作。你在上一個影片中看到的相同本地主機是我們 Web UI 所在的位置。

我們初始化客戶端,現在我們已經可以考慮我們向量搜尋解決方案的數據組織,我認為這是每個解決方案的重要步驟,包括向量搜尋解決方案。

為了製作有意義、有效的東西,不管是否需要某種類型的搜尋(包括語意搜尋),研究你的數據並檢查其性質總是有益的。研究這種性質將幫助你首先定義如何在專門的向量搜尋解決方案中組織這些數據,什麼進入嵌入(所以將針對什麼進行語意搜尋),什麼進入元數據(所以可以用於更嚴格的過濾條件)。

這也會大大幫助你選擇正確的嵌入模型,這是製作有效向量搜尋解決方案的關鍵步驟,因為這實際上是如何準備所有這些的整個藝術,我永遠不會忽視這一步。

所以即使我們這裡有一個非常簡單的例子,讓我們研究一下,讓我們看看我們這裡有什麼。所以在這裡我們有一個課程數據,你可以看到這個課程中的課程文件,這些文件是對特定課程部分的課程內容的問題和對這些問題的答案。

我們有這些數據,它看起來已經準備得很好,清理過,分塊(所以分成小塊),這些小塊對向量化數據的嵌入模型來說更容易消化。

所以現在我們可以直接考慮在語意搜尋中使用什麼是有意義的,在過濾條件中使用什麼作為元數據保存是有意義的。

如果我們看例子,我們可以看到我們正在討論的完全相同的想法,以不同的方式表達。所以我們有語意相似的實體,同時它們用不同的詞語表達。

我在這裡寫下了來自這些問答數據的一個例子,看看這些問題和答案在意義上談論的是同一件事。問題詢問關於主題的問題,答案回答它,但同時它們之間沒有太多重疊的關鍵詞。

例如,我們有一個問題「我已經註冊了數據工程訓練營,什麼時候可以期待收到確認電子郵件」,有一個答案包含關鍵詞「註冊」,但我們可以找到任何其他包含關鍵詞「註冊」的句子,例如「未註冊的參與者不會獲得認證」,相同的關鍵詞,非常不同的意思。

所以在這裡,當我們看到我們的數據點有非常不同的格式但同時有相似的意思,並且在一個上搜尋另一個是有意義的,製作問答系統,正如我們想在這裡做的,這些欄位作為向量搜尋中的嵌入使用是非常有意義的。

同時,像課程或部分這樣的東西,在過濾設置中更有意義,例如我們想詢問關於特定部分或特定課程的具體問題,我們可以更多地保存為元數據。

所以我們已經知道如何在解決方案中組織我們的數據,但讓我們也看看我們將如何做到這一點。

當我們只有幾個問題和答案時,比較向量是很容易的,就像這裡的簡單數據集中,我們有大約一千個,但當它擴展到數十億時,這種比較變得更加繁重,這就是為什麼我們有專門的解決方案,這就是它們通常如何處理存儲和處理數據的方式。

有兩個步驟,第一步是取我們案例中的所有答案(它們在文字欄位中),我們將嵌入它們,所以這是嵌入模型神經網絡的一個非常有趣的表達,看起來很醜但抱歉,我們將嵌入它們,將它們轉換為向量,我們將把它們存儲在專門的向量搜尋解決方案中,在我們的案例中是 Qdrant,在那裡將建立一個向量索引,一個允許可擴展搜尋的結構。

第二步,這一步是離線完成的,所以我們取所有文件並一次性索引它們,然後在線上我們將做以下事情:我們將有一個傳入的問題,我們將再次用相同的模型在相同的向量空間中嵌入它,將其轉換為向量,這個向量將用於與我們存儲的所有答案在向量索引中進行比較,我們將收到與我們問題語意最相似的答案。

這正是我們要做的,所以首先我們將做這個離線階段,我們接下來將選擇一個嵌入模型,然後我們將嵌入和索引我們的數據,我們課程問題的答案以及它們的元數據,所以部分和課程名稱,我們稍後可以用於過濾。

然後我們將執行語意搜尋,我們將使用問題,我們將找到與它們語意相似的答案。

完美,現在我們可以切換到為我們已經研究的數據選擇嵌入模型,這也是一個非常重要的部分,使你的向量搜尋解決方案成功,你總是需要研究和檢查你的數據,它的模態,它的特性,甚至它的領域。

例如,在我們的案例中,找到合適的嵌入模型是相當簡單的,因為我們有簡短的英文文本,更一般的問答性質,但對於特定領域,最好找到合適的嵌入模型。

當然,從資源和最終品質的角度來看,嵌入模型的選擇非常重要,當我們選擇嵌入模型時,我們也在選擇嵌入提供者,這也帶來了成本和我們手頭資源的選擇。

在這個筆記本中,我們將使用 FastEmbed,這是我們自己的 Qdrant 庫,你可以在這裡看到我們的開源儲存庫。

我選擇它首先是因為它與 Qdrant 庫很好地集成,所以你不必考慮第三方提供者和如何傳遞所有這些向量以及如何將它們轉換為所需格式的麻煩,你會看到這只是選擇模型名稱和傳遞文本或圖片的問題。

但也因為它是輕量級的,我們使用 ONNX 運行時,這使得它對 CPU 非常友好,FastEmbed 將比 PyTorch sentence transformers 工作得更快,所以它將是相當輕量級的。

我們將使用本地推理,所以除了我們機器的資源外,它不會花費我們任何費用,它會非常容易使用。

而且 FastEmbed 支援不同類型的向量,不同類型的嵌入,這些在 Qdrant 中也受到支援,例如是密集文本嵌入,我們今天將使用的,向量搜尋中最經典的,但也有稀疏嵌入,在混合搜尋中非常重要,你將進一步在 Qdrant 混合搜尋中看到,多向量在 Qdrant 中也受到支援,圖像嵌入和其他類型的模型。

總而言之,我們選擇了我們的嵌入提供者,我們將在 Qdrant 中使用這個本地推理的 FastEmbed 功能,所以當我們選擇嵌入模型時,請記住你機器的資源。

現在讓我們看看我們手頭有什麼,我們可以選擇什麼。FastEmbed 支援密集文本嵌入,我們可以在這裡看到支援的模型列表以及它們的描述。

在這裡你可以看到模型名稱、來源(它們都在 Hugging Face 上)、它們的大小,對於向量搜尋解決方案的選擇和配置非常重要的是它們輸出的嵌入維度、輸出向量的維度。

這對資源也非常重要,因為向量通常是非常大的數據對象,這就是為什麼一般需要專門的向量搜尋解決方案,因為我們處理如此繁重的對象。你擁有的維度越多,你需要的資源就越多,同時它們在表達你正在編碼的對象的意義方面就越好。

在這裡,我們將根據幾個簡單的參數做出選擇,首先我們需要文本嵌入,我們正在處理英語,如你記得我們的答案中,所以主要我們將基於我們向量的輸出大小做出選擇。

在這裡,對於這樣一個簡單的例子,使用 512 維的小型或中等大小的嵌入是有意義的。我們可以檢查我們有什麼可用的,我們看到幾個模型,讓我們檢查它們。

我們有三個,其中一個是 CLIP,這是多模態的,所以它與圖像一起工作,在這裡選擇它們沒有意義,因為我們根本不處理圖像。這個模型與中文一起工作,我們處理的是英語。

如果我們選擇這個模型,我們的最終選擇將是有意義的,所以讓我們選擇這個模型並保存這個句柄,BGE small 嵌入模型。

我們可以在這個 Hugging Face 卡片中檢查它的詳細信息,在配置向量搜尋解決方案之前,最重要的事情之一是了解這些嵌入如何相互比較,所以我們談論的語意相似性。

在這裡,通常在模型卡片中,你可以看到它們使用哪些指標,大多數嵌入模型使用餘弦相似性作為相似性指標和嵌入之間的語意距離。

提醒你什麼是餘弦相似性,讓你感覺知道發生了什麼,我們有兩個嵌入,假設我在 2D 中描繪它們,因為在 512 維空間中畫東西非常困難,所以我們有兩個向量,它們之間的距離測量為它們之間角度的餘弦。

所以非常接近的嵌入將有接近一的餘弦,所以這個角度的餘弦,相反的向量,例如這些有更大角度的向量,甚至完全相反的向量,在意義上非常不相似的,將有負一的餘弦。

所以我們看角度,我們看這個角度的餘弦,這就是如何測量這些嵌入之間的距離。餘弦相似性越大,越接近一,我們面前的對象在語意上就越相似。

所以我們現在知道我們有這個 BGE 嵌入模型,我們選擇了一個模型,我們知道它輸出什麼維度的向量,是 512 維,我們知道我們使用餘弦相似性來測量它們之間的語意相似性,現在我們基本上可以切換到在 Qdrant 中使用所有這些。


▌2-3 建立 Qdrant 集合與資料索引

現在我們完全準備好創建一個 Qdrant 解決方案,在其中我們將所有數據、我們的課程答案以及元欄位索引到 Qdrant,然後我們在我們的索引向量化數據中搜尋我們問題的答案。

為此,我們需要創建一個 Qdrant 集合,什麼是 Qdrant 集合?我們在 Qdrant 中操作兩個主要實體,一個叫做點(point),點基本上是一個數據點,在我們的情況下,它將是一個答案及其元數據。

點有一個 ID,它有一個嵌入向量或幾個嵌入向量,在我們的情況下,它將是由 BGE 提供的我們答案的嵌入,以及元數據,稱為有效載荷(payload),這是可選的元數據,但在我們的情況下,它將是課程和部分。

所有這些數據點形成一個集合,把集合想像成所有數據點的容器,解決一個業務問題的東西。這並不意味著它需要是一個客戶或任何東西的一個,只是為了一個概念問題,你正在解決的向量搜尋問題。

在這裡我們在 Qdrant 中創建一個集合,為了創建一個集合,我們需要提供一些特定的詳細信息。

最小的,我們需要提供一個集合名稱,在我們的情況下我們將稱它為 zoomcamp-rag,以及我們將用於語意搜尋的嵌入向量的配置。

我們需要提供兩件事,首先是它們的大小,我們已經選擇了,是 512,以及用於比較這些向量的距離度量,在我們的情況下,正如我們檢查的,是餘弦。

所有其他參數你可以在文檔中查看,以及如何配置除了密集向量之外的其他類型的向量。

現在我們的集合已創建,你可以在這裡首先在本地看到它,而且你也可以在儀表板中看到它,但現在它是空的,我們沒有任何點,集合中沒有任何數據點,但我們已經有了配置,在那裡我們可以看到維度和使用的度量。

下一步是創建、嵌入並將我們的點、我們的數據點、我們的答案及其元數據插入到集合中。

讓我們看看我們的點,IDs 我們讓它們只是增量整數 IDs,但我們也在 Qdrant 中支援向量的 UUID IDs。

對於向量,我們在這裡使用由 BGE 模型製作的嵌入,正如你在這裡看到的,由於 FastEmbed 在 Qdrant 中的集成,這很簡單,你只需要傳遞我們正在嵌入的文本,在這裡是我們簡單數據集中關鍵詞為 text 的答案,以及模型名稱,在我們的情況下是 BGE 的模型句柄。

然後這裡是我們保存的元數據,所以是文本,我們可以檢查我們對問題得到什麼答案,因為嵌入不是非常人類可讀的,以及我們稍後可以用於過濾的部分和課程。

在這裡我們只是創建一個點結構,形成它,然後我們準備將其上傳到 Qdrant。

所以在這個上傳操作中,由於 FastEmbed 和 Qdrant 的集成,同時會發生兩件事。

首先,FastEmbed 將獲取並下載所選模型,在我們的情況下是 BGE,並將其保存在本地的臨時文件之一中,你也可以更改此路徑。

然後它將嵌入我們課程中的每個答案,將它們轉換為向量,然後將它們一個接一個地上傳到我們的 Qdrant 集合中。

這需要一些時間,因為首先本地推理使用我的機器的資源,我不會說非常強大,但你也可以加速,你可以使用帶有 GPU 的 FastEmbed,例如或具有更多資源的機器,甚至像某些雲服務器。

而且上傳是一個接一個進行的,然而在 Qdrant 中我們也有批量上傳操作。此外,Python 客戶端為更快、高效的上傳提供了這樣的工具,並行化、重試或惰性批處理。

為此,我們有兩個特定的函數:upload_collection、upload_points,你可以在我們的文檔中查看它們。

現在我們所有的點都已上傳到數據庫,我們可以視覺化研究它們,這我想是最有趣的部分,讓我們了解語意向量搜尋的含義。

讓我們到我們的儀表板。現在如果我們進入裡面,我們將看到我們所有的點都已經上傳到這裡,我們可以看到我們的有效載荷、我們的數據,在這裡我們可以看到我們的向量,我們甚至可以複製它們並研究它們的外觀。

這是很多數字,很嚇人,不是很容易理解,但對我們來說非常容易理解的是這些點的視覺化。

所以在這裡我們有一個叫做視覺化的儀表板標籤,在這裡我們可以研究投影到 2D 的我們的課程答案向量。

在這裡我提供了這個小 JSON,你可以在這個儀表板中插入,我們有 948 個點,948 個我們嵌入到數據庫並上傳的答案。

我們也可以按我們的元數據給它們著色,所以課程的類型,我們可以看到投影到 2D 中,它們基於文本在語意上如何接近或不同。

例如,在這裡我看到一些關於時間段問題的答案,這就是為什麼它們聚集在一起。你可以看到來自不同課程的不同點如何在語意上相似,所以這些答案,這幫助你研究和理解你的非結構化數據中的模式是什麼。

這已經給你很多關於你的解決方案的答案,你基本上可以用向量搜尋做什麼。所以你會理解當問題到來時,它會在所有這些答案中找到最近的鄰居,在向量空間中最近的鄰居,我們將把它作為我們數據庫的回應提供。

但是你會進一步看到,我鼓勵你大量使用我們的儀表板,我認為它非常有助於理解你的數據中發生了什麼。

我們看到了向量語意相似性在 2D 表示中的含義,我們準備好運行我們的語意相似性搜尋。


▌2-4 執行語意相似性搜尋

所以我們索引了我們的數據,我們看到了它的外觀,我們將所有答案存儲在向量索引中的某個地方,現在我們終於可以運行相似性語意搜尋,找到對傳入問題最相關的答案。

相似性搜尋如何工作?簡單地說,我們使用向量索引將查詢向量與所有存儲的答案進行比較,我們找到與我們問題餘弦相似性最接近的答案,並根據餘弦相似性對它們進行排名。語意上最相似的答案將在頂部返回。

我需要說這個最近鄰搜尋是近似的,在任何向量索引中都是近似的。這是由於向量搜尋的性質,由於向量有多大,在規模上很難使其精確,搜尋速度和搜尋品質取決於向量索引的選擇。

我們有我們自定義的向量索引,向量索引的自定義適應。你可以在我留在這裡的文章中閱讀,但我不認為對我們來說看到 Qdrant 中語意搜尋如何工作的例子是相關的。

這裡是我定義的搜尋函數,它接收一個查詢,這將是我們的問題。它用相同的模型嵌入它,借助 FastEmbed,所以是 BGE,在這裡我們將返回在那種情況下的頂部一個結果,所以與我們問題餘弦相似性最相似的答案。

這個 payload=true 用於顯示元數據,所以我們可以以人類可讀的方式看到答案。讓我們立即研究它如何工作。

讓我們從課程數據中選擇一個隨機問題。如你記得,我們沒有將任何問題上傳到 Qdrant,所以這將只是一個隨機選擇,我們將看到我們的語意搜尋如何工作。

在這裡我們看到一個問題,關於無效數據類型和 Pandas 的問題。好吧,讓我們看看我們從向量化和索引的數據中會得到什麼。

我們將看到我們搜尋的結果,這是一個查詢回應,在這裡我們得到一個具有這個 ID 和這個餘弦相似性分數的點,這是我們找到的最相似的答案。

讓我們比較我們的原始答案和我們從 Qdrant 得到的結果。我花了一些時間閱讀一個非常長的答案,發現從數據庫提供的答案和原本提供的答案是相同的,所以我們的語意搜尋在隨機例子上完美工作。

但此外,我們不必從我們的初始數據集中選擇一些問題,我寫了一些隨機問題,我絕對會在課程中問,因為我是那種在截止日期前 1 分鐘提交所有東西的人。

所以我們可以只選擇任何想到的問題,你可以玩弄它,對它運行,看看我們從數據庫中得到什麼。

所以我們得到的答案是遲交作業很遺憾不被允許。所以以防萬一我找到了答案,如果你想遲交一些東西,請不要這樣做。

但在這裡我們看到我們的語意搜尋完美工作。

在我們完成這個簡單的使用 Qdrant 的語意相似性搜尋設置並切換到更複雜的使用 Qdrant 的混合搜尋(我的同事將向你解釋)之前,最後要做的事情是運行帶過濾器的相似性搜尋。

基本上使用我們與嵌入一起上傳的元數據課程和部分,為了更有趣的細粒度結果。

我需要稍微炫耀一下,Qdrant 向量索引的自定義實現專門設計為使帶過濾器的語意相似性搜尋準確,因為這些過濾條件通常會影響向量索引。你可以在我留在筆記本中的文章中查看。

而且一般來說,我們非常關注過濾,所以我們有很多不同類型的元數據你可以存儲,以及很多不同的複雜過濾條件。

但是在這裡我只是想展示如何基於課程類型進行過濾,因為我們有時想問關於特定課程的具體問題,而不是所有課程,因為答案可能不同。

為了有效地使用向量搜尋的過濾,我們需要切換到一個特定的索引,你可以在我們的文檔中閱讀。在這裡就像這樣簡單地切換它。

現在我們可以用我們的查詢過濾器更新我們的搜尋函數,這意味著它總是需要為真,我們的目標是匹配我們所有三個課程中的課程名稱,所以是數據工程、機器學習和 MLOps。

所以我們將只在特定課程內執行向量搜尋。函數中剩下的一切都是相同的,除了過濾器之外什麼都沒有改變。

現在我們可以問我之前問過的關於遲交作業的相同問題,基於我們有的課程。例如,對於數據工程課程,遲交作業是不被允許的。

讓我們看看也許在其他課程中的人更寬容一些。啊哈,你看這裡這取決於表單是否仍然開放。所以如果你在學習機器學習,你可以更馬虎一些。

如果你正在參加 MLOps zoomcamp,那麼我們沒有任何相關的答案,所以我們得到了更隨機的答案,語意上不那麼接近,這意味著在 MLOps 中,在我們的數據集中,沒有人問如果我們遲交作業會發生什麼,或任何語意上相似的問題。

總而言之,現在你有所有基本工具如何運行 Qdrant 以及如何在 Qdrant 中運行語意搜尋,我鼓勵你更深入地檢查它,閱讀材料,提出問題,一般來說嘗試向量搜尋現在所支援的所有不同東西,從 agents 和 RAG 和 MCP 到超越相似性搜尋的東西,例如非結構化數據分析也可以用向量搜尋專門解決方案來完成。

我希望你玩得開心,我把這個交給我的同事,他將向你解釋如何在 Qdrant 中使用混合搜尋。非常高興你在這一系列影片中與我一起,我只是希望你有非常美好的一天,充滿大量的實驗和嘗試不同的東西。

▌補充資料

  1. 這是 Qdrant 官方宣佈與 DataTalksClub 合作的網頁資料。依照上面的說法,會有兩位講師介紹不同主題。
    • Evgeniya Sukhodolskaya(Jenny) 負責說明語義相似性搜索:FastEmbed & WebUI,就是目前的四則影片。
    • Kacper Łukawski 負責說明混合搜尋(詞彙搜尋 + 向量搜尋):multi-vector search, reranking & late interaction models
  1. 去年(2024)的向量搜尋影片還在,但 GitHub 資料已刪除(推測只是設定為講師能夠存取),但你可以參考以下三位去年上課學長的筆記,來得知其內容。

    • 去年資料
  • 去年學長筆記 1
  • 去年學長筆記 2
  • 去年學長筆記 3

▌YouTube 影片