在人工智能AI和机器学习ML迅猛发展的今天,数据的存储和检索需求发生了巨大变化。传统的数据库擅长处理结构化数据,但在面对高维向量数据时往往力不从心。向量数据库作为一种新兴技术,专为AI应用设计,能够高效地存储和查询高维向量数据,成为现代智能应用的核心组件之一。

本文将详细介绍Chroma这一开源向量数据库,探讨其在.NET生态系统中的应用,包括安装步骤、代码示例以及实际应用场景,帮助.NET开发者充分利用这一工具构建智能应用。


一、Chroma简介

Chroma是一个开源的、AI原生的向量数据库,旨在为开发者提供简单、高效的方式来管理和查询高维向量数据。它特别适用于需要嵌入embeddings、向量搜索和多模态数据处理的AI应用场景。Chroma的设计目标是降低开发复杂性,同时保证高性能和灵活性,使其成为构建智能应用的理想选择。

1.1 Chroma 的特点

Chroma具备以下几个显著特点,使其在向量数据库领域脱颖而出:

  • 开源和AI原生Chroma是完全开源的,遵循Apache 2.0许可,开发者可以自由使用、修改和分发。它专为AI应用设计,与现代机器学习工作流无缝衔接。
  • 功能丰富:支持向量搜索、文档存储、全文搜索、元数据过滤和多模态检索等多种功能,满足多样化的应用需求。
  • 易于使用:提供简洁的RESTFul API接口,开发者无需深入了解底层实现即可快速上手。
  • 高性能:针对高维向量数据的存储和检索进行了优化,支持大规模数据集的快速查询。
  • 与.NET集成:通过官方提供的C#客户端SDKChroma可以轻松集成到.NET应用中,为.NET开发者提供了强大的支持。
  • 持久化 Chroma支持将数据持久化到磁盘,以便在重启后保留数据。用户可以选择将数据存储在内存中或持久化到磁盘。
  • 可扩展性 Chroma设计为可扩展的系统,可以处理大规模的嵌入向量和文档集合。用户可以根据需要扩展Chroma的容量和性能。

1.2 Chroma 的核心概念

Chroma的核心概念主要围绕着高效存储、查询和管理嵌入向量(embeddings)以及相关数据。以下是Chroma的关键概念:

  • 租户(Tenant): Tenant 是一个逻辑分组,通常代表一个组织、用户或客户,用于组织一组数据库。

  • 数据库(Database): Database 是一个逻辑分组,通常代表一个应用程序或项目,用于组织一组 Collection(集合)。

  • 集合(Collection): 集合是Chroma中存储嵌入向量、文档、ID和元数据的基本单元。每个集合通常代表一个特定的数据集或应用场景,类似于数据库中的“表”。

Database 与 Collection 的关系:

  • Collection(集合) 是 ChromaDB 中存储实际数据的基本单元,比如嵌入向量、文> 档、ID 和元数据。Collection 隶属于某个 Database,而 Database 又隶属于某个 Ten> ant,形成了一个层次化的数据组织结构。
  • 嵌入向量(Embeddings): 嵌入向量是文本、图像或其他数据的向量表示,用于捕捉其语义或特征。Chroma允许用户将这些嵌入向量与相应的文档和元数据一起存储。

  • 文档(Documents): 文档是与嵌入向量相关联的原始数据,例如文本、图像或其他内容。文档可以与嵌入向量一起存储,以便在查询时提供上下文。

  • ID: 每个嵌入向量、文档和元数据都与一个唯一的ID相关联,用于标识和检索特定的条目。

  • 元数据(Metadata): 元数据是与嵌入向量和文档相关的额外信息,例如作者、日期、类别等。元数据可以用于过滤和查询数据。

  • 嵌入函数(Embedding Functions): Chroma支持使用嵌入函数来自动生成嵌入向量。用户可以指定嵌入函数,以便在添加文档时自动生成嵌入向量。

这些核心概念共同构成了Chroma的功能和特性,使其成为一个高效的嵌入向量存储与查询工具。

1.3 Chroma 的工作原理

Chroma的核心功能基于高效的向量索引和搜索技术。它使用诸如HNSW(Hierarchical Navigable Small World)等先进的索引结构来存储高维向量数据,并支持多种距离度量(如欧几里得距离、余弦相似度)来计算向量之间的相似性。开发者可以将文本、图像或其他数据转换为嵌入向量,存储在Chroma中,并通过相似性搜索快速检索相关内容。这种设计特别适合语义搜索、推荐系统等需要理解数据深层含义的场景。

