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

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

相关推荐
IT_陈寒1 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
东方小月1 小时前
从0开发一个 Coding Agent(一):前言
前端·人工智能·typescript
ZENERGY-众壹1 小时前
AI 诊断光伏组件热斑:从 10% 功率偏差到深度学习建模的实战复盘
人工智能·深度学习·光伏运维·逆变器api·能源数字化
中微极客1 小时前
2026 RAG框架横评:LlamaIndex凭检索称霸
人工智能
通问AI1 小时前
影视飓风122人参保事件背后的技术视角:AI替代岗位的量化分析
人工智能
李昊哲小课1 小时前
咖啡工坊 · FastAPI 22 章教程合集
服务器·人工智能·python·fastapi
学废了wuwu1 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
Microvision维视智造1 小时前
从“看见“到“看懂“——工业视觉的大模型时刻到了吗?
人工智能·计算机视觉·视觉检测·机器视觉
janeboe2 小时前
抖音黑科技兵马俑总站源头简博科技 | 抖音锚点不合规挂载新规今日生效,短视频引流直播间迈入三端全链路监管时代
大数据·人工智能·科技