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

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

相关推荐
fthux5 小时前
装闭 RenoPit 源码解析(07):装修闭坑知识库与AI Prompt构建
人工智能·ai·开源·github·open source·renopit
zyplayer-doc6 小时前
VuePress类静态文档站和动态知识库怎么选:两种技术路线的适用场景
javascript·人工智能·后端·安全·智能手机
KKKlucifer7 小时前
拨开接口黑盒迷雾:运营商第三方合作接口安全审计与准入管控落地实践
网络·人工智能·安全
梦梦代码精7 小时前
连锁品牌数字化:从门店扩张到用户资产运营的技术底座
大数据·人工智能·低代码·docker·开源·代码规范
咕噜咕噜啦啦7 小时前
vLLM框架
人工智能·qwen·vllm
启雀AI7 小时前
AI 驱动的视频课程自动摘要与知识点提取:ASR + LLM 流水线工程实践
人工智能·阿里云·华为云·音视频·培训saas平台
Mac的实验室7 小时前
2026年8月最新实操:谷歌Gmail邮箱手机号注册扫码发短信提示“无法验证”怎么办?(附100%成功绕过指南)
人工智能
MindUp8 小时前
AI辅助PPT生成工具的内容组织能力实测:8款产品的文档解析与排版效果对比
人工智能
寒草8 小时前
【寒草呈献】当巴菲特走进 AI 投研助手
人工智能·架构