.NET 原生駕馭 AI 新基建實(shí)戰(zhàn)系列(三):Chroma ── 輕松構(gòu)建智能應(yīng)用的向量數(shù)據(jù)庫(kù)
在人工智能AI和機(jī)器學(xué)習(xí)ML迅猛發(fā)展的今天,數(shù)據(jù)的存儲(chǔ)和檢索需求發(fā)生了巨大變化。傳統(tǒng)的數(shù)據(jù)庫(kù)擅長(zhǎng)處理結(jié)構(gòu)化數(shù)據(jù),但在面對(duì)高維向量數(shù)據(jù)時(shí)往往力不從心。向量數(shù)據(jù)庫(kù)作為一種新興技術(shù),專為AI應(yīng)用設(shè)計(jì),能夠高效地存儲(chǔ)和查詢高維向量數(shù)據(jù),成為現(xiàn)代智能應(yīng)用的核心組件之一。
本文將詳細(xì)介紹Chroma這一開(kāi)源向量數(shù)據(jù)庫(kù),探討其在.NET生態(tài)系統(tǒng)中的應(yīng)用,包括安裝步驟、代碼示例以及實(shí)際應(yīng)用場(chǎng)景,幫助.NET開(kāi)發(fā)者充分利用這一工具構(gòu)建智能應(yīng)用。
一、Chroma簡(jiǎn)介
Chroma是一個(gè)開(kāi)源的、AI原生的向量數(shù)據(jù)庫(kù),旨在為開(kāi)發(fā)者提供簡(jiǎn)單、高效的方式來(lái)管理和查詢高維向量數(shù)據(jù)。它特別適用于需要嵌入embeddings、向量搜索和多模態(tài)數(shù)據(jù)處理的AI應(yīng)用場(chǎng)景。Chroma的設(shè)計(jì)目標(biāo)是降低開(kāi)發(fā)復(fù)雜性,同時(shí)保證高性能和靈活性,使其成為構(gòu)建智能應(yīng)用的理想選擇。
1.1 Chroma 的特點(diǎn)
Chroma具備以下幾個(gè)顯著特點(diǎn),使其在向量數(shù)據(jù)庫(kù)領(lǐng)域脫穎而出:
-
開(kāi)源和AI原生: Chroma是完全開(kāi)源的,遵循Apache 2.0許可,開(kāi)發(fā)者可以自由使用、修改和分發(fā)。它專為AI應(yīng)用設(shè)計(jì),與現(xiàn)代機(jī)器學(xué)習(xí)工作流無(wú)縫銜接。 -
功能豐富:支持向量搜索、文檔存儲(chǔ)、全文搜索、元數(shù)據(jù)過(guò)濾和多模態(tài)檢索等多種功能,滿足多樣化的應(yīng)用需求。 -
易于使用:提供簡(jiǎn)潔的 RESTFul API接口,開(kāi)發(fā)者無(wú)需深入了解底層實(shí)現(xiàn)即可快速上手。 -
高性能:針對(duì)高維向量數(shù)據(jù)的存儲(chǔ)和檢索進(jìn)行了優(yōu)化,支持大規(guī)模數(shù)據(jù)集的快速查詢。 -
與.NET集成:通過(guò)官方提供的 C#客戶端SDK,Chroma可以輕松集成到.NET應(yīng)用中,為.NET開(kāi)發(fā)者提供了強(qiáng)大的支持。 -
持久化 Chroma支持將數(shù)據(jù)持久化到磁盤(pán),以便在重啟后保留數(shù)據(jù)。用戶可以選擇將數(shù)據(jù)存儲(chǔ)在內(nèi)存中或持久化到磁盤(pán)。 -
可擴(kuò)展性 Chroma設(shè)計(jì)為可擴(kuò)展的系統(tǒng),可以處理大規(guī)模的嵌入向量和文檔集合。用戶可以根據(jù)需要擴(kuò)展Chroma的容量和性能。
1.2 Chroma 的核心概念

