在 .NET 中使用 Milvus 向量資料庫 - .NET 部落格
摘要
學習如何開始使用 Milvus 向量資料庫在 .NET 中管理嵌入向量,用於搜尋和檢索增強生成(RAG)場景。
原文 Get started with Milvus vector database in .NET [1]
2024年3月6日
向量資料庫已經成為支持搜尋和檢索增強生成(RAG)場景的生成性 AI 工作負載的重要組成部份。
.NET 團隊已與 Milvus 密切合作,使 .NET 開發者能夠在其應用程式中使用向量資料庫。
在這篇文章中,我們將展示如何快速地使用目前處於預覽版的 Milvus .NET SDK 開始使用。
什麽是 Milvus?
Milvus 是一個向量資料庫,可以儲存、索引和管理由深度神經網路和其他機器學習模型生成的嵌入向量。
更多詳情,請檢視 Milvus 網站 [2] 。
什麽是嵌入向量?
嵌入向量是數據(如文本、影像和音訊)的數值表示。這些數值表示可以被看作是一系列浮點值的集合。
在這個例子中,你正在檢視基於它們嵌入向量表示的電影的視覺化。
這些向量由機器學習模型建立,例如 OpenAI 的文本嵌入模型 [3] 。
相似的電影會有相似的嵌入向量表示。例如,像【獅子王】和【反斗奇兵】這樣的電影可能會有相似的向量,因為它們都是動畫片且適合全家觀看,而【盜夢空間】和【低俗小說】會有不同的向量,因為它們屬於不同的型別和風格。
這些嵌入向量幫助電腦理解和比較電影,這對於搜尋和推薦系統很有用。
對於生成性 AI 套用,能夠提供相關的上下文資訊來幫助大型語言模型(LLMs)像 GPT 生成相關的響應是很重要的。嵌入向量在這裏起到了作用。
關於嵌入的更多學習,你可以檢視以下文章:
• OpenAI – 引入文本和程式碼嵌入 [4]
• 使用 Azure OpenAI 生成嵌入 [5]
• 解密檢索增強生成 [6]
• 使用智慧 .NET 套用改造您的業務,這些套用由 Azure 和 ChatGPT 提供支持 [7]
• 有效估算向量空間中的詞表示 [8]
• 透過全域上下文和多個詞原型改進詞表示 [9]
• NLP 的深度學習:詞嵌入 [10]
為什麽使用向量資料庫?
就像關聯式資料庫和文件資料庫針對結構化和半結構化數據進行了最佳化一樣,向量資料庫被構建來有效地儲存、索引和管理表示為嵌入向量的數據。因此,向量資料庫使用的索引演算法被最佳化以有效檢索可用於您的應用程式中的下遊數據,這些應用程式可能具有搜尋和 AI 元件。
在 .NET 中開始使用 Milvus
本博文中的程式碼範例僅用於說明目的。有關更詳細的範例,請參閱入門範例。
將 Milvus 部署到 Azure
您開始的最簡單方式是將 Milvus 資料庫的例項部署到 Azure。
Milvus 透過 Zilliz Cloud for Azure [11] 提供,這是 Milvus 的托管版本。
它也可以作為 Azure 容器應用程式 Add-On [12] 使用。在未來的部落格文章中,我們將探討如何開始使用這些附加元件。敬請期待!
連線到資料庫
假設您已部署了 Milvus 例項:
1. 建立一個 C# 控制台應用程式或 Polyglot 筆記本。
2. 安裝 Milvus.Client NuGet 包。
3. 使用 Milvus SDK 建立客戶端並連線到您的資料庫。確保將 「localhost」 替換為您的 Milvus 服務主機。
var milvusClient = new MilvusClient("localhost", username: "username", password: "password");
建立一個集合
數據在集合中組織。假設我們正在建立一個用於儲存電影數據的集合。
首先定義您的模式。模式將包含三個欄位:
• _movie_id_:電影的唯一識別元
• _movie_name_:電影的標題
• _movie_description_:電影描述的嵌入向量。
var schema = new CollectionSchema
{
Fields =
{
FieldSchema.Create<long>("movie_id", isPrimaryKey: true),
FieldSchema.CreateVarchar("movie_name", maxLength: 200),
FieldSchema.CreateFloatVector("movie_description", dimension: 2)
}
};
然後,建立您的集合。
var collection = await milvusClient.CreateCollectionAsync(collectionName: "movies",schema: schema, shardsNum: 2);
向您的集合添加數據
一旦建立了集合,向其添加數據。
在這個案例中,這裏是我們正在使用的數據。在這個範例中,電影描述的嵌入向量已經為方便起見而預先計算。然而,在更真實的場景中,您將使用嵌入模型來生成它們。在表中,我還僅出於演示目的包括了文本描述。然而,集合中不會儲存文本描述,只儲存嵌入向量。
movie_id | movie_name | movie_description (embedding) | movie_description (text) |
1 | 獅子王 | [0.10022575, -0.23998135] | 獅子王是一部經典的迪士尼動畫片,講述了一只名叫辛巴的年輕獅子在其父親悲慘去世後踏上復位王位的征程的故事。 |
2 | 盜夢空間 | [0.10327095, 0.2563685] | 盜夢空間是一部令人費解的科幻電影,由凱瑞斯托弗·諾蘭執導。它講述了唐姆·科布的故事,他是一位擅長進入人們夢境竊取秘密的熟練竊賊。然而,他被提供了一項最終工作,涉及在某人的腦海中植入一個想法。 |
3 | 反斗奇兵 | [0.095857024, -0.201278] | 反斗奇兵是皮克斯的一部突破性動畫片。它跟隨玩具主人安迪不在時的玩具的秘密生活。伍迪和巴斯光年是這個溫馨故事的主角。 |
4 | 低俗小說 | [0.106827796, 0.21676421] | 低俗小說是昆汀·塔倫蒂諾執導的犯罪片。它將有關黑幫、殺手和其他彩色人物的交錯故事編織在一起,故事采用非線性敘述,充滿黑色幽默和暴力。 |
5 | 怪物史萊克 | [0.09568083, -0.21177962] | 怪物史萊克是一部動畫喜劇電影,講述了一位名叫史萊克的食人魔踏上征程,去從一個由龍守護的塔中營救菲奧娜公主,以便取回他的沼澤的故事。 |
var movieIds = new [] { 1L, 2L, 3L, 4L, 5L };
var movieNames = new [] { "The Lion King", "Inception", "Toy Story", "Pulp Fiction", "Shrek" };
var movieDescriptions = new ReadOnlyMemory<float>[] {
new [] { 0.10022575f, 0.23998135f },
new [] { 0.10327095f, -0.2563685f },
new [] { 0.095857024f, 0.201278f },
new [] { 0.106827796f, -0.21676421f },
new [] { 0.09568083f, 0.21177962f }
};
await collection.InsertAsync(new FieldData[]
{
FieldData.Create("movie_id", movieIds),
FieldData.Create("movie_name", movieNames),
FieldData.CreateFloatVector("movie_description", movieDescriptions)
});
搜尋電影
假設我們想找到匹配搜尋查詢「適合全家的有趣電影」的電影。
查詢 | 嵌入 |
適合全家的有趣電影 | [0.12217915, -0.034832448] |
首先,為您的電影集合建立索引。在這個案例中,索引的名稱是
movie_idx
,索引的欄位是包含電影描述的嵌入向量的
movie_description
。其余的是索參照來組織資訊和進行搜尋的配置。有關更多詳情,請檢視
Milvus 向量索引
[13]
和
相似度度量
[14]
文件。
await collection.CreateIndexAsync(
fieldName: "movie_description",
indexType: IndexType.Flat,
metricType: SimilarityMetricType.L2,
indexName: "movie_idx");
一旦建立了索引,載入您的集合。
await collection.LoadAsync();
await collection.WaitForCollectionLoadAsync();
定義搜尋參數。在這種情況下,您希望您的查詢結果顯示與您的查詢最相關的電影名稱,因此您將
movie_name
設定為
OutputFields
。
var parameters = new SearchParameters
{
OutputFields = { "movie_name" },
ConsistencyLevel = ConsistencyLevel.Strong,
ExtraParameters = { ["nprobe"] = "1024" }
};
然後,進行搜尋。註意,對於
vectors
,我傳入了我的搜尋查詢的嵌入向量表示。與電影描述一樣,它們已經方便地預先計算過了。
var results = await collection.SearchAsync(
vectorFieldName: "movie_description",
vectors: new ReadOnlyMemory<float>[] { new[] {0.12217915f, -0.034832448f } },
SimilarityMetricType.L2,
limit: 3,
parameters);
結果是以下內容:
[ Toy Story, Shrek, The Lion King ]
使用語意內核
如果您與語意內核一起使用 Milvus,可以使用 Milvus 連結器 [15] 。
鳴謝
感謝 Milvus 組織和開源社群以及 .NET 數據存取、Azure 套用服務和語意內核團隊在這一努力中的合作。
下一步
今天就試試 範例 [16] 並開始吧!
參照連結
[1]
Get started with Milvus vector database in .NET:
https://devblogs.microsoft.com/dotnet/get-started-milvus-vector-db-dotnet/
[2]
Milvus 網站:
https://milvus.io/
[3]
OpenAI 的文本嵌入模型:
https://learn.microsoft.com/azure/ai-services/openai/concepts/models#embeddings
[4]
OpenAI – 引入文本和程式碼嵌入:
https://openai.com/blog/introducing-text-and-code-embeddings
[5]
使用 Azure OpenAI 生成嵌入:
https://learn.microsoft.com/azure/ai-services/openai/how-to/embeddings?tabs=csharp
[6]
解密檢索增強生成:
https://devblogs.microsoft.com/dotnet/demystifying-retrieval-augmented-generation-with-dotnet/#mind-the-gap
[7]
使用智慧 .NET 套用改造您的業務,這些套用由 Azure 和 ChatGPT 提供支持:
https://devblogs.microsoft.com/dotnet/transform-business-smart-dotnet-apps-azure-chatgpt/#chat-with-your-data
[8]
有效估算向量空間中的詞表示:
https://arxiv.org/abs/1301.3781
[9]
透過全域上下文和多個詞原型改進詞表示:
https://www.andrewng.org/publications/improving-word-representations-via-global-context-and-multiple-word-prototypes/
[10]
NLP 的深度學習:詞嵌入:
https://towardsdatascience.com/deep-learning-for-nlp-word-embeddings-4f5c90bcdab5
[11]
Zilliz Cloud for Azure:
https://zilliz.com/blog/zilliz-cloud-now-available-on-microsoft-azure
[12]
Azure 容器應用程式 Add-On:
https://learn.microsoft.com/azure/container-apps/services
[13]
Milvus 向量索引:
https://milvus.io/docs/v2.2.x/index.md
[14]
相似度度量:
https://milvus.io/docs/v2.2.x/metric.md
[15]
Milvus 連結器:
https://www.nuget.org/packages/Microsoft.SemanticKernel.Connectors.Milvus
[16]
範例:
https://github.com/Azure-Samples/openai/tree/main/Basic_Samples#datastores