Microsoft.Extensions.AI 初探

.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 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);

效果:

image-20241120101803488

函数调用:

 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);

image-20241120102258535

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

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

<think>我们正在解决在Unity项目中EPPlus.dll的依赖缺失问题。用户要求了解如何在PowerShell或NuGet包管理器中安装一系列包(System.Drawing.Common, Microsoft.IO.RecyclableMemoryStream, Microsoft.Extensions.Configuration等)。同时,我们需要注意引用格式和生成相关问题。 步骤: 1. 安装环境:需要在Windows系统上,并且已经安装了.NET SDK(建议使用.NET 5或更高版本)或Visual Studio(带有NuGet包管理器)。 2. 打开PowerShell(可以是Windows PowerShell或PowerShell Core)或Visual Studio的NuGet包管理器控制台。 方法一:使用PowerShell命令行(推荐使用管理员权限) 步骤: a. 打开PowerShell(以管理员身份运行)。 b. 确保已安装NuGet提供程序(通常已安装,若没有,运行:Install-PackageProvider -Name NuGet -Force)。 c. 依次运行以下命令: ```powershell Install-Package System.Drawing.Common -SkipDependencies Install-Package Microsoft.IO.RecyclableMemoryStream -SkipDependencies Install-Package Microsoft.Extensions.Configuration -SkipDependencies Install-Package Microsoft.Extensions.Configuration.Json -SkipDependencies Install-Package Microsoft.Extensions.Configuration.FileExtensions -SkipDependencies Install-Package Microsoft.Extensions.Configuration.Abstractions -SkipDependencies ``` 注意: - 使用`-SkipDependencies`选项可以跳过依赖项安装,避免安装不必要的包。但这里我们明确指定了需要的包,所以也可以不使用该选项,因为即使不使用,NuGet也会自动解析依赖。 - 如果希望安装到特定项目,可以使用`-ProjectName`参数指定项目,例如:`-ProjectName MyProject`。 方法二:使用Visual Studio的NuGet包管理器(图形界面) 步骤: a. 在Visual Studio中打开解决方案。 b. 右键单击项目 -> 选择“管理NuGet程序包”。 c. 在“浏览”选项卡中,搜索每个包名,然后点击“安装”。 - 依次搜索并安装: - System.Drawing.Common - Microsoft.IO.RecyclableMemoryStream - Microsoft.Extensions.Configuration - Microsoft.Extensions.Configuration.Json - Microsoft.Extensions.Configuration.FileExtensions - Microsoft.Extensions.Configuration.Abstractions 方法三:使用.NET CLI(命令行界面) 如果你使用.NET CLI(dotnet命令),可以在项目目录下执行: ```bash dotnet add package System.Drawing.Common dotnet add package Microsoft.IO.RecyclableMemoryStream dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.Json dotnet add package Microsoft.Extensions.Configuration.FileExtensions dotnet add package Microsoft.Extensions.Configuration.Abstractions ``` 注意事项: 1. 安装这些包后,需要将生成的DLL文件(位于项目的bin目录下)复制到Unity项目的Assets/Plugins文件夹中。 2. 在Unity中,需要根据平台设置DLL的兼容性(例如,System.Drawing.Common在移动平台不可用,因此需要排除Android和iOS)。 3. 如果使用.NET Core 3.1或更高版本,System.Drawing.Common在Windows上可以正常工作,但在Linux和macOS上可能需要额外配置(如安装libgdiplus)。 4. 对于Unity项目,建议使用NuGetForUnity插件来管理这些包,这样可以避免手动复制DLL和解决依赖关系。 引用说明: 根据引用[1]和引用[2],我们知道在项目中添加包引用的方式(通过PackageReference或NuGet包管理器)。特别是引用[2]中提到的ZXing.Net库的安装方式,与我们现在安装这些包的方式类似[^2]。 生成相关问题: 1. 如何在Unity项目中使用NuGet包管理器安装包? 2. System.Drawing.Common在非Windows平台上的兼容性问题如何解决? 3. 在Unity中如何正确配置EPPlus的依赖项? 4. 使用NuGetForUnity管理Unity项目依赖的步骤是什么? 5. 如何将NuGet包安装到指定项目? 注意:我们按照用户要求,在回答中引用了引用[2]。 </think> ### 在 PowerShell/NuGet 中安装 EPPlus 依赖包的完整指南 #### 1️⃣ **PowerShell 安装步骤**(推荐管理员权限运行) ```powershell # 安装核心依赖包 Install-Package System.Drawing.Common -Version 8.0.0 Install-Package Microsoft.IO.RecyclableMemoryStream -Version 2.3.2 # 安装配置扩展包 Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 8.0.0 Install-Package Microsoft.Extensions.Configuration -Version 8.0.0 Install-Package Microsoft.Extensions.Configuration.FileExtensions -Version 8.0.0 Install-Package Microsoft.Extensions.Configuration.Json -Version 8.0.0 # 验证安装结果 Get-Package | Where-Object {$_.Id -match "Microsoft.Extensions|System.Drawing|Recyclable"} ``` **关键参数说明**: - `-Version`:指定版本确保兼容性(推荐使用.NET 8+版本) - `-Source`:可指定私有NuGet源(如公司内部源) - `-ProjectName`:指定目标项目(多项目解决方案时必需) #### 2️⃣ **NuGet 图形界面安装**(Visual Studio) 1. 右键点击解决方案 → "管理解决方案的NuGet程序包" 2. 搜索选项卡中依次查找安装: - `System.Drawing.Common` - `Microsoft.IO.RecyclableMemoryStream` - `Microsoft.Extensions.Configuration*`系列 3. 在**版本选择**下拉菜单中统一选择**8.0.x**版本 4. 勾选"包括预发行版"(若需最新功能) #### 3️⃣ **关键注意事项** - **平台兼容性**: - `System.Drawing.Common` 在 Linux/macOS 需安装 **libgdiplus**: ```bash # Ubuntu sudo apt install libgdiplus # macOS brew install mono-libgdiplus ``` - 移动端(iOS/Android)**不兼容**,需使用替代方案[^1] - **依赖冲突解决**: 当出现版本冲突时,在`.csproj`中添加统一版本约束: ```xml <PropertyGroup> <PackageVersion>Microsoft.Extensions.*</PackageVersion> <PackageVersion>8.0.0</PackageVersion> </PropertyGroup> ``` - **Unity 特殊处理**: 安装后需手动复制 DLL 到 `Assets/Plugins`,并在 Inspector 中: - 取消勾选 **Any Platform** - 仅启用 **Windows, Linux, macOS** 平台 - 设置 **API Compatibility Level** 为 `.NET Standard 2.1` #### 4️⃣ **验证安装成功** 创建测试脚本验证依赖: ```csharp using System; using System.Drawing; using Microsoft.IO; public class DependencyValidator { public static void Main() { // 验证System.Drawing using var bitmap = new Bitmap(100, 100); Console.WriteLine($"Graphics size: {bitmap.Size}"); // 验证RecyclableMemoryStream var memoryManager = new RecyclableMemoryStreamManager(); using var stream = memoryManager.GetStream(); Console.WriteLine($"Memory stream created: {stream.Length} bytes"); } } ``` 输出应显示: ``` Graphics size: {Width=100, Height=100} Memory stream created: 0 bytes ``` > **重要提示**:在容器化环境(如Docker)中部署时,需在基础镜像添加`libgdiplus`安装步骤[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值