Chroma的核心概念主要圍繞著高效存儲(chǔ)、查詢和管理嵌入向量(embeddings)以及相關(guān)數(shù)據(jù)。以下是Chroma的關(guān)鍵概念:
-
租戶(Tenant): Tenant 是一個(gè)邏輯分組,通常代表一個(gè)組織、用戶或客戶,用于組織一組數(shù)據(jù)庫(kù)。
-
數(shù)據(jù)庫(kù)(Database): Database 是一個(gè)邏輯分組,通常代表一個(gè)應(yīng)用程序或項(xiàng)目,用于組織一組 Collection(集合)。
-
集合(Collection): 集合是Chroma中存儲(chǔ)嵌入向量、文檔、ID和元數(shù)據(jù)的基本單元。每個(gè)集合通常代表一個(gè)特定的數(shù)據(jù)集或應(yīng)用場(chǎng)景,類似于數(shù)據(jù)庫(kù)中的“表”。
?Database 與 Collection 的關(guān)系:
Collection(集合) 是 ChromaDB 中存儲(chǔ)實(shí)際數(shù)據(jù)的基本單元,比如嵌入向量、文> 檔、ID 和元數(shù)據(jù)。Collection 隸屬于某個(gè) Database,而 Database 又隸屬于某個(gè) Ten> ant,形成了一個(gè)層次化的數(shù)據(jù)組織結(jié)構(gòu)。
-
嵌入向量(Embeddings): 嵌入向量是文本、圖像或其他數(shù)據(jù)的向量表示,用于捕捉其語(yǔ)義或特征。Chroma允許用戶將這些嵌入向量與相應(yīng)的文檔和元數(shù)據(jù)一起存儲(chǔ)。
-
文檔(Documents): 文檔是與嵌入向量相關(guān)聯(lián)的原始數(shù)據(jù),例如文本、圖像或其他內(nèi)容。文檔可以與嵌入向量一起存儲(chǔ),以便在查詢時(shí)提供上下文。
-
ID: 每個(gè)嵌入向量、文檔和元數(shù)據(jù)都與一個(gè)唯一的ID相關(guān)聯(lián),用于標(biāo)識(shí)和檢索特定的條目。
-
元數(shù)據(jù)(Metadata): 元數(shù)據(jù)是與嵌入向量和文檔相關(guān)的額外信息,例如作者、日期、類別等。元數(shù)據(jù)可以用于過(guò)濾和查詢數(shù)據(jù)。
-
嵌入函數(shù)(Embedding Functions): Chroma支持使用嵌入函數(shù)來(lái)自動(dòng)生成嵌入向量。用戶可以指定嵌入函數(shù),以便在添加文檔時(shí)自動(dòng)生成嵌入向量。
這些核心概念共同構(gòu)成了Chroma的功能和特性,使其成為一個(gè)高效的嵌入向量存儲(chǔ)與查詢工具。
1.3 Chroma 的工作原理
Chroma的核心功能基于高效的向量索引和搜索技術(shù)。它使用諸如HNSW(Hierarchical Navigable Small World)等先進(jìn)的索引結(jié)構(gòu)來(lái)存儲(chǔ)高維向量數(shù)據(jù),并支持多種距離度量(如歐幾里得距離、余弦相似度)來(lái)計(jì)算向量之間的相似性。開(kāi)發(fā)者可以將文本、圖像或其他數(shù)據(jù)轉(zhuǎn)換為嵌入向量,存儲(chǔ)在Chroma中,并通過(guò)相似性搜索快速檢索相關(guān)內(nèi)容。這種設(shè)計(jì)特別適合語(yǔ)義搜索、推薦系統(tǒng)等需要理解數(shù)據(jù)深層含義的場(chǎng)景。

