【.NET新特性·第8篇】.NET 9 AI 构建基块:Microsoft.Extensions.AI

.NET 9 引入了统一的 AI 抽象层,让 .NET 应用轻松集成大语言模型和向量存储

版本定位

适用版本:.NET 9 前置知识:.NET 8 基础、AI/LLM 基本概念

背景

随着 AI 的火热,越来越多的 .NET 应用需要集成大语言模型(LLM)。但问题是:

  • OpenAI、Anthropic、Google Gemini 等服务的 API 各不相同

  • 向量存储没有统一的标准

  • 每次切换模型都需要重写代码

微软在 .NET 9 中引入了 Microsoft.Extensions.AI,提供统一的抽象层,让你的代码不依赖具体的 AI 提供商。

核心组件

复制代码
┌─────────────────────────────────────────────┐
│           Microsoft.Extensions.AI           │
├─────────────────────────────────────────────┤
│  ChatClient  │  EmbeddingClient  │  VectorStore  │
│  ─────────   │  ──────────────   │  ────────────  │
│  对话模型     │  嵌入模型          │  向量存储      │
├─────────────────────────────────────────────┤
│              AI 提供商                       │
│  OpenAI │ Anthropic │ Google │ Azure │ ...  │
└─────────────────────────────────────────────┘

相关底层类型 :.NET 9 还引入了 Tensor<T>(张量类型),用于高性能 AI/ML 计算,是 Vector SIMD 的扩展。但日常应用开发中,通过 Microsoft.Extensions.AI 的高层抽象即可完成大部分工作。

快速上手

1. 安装 NuGet 包

复制代码
# 核心抽象层
dotnet add package Microsoft.Extensions.AI

# OpenAI 提供商
dotnet add package Microsoft.Extensions.AI.OpenAI

# 向量存储
dotnet add package Microsoft.Extensions.VectorData

2. 配置 AI 客户端

复制代码
// Program.cs
var builder = WebApplication.CreateBuilder(args);

// 添加 AI 服务
builder.Services.AddChatClient(sp =>
    new OpenAIClient(builder.Configuration["OpenAI:ApiKey"])
        .GetChatClient("gpt-4"));

var app = builder.Build();

3. 使用 ChatClient

复制代码
// 注入 IChatClient
public class ChatService(IChatClient chatClient)
{
    public async Task<string> AskAsync(string question)
    {
        var response = await chatClient.CompleteAsync(question);
        return response.Message.Content;
    }
}

核心功能详解

1. ChatClient(对话客户端)

复制代码
// 基本对话
var response = await chatClient.CompleteAsync("你好,请介绍一下自己");
Console.WriteLine(response.Message.Content);

// 带历史的对话
var messages = new List<ChatMessage>
{
    new(ChatRole.System, "你是一个有帮助的助手"),
    new(ChatRole.User, "什么是 .NET?")
};

var response = await chatClient.CompleteAsync(messages);

// 流式输出
await foreach (var chunk in chatClient.CompleteStreamingAsync("讲一个故事"))
{
    Console.Write(chunk.Message.Content);
}

2. EmbeddingClient(嵌入客户端)

复制代码
// 生成嵌入向量
var embedding = await embeddingClient.GenerateEmbeddingAsync("Hello, World!");
float[] vector = embedding.Vector;

// 批量生成
var texts = new[] { "Hello", "World", "AI" };
var embeddings = await embeddingClient.GenerateEmbeddingsAsync(texts);

3. VectorStore(向量存储)

复制代码
// 定义向量记录
public class ProductRecord
{
    [Key]
    public int Id { get; set; }

    [VectorStoreRecordData]
    public string Name { get; set; }

    [VectorStoreRecordVector(1536)]
    public float[] Embedding { get; set; }
}

// 添加到向量存储
var record = new ProductRecord
{
    Id = 1,
    Name = ".NET 9 新特性",
    Embedding = await embeddingClient.GenerateEmbeddingAsync(".NET 9 新特性")
};

await vectorStore.GetCollection<int, ProductRecord>("products")
    .UpsertAsync(record);

// 相似度搜索
var results = await vectorStore.GetCollection<int, ProductRecord>("products")
    .GetNearestNeighborsAsync(
        queryEmbedding: queryVector,
        top: 5
    );

4. 中间件支持

复制代码
// 添加日志中间件
builder.Services.AddChatClient(sp =>
    new OpenAIClient(apiKey).GetChatClient("gpt-4"))
    .UseOpenTelemetry()
    .UseFunctionInvocation();

