在人工智能AI
和机器学习ML
迅猛发展的今天,数据的存储和检索需求发生了巨大变化。传统的数据库擅长处理结构化数据,但在面对高维向量数据时往往力不从心。向量数据库作为一种新兴技术,专为AI
应用设计,能够高效地存储和查询高维向量数据,成为现代智能应用的核心组件之一。
本文将详细介绍Chroma
这一开源向量数据库,探讨其在.NET
生态系统中的应用,包括安装步骤、代码示例以及实际应用场景,帮助.NET
开发者充分利用这一工具构建智能应用。
Chroma
是一个开源的、AI原生的向量数据库,旨在为开发者提供简单、高效的方式来管理和查询高维向量数据。它特别适用于需要嵌入embeddings
、向量搜索和多模态数据处理的AI
应用场景。Chroma
的设计目标是降低开发复杂性,同时保证高性能和灵活性,使其成为构建智能应用的理想选择。
Chroma
具备以下几个显著特点,使其在向量数据库领域脱颖而出:
Chroma
是完全开源的,遵循Apache 2.0
许可,开发者可以自由使用、修改和分发。它专为AI应用设计,与现代机器学习工作流无缝衔接。RESTFul API
接口,开发者无需深入了解底层实现即可快速上手。C#
客户端SDK
,Chroma
可以轻松集成到.NET
应用中,为.NET
开发者提供了强大的支持。Chroma的核心概念主要围绕着高效存储、查询和管理嵌入向量(embeddings)以及相关数据。以下是Chroma的关键概念:
❝Database 与 Collection 的关系:
这些核心概念共同构成了Chroma的功能和特性,使其成为一个高效的嵌入向量存储与查询工具。
Chroma
的核心功能基于高效的向量索引和搜索技术。它使用诸如HNSW(Hierarchical Navigable Small World)
等先进的索引结构来存储高维向量数据,并支持多种距离度量(如欧几里得距离、余弦相似度)来计算向量之间的相似性。开发者可以将文本、图像或其他数据转换为嵌入向量,存储在Chroma
中,并通过相似性搜索快速检索相关内容。这种设计特别适合语义搜索、推荐系统等需要理解数据深层含义的场景。
Chroma Embeddings算法是一种用于生成文本嵌入向量(text embeddings)的方法,主要在ChromaDB中应用。ChromaDB是一个专门设计用于存储和查询嵌入向量的数据库,支持多种嵌入模型,其中就包括Chroma Embeddings算法。
❝这种算法的核心目标是将文本转化为高维向量表示,从而捕捉文本的语义信息,并支持诸如相似性搜索、文本分类和聚类等自然语言处理任务。
Chroma Embeddings算法通常基于Transformer模型,尤其是类似于BERT(Bidirectional Encoder Representations from Transformers)或其变体的预训练语言模型。BERT通过在大量文本数据上进行无监督学习,能够理解文本的上下文和深层语义。Chroma Embeddings算法利用这一特性,将输入文本转化为固定长度的嵌入向量。这些向量保留了文本的语义信息,使得相似的文本在向量空间中距离较近,而语义不同的文本则距离较远。
其工作流程大致如下:
例如,用户可以输入一段查询文本,Chroma Embeddings算法会将其转化为嵌入向量,然后ChromaDB会返回数据库中最相似的文本结果。这种功能在信息检索、推荐系统等领域尤为实用。
Chroma Embeddings算法具有以下优点:
尽管具体实现可能因ChromaDB的版本和配置而有所不同,但Chroma Embeddings算法通常依赖于:
用户在使用时无需深入了解模型内部细节,只需通过ChromaDB的接口调用算法即可生成和查询嵌入向量。
❝Chroma Embeddings算法是一种基于Transformer模型的文本嵌入生成方法,广泛应用于ChromaDB中。它通过将文本转化为嵌入向量,捕捉深层语义信息,支持高效的存储和查询操作。这种算法在相似性搜索、文本分类等任务中表现出色,是自然语言处理领域的重要工具。
目前在.NET中,想要完整的使用,还是比较困难的,最大的困难在于生成嵌入向量,虽然现在有很多的SDK,但这些这是对Chroma API的封装而已,还远没有达到可以实际应用的地步。
不过,好消息是,.NET官方正在Semantic Kernel中加入对Chroma的完整支持,目前尚不成熟,在这里,我简单的演示一下,大家也不用太深入的看代码,因为现在的代码都处于开发中,很多接口都会变化,而且已经实现的代码也有很多问题,我花了一下午的时间,才把这些问题清除掉,并运行起来。
Chroma
的客户端需要连接到一个运行中的Chroma
服务器。开发者可以通过以下方式启动 Chroma
服务:
Chroma
服务:docker run -v ./chroma-data:/data -p 8000:8000 ghcr.io/chroma-core/chroma:0.6.4.dev379
Chroma
,可以通过Python
安装并启动:pip install chromadb
chromadb run --host localhost --port 8000
完成上述步骤后,Chroma
服务将在本地运行,.NET
客户端即可通过配置的URI
进行连接。
接口地址:http://localhost:8000/docs
为了帮助开发者更好地理解Chroma
在.NET
中的使用方式,以下提供几个实用的代码示例,展示如何创建集合、添加文档、执行查询。
❝以下代码是使用官方代码库演示,而由于官方代码库尚未稳定,所以只是让大家先看看效果,但是暂时不需要对代码实现有太多的关注,建议把精力多放在 Chroma 的相关知识的学习中,静等微软发布正式版代码库。
参考代码:https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/Concepts/Memory/TextMemoryPlugin_MultipleMemoryStore.cs
在Chroma
中,集合Collection
是存储向量数据的基本单元。以下代码演示如何创建一个名为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
conststring 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());
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
会使用内置的嵌入模型(如 all-MiniLM-L6-v2
)自动生成向量。
IAsyncEnumerable<MemoryQueryResult> answers = textMemory.SearchAsync(
collection: MemoryCollectionName,
query: "What's yous name?",
limit: 2,
minRelevanceScore: 0.4,
withEmbeddings: true);
Chroma
的强大功能使其在.NET
应用中有着广泛的适用性。以下是几个典型的应用场景:
在企业文档管理系统中,传统的关键字搜索往往无法捕捉用户意图的深层含义。通过将文档转换为嵌入并存储在Chroma
中,开发者可以实现语义搜索。例如,用户输入“如何提高团队效率”,系统能够返回与团队协作、时间管理相关的文档,而不仅仅是包含关键字的文档。
在电子商务平台中,可以使用Chroma
存储商品和用户的向量表示。例如,将商品描述和用户浏览历史转换为嵌入,存储在Chroma
中,通过相似性搜索为用户推荐相关商品。这种方法比传统基于规则的推荐系统更灵活、更智能。
在多媒体应用中,Chroma
的多模态检索功能尤为强大。例如,可以将图像和文本描述的嵌入存储在同一个集合中,用户上传一张图片后,系统能够返回与之内容相似的图像和相关描述。
在客户支持应用中,可以使用Chroma
存储常见问题及其答案的向量表示。用户输入问题后,系统通过向量搜索返回最匹配的答案,提升响应速度和准确性。
Chroma
不仅可以通过C#
客户端直接使用,还能与.NET
生态系统中的其他组件深度集成,进一步提升开发效率:
Microsoft
推出的一款AI
开发框架,支持与Chroma
集成。开发者可以通过Semantic Kernel
将Chroma
作为向量存储,用于实现复杂的AI
工作流。Chroma
可以与.NET的依赖注入机制无缝协作,提供标准化的向量数据访问接口,简化应用程序架构。这些集成使得Chroma
能够融入现有的.NET
项目,与其他工具协同工作,加速智能应用的开发。
❝目前这些工作正在进行中,请大家静等.NET正式版的发布。
为了在.NET
应用中充分发挥Chroma
的性能,开发者可以采用以下优化策略:
efConstruction
(构建时的搜索深度)和 M
(邻居数量),在搜索速度和精度之间找到平衡。.NET
应用层添加缓存,减少对Chroma
的直接访问。随着AI
技术的不断进步,向量数据库在软件开发中的重要性日益凸显。作为一款开源项目,Chroma
在未来有很大的发展潜力,尤其是在.NET
生态系统中:
.NET
开发者提供更便捷的接入方式。.NET
平台的专用工具和文档,提升开发效率。Chroma
作为一个开源、易用且功能强大的向量数据库,为.NET
开发者提供了一款构建智能应用的利器。通过简单的安装步骤和直观的API
,开发者可以将Chroma
集成到.NET项目中,实现高效的向量数据管理。无论是语义搜索、推荐系统还是多模态检索,Chroma
都能为应用注入智能化能力。随着技术的不断演进,Chroma
在.NET
生态系统中的应用前景将更加广阔,为开发者开启更多创新可能。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有