Bootstrap

技术速递|Microsoft.Extensions.AI 预览版简介 – 适用于 .NET 的统一 AI 构建块

作者:Luis Quintanilla - 项目经理

排版:Alan Wang

我们很高兴地宣布 Microsoft.Extensions.AI.Abstractions 和 Microsoft.Extensions.AI 库现已推出预览版。这些软件包为 .NET 生态系统提供了将 AI 服务集成到 .NET 应用程序和库中的基本抽象,以及用于添加关键功能的中间件。

为了支持 .NET 生态系统,.NET 团队使用这些抽象或“交换类型”增强了核心 Microsoft.Extensions 库,以用于 .NET 生成式 AI 应用程序和库。

人工智能功能正在快速发展,诸如“聊天”、嵌入和工具调用等功能出现了常见模式。统一的抽象对于开发人员跨不同来源有效工作至关重要。中间件可以在不增加生产者负担的情况下添加有价值的功能,从而立即使消费者受益。

例如,IChatClient 接口允许使用语言模型,无论是远程托管还是本地运行。任何提供 AI 客户端的 .NET 包都可以实现此接口,从而实现与使用 .NET 代码的无缝集成。

IChatClient client =
    environment.IsDevelopment ?  
    new OllamaChatClient(...) : 
    new AzureAIInferenceChatClient(...); 

然后,无论您使用哪个提供商,您都可以按如下方式发送请求:

var response = await chatClient.CompleteAsync( 
      "Translate the following text into Pig Latin: I love .NET and AI"); 
Console.WriteLine(response.Message);  

什么是 Microsoft.Extensions.AI?

Microsoft.Extensions.AI 是一组由 .NET 生态系统中的开发人员(包括 Semantic Kernel)共同开发的核心 .NET 库。这些库提供了一个统一的 C# 抽象层,用于与 AI 服务交互,例如小型和大型语言模型(SLM 和 LLM)、嵌入和中间件。
在这里插入图片描述
目前,我们的重点是创建可由各种服务实现的抽象,所有抽象均遵循相同的核心概念。我们不打算发布针对任何特定提供商的服务而量身定制的 API。我们的目标是充当 .NET 生态系统中的统一层,使开发人员能够选择他们喜欢的框架和库,同时确保整个生态系统的无缝集成和协作。

Microsoft.Extensions.AI 的优势

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

核心优势

  • 统一 API:提供一组一致的 API 和约定,用于将 AI 服务集成到 .NET 应用程序中。

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

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

  • 组件化:简化新功能的添加,便于应用程序的组件化和测试。

人工智能服务的通用抽象

这些抽象让您可以轻松地在各种场景中使用惯用的 C# 代码,并且只需进行最少的代码更改,无论您是使用不同的服务进行开发或生产、解决混合场景还是探索其他服务提供商。

实现这些抽象的库作者将使他们的客户端能够与更广泛的 Microsoft.Extensions.AI 生态系统互操作。特定服务的 API 在需要时仍可访问,允许用户使用标准抽象编写代码,并仅在需要时传递到专有 API。

public interface IChatClient : IDisposable 
{ 
    Task<ChatCompletion> CompleteAsync(...); 
    IAsyncEnumerable<StreamingChatCompletionUpdate> CompleteStreamingAsync(...); 
    ChatClientMetadata Metadata { get; } 
    TService? GetService<TService>(object? key = null) where TService : class; 
} 

在这个预览版中,我们为以下服务提供了参考实现:

  • OpenAI
  • Azure AI Inference
  • Ollama

但是,我们打算与 .NET 生态系统中的软件包作者合作,以便这些 Microsoft.Extensions.AI 抽象的实现最终成为相应客户端库的一部分,而不需要安装其他软件包。如果您有一个针对特定 AI 服务的 .NET 客户端库,我们很乐意在您的库中看到这些抽象的实现。

标准中间件实现

