.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 构建基块的场景
-
智能客服:集成 LLM 处理用户咨询
-
内容生成:自动生成文章、代码、翻译
-
知识问答:基于文档的问答系统
-
代码辅助:代码补全、代码审查
示例:智能问答系统
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 | 简单直接 | 切换提供商需重写 |
建议:
-
简单场景:直接调用 API
-
中等复杂度:Microsoft.Extensions.AI
-
复杂场景:Semantic Kernel
迁移建议
从直接调用 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)
💬 欢迎点赞、收藏、转发,你的支持是我持续创作的动力!