.NET 原生駕馭 AI 新基建實(shí)戰(zhàn)系列(四):Qdrant ── 實(shí)時(shí)高效的向量搜索利器
向量數(shù)據(jù)庫(kù)作為一種專為現(xiàn)代AI應(yīng)用設(shè)計(jì)的新型存儲(chǔ)技術(shù),能夠高效地管理和檢索高維數(shù)據(jù),成為智能應(yīng)用開發(fā)中的關(guān)鍵基礎(chǔ)設(shè)施。本文將深入探討 Qdrant 這個(gè)開源、高性能的向量數(shù)據(jù)庫(kù),重點(diǎn)介紹其如何與 .NET 生態(tài)系統(tǒng)結(jié)合,為開發(fā)者提供強(qiáng)大的工具支持。我們將從安裝配置到代碼實(shí)現(xiàn),再到實(shí)際應(yīng)用場(chǎng)景,全面展示 Qdrant 在 .NET 中的使用方式。
一、Qdrant 簡(jiǎn)介
Qdrant 是一款專為 AI 和 ML 應(yīng)用打造的開源向量數(shù)據(jù)庫(kù),旨在提供高效的向量存儲(chǔ)和相似性搜索能力。它以高性能、靈活性和易用性為核心設(shè)計(jì)理念,支持實(shí)時(shí)查詢、元數(shù)據(jù)過濾和分布式部署,非常適合需要處理大規(guī)模高維數(shù)據(jù)的場(chǎng)景。無論是語義搜索、推薦系統(tǒng)還是多媒體內(nèi)容檢索,Qdrant 都能為開發(fā)者提供可靠的支持。
1.1 Qdrant 的核心特點(diǎn)
Qdrant 的獨(dú)特優(yōu)勢(shì)體現(xiàn)在以下幾個(gè)方面:
-
開源與高性能:Qdrant 遵循 Apache 2.0 許可,完全開源,開發(fā)者可以自由使用和定制。它針對(duì)高維向量數(shù)據(jù)進(jìn)行了深度優(yōu)化,確保在大規(guī)模數(shù)據(jù)集上的查詢性能。 -
實(shí)時(shí)性與靈活性:支持實(shí)時(shí)向量搜索,并允許在查詢時(shí)結(jié)合元數(shù)據(jù)過濾,滿足復(fù)雜的業(yè)務(wù)邏輯需求。 -
分布式架構(gòu):支持水平擴(kuò)展,可以部署在多節(jié)點(diǎn)集群上,提升系統(tǒng)的可伸縮性和可靠性。 -
多語言支持:通過 REST API 和 gRPC 接口,Qdrant 能夠與多種編程語言無縫集成,包括通過 C# 客戶端支持 .NET。 -
易于集成:官方提供的 Qdrant.ClientNuGet 包讓 Qdrant 在 .NET 項(xiàng)目中的接入變得簡(jiǎn)單高效。
1.2 Qdrant 的核心概念
Qdrant 是一個(gè)開源向量數(shù)據(jù)庫(kù),專為存儲(chǔ)、搜索和管理高維向量設(shè)計(jì),廣泛應(yīng)用于人工智能和機(jī)器學(xué)習(xí)領(lǐng)域,尤其是嵌入向量存儲(chǔ)和相似性搜索。以下是其核心概念的整理:
-
嵌入(Embeddings)
嵌入是將原始數(shù)據(jù)(如文本、圖像)轉(zhuǎn)化為高維向量的過程,這些向量捕捉數(shù)據(jù)的語義信息,是向量數(shù)據(jù)庫(kù)的核心數(shù)據(jù)類型。
-
相似性搜索(Similarity Search)
相似性搜索是查找與查詢向量最相似的向量的過程,Qdrant 使用近似最近鄰(ANN)算法實(shí)現(xiàn)高效搜索。
-
集合(Collections)
集合是向量的邏輯分組,類似于傳統(tǒng)數(shù)據(jù)庫(kù)中的表,包含特定配置(如向量維度和距離度量)。
-
點(diǎn)(Points)
點(diǎn)是集合中的單個(gè)條目,包含向量、唯一 ID 和可選的元數(shù)據(jù)(負(fù)載),是存儲(chǔ)和檢索的基本單元。
-
負(fù)載(Payload)
負(fù)載是與向量關(guān)聯(lián)的元數(shù)據(jù)(JSON 格式),提供額外上下文并支持搜索時(shí)的過濾。
-
距離度量(Distance Metrics)
距離度量用于衡量向量間的相似性,Qdrant 支持歐幾里得距離、余弦相似度和點(diǎn)積等多種方式。
-
索引(Indexing)
索引是加速向量搜索的數(shù)據(jù)結(jié)構(gòu),Qdrant 使用 HNSW(層次可導(dǎo)航小世界)算法實(shí)現(xiàn)高效近似最近鄰搜索。
-
過濾(Filtering)
過濾允許基于負(fù)載元數(shù)據(jù)添加搜索條件,實(shí)現(xiàn)更精確的檢索結(jié)果。
-
API
Qdrant 提供 RESTful 和 gRPC API,用于向量插入、搜索和集合管理等操作。
-
分布式部署(Distributed Deployment)
Qdrant 支持分布式部署,多節(jié)點(diǎn)協(xié)同處理大規(guī)模數(shù)據(jù)和高并發(fā)請(qǐng)求,提升可擴(kuò)展性和性能。
1.3 Qdrant 的工作機(jī)制
Qdrant 的核心在于其高效的向量索引和搜索技術(shù)。它采用了 HNSW(Hierarchical Navigable Small World)等先進(jìn)算法來構(gòu)建向量索引,支持多種距離度量方式,如歐幾里得距離、余弦相似度和內(nèi)積。開發(fā)者可以將文本、圖像或其他數(shù)據(jù)的嵌入(embeddings)存儲(chǔ)在 Qdrant 中,通過相似性搜索快速找到最相關(guān)的結(jié)果。這種機(jī)制特別適用于需要理解數(shù)據(jù)深層語義的場(chǎng)景,與傳統(tǒng)的關(guān)鍵字匹配方式形成了鮮明對(duì)比。

