EF Core 向量搜索:将 RAG 核心能力直接带入 .NET 生态

EF Core 向量搜索:将 RAG 核心能力直接带入 .NET 生态

在一个标准的 RAG 应用中,用户提问后,系统需要在知识库中检索最相关的内容作为上下文,再由大模型生成答案。传统的检索方式依赖关键词匹配,无法理解“用户可能想知道什么”。

向量搜索的解决方案是把文本转化为嵌入(embedding)——高维数值向量,然后在向量空间中通过距离计算(如余弦相似度)找到语义相近的内容。当用户问“如何重置密码”时,向量搜索能找到文档中描述“忘记登录凭证”的内容,即便原文中没有“密码”二字。

微软官方文档对此的定义是:“SQL Server 向量数据类型允许存储嵌入,这些嵌入是意义的数值表示,可以高效地进行相似性搜索,为语义搜索和检索增强生成(RAG)等 AI 工作负载提供支持。”

1.2 EF Core 的向量进化时间线

EF Core 对向量的支持并非一蹴而就,而是经过了完整的演进:

版本向量支持状态说明
EF Core 9实验性支持(需扩展包)通过EFCore.SqlServer.VectorSearch扩展包实现二进制向量传输 [11†L15-L24]
EF Core 10原生支持(自 .NET 10)内置SqlVector<T>类型和EF.Functions.VectorDistance()函数 [8†L10-L14][18†L12-L15]
.NET 11 Preview 4持续增强向量搜索能力进一步成熟,配合 Preview 4 的整体 AI 生态升级 [7†L13-L14]

这意味着,在 .NET 10/11 时代启动新项目的开发者,无需安装额外扩展即可直接使用向量功能。

1.3 实际代码:从模型定义到相似性查询

第一步:定义包含向量的实体模型

在 EF Core 11 中,向量字段可以通过SqlVector<float>类型轻松定义:

public class Document { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } [Column(TypeName = "vector(1536)")] // 1536维:OpenAI ada-002的标准维度 public SqlVector<float> Embedding { get; set; } }

第二步:生成并存储嵌入

嵌入的生成通过Microsoft.Extensions.AI库中的IEmbeddingGenerator抽象完成,这与微软正在推进的统一 AI 抽象层保持一致。

using Microsoft.Extensions.AI; // IEmbeddingGenerator 提供了统一的嵌入生成抽象 IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = /* 配置 OpenAI 或 Azure OpenAI 服务 */; // 为文档内容生成嵌入 var embedding = await embeddingGenerator.GenerateVectorAsync( "文档的全部内容文本..."); // 存储到数据库 context.Documents.Add(new Document { Title = "文档标题", Content = "文档内容", Embedding = new SqlVector<float>(embedding) }); await context.SaveChangesAsync();

第三步:执行向量相似性搜索

// 为用户查询生成嵌入 var queryEmbedding = await embeddingGenerator.GenerateVectorAsync( "用户输入的问题"); var sqlVector = new SqlVector<float>(queryEmbedding); // 使用 LINQ 进行相似性排序 var topDocuments = await context.Documents .OrderBy(d => EF.Functions.VectorDistance("cosine", d.Embedding, sqlVector)) .Take(5) .ToListAsync();

VectorDistance函数支持不同的距离度量,除了“cosine”余弦距离外,还支持“euclidean”欧氏距离和“dot”点积距离,开发者可以根据具体场景选择合适的度量方式。微软官方还介绍了更高级的检索策略:“Azure SQL DB Vector Search 示例演示了如何使用原生向量函数构建检索、混合搜索、EF Core/SqlClient 用法等,为 RAG 管道的第一阶段检索提供候选结果。”

二、MCP Server 模板:AI 原生应用开发的“最后一公里”

2.1 MCP:让 AI 模型“会用工具”的开放标准

Model Context Protocol(MCP)由 Anthropic 发起,微软已加入并共同推动其成为 AI 领域的行业标准。简单理解:MCP 是为 AI 应用设计的“USB-C 接口”——标准化了 AI 模型如何发现和使用外部工具与数据。