// 函数调用
public class WeatherService
{
    [Description("获取指定城市的天气")]
    public string GetWeather(string city)
    {
        return $"{city}:晴,25°C";
    }
}

// AI 可以自动调用函数
var response = await chatClient.CompleteAsync(
    "北京今天天气怎么样?",
    tools: [AIFunctionFactory.Create<WeatherService>(new WeatherService()).GetWeather]
);

实战场景

适合 AI 构建基块的场景

  1. 智能客服:集成 LLM 处理用户咨询

  2. 内容生成:自动生成文章、代码、翻译

  3. 知识问答:基于文档的问答系统

  4. 代码辅助:代码补全、代码审查

示例:智能问答系统

复制代码
public class KnowledgeBaseService(
    IChatClient chatClient,
    IEmbeddingClient embeddingClient,
    IVectorStore vectorStore)
{
    public async Task<string> AskAsync(string question)
    {
        // 1. 生成问题的嵌入向量
        var questionEmbedding = await embeddingClient
            .GenerateEmbeddingAsync(question);

        // 2. 向量搜索相关文档
        var collection = vectorStore
            .GetCollection<string, DocumentRecord>("documents");
        var relevantDocs = await collection
            .GetNearestNeighborsAsync(questionEmbedding.Vector, top: 3);

        // 3. 构建上下文
        var context = string.Join("\n", relevantDocs
            .Select(d => d.Record.Content));

        // 4. 调用 LLM 生成回答
        var prompt = $"""
            基于以下文档回答问题:

            文档:
            {context}

            问题:{question}
            """;

        var response = await chatClient.CompleteAsync(prompt);
        return response.Message.Content;
    }
}

与其他方案对比

方案 优点 缺点
Microsoft.Extensions.AI 统一抽象、官方支持 较新,生态还在建设
Semantic Kernel 功能丰富、插件生态 较重,学习曲线高
直接调用 API 简单直接 切换提供商需重写

建议:

迁移建议

从直接调用 OpenAI API 迁移

复制代码
// 旧代码
using OpenAI;
var client = new OpenAIClient(apiKey);
var chatClient = client.GetChatClient("gpt-4");
var response = await chatClient.CompleteAsync("Hello");

// 新代码
builder.Services.AddChatClient(sp =>
    new OpenAIClient(apiKey).GetChatClient("gpt-4"));

// 注入使用
public class MyService(IChatClient chatClient)
{
    public async Task<string> AskAsync(string question)
    {
        var response = await chatClient.CompleteAsync(question);
        return response.Message.Content;
    }
}

一句话总结

Microsoft.Extensions.AI 让 .NET 应用集成 AI 变得简单,切换提供商只需换一行配置。


官方文档


📦 示例代码:.NET 新特性巡礼全系列配套示例代码(含 dotnet 8/9/10)

💬 欢迎点赞、收藏、转发,你的支持是我持续创作的动力!

相关推荐
老马识码1 分钟前
WorkBuddy 的专家和专家团是怎么组织的
人工智能·agent
呆萌很7 分钟前
深度学习中检测、识别、感知区别
人工智能·深度学习
像风一样自由202013 分钟前
3.Dockerfile如何构建一个Python算法镜像
开发语言·人工智能·python·大模型
宝哥聊编程16 分钟前
主流 Agent 平台对比:Coze、Dify、飞书、扣子、OpenClaw 落地实操手册
前端·人工智能·飞书
sunzy_泽阳20 分钟前
《Spring Ai 2.1 + LangGraph4j》系列教程(上):从零建项目到可恢复的 Java Graph
人工智能·agent
武天旭34 分钟前
AI安全--AI大模型的关键技术组成
人工智能·深度学习·安全·机器学习
编码者卢布44 分钟前
【Azure Container Apps】为什么通过 Diagnostic Settings 发送到 Log Analytics 中的日志会延迟几分钟?
microsoft·azure
无心水1 小时前
22、数学与经济管理(运筹学) 核心考点与学习笔记
人工智能·笔记·学习·架构师·软考·软考架构师·软考系统架构师
日日大王学编程1 小时前
AI 时代后端方向新人的未来规划与看法
人工智能·后端·python·ai·golang
小哈里1 小时前
【Agent】从Prompt工程、Context工程到 Harness工程,让 AI 能真正完成工作
人工智能·prompt·agent·ai编程·harness