1.4 Chroma Embeddings算法簡(jiǎn)介
Chroma Embeddings算法是一種用于生成文本嵌入向量(text embeddings)的方法,主要在ChromaDB中應(yīng)用。ChromaDB是一個(gè)專門(mén)設(shè)計(jì)用于存儲(chǔ)和查詢嵌入向量的數(shù)據(jù)庫(kù),支持多種嵌入模型,其中就包括Chroma Embeddings算法。
?這種算法的核心目標(biāo)是將文本轉(zhuǎn)化為高維向量表示,從而捕捉文本的語(yǔ)義信息,并支持諸如相似性搜索、文本分類和聚類等自然語(yǔ)言處理任務(wù)。
算法原理
Chroma Embeddings算法通?;?strong style="color: rgba(53, 148, 247, 1); font-weight: bold; background: none left top / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0); width: auto; height: auto; border-radius: 0; border: 3px none rgba(0, 0, 0, 0.4); padding: 0; margin: 0">Transformer模型,尤其是類似于BERT(Bidirectional Encoder Representations from Transformers)或其變體的預(yù)訓(xùn)練語(yǔ)言模型。BERT通過(guò)在大量文本數(shù)據(jù)上進(jìn)行無(wú)監(jiān)督學(xué)習(xí),能夠理解文本的上下文和深層語(yǔ)義。Chroma Embeddings算法利用這一特性,將輸入文本轉(zhuǎn)化為固定長(zhǎng)度的嵌入向量。這些向量保留了文本的語(yǔ)義信息,使得相似的文本在向量空間中距離較近,而語(yǔ)義不同的文本則距離較遠(yuǎn)。
其工作流程大致如下:
-
文本輸入:接收用戶提供的文本數(shù)據(jù)。 -
嵌入生成:通過(guò)預(yù)訓(xùn)練的Transformer模型,將文本轉(zhuǎn)換為嵌入向量。 -
存儲(chǔ)與查詢:在ChromaDB中存儲(chǔ)這些向量,并支持基于向量的查詢操作。
應(yīng)用
-
生成嵌入向量:將文本數(shù)據(jù)轉(zhuǎn)化為向量表示。 -
存儲(chǔ)嵌入:將生成的向量高效存儲(chǔ)在數(shù)據(jù)庫(kù)中。 -
相似性搜索:通過(guò)比較向量之間的距離,找到與查詢文本最相似的已有文本。
例如,用戶可以輸入一段查詢文本,Chroma Embeddings算法會(huì)將其轉(zhuǎn)化為嵌入向量,然后ChromaDB會(huì)返回?cái)?shù)據(jù)庫(kù)中最相似的文本結(jié)果。這種功能在信息檢索、推薦系統(tǒng)等領(lǐng)域尤為實(shí)用。
優(yōu)勢(shì)
Chroma Embeddings算法具有以下優(yōu)點(diǎn):
-
語(yǔ)義捕捉能力強(qiáng):基于Transformer模型,能夠理解文本的深層含義,而不僅僅是表面詞匯。 -
靈活性:ChromaDB支持多種嵌入模型,用戶可以根據(jù)任務(wù)需求選擇合適的模型。 -
高效性:生成的嵌入向量支持快速查詢和相似性計(jì)算,適用于大規(guī)模數(shù)據(jù)場(chǎng)景。
實(shí)現(xiàn)細(xì)節(jié)
盡管具體實(shí)現(xiàn)可能因ChromaDB的版本和配置而有所不同,但Chroma Embeddings算法通常依賴于:
-
預(yù)訓(xùn)練模型:如BERT或其變體,這些模型已在大型語(yǔ)料庫(kù)上訓(xùn)練完成。 -
微調(diào)(可選):根據(jù)特定任務(wù)對(duì)模型進(jìn)行調(diào)整,以提升性能。
用戶在使用時(shí)無(wú)需深入了解模型內(nèi)部細(xì)節(jié),只需通過(guò)ChromaDB的接口調(diào)用算法即可生成和查詢嵌入向量。
?Chroma Embeddings算法是一種基于Transformer模型的文本嵌入生成方法,廣泛應(yīng)用于ChromaDB中。它通過(guò)將文本轉(zhuǎn)化為嵌入向量,捕捉深層語(yǔ)義信息,支持高效的存儲(chǔ)和查詢操作。這種算法在相似性搜索、文本分類等任務(wù)中表現(xiàn)出色,是自然語(yǔ)言處理領(lǐng)域的重要工具。
二、配置 Chroma 開(kāi)發(fā)環(huán)境
目前在.NET中,想要完整的使用,還是比較困難的,最大的困難在于生成嵌入向量,雖然現(xiàn)在有很多的SDK,但這些這是對(duì)Chroma API的封裝而已,還遠(yuǎn)沒(méi)有達(dá)到可以實(shí)際應(yīng)用的地步。
不過(guò),好消息是,.NET官方正在Semantic Kernel中加入對(duì)Chroma的完整支持,目前尚不成熟,在這里,我簡(jiǎn)單的演示一下,大家也不用太深入的看代碼,因?yàn)楝F(xiàn)在的代碼都處于開(kāi)發(fā)中,很多接口都會(huì)變化,而且已經(jīng)實(shí)現(xiàn)的代碼也有很多問(wèn)題,我花了一下午的時(shí)間,才把這些問(wèn)題清除掉,并運(yùn)行起來(lái)。
2.1 安裝 Chroma 服務(wù)
Chroma的客戶端需要連接到一個(gè)運(yùn)行中的Chroma服務(wù)器。開(kāi)發(fā)者可以通過(guò)以下方式啟動(dòng) Chroma服務(wù):
-
使用 Docker: 在本地運(yùn)行以下命令以啟動(dòng) Chroma服務(wù):
docker run -v ./chroma-data:/data -p 8000:8000 ghcr.io/chroma-core/chroma:0.6.4.dev379

