技术速递|Microsoft.Extensions.VectorData 预览版简介

作者:Luis Quintanilla - 项目经理

排版:Alan Wang

我们很高兴推出 Microsoft.Extensions.VectorData.Abstractions 库,该库现已提供预览版。

正如 Microsoft.Extensions.AI 库为使用 AI 服务提供了一个统一层一样,此包为 .NET 生态系统提供了抽象,有助于将矢量存储集成到 .NET 应用程序和库中。

为什么选择矢量存储?

矢量数据库对于搜索和生成 AI 响应等任务非常重要。

与关系数据库和文档数据库针对结构化和半结构化数据进行优化的方式类似,矢量数据库的构建旨在高效存储、索引和管理以嵌入矢量表示的数据。因此,矢量数据库使用的索引算法经过优化,可高效检索在应用程序下游使用的数据。

什么是 Microsoft.Extensions.VectorData?

Microsoft.Extensions.VectorData 是一组由 Semantic Kernel 和更广泛的 .NET 生态系统一起合作开发的核心 .NET 库。这些库提供了一个统一的 C# 抽象层,用于与矢量存储交互。

Microsoft.Extensions.VectorData 中的抽象为库作者和开发人员提供了以下功能:

  • 能够对矢量存储执行创建-读取-更新-删除 (CRUD) 操作

  • 能够在矢量存储上使用矢量和文本搜索。

如何开始?

开始使用 Microsoft.Extensions.VectorData 抽象的最简单方法是使用任何一种语义内核矢量存储连接器。

在此示例中,我将使用内存矢量存储的实现。

为了完善此示例并使其更具真实感,我们还将使用 Microsoft.Extensions.AI 中的 Ollama 参考实现。不过,任何其他支持嵌入生成的实现也同样有效。

创建应用程序并添加 NuGet 包

  1. 创建 一个 C# 控制台应用程序。
  2. 安装以下 NuGet 包
  • Microsoft.SemanticKernel.Connectors.InMemory

  • Microsoft.Extensions.VectorData.Abstractions

  • Microsoft.Extensions.AI.Ollama

  1. 将以下 using 语句添加到您的应用程序。
using System.Collections.ObjectModel;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.InMemory;

存储数据

此示例使用的场景是对电影集合执行语义搜索。

存储数据

首先定义一个类来表示您的电影数据。

public class Movie
{[VectorStoreRecordKey]public int Key {get;set;}[VectorStoreRecordData] public string Title {get;set;}[VectorStoreRecordData]public string Description {get;set;}[VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)]public ReadOnlyMemory<float> Vector {get;set;}
}

通过使用 VectoStoreRecordKey、VectorStoreRecordVector 和 VectorStoreRecordData 等属性,您可以对数据模型进行注释,以便矢量存储实现更轻松地将 POCO 对象映射到其底层数据模型。有关每个属性所支持选项的更多信息,请参阅语义内核矢量存储数据模型学习页面。

创建矢量存储和电影集合

现在您已经定义了数据模型,请创建一个带有集合的矢量存储来存储电影数据。

var movieData = new List<Movie>()
{new Movie{Key=0, Title="Lion King", Description="The Lion King is a classic Disney animated film that tells the story of a young lion named Simba who embarks on a journey to reclaim his throne as the king of the Pride Lands after the tragic death of his father."},new Movie{Key=1,Title="Inception", Description="Inception is a science fiction film directed by Christopher Nolan that follows a group of thieves who enter the dreams of their targets to steal information."},new Movie{Key=2,Title="The Matrix", Description="The Matrix is a science fiction film directed by the Wachowskis that follows a computer hacker named Neo who discovers that the world he lives in is a simulated reality created by machines."},new Movie{Key=3,Title="Shrek", Description="Shrek is an animated film that tells the story of an ogre named Shrek who embarks on a quest to rescue Princess Fiona from a dragon and bring her back to the kingdom of Duloc."}
};
var vectorStore = new InMemoryVectorStore();
var movies = vectorStore.GetCollection<int, Movie>("movies");
await movies.CreateCollectionIfNotExistsAsync();
创建嵌入生成器

若要生成嵌入,请使用 Ollama 提供的托管模型之一。在此示例中,使用的模型是 all-minilm,但任何模型都可以使用。

  1. 安装 Ollama。

  2. 下载 all-minilm 模型。

  3. 在您的应用程序中配置 OllamaEmbeddingGenerator:

生成嵌入