AI 应用要让 LLM 调用外部函数,以往开发者需要为每个大模型平台单独适配工具调用格式,而 MCP 为 AI 模型和外部服务之间提供了一个标准化的开放协议。微软官方解释:“MCP 服务器是通过 Model Context Protocol(MCP)向客户端暴露能力的服务。”

微软与 Anthropic 合作开发的官方 C# SDK 在 2026 年 3 月已发布 v1.0 稳定版本,全面支持 2025 年 11 月的 MCP 规范,成为 MCP 官方生态中的 Tier 1 级别 SDK。这意味着 .NET 开发者现在拥有一套生产就绪的一流工具包来构建 MCP 服务器和客户端。

2.2 Preview 4 的变化:MCP Server 模板正式落地

.NET 11 Preview 4 引入了一个对 AI 开发者而言极具价值的新特性——MCP Server 项目模板。通过Microsoft.McpServer.ProjectTemplates包安装后,开发者可以在 Visual Studio 中直接创建 MCP Server App 项目。

模板的新建向导提供了丰富的配置选项:

  • 传输类型:stdio(适用于本地 CLI 工具集成)或 HTTP(适用于远程服务调用)
  • Native AOT 支持:可将 MCP 服务器编译为自包含的原生二进制
  • 独立发布:生成不依赖 .NET 运行时的独立可执行文件

2.3 实战:三步创建第一个 MCP Server

下面我们来快速体验一个 MCP Server 的构建过程。

第一步:安装模板并创建项目

在终端执行以下命令安装 MCP Server 模板:

dotnet new install Microsoft.McpServer.ProjectTemplates

然后创建新项目:

dotnet new mcp-server -n MyCalculatorMcpServer

或者,在 Visual Studio 的“新建项目”界面中,选择MCP Server App模板,按向导配置即可。

第二步:实现工具(Tools)

MCP 的核心是“工具”——AI 可调用的能力单元。在生成的模板代码中,添加一个简单的计算工具:

[McpTool("calculator")] public class CalculatorTool { [McpTool("add")] public int Add( [McpToolParameter(Description = "第一个加数")] int a, [McpToolParameter(Description = "第二个加数")] int b) => a + b; [McpTool("multiply")] public int Multiply( [McpToolParameter(Description = "被乘数")] int a, [McpToolParameter(Description = "乘数")] int b) => a * b; }

注解驱动的定义方式让 MCP 开发变得非常直观。AI 客户端(如 GitHub Copilot、Claude Desktop、VS Code)可以通过 MCP 协议自动发现这些工具,并在生成回答时按需调用。

第三步:构建 MCP 客户端

有了 MCP Server 之后,还需要一个客户端来消费它。微软官方提供了客户端快速入门,基本代码结构如下:

using ModelContextProtocol.Client; // 启动 MCP 客户端连接到服务器 var transport = new StdioClientTransport(new() { Command = "dotnet run", Arguments = ["--project", "<path-to-mcp-server>"] }); McpClient mcpClient = await McpClient.CreateAsync(transport); // 列出所有可用工具 IList<McpClientTool> tools = await mcpClient.ListToolsAsync(); // 将 MCP 工具作为函数调用能力注入 AI 聊天客户端 IChatClient chatClient = new ChatClientBuilder(openAIClient) .UseFunctionInvocation() // 启用函数调用 .Build(); // 对话循环,AI 会按需自动调用 tools while (true) { var userMessage = Console.ReadLine(); await foreach (var update in chatClient.GetStreamingResponseAsync( messages, new() { Tools = tools })) { Console.Write(update); } }

2.4 MCP 的生态想象

一旦企业内部的业务 API 通过 MCP Server 暴露出来,AI 编程助手(如 GitHub Copilot)可以:

  • 实时查询企业的订单状态
  • 创建 Jira 工单
  • 查询 KPI 仪表盘数据
  • 甚至执行 CI/CD 流水线任务

