.NET Conf上的介绍

在今年的.NET Conf上Steve Sanderson带来了题为“AI Building Blocks - A new, unified AI layer”的演讲。该演讲的主要内容如下:

“大多数.NET应用程序可以通过AI功能变得更加强大和高效,例如语义搜索、自动分类、摘要生成、翻译、数据提取,甚至是基于聊天的助手。但直到现在,.NET本身还没有统一的AI概念表示标准,因此开发者需要组合使用许多不相关的API。Microsoft.Extensions.AI解决了这个问题,提供了一组新的AI服务标准API,包括在本地工作站上运行或作为托管服务的大型语言模型(LLMs),并集成了文本嵌入、向量存储等功能。在本次演讲中,我们将展示这些新的标准抽象如何让你组合多个服务,并且这些服务可以随着时间的推移轻松替换和更改,以及如何在更高级的场景中接入内部机制。通过本次演讲,你将能够开始在自己的应用程序中实验新的AI功能。”

youtube地址:https://www.youtube.com/watch?v=qcp6ufe_XYo&list=PLdo4fOcmZ0oXeSG8BgCVru3zQtw_K4ANY&index=3

Steve Sanderson介绍了以下几种应用场景:

Microsoft.Extensions.AI介绍

2024年10月8日,Luis Quintanilla在.NET Blog上发布了题为“Introducing Microsoft.Extensions.AI Preview – Unified AI Building Blocks for .NET”的文章介绍了Microsoft.Extensions.AI Preview。

文章地址:https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-ai-preview/

“Microsoft.Extensions.AI 是一组由 .NET 生态系统中的开发者(包括 Semantic Kernel 团队)共同开发的核心 .NET 库。这些库提供了一层统一的 C# 抽象层,用于与 AI 服务进行交互,例如小型和大型语言模型(SLM 和 LLM)、嵌入内容以及中间件。”

“目前,我们的重点是创建抽象概念,这些抽象概念可以由各种服务实现,并且都遵循相同的核心理念。我们不打算发布针对任何特定服务提供商的API。我们的目标是在.NET生态系统中充当一个统一的层,使开发者能够选择他们喜欢的框架和库,同时确保在整个生态系统中的无缝集成和协作。”

Microsoft.Extensions.AI的优势

Microsoft.Extensions.AI 提供了一个统一的 API 抽象,用于 AI 服务,类似于我们在日志记录和依赖注入(DI)抽象方面的成功。我们的目标是提供标准的实现,用于缓存、遥测、工具调用和其他常见任务,这些实现可以与任何提供商兼容。

核心优势有以下几点:

统一API:为将AI服务集成到.NET应用程序提供了一致的API和约定。

灵活性:允许.NET库作者使用AI服务而无需绑定特定提供商,使其适应任何提供商。

易用性:使.NET开发人员能够使用相同的底层抽象尝试不同的包,在整个应用程序中保持单一API。

组件化:简化了添加新功能的过程,并促进了应用程序的组件化和测试。

Microsoft.Extensions.AI简单实践

使用Microsoft.Extensions.AI可以看Nuget包的介绍。

地址:https://www.nuget.org/packages/Microsoft.Extensions.AI.Abstractions/9.0.0-preview.9.24556.5

先简单的以OpenAI为例,然后考虑到在国内使用OpenAI不便,再介绍一下如何接入兼容OpenAI格式的大语言模型提供商。

简单的对话:

string OPENAI_API_KEY = "sk-sssss...";

IChatClient client =
new OpenAIClient(OPENAI_API_KEY)
.AsChatClient(modelId: "gpt-4o-mini"); var response = await client.CompleteAsync("你是谁?"); Console.WriteLine(response.Message);

效果:

我比较关心的是Function Calling的功能,来简单尝试一下:

string OPENAI_API_KEY = "sk-sssss...";

[Description("Get the current time")]
string GetCurrentTime() => DateTime.Now.ToString(); IChatClient client = new ChatClientBuilder()
.UseFunctionInvocation()
.Use(new OpenAIClient(OPENAI_API_KEY).AsChatClient(modelId: "gpt-4o-mini")); var response = client.CompleteStreamingAsync(
"现在几点了?",
new() { Tools = [AIFunctionFactory.Create(GetCurrentTime)] }); await foreach (var update in response)
{
Console.Write(update);
}

效果:

成功获取到了当前的时间。

由于在国内使用OpenAI不方便,而且国内也有很多大模型提供商都是兼容OpenAI格式的,因此现在以国内的模型提供商为例,进行说明。

我以硅基流动为例,上面还有一些额度。

简单对话:

 OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri("https://api.siliconflow.cn/v1"); // SiliconCloud API Key
string mySiliconCloudAPIKey = "sk-lll..."; OpenAIClient client = new OpenAIClient(new ApiKeyCredential(mySiliconCloudAPIKey), openAIClientOptions);
IChatClient chatClient = client.AsChatClient("Qwen/Qwen2.5-72B-Instruct-128K");
var response = await chatClient.CompleteAsync("你是谁?");
Console.WriteLine(response.Message);