现在您有了一个嵌入生成器,请使用它为您的电影数据生成嵌入并将它们存储在矢量存储中。

foreach(var movie in movieData)
{movie.Vector = await generator.GenerateEmbeddingVectorAsync(movie.Description);await movies.UpsertAsync(movie);
}

查询数据

现在您的数据存储中已经有了数据,您可以查询它了。

生成查询嵌入

为查询“一部适合家庭观看的电影”生成一个嵌入。

var query = "A family friendly movie";
var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query);
查询数据存储

现在您已经有了查询的嵌入内容,您可以使用它在数据存储中搜索相关结果。

var searchOptions = new VectorSearchOptions()
{Top = 1,VectorPropertyName = "Vector"
};
var results = await movies.VectorizedSearchAsync(queryEmbedding, searchOptions);
await foreach(var result in results.Results)
{Console.WriteLine($"Title: {result.Record.Title}");Console.WriteLine($"Description: {result.Record.Description}");Console.WriteLine($"Score: {result.Score}");Console.WriteLine();
}

结果应如下所示:
在这里插入图片描述

继续学习

有关使用抽象的详细文档,请参阅语义内核矢量存储学习网站。

从以下示例中了解更多信息:

  • RAG 示例

  • Microsoft.Extensions.VectorData 核心概念

Microsoft.Extensions.VectorData 的下一步计划是什么?

与 Microsoft.Extensions.AI 类似,我们计划:

  • 继续与 Semantic Kernel 合作,在抽象和 Microsoft.Extensions.VectorData 的基础上进行构建,从而在 RAG 场景中带来更简化的体验。查看 Semantic Kernel 博客以了解更多信息。

  • 与生态系统中的矢量存储合作伙伴合作,为整个 .NET 生态系统提供客户端 SDK、库作者和开发人员,以采用 Microsoft.Extensions.VectorData。

我们很高兴您开始使用 Microsoft.Extensions.VectorData 进行构建。

请试用并向我们提供反馈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/20412.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第5章-总体设计 5.3 硬件架构设计

5.3 硬件架构设计 1.哪些类型的产品需要架构设计&#xff1f;2.硬件架构师到底做什么&#xff1f;&#xff08;1&#xff09;理解需求和业务模型的情况。&#xff08;2&#xff09;背板设计&#xff0c;既需要考虑业务数据交换能力&#xff0c;也需要考虑子模块的管理监控能力。…

图像/文字差异类型验证码识别 无需训练

某像差异在个别全家桶验证方便有使用&#xff0c;对于这种验证码类型如下&#xff1a; 首先还是目标检测&#xff0c;直接用 dddd 自带的detection 就足够了。 特征提取 其次经过观察&#xff0c;差异答案与其他三个无非就是颜色&#xff0c;字体&#xff0c;方向&#xff0c…

新华三H3CNE网络工程师认证—生成树协议

新华三H3CNE网络工程师认证本节讲解生成树协议&#xff0c;关于生成树协议&#xff0c;提到生成树协议&#xff0c;这个时候不得不提到另外一个概念叫二层环路。二层环路导致的原因是交换机的转发机制导致的&#xff0c;本博客将分析这个机制导致这个问题的原因。 文章目录 一…

使用ai工具探究论文的工作流(阅读一个EEG的cnn-lstm文献(2021))

文章目录 李沐老师的方法论第一遍&#xff1a;做海选第二遍&#xff1a;对相关论文进行精选第三遍&#xff1a;重点研读 AI是怎么分析一个文章的标题&#xff08;Title&#xff09;和关键词摘要&#xff08;Abstract&#xff09;分析引言&#xff08;Introduction&#xff09;梳…

Scala的Array习题

答案&#xff1a;CBBBB import scala.collection.mutable.ArrayBuffer //1 case class DreamItem(content:String,var isDone:Boolean,deadline:String,var order:Int) object p5 {def main(args: Array[String]): Unit {//2val dreamListArrayBuffer[DreamItem]()//梦想清单/…

深度学习的实践层面

深度学习的实践层面 设计机器学习应用 在训练神经网络时&#xff0c;超参数选择是一个高度迭代的过程。我们通常从一个初步的模型框架开始&#xff0c;进行编码、运行和测试&#xff0c;通过不断调整优化模型。 数据集一般划分为三部分&#xff1a;训练集、验证集和测试集。常…

TPU-MLIR 总览