與 Chroma 類似,Qdrant 的設(shè)計(jì)也強(qiáng)調(diào)了易用性和性能,但它在分布式支持和實(shí)時(shí)性上更進(jìn)一步,為需要高可用性和低延遲的應(yīng)用提供了額外的優(yōu)勢(shì)。
二、在 .NET 中安裝與配置 Qdrant 環(huán)境
要在 .NET 項(xiàng)目中使用 Qdrant,開發(fā)者需要安裝其 C# 客戶端庫(kù)并完成基本配置。以下是詳細(xì)的步驟,確保從零開始的開發(fā)者也能順利上手。
2.1 安裝 Qdrant.Client NuGet 包
Qdrant 提供了官方的 C# 客戶端庫(kù),可以通過 NuGet 包管理器輕松安裝,注意以下包存在預(yù)覽版,所以需要加上預(yù)覽標(biāo)識(shí):
-
Qdrant.Client, -
Microsoft.SemanticKernel.Connectors.Qdrant -
Microsoft.Extensions.AI -
Microsoft.Extensions.AI.Ollama
-
命令行安裝: 在 Visual Studio 的“包管理器控制臺(tái)”中運(yùn)行以下命令:
Install-Package Qdrant.Client Install-Package Microsoft.SemanticKernel.Connectors.Qdrant --prerelease Install-Package Microsoft.Extensions.AI --prerelease Install-Package Microsoft.Extensions.AI.Ollama --prerelease -
圖形界面安裝:
-
右鍵點(diǎn)擊 .NET 項(xiàng)目,選擇“管理 NuGet 包”。 -
在搜索框中輸入 Qdrant.Client等包,選擇官方包。 -
點(diǎn)擊“安裝”,等待安裝完成。
-
安裝成功后,項(xiàng)目會(huì)自動(dòng)引用 Qdrant.Client,為后續(xù)開發(fā)奠定基礎(chǔ)。
2.2 配置 Qdrant 客戶端
在使用 Qdrant 之前,需要初始化一個(gè) QdrantClient 實(shí)例,并指定連接參數(shù)。以下是一個(gè)簡(jiǎn)單的配置示例:
using Qdrant.Client;
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));
-
host:Qdrant 服務(wù)的地址,默認(rèn)值為localhost。如果服務(wù)部署在遠(yuǎn)程服務(wù)器上,需要替換為實(shí)際 IP 或域名。 -
port:Qdrant 的默認(rèn)端口為6334,可根據(jù)實(shí)際部署調(diào)整。
2.3 啟動(dòng) Qdrant 服務(wù)
Qdrant 客戶端需要連接到一個(gè)運(yùn)行中的 Qdrant 實(shí)例。開發(fā)者可以通過以下方式啟動(dòng)服務(wù):
-
Docker 部署: 使用以下命令在本地運(yùn)行 Qdrant:
docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrant -
手動(dòng)運(yùn)行: 從 Qdrant 的 GitHub 倉(cāng)庫(kù)下載二進(jìn)制文件,解壓后執(zhí)行:
./qdrant