1.4 Chroma Embeddings算法简介

Chroma Embeddings算法是一种用于生成文本嵌入向量(text embeddings)的方法,主要在ChromaDB中应用。ChromaDB是一个专门设计用于存储和查询嵌入向量的数据库,支持多种嵌入模型,其中就包括Chroma Embeddings算法。

这种算法的核心目标是将文本转化为高维向量表示,从而捕捉文本的语义信息,并支持诸如相似性搜索、文本分类和聚类等自然语言处理任务。

算法原理

Chroma Embeddings算法通常基于Transformer模型,尤其是类似于BERT(Bidirectional Encoder Representations from Transformers)或其变体的预训练语言模型。BERT通过在大量文本数据上进行无监督学习,能够理解文本的上下文和深层语义。Chroma Embeddings算法利用这一特性,将输入文本转化为固定长度的嵌入向量。这些向量保留了文本的语义信息,使得相似的文本在向量空间中距离较近,而语义不同的文本则距离较远。

其工作流程大致如下:

  1. 文本输入:接收用户提供的文本数据。
  2. 嵌入生成:通过预训练的Transformer模型,将文本转换为嵌入向量。
  3. 存储与查询:在ChromaDB中存储这些向量,并支持基于向量的查询操作。

应用

  • 生成嵌入向量:将文本数据转化为向量表示。
  • 存储嵌入:将生成的向量高效存储在数据库中。
  • 相似性搜索:通过比较向量之间的距离,找到与查询文本最相似的已有文本。

例如,用户可以输入一段查询文本,Chroma Embeddings算法会将其转化为嵌入向量,然后ChromaDB会返回数据库中最相似的文本结果。这种功能在信息检索、推荐系统等领域尤为实用。

优势

Chroma Embeddings算法具有以下优点:

  • 语义捕捉能力强:基于Transformer模型,能够理解文本的深层含义,而不仅仅是表面词汇。
  • 灵活性:ChromaDB支持多种嵌入模型,用户可以根据任务需求选择合适的模型。
  • 高效性:生成的嵌入向量支持快速查询和相似性计算,适用于大规模数据场景。

实现细节

尽管具体实现可能因ChromaDB的版本和配置而有所不同,但Chroma Embeddings算法通常依赖于:

  • 预训练模型:如BERT或其变体,这些模型已在大型语料库上训练完成。
  • 微调(可选):根据特定任务对模型进行调整,以提升性能。

用户在使用时无需深入了解模型内部细节,只需通过ChromaDB的接口调用算法即可生成和查询嵌入向量。

Chroma Embeddings算法是一种基于Transformer模型的文本嵌入生成方法,广泛应用于ChromaDB中。它通过将文本转化为嵌入向量,捕捉深层语义信息,支持高效的存储和查询操作。这种算法在相似性搜索、文本分类等任务中表现出色,是自然语言处理领域的重要工具。


二、配置 Chroma 开发环境

目前在.NET中,想要完整的使用,还是比较困难的,最大的困难在于生成嵌入向量,虽然现在有很多的SDK,但这些这是对Chroma API的封装而已,还远没有达到可以实际应用的地步。

不过,好消息是,.NET官方正在Semantic Kernel中加入对Chroma的完整支持,目前尚不成熟,在这里,我简单的演示一下,大家也不用太深入的看代码,因为现在的代码都处于开发中,很多接口都会变化,而且已经实现的代码也有很多问题,我花了一下午的时间,才把这些问题清除掉,并运行起来。

2.1 安装 Chroma 服务

Chroma的客户端需要连接到一个运行中的Chroma服务器。开发者可以通过以下方式启动 Chroma服务:

  • 使用 Docker: 在本地运行以下命令以启动Chroma服务:
docker run -v ./chroma-data:/data -p 8000:8000 ghcr.io/chroma-core/chroma:0.6.4.dev379
  • 使用 Python: 如果你更倾向于直接运行Chroma,可以通过Python安装并启动:
pip install chromadb
chromadb run --host localhost --port 8000

完成上述步骤后,Chroma服务将在本地运行,.NET客户端即可通过配置的URI进行连接。

Chroma 接口文档查看

接口地址:http://localhost:8000/docs

2.2 安装Ollama并配置相关模型

  • 安装all-minilm用于对话功能
  • 安装mxbai-embed-large用于生成嵌入向量

三、在.NET 中操作 Chroma

为了帮助开发者更好地理解Chroma.NET中的使用方式,以下提供几个实用的代码示例,展示如何创建集合、添加文档、执行查询。