-
使用 Python: 如果你更傾向于直接運(yùn)行 Chroma,可以通過(guò)Python安裝并啟動(dòng):
pip install chromadb
chromadb run --host localhost --port 8000
完成上述步驟后,Chroma服務(wù)將在本地運(yùn)行,.NET客戶端即可通過(guò)配置的URI進(jìn)行連接。
Chroma 接口文檔查看
接口地址:http://localhost:8000/docs

2.2 安裝Ollama并配置相關(guān)模型
-
安裝all-minilm用于對(duì)話功能

-
安裝mxbai-embed-large用于生成嵌入向量

三、在.NET 中操作 Chroma
為了幫助開(kāi)發(fā)者更好地理解Chroma在.NET中的使用方式,以下提供幾個(gè)實(shí)用的代碼示例,展示如何創(chuàng)建集合、添加文檔、執(zhí)行查詢。
?以下代碼是使用官方代碼庫(kù)演示,而由于官方代碼庫(kù)尚未穩(wěn)定,所以只是讓大家先看看效果,但是暫時(shí)不需要對(duì)代碼實(shí)現(xiàn)有太多的關(guān)注,建議把精力多放在 Chroma 的相關(guān)知識(shí)的學(xué)習(xí)中,靜等微軟發(fā)布正式版代碼庫(kù)。
3.1 連接與創(chuàng)建集合
參考代碼:https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/Concepts/Memory/TextMemoryPlugin_MultipleMemoryStore.cs
在Chroma中,集合Collection是存儲(chǔ)向量數(shù)據(jù)的基本單元。以下代碼演示如何創(chuàng)建一個(gè)名為products的集合:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Chroma;
using Microsoft.SemanticKernel.Connectors.Ollama;
using Microsoft.SemanticKernel.Embeddings;
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Plugins.Memory;
using OllamaSharp;
#pragma warning disable SKEXP0070
#pragma warning disable SKEXP0050
#pragma warning disable SKEXP0001
#pragma warning disable SKEXP0020
const string MemoryCollectionName = "my-memory-collection";
IMemoryStore memoryStore = new ChromaMemoryStore("http://localhost:8000/api/v2/tenants/tenant_test/databases/db_test/");
await memoryStore.CreateCollectionAsync(MemoryCollectionName);
var kernel = Kernel.CreateBuilder()
.AddOllamaChatCompletion("phi3", new Uri("http://localhost:11434"))
.AddOllamaTextEmbeddingGeneration("mxbai-embed-large", new Uri("http://localhost:11434"))
.Build();
// Create an embedding generator to use for semantic memory.
// The combination of the text embedding generator and the memory store makes up the 'SemanticTextMemory' object used to
// store and retrieve memories.
SemanticTextMemory textMemory = new(memoryStore, new OllamaApiClient("http://localhost:11434", "mxbai-embed-large").AsTextEmbeddingGenerationService());
3.2 組建 SemanticTextMemory 對(duì)象并添加文檔信息
SemanticTextMemory textMemory = new(memoryStore, new OllamaApiClient("http://localhost:11434", "mxbai-embed-large").AsTextEmbeddingGenerationService());
Console.WriteLine("Saving memory with key 'info1': \"My name is Andrea\"");
await textMemory.SaveInformationAsync(MemoryCollectionName, id: "info1", text: "My name is Andrea");
……
如果未提供嵌入,Chroma會(huì)使用內(nèi)置的嵌入模型(如 all-MiniLM-L6-v2)自動(dòng)生成向量。
3.3 執(zhí)行向量查詢
IAsyncEnumerable<MemoryQueryResult> answers = textMemory.SearchAsync(
collection: MemoryCollectionName,
query: "What's yous name?",
limit: 2,
minRelevanceScore: 0.4,
withEmbeddings: true);
3.4 總的運(yùn)行結(jié)果