服務(wù)啟動(dòng)后,.NET 客戶端即可通過指定的地址和端口與之通信。與 Chroma 類似,Qdrant 的安裝過程簡(jiǎn)單明了,但其 Docker 支持和分布式特性為大規(guī)模部署提供了更多選擇。
-
UI界面
大家可以打開地址:http://localhost:6333/dashboard#/welcome,查看UI界面

2.4 安裝Ollama并配置相關(guān)模型
-
安裝mxbai-embed-large用于生成嵌入向量

三、Qdrant 在 .NET 中的代碼示例
為了讓開發(fā)者快速掌握 Qdrant 的使用方法,以下提供了一系列實(shí)用的代碼示例,涵蓋創(chuàng)建集合、添加數(shù)據(jù)、執(zhí)行查詢和元數(shù)據(jù)過濾等核心功能。
3.1 創(chuàng)建集合
在 Qdrant 中,集合(Collection)是存儲(chǔ)向量的基本單位。以下代碼展示了如何創(chuàng)建一個(gè)名為skhotels的集合:
首先需要?jiǎng)?chuàng)建Hotel實(shí)體,注意DescriptionEmbedding字段的Dimensions數(shù)值為384,這與我們使用的模型有關(guān),模型發(fā)生變化,這個(gè)數(shù)值也要發(fā)生變化。
using Microsoft.Extensions.VectorData;
namespace QdrantVectorTest;
/// <summary>
///
/// </summary>
public class Hotel
{
/// <summary>
/// Gets or sets the hotel identifier.
/// </summary>
/// <value>
/// The hotel identifier.
/// </value>
[VectorStoreRecordKey]
public ulong HotelId { get; set; }
/// <summary>
/// Gets or sets the name of the hotel.
/// </summary>
/// <value>
/// The name of the hotel.
/// </value>
[VectorStoreRecordData(IsFilterable = true)]
public string HotelName { get; set; }
/// <summary>
/// Gets or sets the description.
/// </summary>
/// <value>
/// The description.
/// </value>
[VectorStoreRecordData(IsFullTextSearchable = true)]
public string Description { get; set; }
/// <summary>
/// Gets or sets the description embedding.
/// </summary>
/// <value>
/// The description embedding.
/// </value>
[VectorStoreRecordVector(Dimensions: 384, DistanceFunction.CosineSimilarity, IndexKind.Hnsw)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
/// <summary>
/// Gets or sets the tags.
/// </summary>
/// <value>
/// The tags.
/// </value>
[VectorStoreRecordData(IsFilterable = true)]
public string[] Tags { get; set; }
}
using Microsoft.Extensions.AI;
using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;
using QdrantVectorTest;
#pragma warning disable SKEXP0001
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));
var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels");
await collection.CreateCollectionIfNotExistsAsync();
集合創(chuàng)建成功:

3.2 添加向量嵌入生成算法
這里通過Ollama使用all-minilm作為向量嵌入生成算法模型
async Task<ReadOnlyMemory<float>> GenerateEmbeddingAsync(string descriptionText)
{
IEmbeddingGenerator<string, Embedding<float>> generator =
new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm");
var embedding = await generator.GenerateEmbeddingVectorAsync(descriptionText);
return embedding;
}
3.2 添加向量數(shù)據(jù)
向集合中添加點(diǎn)(points)時(shí),需要指定 ID、向量和可選的元數(shù)據(jù)(payload)。以下示例展示了如何添加兩篇文檔的向量和元數(shù)據(jù):
string descriptionText = "一個(gè)高檔的參加團(tuán)隊(duì)聚會(huì)的地方";
ulong hotelId = 1;
await collection.UpsertAsync(new Hotel
{
HotelId = hotelId,
HotelName = "Bulgari",
Description = descriptionText,
DescriptionEmbedding = await GenerateEmbeddingAsync(descriptionText),
Tags = new[] { "luxury", "pool" }
});
3.3 執(zhí)行相似性搜索
通過向量查詢,可以找到與給定向量最相似的點(diǎn)。以下代碼展示了如何檢索與查詢向量最接近的兩篇文章:
ReadOnlyMemory<float> searchVector = await GenerateEmbeddingAsync("我需要找一家高檔酒店");
var searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 1 });
await foreach (var record in searchResult.Results)
{
Console.WriteLine("描述信息: " + record.Record.Description);
Console.WriteLine("匹配分?jǐn)?shù): " + record.Score);
}
輸出如下:

四、Qdrant 應(yīng)用場(chǎng)景
4.1 語義搜索系統(tǒng)
在企業(yè)文檔管理系統(tǒng)中,傳統(tǒng)的關(guān)鍵字搜索難以捕捉用戶意圖的深層含義。通過將文檔內(nèi)容轉(zhuǎn)換為嵌入并存儲(chǔ)在 Qdrant 中,開發(fā)者可以實(shí)現(xiàn)語義搜索。例如,用戶輸入“如何提高團(tuán)隊(duì)協(xié)作效率”,系統(tǒng)能夠返回與團(tuán)隊(duì)管理、協(xié)作工具相關(guān)的內(nèi)容,而不僅僅是包含“效率”一詞的文檔。
4.2 個(gè)性化推薦引擎
在電商平臺(tái)中,Qdrant 可以存儲(chǔ)用戶行為和商品特征的向量表示。例如,將用戶的瀏覽歷史和商品描述轉(zhuǎn)換為嵌入,通過相似性搜索為用戶推薦相關(guān)產(chǎn)品。這種方法能夠捕捉用戶興趣的細(xì)微變化,提供更精準(zhǔn)的推薦體驗(yàn)。
4.3 多媒體內(nèi)容檢索
在圖像或視頻管理應(yīng)用中,Qdrant 可以存儲(chǔ)多媒體內(nèi)容的嵌入向量。例如,用戶上傳一張風(fēng)景照片,系統(tǒng)能夠快速返回視覺上相似的圖像,適用于內(nèi)容推薦、版權(quán)檢測(cè)等場(chǎng)景。與 Chroma 類似,Qdrant 在這一領(lǐng)域表現(xiàn)出色,但其分布式支持使其更適合處理大規(guī)模多媒體數(shù)據(jù)。
4.4 智能問答系統(tǒng)
在客戶支持應(yīng)用中,Qdrant 可以存儲(chǔ)常見問題及其答案的向量表示。用戶提問時(shí),系統(tǒng)通過向量搜索返回最匹配的答案,提升響應(yīng)速度和準(zhǔn)確性。這種應(yīng)用與 Chroma 的 NLP 場(chǎng)景類似,但 Qdrant 的實(shí)時(shí)性使其在高并發(fā)場(chǎng)景中更具優(yōu)勢(shì)。
五、Qdrant 與 .NET 生態(tài)系統(tǒng)的集成
Qdrant 不僅可以通過 C# 客戶端直接使用,還能與 .NET 生態(tài)中的其他工具深度結(jié)合,提升開發(fā)效率:
-
Semantic Kernel:微軟推出的 AI 開發(fā)框架支持與 Qdrant 集成,開發(fā)者可以將其作為向量存儲(chǔ),用于構(gòu)建復(fù)雜的 AI 工作流。 -
ASP.NET Core:通過依賴注入機(jī)制,Qdrant 客戶端可以輕松集成到 Web 應(yīng)用中,為實(shí)時(shí)智能功能提供支持。 -
Entity Framework 風(fēng)格的擴(kuò)展:借助 Microsoft.Extensions.VectorData,Qdrant 可以與 .NET 的標(biāo)準(zhǔn)化數(shù)據(jù)訪問接口協(xié)作,簡(jiǎn)化開發(fā)流程。
這些集成特性與 Chroma 在 .NET 中的應(yīng)用方式相似,但 Qdrant 的分布式支持和 gRPC 接口為其帶來了額外的靈活性。
六、性能優(yōu)化技巧
為了在 .NET 中充分發(fā)揮 Qdrant 的潛力,開發(fā)者可以采用以下優(yōu)化策略:
-
索引優(yōu)化:調(diào)整 HNSW 參數(shù)(如 m和ef_construction),在查詢速度和精度之間找到最佳平衡。 -
分布式部署:對(duì)于大規(guī)模數(shù)據(jù),利用 Qdrant 的集群功能分片存儲(chǔ)和并行查詢,提升吞吐量。 -
本地緩存:在 .NET 應(yīng)用中為熱點(diǎn)查詢添加緩存層,減少對(duì) Qdrant 的直接請(qǐng)求。
這些技巧雖與 Chroma 的性能優(yōu)化建議有異曲同工之妙,但 Qdrant 的分布式特性為其在大規(guī)模場(chǎng)景中的優(yōu)化提供了更多可能性。
七、Qdrant 的未來發(fā)展展望
隨著向量數(shù)據(jù)庫(kù)在 AI 驅(qū)動(dòng)應(yīng)用中的重要性日益凸顯,Qdrant 作為一款開源項(xiàng)目展現(xiàn)出廣闊的前景:
-
功能增強(qiáng):未來可能支持更多索引類型和距離度量,滿足多樣化的應(yīng)用需求。 -
性能突破:通過算法優(yōu)化,進(jìn)一步提升大規(guī)模數(shù)據(jù)集的處理能力。 -
云原生支持:推出官方托管服務(wù),降低部署門檻,為 .NET 開發(fā)者提供開箱即用的解決方案。 -
生態(tài)融合:與 .NET 的深度集成可能帶來更多專用工具和文檔,提升開發(fā)體驗(yàn)。
與 Chroma 的發(fā)展方向類似,Qdrant 也在不斷演進(jìn),但其分布式架構(gòu)和實(shí)時(shí)性為其在企業(yè)級(jí)應(yīng)用中贏得了一席之地。
八、結(jié)語
Qdrant 作為一款高性能、開源的向量數(shù)據(jù)庫(kù),為 .NET 開發(fā)者提供了一個(gè)強(qiáng)大的工具,用于構(gòu)建高效的智能應(yīng)用。從簡(jiǎn)單的安裝配置到豐富的代碼示例,再到多樣化的應(yīng)用場(chǎng)景,Qdrant 展示了其在語義搜索、推薦系統(tǒng)和多媒體檢索等領(lǐng)域的潛力。通過與 .NET 生態(tài)系統(tǒng)的無縫集成,開發(fā)者可以快速將其融入現(xiàn)有項(xiàng)目,釋放 AI 技術(shù)的價(jià)值。未來,隨著 Qdrant 的持續(xù)發(fā)展,其在 .NET 社區(qū)中的影響力將進(jìn)一步擴(kuò)大,為智能應(yīng)用的創(chuàng)新提供更多可能。
本文來自博客園,作者:AI·NET極客圈,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/code-daily/p/18840212
歡迎關(guān)注我們的公眾號(hào),作為.NET工程師,我們聚焦人工智能技術(shù),探討 AI 的前沿應(yīng)用與發(fā)展趨勢(shì),為你立體呈現(xiàn)人工智能的無限可能,讓我們共同攜手共同進(jìn)步。

浙公網(wǎng)安備 33010602011771號(hào)