TPU-MLIR 总览 &#x1f4a1;深度学习编译器可以实现一次性代码开发和重用各种计算能力处理器的目标 ## 项目简介&#xff1a; TPU-MLIR 是 AI 芯片的 TPU 编译器工程。该工程提供了一套完整的工具链, 其可以将不同框架下预训练的神经网络, 转化为可以在算能 TPU 上高效运算的…

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项&#xff08;启用 strict 后自动包含这些&#xff09;模块与导入相关选项 2. include 和 excludeinclude…

苹果MacOS 调用自编译opencv的Dylib显示一个图片程序的步骤

前言 为了测试自编译的opencv库是否能在苹果MacOS系统下使用&#xff0c;需要写一个简单的测试程序。这个测试程序写起来不难&#xff0c;麻烦的是一些配置。网上的办法很多&#xff0c;里面因为版本的问题有一些坑。特此写了一个建立步骤&#xff0c;供大家参考。 1、新建一个…

AI赋能:高职院校实验实训教学如何拥抱人工智能浪潮?

随着信息技术的迅猛发展&#xff0c;人工智能技术已成为推动社会各行业转型升级的核心力量。它不仅在提升生产效率、优化管理流程、提高服务质量方面发挥着关键作用&#xff0c;也深刻影响着高职教育的专业发展和课程教学内容的改革。作为培养专业技术技能人才的摇篮&#xff0…

消费者行为学领域的顶级期刊

一、期刊 1.Journal of Consumer Research 2.Journal of Consumer Psychology 3.Journal of Research in Interactive Marketing 4.Journal of the Academy of Marketing Science 5.Tourism Management 下面是我整理的一个excel&#xff0c;大家按需丝我获取。 二、期刊&z…

STM32单片机CAN总线汽车线路通断检测-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

3.tree of thought 源码 (Thought 和ToTDFSMemory 类)

本教程将介绍 tree of thought 源码 中的Thought 和ToTDFSMemory 类 定义思维有效性 使用Enum模块来定义思维的有效性。 from enum import Enumclass ThoughtValidity(Enum):"""Enum for the validity of a thought."""VALID_INTERMEDIATE 0…

从ES的JVM配置起步思考JVM常见参数优化

目录 一、真实查看参数 &#xff08;一&#xff09;-XX:PrintCommandLineFlags &#xff08;二&#xff09;-XX:PrintFlagsFinal 二、堆空间的配置 &#xff08;一&#xff09;默认配置 &#xff08;二&#xff09;配置Elasticsearch堆内存时&#xff0c;将初始大小设置为…

【C++】list使用详解

本篇介绍一下list链表的使用&#xff0c;后续也是会对list进行模拟实现的。list是链表里面的双向链表。 1.文档介绍 list - C Referencehttps://legacy.cplusplus.com/reference/list/list/ list中的接口比较多&#xff0c;此处类似&#xff0c;只需要掌握如何正确的使用&am…

分布式事务

参考 Seata 详解Mysql分布式事务XA CAP 这个定理的内容是指&#xff1a;在一个分布式系统中、Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性)&#xff0c;三者不可得兼。 一致性&#xff08;C&#xff09; 在分布式系统中的所有数据备份&…

记录elasticsearch-analysis-dynamic-synonym从8.15.0升级到8.16.0所遇到的问题

记录elasticsearch-analysis-dynamic-synonym从8.15.0升级到8.16.0所遇到的问题 一、打包步骤 步骤一、linux系统下执行elasticsearch-module中的build.sh脚本 步骤二、maven环境下elasticsearch-cluster-runner执行maven install命令安装到本地maven仓库。 步骤三、修改版…

【大模型推理加速】KV cache

目录 1. kv cache 原理1.1 Flops 计算公式推导 2. 缺点3. kv cache 优化3.1 L: Layer-Condensed KV Cache , 粒度大&#xff0c;效率高3.1.1 MiniCache3.1.2 PyramidInfer3.1.3 CLA 3.2 H: Retrieval Head,3.2.1 Razor Attention, DuoAttention3.2.2 GQA多个head共享一份KV 3.3…

esp32c3开发板通过micropython的ubluetooth库连蓝牙设备

ESP32-C3开发板是一款高性能、低功耗的微控制器&#xff0c;搭载了Espressif自家的RISC-V处理器。通过MicroPython&#xff0c;一种面向微控制器的精简版Python编程语言&#xff0c;开发者可以轻松地为ESP32-C3编写代码。MicroPython的ubluetooth库使得ESP32-C3能够通过蓝牙与各…