Microsoft.Extensions.AI 初探

news/2024/12/25 2:07:18/文章来源:https://www.cnblogs.com/mingupupu/p/18556342

.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介绍了以下几种应用场景:

image-20241120094958717

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)、嵌入内容以及中间件。”

img

“目前,我们的重点是创建抽象概念,这些抽象概念可以由各种服务实现,并且都遵循相同的核心理念。我们不打算发布针对任何特定服务提供商的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);

效果:

image-20241120101114704

我比较关心的是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);}

效果:

image-20241120101404123

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

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

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

简单对话:

 OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();openAIClientOptions.Endpoint = new Uri("https://api.siliconflow.cn/v1");// SiliconCloud API Keystring 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);

效果:

image-20241120101803488

函数调用:

 OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();openAIClientOptions.Endpoint = new Uri("https://api.siliconflow.cn/v1");// SiliconCloud API Keystring 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);

image-20241120102258535

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何确定合适的绩效考核周期和频率?

绩效考核周期的确定需要根据企业的实际情况、不同岗位的特殊性、考核指标的性质及考核标准的不同进行综合考虑。 1、一般来说,管理层级越高的岗位,其考核周期也应该设置得相对较长 2、绩效考核周期过短会增加企业的管理成本;过长又会降低绩效考核数据的准确性比如,销售人员…

什么是OA办公系统?为什么OA办公系统对于企业的作用越来越重要?

如何提升工作效率、优化资源配置、加强团队协作能力,成为了每个企业管理者亟需解决的关键问题。随着企业规模的扩展和业务流程的复杂化,传统的手工操作和纸质文件已经无法满足高效办公的需求。 OA(Office Automation)办公系统应运而生,成为了现代企业提高工作效率、优化管…

关于湖北移动机顶盒CM311-1S长虹版本刷机的总结

最近家里的机顶盒不好使了,就捣鼓了一下自己刷机, 机顶盒是湖北移动的CM311-1s,长虹代工的,晶晨的S905L3处理器,2+8G的配置,用着也还行 这个版本的刷机需要拆机顶盒,找内部的短接点,就是背面这个“4R12”的电阻, 刷机需要用到USB双A头线,接靠近后排插座的那个口,插…

从零搭建UVM验证平台 简介

搭建UVM流程:定义interface。Interface是连接DUT和验证平台的桥梁,根据DUT的输入输出参数定义interface,在top_tb里连接interface和DUT。加入transaction。transaction是一个数据包,transaction由sequence产生,通过sequencer传递给driver。加入driver。Driver负责将接收到…

智慧城市时空基础设施建设与应用实践

智慧城市作为现代城市发展的新趋势,其核心在于利用先进的信息技术,实现城市运行的高效、智能和绿色。时空基础设施作为智慧城市建设的基石,为城市的智慧化提供了基础支撑。本文将探讨智慧城市时空基础设施的建设与应用实践。1. 时空基础设施的重要性时空基础设施是智慧城市不…

echarts 使用移表盘实现类似类目轴效果,不使用数值刻度

思路:使用多个移表盘叠加 效果图:代码: setGaugeChart() {this.gaugeChart && this.gaugeChart?.dispose && this.gaugeChart?.dispose()this.gaugeChart = echarts.init(this.$refs.gaugeChartRef)const grades = [AAA, AA, A, BBB, BB, B, CCC, CC, C, …

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本新特性 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来,用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能,请访问网站,并点击聚焦时出现在地址栏的 Google Lens 搜索按钮,或者…

Qt 重写paintEvent事件划线

可以自定义一个类QtImageLabel继承于QLabel,重写paintEvent事件划线,写文字等。如果用 ui 设计,将 QLabel 控件提升为 QtImageLabel 类型即可。QtImageLabel.h protected:void paintEvent(QPaintEvent *) override;QtImageLabel.cpp #pragma execution_character_set("…

递归定义

GNU “GNU”是“GNUs Not Unix!”(GNU并非Unix!)的首字母递归缩写。 平衡二叉树 也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 前序遍历 (preorder tra…

【GreatSQL优化器-03】查询开销估算

【GreatSQL优化器-03】查询开销估算 一、cost和read_time介绍 GreatSQL的优化器在创建执行计划的时候是根据每张表的行数和数据分布以及读数据硬盘消耗等信息来判断先查询哪张表后查询哪张表,要不要使用索引,这些表资源信息就被称为cost,俗称为"开销"。在这之前已…

PyODPS获取MaxComputer数据仓中业务表的最新更新时间并输出至表中

PyODPS获取MaxComputer数据仓中业务表的最新更新时间并输出1.准备两张数据表: 1.1 需要统计的库表中间表:CREATE TABLE IF NOT EXISTS dim_river_system_business_time (`id` STRING COMMENT 序号,`dept_name` STRING COMMENT ,`system_name` STRING COMMENT 所属系统,…

powerdesigner同时显示列的name和code

参考来源:数据库设计工具-PowerDesigner中table视图显示name与code 1、Tools-->Display Preferences2、Table->Advanced3、Columns-->放大镜图标4、勾选【code】并调整顺序到datatype之前5、单击ok,成功