连接和使用 AI 服务只是构建强大应用程序的一个方面。生产就绪型应用程序需要遥测、日志记录和工具调用功能等附加功能。Microsoft.Extensions.AI 抽象使开发人员能够使用熟悉的模式轻松地将这些组件集成到他们的应用程序中。

以下示例演示了如何注册 OpenAI IChatClient。IChatClient 允许您以一致的方式在各个提供商之间附加功能。

app.Services.AddChatClient(builder => builder 
    .UseLogging()
    .UseFunctionInvocation() 
    .UseDistributedCache()    
    .UseOpenTelemetry()  
    .Use(new OpenAIClient(...)).AsChatClient(...)); 

上面演示的功能包含在 Microsoft.Extensions.AI 库中,但它们只是使用此方法可以分层添加的功能的一小部分。我们很高兴看到 .NET 开发人员的创造力随着各种类型的中间件的出现而闪耀,这些中间件可用于创建强大、可靠的 AI 相关功能。

如何开始

Microsoft.Extensions.AI 从今天开始提供预览版。

首先,您可以创建一个控制台应用程序,并为您正在使用的相应 AI 服务安装 Microsoft.Extensions.AI 包。

聊天

以下示例展示了如何在聊天场景中使用 Microsoft.Extensions.AI。

Azure AI Inference (GitHub Models)
  1. 安装 Microsoft.Extensions.AI.AzureAIInference NuGet 包,该包可与 GitHub ModelsAzure AI Model Catalog 中的模型配合使用。

  2. 将以下代码添加到您的应用程序中。将 GH_TOKEN 替换为您的 GitHub 个人访问令牌。

using Azure; 
using Azure.AI.Inference;
using Microsoft.Extensions.AI;
IChatClient client =
    new ChatCompletionsClient(
        endpoint: new Uri("https://models.inference.ai.azure.com"), 
        new AzureKeyCredential(Environment.GetEnvironmentVariable("GH_TOKEN")))
        .AsChatClient("Phi-3.5-MoE-instruct");
var response = await client.CompleteAsync("What is AI?");
Console.WriteLine(response.Message);
OpenAI
  1. 安装 Microsoft.Extensions.AI.OpenAI NuGet 包

  2. 将以下代码添加到您的应用程序中。将 OPENAI_API_KEY 替换为您的 OpenAI 密钥。

using OpenAI;
using Microsoft.Extensions.AI;
IChatClient client =
    new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
        .AsChatClient(modelId: "gpt-4o-mini");