正如一位 MCP 实践者所言:“MCP 正在迅速成为扩展 AI 智能体能力的基石,用 C# 构建 MCP 服务器从未像现在这样简单和易上手。”

三、强强联合:用 EF Core 向量搜索 + MCP 构建完整 RAG 应用

理解了 EF Core 的向量搜索和 MCP Server 模板之后,一个问题自然浮现——这两者如何协同工作?答案就是 RAG 应用。

设想一个企业智能问答场景:

3.1 数据准备(使用 EF Core 向量存储)

企业内部有大量产品文档、技术手册和 FAQ。首先,使用 EF Core 将文档切分、生成嵌入并存入 SQL Server 2025。

// 文档处理管道 foreach (var chunk in documentChunks) { var embedding = await embeddingGenerator.GenerateVectorAsync(chunk.Content); dbContext.DocumentChunks.Add(new DocumentChunk { Content = chunk.Content, Metadata = chunk.Metadata, Embedding = new SqlVector<float>(embedding) }); } await dbContext.SaveChangesAsync();

3.2 MCP 工具包装(让 AI 能检索文档)

将“文档检索”能力包装为 MCP 工具:

[McpTool("document_search")] public class DocumentSearchTool { private readonly AppDbContext _dbContext; private readonly IEmbeddingGenerator _embeddingGenerator; [McpTool("search")] public async Task<List<SearchResult>> SearchAsync( [McpToolParameter(Description = "用户的问题或查询")] string query) { var queryVector = await _embeddingGenerator.GenerateVectorAsync(query); var sqlVector = new SqlVector<float>(queryVector); return await _dbContext.DocumentChunks .OrderBy(d => EF.Functions.VectorDistance("cosine", d.Embedding, sqlVector)) .Take(5) .Select(d => new SearchResult { Content = d.Content, Score = d.Similarity }) .ToListAsync(); } }

3.3 AI 问答流程

当用户在 AI 助手的对话框中提问时,流程如下:

  1. AI 模型识别到需要调用document_search工具
  2. MCP 协议触发 .NET 后端执行向量相似性搜索
  3. 检索到的文档内容作为上下文返回给 AI
  4. 大语言模型基于检索结果生成准确、上下文相关的最终回答

整个过程对用户透明——他们只感知到“AI 能准确回答关于产品的问题”。

四、AI 生态全景:除了 Preview 4,还有哪些重要拼图?

Preview 4 的 AI 集成只是 .NET AI 战略的一个组成部分。回顾历史,微软在 .NET 生态中布局 AI 的深度远超大多数开发者所认知:

组件说明
Microsoft.Extensions.AI提供统一的 C# 抽象层,支持聊天模型、嵌入生成、函数调用等,已在 .NET 11 中进一步成熟
C# SDK for MCP官方 C# 实现,已发布 v1.0 稳定版,支持 stdio 和 HTTP 传输
Semantic Kernel轻量级 AI 编排框架,支持插件化开发和 Agent 工作流
.NET AI Templates提供 AI 聊天 Web 应用脚手架,支持多种 AI 服务提供商
EF Core Vector Search原生向量搜索支持,SQL Server 2025 提供 DiskANN 向量索引加速
.NET Agent Framework支持多步骤推理和工具调用决策的新框架(预览中)

微软将 AI 能力正式纳入 .NET 核心库,使开发者能够统一调用大模型(支持 OpenAI API / 本地模型),而不再关心各厂商的 SDK 差异,并可随时切换模型。

五、总结与展望

.NET 11 Preview 4 在 AI 开发方向上的两大战役:

  1. EF Core 向量搜索:将 RAG 应用的核心基础设施——语义检索——原生接入 .NET 开发者熟悉的 ORM 生态。只需配置vector(1536)类型和使用VectorDistanceLINQ 函数,即可轻松构建混合搜索流水线。

  2. MCP Server 模板:让 .NET 开发者无需纠结协议细节就能为 AI 智能体