四、Chroma 的實(shí)際應(yīng)用場(chǎng)景
Chroma的強(qiáng)大功能使其在.NET應(yīng)用中有著廣泛的適用性。以下是幾個(gè)典型的應(yīng)用場(chǎng)景:
4.1 語(yǔ)義搜索
在企業(yè)文檔管理系統(tǒng)中,傳統(tǒng)的關(guān)鍵字搜索往往無(wú)法捕捉用戶意圖的深層含義。通過(guò)將文檔轉(zhuǎn)換為嵌入并存儲(chǔ)在Chroma中,開(kāi)發(fā)者可以實(shí)現(xiàn)語(yǔ)義搜索。例如,用戶輸入“如何提高團(tuán)隊(duì)效率”,系統(tǒng)能夠返回與團(tuán)隊(duì)協(xié)作、時(shí)間管理相關(guān)的文檔,而不僅僅是包含關(guān)鍵字的文檔。
4.2 推薦系統(tǒng)
在電子商務(wù)平臺(tái)中,可以使用Chroma存儲(chǔ)商品和用戶的向量表示。例如,將商品描述和用戶瀏覽歷史轉(zhuǎn)換為嵌入,存儲(chǔ)在Chroma中,通過(guò)相似性搜索為用戶推薦相關(guān)商品。這種方法比傳統(tǒng)基于規(guī)則的推薦系統(tǒng)更靈活、更智能。
4.3 多模態(tài)檢索
在多媒體應(yīng)用中,Chroma的多模態(tài)檢索功能尤為強(qiáng)大。例如,可以將圖像和文本描述的嵌入存儲(chǔ)在同一個(gè)集合中,用戶上傳一張圖片后,系統(tǒng)能夠返回與之內(nèi)容相似的圖像和相關(guān)描述。
4.4 問(wèn)答系統(tǒng)
在客戶支持應(yīng)用中,可以使用Chroma存儲(chǔ)常見(jiàn)問(wèn)題及其答案的向量表示。用戶輸入問(wèn)題后,系統(tǒng)通過(guò)向量搜索返回最匹配的答案,提升響應(yīng)速度和準(zhǔn)確性。
五、Chroma 與.NET生態(tài)系統(tǒng)的集成
Chroma不僅可以通過(guò)C#客戶端直接使用,還能與.NET生態(tài)系統(tǒng)中的其他組件深度集成,進(jìn)一步提升開(kāi)發(fā)效率:
-
Semantic Kernel:這是 Microsoft推出的一款AI開(kāi)發(fā)框架,支持與Chroma集成。開(kāi)發(fā)者可以通過(guò)Semantic Kernel將Chroma作為向量存儲(chǔ),用于實(shí)現(xiàn)復(fù)雜的AI工作流。 -
Microsoft.SemanticKernel.Connectors.Chroma:通過(guò)此擴(kuò)展, Chroma可以與.NET的依賴注入機(jī)制無(wú)縫協(xié)作,提供標(biāo)準(zhǔn)化的向量數(shù)據(jù)訪問(wèn)接口,簡(jiǎn)化應(yīng)用程序架構(gòu)。 -
Microsoft.Extensions.VectorData:庫(kù)的主要作用是為 .NET 應(yīng)用程序提供與向量存儲(chǔ)交互的統(tǒng)一抽象層。向量存儲(chǔ)用于存儲(chǔ)和管理高維嵌入向量,廣泛應(yīng)用于語(yǔ)義搜索和生成式 AI 等場(chǎng)景。
這些集成使得Chroma能夠融入現(xiàn)有的.NET項(xiàng)目,與其他工具協(xié)同工作,加速智能應(yīng)用的開(kāi)發(fā)。
?目前這些工作正在進(jìn)行中,請(qǐng)大家靜等.NET正式版的發(fā)布。
六、性能優(yōu)化技巧
為了在.NET應(yīng)用中充分發(fā)揮Chroma的性能,開(kāi)發(fā)者可以采用以下優(yōu)化策略:
-
索引調(diào)優(yōu):調(diào)整 HNSW 索引的參數(shù),例如 efConstruction(構(gòu)建時(shí)的搜索深度)和M(鄰居數(shù)量),在搜索速度和精度之間找到平衡。 -
數(shù)據(jù)分片:對(duì)于超大規(guī)模數(shù)據(jù)集,可以將數(shù)據(jù)分散到多個(gè)集合或?qū)嵗校ㄟ^(guò)并行查詢提高吞吐量。 -
緩存策略:對(duì)于頻繁查詢的熱點(diǎn)數(shù)據(jù),可以在 .NET應(yīng)用層添加緩存,減少對(duì)Chroma的直接訪問(wèn)。
七、Chroma 的未來(lái)發(fā)展展望
隨著AI技術(shù)的不斷進(jìn)步,向量數(shù)據(jù)庫(kù)在軟件開(kāi)發(fā)中的重要性日益凸顯。作為一款開(kāi)源項(xiàng)目,Chroma在未來(lái)有很大的發(fā)展?jié)摿?,尤其是?code style="color: rgba(53, 148, 247, 1); font-size: 14px; line-height: 1.8em; letter-spacing: 0; background: none left top / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; border-radius: 4px; overflow-wrap: break-word; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace; word-break: break-all; border-top: 3px none rgba(0, 0, 0, 1); border-right: 3px none rgba(0, 0, 0, 0.4); border-bottom: 3px none rgba(0, 0, 0, 0.4); border-left: 3px none rgba(0, 0, 0, 0.4); padding: 2px 4px; margin: 0 2px">.NET生態(tài)系統(tǒng)中:
-
功能擴(kuò)展:支持更多類型的索引和距離度量,滿足不同場(chǎng)景的需求。 -
性能提升:優(yōu)化底層算法,進(jìn)一步提高大規(guī)模數(shù)據(jù)集的處理能力。 -
云服務(wù)支持:推出官方托管版本,降低部署和維護(hù)的門(mén)檻,為 .NET開(kāi)發(fā)者提供更便捷的接入方式。 -
與.NET深度融合:提供更多針對(duì) .NET平臺(tái)的專用工具和文檔,提升開(kāi)發(fā)效率。
八、總結(jié)
Chroma作為一個(gè)開(kāi)源、易用且功能強(qiáng)大的向量數(shù)據(jù)庫(kù),為.NET開(kāi)發(fā)者提供了一款構(gòu)建智能應(yīng)用的利器。通過(guò)簡(jiǎn)單的安裝步驟和直觀的API,開(kāi)發(fā)者可以將Chroma集成到.NET項(xiàng)目中,實(shí)現(xiàn)高效的向量數(shù)據(jù)管理。無(wú)論是語(yǔ)義搜索、推薦系統(tǒng)還是多模態(tài)檢索,Chroma都能為應(yīng)用注入智能化能力。隨著技術(shù)的不斷演進(jìn),Chroma在.NET生態(tài)系統(tǒng)中的應(yīng)用前景將更加廣闊,為開(kāi)發(fā)者開(kāi)啟更多創(chuàng)新可能。
本文來(lái)自博客園,作者:AI·NET極客圈,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/code-daily/p/18826233
歡迎關(guān)注我們的公眾號(hào),作為.NET工程師,我們聚焦人工智能技術(shù),探討 AI 的前沿應(yīng)用與發(fā)展趨勢(shì),為你立體呈現(xiàn)人工智能的無(wú)限可能,讓我們共同攜手共同進(jìn)步。

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