效果:

函数调用:

 OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();
openAIClientOptions.Endpoint = new Uri("https://api.siliconflow.cn/v1"); // SiliconCloud API Key
string mySiliconCloudAPIKey = "sk-lll..."; [Description("Get the current time")]
string GetCurrentTime() => DateTime.Now.ToString(); IChatClient client = new ChatClientBuilder()
.UseFunctionInvocation()
.Use(new OpenAIClient(new ApiKeyCredential(mySiliconCloudAPIKey), openAIClientOptions).AsChatClient("Qwen/Qwen2.5-72B-Instruct-128K")); var response = await client.CompleteAsync(
"现在几点了?",
new() { Tools = [AIFunctionFactory.Create(GetCurrentTime)] }); Console.Write(response);

也成功进行函数调用,获取到了当前的时间。

会发现其实和SemanticKernel很像,Steve Sanderson也坦言这些是从SemanticKernel“毕业”的东西,更多用例可由读者自行探索。

Microsoft.Extensions.AI 初探的更多相关文章

  1. Microsoft.Extensions.Options支持什么样的配置类?

    在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统, ...

  2. asp.net core 2.0 Microsoft.Extensions.Logging 文本文件日志扩展

    asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在 ...

  3. DotNetCore跨平台~一起聊聊Microsoft.Extensions.DependencyInjection

    写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac, ...

  4. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  5. Microsoft.Extensions.DependencyInjection不同版本导致EF出现内存泄露。

    我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在A ...

  6. 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0

    解决方法:工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions ...

  7. 微软日志工厂 Microsoft.Extensions.Logging 中增加 log4net 的日志输出

    前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Micros ...

  8. 解析 Microsoft.Extensions.DependencyInjection 2.x 版本实现

    项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论 ...

  9. 使用诊断工具观察 Microsoft.Extensions.DependencyInjection 2.x 版本的内存占用

    目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次 ...

  10. Microsoft.Extensions.DependencyInjection 之三:展开测试

    目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine Dynamic ...

随机推荐

  1. HEOI游记

    \(NOI2024河北省选-HEOI游记\) ·评价 其实作为体验名额,最大的感觉就是自费旅游了一趟. 为什么说是自费呢?下面清点一下账单: 1.两晚酒店 1200 2.KFC 和 拉面 112 3. ...

  2. Docker容器常用操作命令(镜像的上传、下载、导入、导出、创建、删除、修改、启动等)详解

    1.docker镜像下载 docker pull [options] name [:tag@digest] name后边可以跟镜像标签或者镜像摘要(其实就是镜像的版本),如果不加任何东西,则会默认是在 ...

  3. Android Studio 项目已经sync完成,但是在布局中显示:Design editor is unavaliable until after a sunncessful project sync

    原因:在drawable文件夹中新增了一个png图标 解决:同步在drawable-v24文件中复制一份即可

  4. 使用.NET源生成器(SG)生成项目的版本号信息

    之前写过一篇 源生成器生成自动注入的代码 主要是通过SyntaxProvider查找标注特性实现 其实除了SyntaxProvider之外还有几个很重要的Provider,比如:MetadataRef ...

  5. 【YashanDB知识库】主备延迟故障分析方法

    [标题]主备延迟故障分析方法 [问题分类]故障分析 [关键字]Yashandb.主备延迟 [问题描述]当数据库备机出现回放延迟时,需要通过一些手段分析延迟的原因.通过数据库的系统视图或操作系统监控数据 ...

  6. 【YashanDB知识库】绑定参数,同一个sql多个执行计划的问题

    问题现象 同一个sql有两个执行计划,是否合理? 它的EXECUTIONS,ELAPSED_TIME等统计信息怎么看,是独立分开的还是统一计算的? 如下图: 问题影响版本 tpcc测试:23.2.1. ...

  7. 【转】一种Vue应用程序错误/异常处理机制

    在前端应用程序中,最常见的错误/异常类型可能包括以下几种: 语法错误:使用了一些错误的语法 运行时错误:由于执行期间的非法操作导致的 逻辑错误:由于程序逻辑错误 Http 错误:API 返回的错误 有 ...

  8. Transformer应用于时序任务:综述《Transformers in Time Series: A Survey》

    2022年9月13日 21:28 摸鱼了一天,看看综述. 论文:Transformers in Time Series: A Survey GitHub: 阿里达摩院 2022的论文. 摘要 从两个角 ...

  9. Axios——异步框架

    Axios--异步框架(简化AJAX代码书写)    Axios 请求方式别名   

  10. Nuxt Kit中的 Nitro 处理程序

    title: Nuxt Kit中的 Nitro 处理程序 date: 2024/9/21 updated: 2024/9/21 author: cmdragon excerpt: 摘要:本文详细介绍了 ...