var response = await client.CompleteAsync("What is AI?");
Console.WriteLine(response.Message);
Azure OpenAI
  1. 安装 Microsoft.Extensions.AI.OpenAIAzure.AI.OpenAIAzure.Identity NuGet 包。

  2. 将以下代码添加到您的应用程序。将 AZURE_OPENAI_ENDPOINT 替换为您的 Azure OpenAI 端点,将 modelId 替换为您的部署名称。

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.AI;
IChatClient client =
    new AzureOpenAIClient(
        new Uri(Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")), 
        new DefaultAzureCredential())
            .AsChatClient(modelId: "gpt-4o-mini");
var response = await client.CompleteAsync("What is AI?");
Console.WriteLine(response.Message);
Ollama
  1. 安装 Microsoft.Extensions.AI.Ollama NuGet 包

  2. 将以下代码添加到您的应用程序中。

using Microsoft.Extensions.AI;
IChatClient client = 
    new OllamaChatClient(new Uri("http://localhost:11434/"), "llama3.1");
var response = await client.CompleteAsync("What is AI?");
Console.WriteLine(response.Message);

嵌入

与聊天类似,您也可以使用 Microsoft.Extensions.AI 进行文本嵌入生成场景。

OpenAI
  1. 安装 Microsoft.Extensions.AI.OpenAI NuGet 包

  2. 将以下代码添加到您的应用程序中。将 OPENAI_API_KEY 替换为您的 OpenAI 密钥。

using OpenAI;
using Microsoft.Extensions.AI;
IEmbeddingGenerator<string,Embedding<float>> generator =
    new OpenAIClient(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
        .AsEmbeddingGenerator(modelId: "text-embedding-3-small");
var embedding = await generator.GenerateAsync("What is AI?");
Console.WriteLine(string.Join(", ", embedding[0].Vector.ToArray()));
Azure OpenAI
  1. 安装 Microsoft.Extensions.AI.OpenAIAzure.AI.OpenAIAzure.Identity NuGet 包。

  2. 将以下代码添加到您的应用程序中。将 AZURE_OPENAI_ENDPOINT 替换为您的 Azure OpenAI 端点,将 modelId 替换为您的部署名称。

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.AI;
IEmbeddingGenerator<string,Embedding<float>> generator =
    new AzureOpenAIClient(
        new Uri(Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")), 
        new DefaultAzureCredential())
            .AsEmbeddingGenerator(modelId: "text-embedding-3-small");
var embeddings = await generator.GenerateAsync("What is AI?");
Console.WriteLine(string.Join(", ", embeddings[0].Vector.ToArray()));
Ollama
  1. 安装 Microsoft.Extensions.AI.Ollama NuGet 包

  2. 将以下代码添加到您的应用程序中。

using Microsoft.Extensions.AI;
IEmbeddingGenerator<string,Embedding<float>> generator = 
    new OllamaEmbeddingGenerator(new Uri("http://localhost:11434/"), "all-minilm");
var embedding = await generator.GenerateAsync("What is AI?");
Console.WriteLine(string.Join(", ", embedding[0].Vector.ToArray()));

开始使用 Microsoft.Extensions.AI 进行构建

随着 Microsoft.Extensions.AI 的发布,我们很高兴能够为 AI 应用程序开发构建生态系统的基础。以下是您可以参与其中并开始使用 Microsoft.Extensions.AI 的一些方法:

  • 库开发人员:如果您拥有提供 AI 服务客户端的库,请考虑在您的库中实现接口。这样,用户就可以通过抽象轻松集成您的 NuGet 包。

  • 服务使用者:如果您正在开发使用 AI 服务的库,请使用抽象,而不是硬编码到特定的 AI 服务。这种方法让您的用户可以灵活地选择他们喜欢的服务。

  • 应用程序开发人员:尝试使用抽象来简化与您的应用程序的集成。这样可以实现跨模型和服务的可移植性,促进测试和模拟,利用生态系统提供的中间件,并在整个应用程序中保持一致的 API,即使您在应用程序的不同部分使用不同的服务(即本地和托管模型混合场景)。

  • 生态系统贡献者:如果您有兴趣为生态系统做出贡献,请考虑编写自定义中间件组件。

我们在 dotnet/ai-samples GitHub 存储库中提供了一组示例来帮助您入门。

有关使用 Microsoft.Extensions.AI 的端到端示例,请参阅 eShopSupport

Microsoft.Extensions.AI 的下一步计划?

如上所述,我们目前正在发布 Microsoft.Extensions.AI 预览版。我们预计该库将在 11 月 .NET 9 发布之前一直处于预览状态,同时我们将继续收集反馈。

在短期内,我们计划:

  • 继续与 Semantic Kernel 合作,将 Microsoft.Extensions.AI 集作为其基础层。有关更多详细信息,请查看 Semantic Kernel 博客上的帖子。

  • 更新现有示例(如 eShop)以使用 Microsoft.Extensions.AI。

  • 与 .NET 生态系统中的每个人合作,推广 Microsoft.Extensions.AI 的使用。提供商实现的抽象层越多,消费者使用它的就越多,中间件组件构建得越多,所有组件就越强大。

我们期待在您的帮助下塑造 .NET 中 AI 开发的未来。

请试用 Microsoft.Extensions.AI 并分享您的反馈,以便我们能够构建有助于您和您的团队蓬勃发展的体验。

;