以下代码是使用官方代码库演示,而由于官方代码库尚未稳定,所以只是让大家先看看效果,但是暂时不需要对代码实现有太多的关注,建议把精力多放在 Chroma 的相关知识的学习中,静等微软发布正式版代码库。

3.1 连接与创建集合

参考代码: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 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 对象并添加文档信息

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)自动生成向量。

3.3 执行向量查询

IAsyncEnumerable<MemoryQueryResult> answers = textMemory.SearchAsync(
    collection: MemoryCollectionName,
    query: "What's yous name?",
    limit: 2,
    minRelevanceScore: 0.4,
    withEmbeddings: true);

3.4 总的运行结果


四、Chroma 的实际应用场景

Chroma的强大功能使其在.NET应用中有着广泛的适用性。以下是几个典型的应用场景:

4.1 语义搜索

在企业文档管理系统中,传统的关键字搜索往往无法捕捉用户意图的深层含义。通过将文档转换为嵌入并存储在Chroma中,开发者可以实现语义搜索。例如,用户输入“如何提高团队效率”,系统能够返回与团队协作、时间管理相关的文档,而不仅仅是包含关键字的文档。

4.2 推荐系统

在电子商务平台中,可以使用Chroma存储商品和用户的向量表示。例如,将商品描述和用户浏览历史转换为嵌入,存储在Chroma中,通过相似性搜索为用户推荐相关商品。这种方法比传统基于规则的推荐系统更灵活、更智能。

4.3 多模态检索

在多媒体应用中,Chroma的多模态检索功能尤为强大。例如,可以将图像和文本描述的嵌入存储在同一个集合中,用户上传一张图片后,系统能够返回与之内容相似的图像和相关描述。

4.4 问答系统

在客户支持应用中,可以使用Chroma存储常见问题及其答案的向量表示。用户输入问题后,系统通过向量搜索返回最匹配的答案,提升响应速度和准确性。


五、Chroma 与.NET生态系统的集成

Chroma不仅可以通过C#客户端直接使用,还能与.NET生态系统中的其他组件深度集成,进一步提升开发效率:

  • Semantic Kernel:这是Microsoft推出的一款AI开发框架,支持与Chroma集成。开发者可以通过Semantic KernelChroma作为向量存储,用于实现复杂的AI工作流。
  • Microsoft.SemanticKernel.Connectors.Chroma:通过此扩展,Chroma可以与.NET的依赖注入机制无缝协作,提供标准化的向量数据访问接口,简化应用程序架构。
  • Microsoft.Extensions.VectorData:库的主要作用是为 .NET 应用程序提供与向量存储交互的统一抽象层。向量存储用于存储和管理高维嵌入向量,广泛应用于语义搜索和生成式 AI 等场景。

这些集成使得Chroma能够融入现有的.NET项目,与其他工具协同工作,加速智能应用的开发。

目前这些工作正在进行中,请大家静等.NET正式版的发布。


六、性能优化技巧

为了在.NET应用中充分发挥Chroma的性能,开发者可以采用以下优化策略:

  • 索引调优:调整 HNSW 索引的参数,例如efConstruction(构建时的搜索深度)和 M(邻居数量),在搜索速度和精度之间找到平衡。
  • 数据分片:对于超大规模数据集,可以将数据分散到多个集合或实例中,通过并行查询提高吞吐量。
  • 缓存策略:对于频繁查询的热点数据,可以在.NET应用层添加缓存,减少对Chroma的直接访问。

七、Chroma 的未来发展展望

随着AI技术的不断进步,向量数据库在软件开发中的重要性日益凸显。作为一款开源项目,Chroma在未来有很大的发展潜力,尤其是在.NET生态系统中:

  • 功能扩展:支持更多类型的索引和距离度量,满足不同场景的需求。
  • 性能提升:优化底层算法,进一步提高大规模数据集的处理能力。
  • 云服务支持:推出官方托管版本,降低部署和维护的门槛,为.NET开发者提供更便捷的接入方式。
  • 与.NET深度融合:提供更多针对.NET平台的专用工具和文档,提升开发效率。

八、总结

Chroma作为一个开源、易用且功能强大的向量数据库,为.NET开发者提供了一款构建智能应用的利器。通过简单的安装步骤和直观的API,开发者可以将Chroma集成到.NET项目中,实现高效的向量数据管理。无论是语义搜索、推荐系统还是多模态检索,Chroma都能为应用注入智能化能力。随着技术的不断演进,Chroma.NET生态系统中的应用前景将更加广阔,为开发者开启更多创新可能。

.NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库的更多相关文章

  1. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

  2. Jenkins持续集成企业实战系列之Jenkins手动构建-----04

    注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.    最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...

  3. ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程

    前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...

  4. memcached实战系列(三)memcached命令使用

    memcached命令的使用,在这里我们最好了解一下命令的含义,对命令有一个大致的了解,在了解的基础上进行使用.这里的命名是常用的crud命令的演示. 1.1.1. memcached命令的格式 标准 ...

  5. MP实战系列(三)之实体类讲解

    首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomido ...

  6. shiro实战系列(三)之架构

    Apache Shiro 的设计目标是通过直观和易于使用来简化应用程序安全.Shiro 的核心设计体现了大多数人们是如何考虑应用程序安全的——在某些人(或某些事)与应用程序交互的背景下.   应用软件 ...

  7. Drools实战系列(三)之eclipse创建工程

    web工程和maven工程是目前比较常用的,当然对现在而言,maven工程是开发中最常用的. 两种Drools项目的创建方式,一种是直接创建Drools项目,另一种是基于Maven创建Drools项目 ...

  8. 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

    在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...

  9. HTML5系列三(多媒体播放、本地存储、本地数据库、离线应用)

    各浏览器对编码格式的支持情况 audio和video元素的属性介绍 1.src:媒体数据的URL地址 <video src="pr6.mp4"></video&g ...

  10. Maven实战(三)Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

随机推荐

  1. oracle配置SGA参数不当导致不能正确启动数据库实例处理

    原因:生成环境数据库想要增加数据库内存配置参数SGA_TARGET增加到42G,但是没有配置SGA_MAX_SIZE参数值,导致SHUTDOWN IMMEDIATE停止数据库,再STARTUP启动数据 ...

  2. 载誉而归!天翼云荣获第23届中国IT用户满意度大会多项殊荣

    10月25日,2024第23届中国IT用户满意度大会暨首届工业产品满意度交流会在北京举行.现场揭晓"2024中国IT用户满意度征集结果",天翼云凭借领先的产品技术.完善的客户服务以 ...

  3. have my hair cut

    标题致敬传奇抗压王裤子. 今天去剪了头发.体验很好,老师帅. 但是还是一直很不安 我们 i 人剪了头发是这样的 剪头发不是换发型 但大概率得换 而且很快会剪短 乌龟的壳换了形状 或是变薄 肯定不安 一 ...

  4. Q:浏览器不能上网,但是可以ping通外网ip,dns配置也没问题(TCP/IP 无法建立传出连接)

    问题症状 每隔一段时间,浏览器不能访问外网,重启电脑又正常,重置网卡无效 可以ping通外网ip地址,可以ping通外网域名 ping不通外网端口端口 查看日志 每次出现不能上网情况时都会有至少两条T ...

  5. Deepseek学习随笔(11)--- 普通人如何抓住DeepSeek红利(附网盘链接)

    一.文档简介 这个文档是清华大学新闻与传播学院新媒体研究中心发布的<普通人如何抓住DeepSeek红利>,该文件详细介绍了DeepSeek的功能.应用场景.使用技巧以及如何通过提示词驱动提 ...

  6. 项目愿景 (Product Vision)、产品目标 (Product Goal) 、Sprint目标 (Sprint Goal) 及 示例

    愿景(Vision) 是制定业务目标(Business Goal)的基础,后者为确定正确的产品目标 (Product Goal) 创造了环境.同样,每个产品目标作为识别有用的冲刺目标的基础.换句话说, ...

  7. 无界 | Bncr | Boundless Nodejs Chat Robot 机器人框架安装使用教程

    背景:Bncr 是一个开箱即用的Nodejs Chat RoBot(会话式机器人)框架.它基于OOP函数响应式编程,具有占用小.响应快.开发易等特点,允许开发者创建高度可测试.可扩展.松散耦合且易于维 ...

  8. Oracle - [03] 存储过程

    一.什么是存储过程 存储过程是一种数据库对象,是一种存储在数据库中的可执行程序,是一些经过编写.编译而存在数据库中的SQL语句集. 二.创建存储过程的语法 create or replace proc ...

  9. Scala查看源码

    package com.wyh.day01 /** * 1.代码格式化的快捷键 ctrl+alt+L\ * 2.scala查看源代码的快捷键 ctrl+b */ object ScalaLookSou ...

  10. JUC相关知识点总结

    Java JUC(java.util.concurrent)是Java并发编程的核心工具包,提供了丰富的并发工具类和框架.以下是JUC的主要知识点,按难易程度分类,供你参考: 1. 基础概念与工具类 ...