Tóm tắt: nên dùng gì để xây backend AI bằng C# năm 2026
Với phần lớn backend AI viết bằng C#, hãy bắt đầu bằng Microsoft.Extensions.AI (lớp trừu tượng IChatClient chung cho mọi nhà cung cấp mô hình), chỉ thêm Microsoft Agent Framework khi bài toán thật sự là agent nhiều bước, và dùng SDK chính thức của OpenAI hoặc Anthropic làm lớp kết nối bên dưới. Phần còn lại là kỹ thuật backend .NET quen thuộc: dependency injection, Polly cho resilience, OpenTelemetry cho quan sát và kiểm thử tự động.
Đây cũng là thứ tự Microsoft khuyến nghị trên trang tổng quan hệ sinh thái .NET + AI: bắt đầu với Microsoft.Extensions.AI, thêm DataIngestion và VectorData khi cần trả lời dựa trên dữ liệu riêng, dùng MCP khi năng lực cần chia sẻ giữa nhiều ứng dụng, và chuyển sang Agent Framework khi lời gọi một bước trở thành quy trình nhiều bước.
Bài viết do Phan Phúc Nguyên, Giám đốc EYC, biên soạn. Tên gói và API được đối chiếu với Microsoft Learn, GitHub và NuGet tại thời điểm viết (10/2026); hệ sinh thái thay đổi nhanh, nên hãy ghim phiên bản và đọc release notes trước khi nâng cấp.
Bản đồ thư viện .NET cho AI (trạng thái 10/2026)
Bảng dưới gom các thành phần chính theo vai trò. Điều cần nhớ nhất: Microsoft.Extensions.AI là lớp trừu tượng; Agent Framework là lớp điều phối; SDK của nhà cung cấp là lớp kết nối; ONNX Runtime và ML.NET dành cho mô hình chạy cục bộ.
| Thành phần | Vai trò | Trạng thái đã kiểm chứng | Khi nào dùng |
|---|---|---|---|
| Microsoft.Extensions.AI (MEAI) | Lớp trừu tượng: IChatClient, IEmbeddingGenerator, middleware (gọi hàm, cache, telemetry) | Gói Abstractions phiên bản 10.x trên Microsoft Learn | Mặc định cho mọi tính năng AI ở tầng ứng dụng |
| Microsoft Agent Framework (MAF) | Điều phối agent, workflow dạng đồ thị, trạng thái, human-in-the-loop | Kế nhiệm trực tiếp Semantic Kernel và AutoGen theo Microsoft Learn; gói Microsoft.Agents.AI có bản ổn định 1.0.0 trên NuGet từ 02/4/2026 | Khi cần agent đa bước, chuyển giao giữa nhiều agent |
| Semantic Kernel | SDK điều phối thế hệ trước | Microsoft gọi Agent Framework là thế hệ kế tiếp; có hướng dẫn di chuyển chính thức | Dự án đang chạy; dự án mới nên cân nhắc MAF |
| OpenAI (NuGet: OpenAI) | SDK chính thức cho OpenAI API | Repo openai/openai-dotnet, tương thích .NET Standard 2.0 | Gọi mô hình OpenAI hoặc endpoint tương thích |
| Anthropic (NuGet: Anthropic) | SDK chính thức cho Claude API | Từ phiên bản 10 trở lên là SDK chính thức; yêu cầu .NET Standard 2.0+ | Gọi mô hình Claude |
| ModelContextProtocol | SDK C# chính thức cho MCP client và server | Bản ổn định 2.2.0 trên NuGet; duy trì cùng Microsoft | Chia sẻ công cụ giữa nhiều agent, IDE, sản phẩm |
| ONNX Runtime (Microsoft.ML.OnnxRuntime) | Suy luận mô hình ONNX cục bộ | Có API C#; chạy Linux, Windows, macOS | Mô hình nhỏ, phân loại, embedding chạy tại chỗ |
| ML.NET | Huấn luyện và dùng mô hình ML truyền thống trong .NET | Mã nguồn mở, đa nền tảng, có thể dùng mô hình ONNX | Dự báo, phân loại trên dữ liệu bảng |
Microsoft.Extensions.AI: lớp trừu tượng nên có trong mọi dự án
Theo Microsoft Learn, gói Microsoft.Extensions.AI.Abstractions cung cấp các kiểu trao đổi cốt lõi như IChatClient và IEmbeddingGenerator; bất kỳ thư viện .NET nào cung cấp client cho LLM đều có thể hiện thực IChatClient. Gói Microsoft.Extensions.AI bổ sung các thành phần như tự động gọi hàm công cụ, telemetry và cache theo kiểu dependency injection quen thuộc. Các API cấp thấp này được tách ra từ Semantic Kernel.
Lợi ích thực tế là code nghiệp vụ chỉ phụ thuộc IChatClient. Muốn đổi từ OpenAI sang Claude hay sang mô hình chạy cục bộ qua Ollama, bạn đổi đăng ký trong DI, không đổi logic. IChatClient có hai phương thức chính: GetResponseAsync (trả về toàn bộ) và GetStreamingResponseAsync (trả về IAsyncEnumerable các ChatResponseUpdate).
Client được ghép thành pipeline bằng ChatClientBuilder: UseFunctionInvocation để mô hình gọi hàm C#, UseOpenTelemetry để ghi trace, DistributedCachingChatClient để cache câu trả lời. RoutingChatClient và FailoverChatClient chuyển yêu cầu sang client khác khi một nhà cung cấp lỗi trước khi sinh output.
Microsoft cũng lưu ý rõ: MEAI tự nó không phải agent framework. Một lời gọi đơn, tính năng chat hay vòng lặp gọi công cụ có thể xây bằng MEAI mà không cần trở thành hệ thống agentic.
Microsoft Agent Framework và Semantic Kernel: chọn cái nào?
Trang tổng quan trên Microsoft Learn nêu Agent Framework là kế nhiệm trực tiếp của Semantic Kernel và AutoGen, do chính các nhóm đó xây dựng. Nó kết hợp abstraction đơn giản của AutoGen với các tính năng doanh nghiệp của Semantic Kernel như quản lý trạng thái theo phiên, type safety, middleware, telemetry, và bổ sung workflow dạng đồ thị cho điều phối nhiều agent. Agent Framework hỗ trợ tạo agent từ bất kỳ dịch vụ nào có hiện thực IChatClient, nên nó nằm ngay trên MEAI.
Gói Microsoft.Agents.AI phát hành bản ổn định 1.0.0 trên NuGet ngày 02/4/2026, sau các bản Release Candidate từ tháng 2/2026; tại thời điểm rà soát (10/2026) bản mới nhất là 1.24.0. Một số gói tích hợp vẫn ở dạng prerelease, ví dụ hướng dẫn bắt đầu trên Learn cài Microsoft.Agents.AI.Foundry với cờ --prerelease, nên hãy kiểm tra trạng thái từng gói trước khi đưa vào production.
Microsoft cũng khuyên đừng lạm dụng agent: nếu viết được một hàm để xử lý tác vụ, hãy làm vậy thay vì dùng AI Agent; nếu một lời gọi MEAI hoặc một vòng gọi công cụ đơn giản giải quyết được, hãy dùng cách đơn giản hơn. Xem thêm khái niệm trong bài AI Agent là gì.
- Dự án mới, cần agent đa bước hoặc workflow: Microsoft Agent Framework.
- Dự án Semantic Kernel đang chạy ổn: giữ nguyên, lên kế hoạch di chuyển theo hướng dẫn chính thức.
- Chỉ cần chat, tóm tắt, trích xuất, gọi vài công cụ: Microsoft.Extensions.AI là đủ.
SDK nhà cung cấp, MCP và mô hình chạy cục bộ
SDK chính thức của OpenAI và Anthropic
Thư viện OpenAI cho .NET (repo openai/openai-dotnet) là thư viện chính thức, tương thích mọi ứng dụng .NET Standard 2.0, hỗ trợ streaming, có phương thức async cho mọi lời gọi, và được thiết kế để dễ mock khi kiểm thử. Với Claude, gói NuGet Anthropic từ phiên bản 10 trở lên là SDK C# chính thức; các bản 3.x trở xuống trước đây thuộc SDK cộng đồng tryAGI và đã chuyển sang tên tryAGI.Anthropic. Chi tiết này dễ gây nhầm khi nâng cấp, nên hãy kiểm tra số phiên bản. SDK Anthropic có các phương thức streaming mang hậu tố Streaming, ví dụ Messages.CreateStreaming.
MCP C# SDK
SDK C# chính thức cho Model Context Protocol được duy trì cùng Microsoft, gồm ModelContextProtocol.Core (tối thiểu phụ thuộc), ModelContextProtocol (hosting và DI) và ModelContextProtocol.AspNetCore (server qua HTTP); bản ổn định trên NuGet là 2.2.0. Release notes của 2.0.0 đánh dấu Obsolete một số API cho tính năng bị đặc tả mới loại bỏ, nên tutorial cũ có thể không còn đúng. Công cụ MCP dùng trực tiếp với IChatClient vì McpClientTool kế thừa AIFunction. Nếu công cụ chỉ dùng trong một ứng dụng, gọi hàm trong tiến trình đơn giản hơn. Xem MCP là gì.
ONNX Runtime và ML.NET cho mô hình cục bộ
ONNX Runtime là engine suy luận cho mô hình ONNX, chạy trên Linux, Windows, macOS, có API C# và hỗ trợ bộ tăng tốc như TensorRT, OpenVINO, DirectML. ML.NET là framework ML mã nguồn mở, đa nền tảng để huấn luyện và dùng mô hình trong .NET, dùng được mô hình ONNX. Hai công cụ này hợp với tác vụ hẹp như phân loại văn bản, embedding, dự báo trên dữ liệu bảng, nơi gọi LLM qua API là thừa.
Kiến trúc tham chiếu cho backend AI bằng ASP.NET Core
Ví dụ minh họa: một API hỗ trợ nhân viên chăm sóc khách hàng, trả lời dựa trên tài liệu nội bộ và tra cứu đơn hàng. Kiến trúc chia lớp giúp thay mô hình, thêm công cụ và kiểm thử độc lập.
- Lớp API (ASP.NET Core): xác thực, giới hạn tần suất, kiểm tra đầu vào, trả kết quả dạng streaming.
- Lớp ứng dụng: các use case như AnswerQuestion, SummarizeTicket; chỉ phụ thuộc IChatClient và interface nghiệp vụ.
- Lớp AI: pipeline IChatClient đăng ký trong DI (gọi hàm, telemetry, cache, failover); prompt và cấu hình mô hình đọc từ configuration, không hardcode.
- Lớp tri thức: Microsoft.Extensions.DataIngestion để đọc, chia đoạn tài liệu; Microsoft.Extensions.VectorData để lưu và truy xuất vector (xem RAG là gì).
- Lớp công cụ: hàm C# đăng ký qua AIFunctionFactory, hoặc MCP server khi cần chia sẻ cho nhiều ứng dụng; mỗi công cụ có quyền tối thiểu.
- Lớp vận hành: OpenTelemetry, health check, Polly cho mọi lời gọi HTTP ra ngoài, tác vụ dài đẩy vào hàng đợi xử lý nền.
Streaming, resilience và quan sát hệ thống
Streaming
Câu trả lời dài có thể mất vài giây; repo OpenAI .NET nêu rõ streaming cho phép xử lý phần đầu câu trả lời trước khi mô hình sinh xong. Trong ASP.NET Core, trả IAsyncEnumerable từ GetStreamingResponseAsync qua Server-Sent Events hoặc SignalR, và truyền CancellationToken từ request xuống để hủy lời gọi mô hình khi người dùng đóng kết nối, tránh trả tiền cho token không ai đọc.
Resilience với Microsoft.Extensions.Http.Resilience và Polly
Gói Microsoft.Extensions.Http.Resilience, xây trên Polly, cung cấp AddStandardResilienceHandler cho HttpClient; theo .NET Blog, pipeline chuẩn gồm rate limiter, timeout tổng, retry, circuit breaker và timeout từng lần thử. Với LLM, hãy kéo dài timeout mỗi lần thử cho câu trả lời lớn và không retry request streaming đã bắt đầu trả dữ liệu. Khi tự cấu hình điều kiện retry, lưu ý Polly ném TimeoutRejectedException chứ không phải TimeoutException. Chúng tôi chưa kiểm chứng SDK OpenAI hay Anthropic có dùng IHttpClientFactory theo mặc định không; hãy đọc tài liệu từng SDK về cách truyền HttpClient tùy chỉnh.
OpenTelemetry cho lời gọi AI
UseOpenTelemetry trong MEAI thêm OpenTelemetryChatClient vào pipeline, hiện thực OpenTelemetry Semantic Conventions cho Generative AI (phiên bản 1.41 theo tài liệu API); đặc tả này vẫn ở trạng thái thử nghiệm nên dữ liệu telemetry có thể thay đổi. Các thuộc tính như gen_ai.request.model, gen_ai.usage.input_tokens và gen_ai.usage.output_tokens cho phép đo token và ước tính chi phí theo từng request. Theo OpenTelemetry, mặc định nội dung prompt và tham số công cụ không được ghi vì có thể chứa dữ liệu nhạy cảm; chỉ bật EnableSensitiveData ở môi trường phát triển. Agent Framework cũng phát trace, log, metric theo cùng chuẩn này.
Kiểm thử, triển khai và kiểm soát chi phí
Kiểm thử
Vì code nghiệp vụ phụ thuộc IChatClient, unit test có thể thay bằng một client giả trả câu trả lời cố định. SDK OpenAI .NET được thiết kế hỗ trợ mock với phương thức virtual và model factory. Với chất lượng câu trả lời, Microsoft cung cấp Microsoft.Extensions.AI.Evaluation để so sánh đầu ra lặp lại và bắt hồi quy khi đổi prompt, mô hình hay công cụ. Nên có bộ câu hỏi chuẩn chạy trong CI trước mỗi lần đổi mô hình.
Triển khai
Backend AI .NET triển khai như mọi dịch vụ ASP.NET Core: container Linux, cấu hình và khóa API qua biến môi trường hoặc kho bí mật, không để trong mã. Aspire là lớp điều phối, nối dịch vụ và quan sát cho ứng dụng .NET phân tán gồm API, worker, vector store, MCP server. Khi cần chạy mô hình gần dữ liệu, có Foundry Local cho hướng local-first. Về hạ tầng, xem chọn kiến trúc cloud.
Chi phí
Chi phí chủ yếu đến từ token, không phải từ framework: các thư viện kể trên đều mã nguồn mở. Đòn bẩy giảm chi phí gồm: đo token theo request bằng OpenTelemetry, cache câu trả lời lặp lại, dùng mô hình nhỏ hoặc ONNX cục bộ cho tác vụ hẹp, giới hạn số vòng gọi công cụ, và hủy lời gọi khi client ngắt kết nối. Chi tiết trong bài kiểm soát chi phí LLM.
Kinh nghiệm .NET từ dự án mã nguồn mở của tác giả
Ngoài công việc tại EYC, tác giả duy trì hai dự án mã nguồn mở cá nhân: Nalix, framework mạng nhị phân độ trễ thấp cho .NET 10, tương thích Native AOT (Apache-2.0), và Zalo.Net, SDK .NET không chính thức cho Zalo API. Đây không phải thành phần của sản phẩm EYC. Bài học mang sang backend AI: đo trước khi tối ưu, tách lớp rõ ràng, và ghi rõ khi nào không nên dùng một công cụ, như mục "When NOT to use" trong README của Nalix.
Nếu doanh nghiệp bạn đang có hệ thống .NET và muốn bổ sung AI, EYC có thể hỗ trợ qua dịch vụ phần mềm và SaaS và AI Agent, tự động hóa; cam kết về SLA hay quyền sở hữu mã nguồn theo thỏa thuận trong hợp đồng.
Nếu backend AI cần kết nối kênh Zalo, xem hướng dẫn gọi Zalo API từ C#/.NET.
Câu hỏi thường gặp
Có nên dùng C# để làm backend AI hay phải dùng Python?
Để huấn luyện mô hình, Python vẫn phổ biến hơn. Nhưng phần lớn backend AI là gọi mô hình qua API, kết nối dữ liệu và công cụ, nơi .NET có đủ thư viện chính thức: Microsoft.Extensions.AI, Microsoft Agent Framework, SDK OpenAI và Anthropic, MCP C# SDK và ONNX Runtime.
Microsoft.Extensions.AI khác Semantic Kernel thế nào?
Microsoft.Extensions.AI là lớp trừu tượng cấp thấp (IChatClient, IEmbeddingGenerator, middleware); các API này được tách ra từ Semantic Kernel. Semantic Kernel và nay là Microsoft Agent Framework là lớp điều phối cao hơn, xây trên các abstraction đó.
Có nên chuyển dự án Semantic Kernel sang Microsoft Agent Framework ngay?
Microsoft gọi Agent Framework là kế nhiệm trực tiếp và có hướng dẫn di chuyển chính thức. Với dự án đang chạy ổn, hãy lên kế hoạch di chuyển có kiểm thử thay vì chuyển gấp; với dự án mới cần agent, nên bắt đầu bằng Agent Framework.
SDK Claude chính thức cho C# là gói nào?
Gói NuGet tên Anthropic, từ phiên bản 10 trở lên, là SDK chính thức. Các phiên bản 3.x trở xuống thuộc SDK cộng đồng nay đổi tên thành tryAGI.Anthropic.
Khi nào cần MCP thay vì gọi hàm thông thường?
Khi cùng một bộ công cụ cần phục vụ nhiều ứng dụng, agent hoặc IDE khác nhau. Nếu công cụ chỉ dùng trong một ứng dụng, gọi hàm trong tiến trình qua AIFunction đơn giản hơn.
Làm sao theo dõi chi phí token trong backend .NET?
Bật UseOpenTelemetry trên pipeline IChatClient. Telemetry theo chuẩn GenAI ghi lại mô hình và số token đầu vào, đầu ra cho mỗi lời gọi; xuất sang công cụ quan sát tương thích OTLP để tổng hợp theo tính năng hoặc khách hàng.