Tìm hiểu cách tạo và sử dụng Prompt Files trong GitHub Copilot cho Visual Studio để tự động hóa các tác vụ lặp lại, tăng tốc độ code và làm chủ trợ lý AI của bạn.
Chào mọi người! Hôm nay chúng ta sẽ khám phá một thứ cực kỳ "chất" – đó là cách tạo ra một AI Agent thông minh dùng .NET, có khả năng tự viết và chạy code C# để giải quyết cả tá công việc phức tạp. Bạn đã sẵn sàng "lặn" sâu vào thế giới này chưa? <a href="#introduction"> </a> ### Mở Màn: Thế Giới AI Đang 'Lên Đồng'! Thế giới AI tạo sinh đang tiến như vũ bão, phải không bạn? Thời cái LoL (LLM) chỉ biết 'trả bài' theo dữ liệu đã học xưa rồi Diễm ơi! Giờ đây, chúng đã trở thành những phù thủy công nghệ đích thực, biết dùng đủ thứ 'công cụ' xịn sò để làm được nhiều hơn thế nữa. Này nhé, những sáng kiến như <a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="noopener noreferrer">Model Context Protocol (MCP)</a> đang mở ra một kỷ nguyên mới, và các <a href="https://mcpservers.org/" target="_blank" rel="noopener noreferrer">'server MCP'</a> thì mọc lên như nấm sau mưa. Điều này cho phép AI không chỉ nói suông mà còn hành động nữa đó! Bạn đã nghe đến khái niệm <a href="https://en.wikipedia.org/wiki/Vibe_coding" target="_blank" rel="noopener noreferrer">"vibe coding"</a> chưa? Theo ChatGPT, nó có nghĩa là: <blockquote>Vibe coding with AI is like whispering your app dreams to a super-fast coder who never sleeps—you describe what you want (“make the button red,” “add cat purring”), and the AI writes it. You review, tweak, rinse, repeat… no need to grok every line. It’s part brainstorming session, part code genie — fast, fun, and sometimes buggy magic! 😜</blockquote> Đúng là ma thuật, nhưng đôi khi cũng 'buggy' lắm nha! Mà này, Microsoft cũng vừa 'nhá hàng' .NET 10 với một loạt tính năng mới toanh. Trong đó, có một điểm sáng chói là khả năng chạy file script đơn lẻ với lệnh `dotnet run app.cs`. Tuyệt vời đúng không? Cuối cùng thì <a href="https://devblogs.microsoft.com/dotnet/announcing-dotnet-run-app/" target="_blank" rel="noopener noreferrer">'single file scripts' cũng đã đến với chúng ta rồi</a>! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/gK2Jz9F.png' alt='Công thức tạo AI Agent: LLM + Tooling + .NET 10'> Ba 'nguyên liệu vàng' này – LLM đỉnh cao, khả năng gọi công cụ (tool calling) và sức mạnh của .NET 10 – sẽ giúp chúng ta 'hô biến' ra một AI Agent 'vibe coding' của riêng mình. Nó sẽ không chỉ trả lời câu hỏi mà còn tự động hoàn thành các tác vụ phức tạp nữa! Sẵn sàng 'lặn' sâu vào thế giới này chưa? Chúng ta sẽ dùng các thư viện <a href="https://learn.microsoft.com/en-us/dotnet/ai/microsoft-extensions-ai" target="_blank" rel="noopener noreferrer">Microsoft.Extensions.AI</a> để làm 'phép' nhé! <a href="#setting-up-the-stage"> </a> ### Chuẩn Bị 'Sân Khấu': Kết Nối AI và 'Công Cụ' Code Để 'phù phép', đầu tiên chúng ta cần 'triệu hồi' vài gói thư viện quan trọng và thiết lập một 'khách hàng' chat. Mình dùng một mô hình AI được host trên <a href="https://learn.microsoft.com/en-us/azure/ai-foundry/what-is-azure-ai-foundry" target="_blank" rel="noopener noreferrer">Azure AI Foundry</a>, nhưng bạn có thể dùng bất kỳ mô hình nào hỗ trợ 'tool calling' là được: ```csharp #:package Azure.AI.OpenAI #:package Microsoft.Extensions.AI #:package [email protected] #:package [email protected] using Azure.AI.OpenAI; using Microsoft.Extensions.AI; using Microsoft.Extensions.Logging; using System.ClientModel; using System.Diagnostics; var runId = Guid.NewGuid(); var azureOpenAIEndpoint = "https://<your-endpoint>.cognitiveservices.azure.com/"; var azureOpenAIModelId = "gpt-4.1"; using var loggerFactory = LoggerFactory.Create(builder => builder.SetMinimumLevel(LogLevel.Information).AddConsole()); var client = new ChatClientBuilder( new AzureOpenAIClient(new Uri(azureOpenAIEndpoint), new ApiKeyCredential("<your-api-key>")) .GetChatClient(azureOpenAIModelId).AsIChatClient()) .UseLogging(loggerFactory) .UseFunctionInvocation(loggerFactory) .Build(); ``` Đoạn code trên nhìn có vẻ hơi 'hack não' nhỉ? Đừng lo, nó chỉ đang 'xây' cho chúng ta một 'người bạn' chat AI thông minh thôi. Cái `ChatClientBuilder` này sẽ giúp 'kết nối' AI với thế giới bên ngoài, cho phép nó 'giao tiếp' và 'hiểu' được các công cụ mà chúng ta sẽ cung cấp. Mấy dòng `runId` và `loggerFactory` thì đơn giản là để 'ghi nhật ký' và theo dõi quá trình AI làm việc thôi, tiện cho việc 'debug' sau này. Bây giờ, chúng ta đã có 'bộ não' AI, nhưng nó vẫn chưa biết 'hành động' đâu nhé! LLM tuy biết viết code nhưng cần phải có khả năng 'chạy' code đó nữa. Vậy thì, hãy cùng tạo một 'công cụ' đặc biệt để nó có thể 'thực thi' code C# của mình! Dưới đây là cách chúng ta định nghĩa công cụ 'chạy code': ```csharp var chatOptions = new ChatOptions { Tools = [ AIFunctionFactory.Create((string code) => { var logger = loggerFactory.CreateLogger("CodeExecution"); var codeFileName = @$"c:\temp\{DateTime.Now.ToString("HHmmssfff")}-{runId}.cs"; File.WriteAllText(codeFileName, code); var process = new Process { StartInfo = new ProcessStartInfo { FileName = "dotnet", Arguments = $"run {codeFileName}", RedirectStandardOutput = true } }; process.Start(); process.WaitForExit(TimeSpan.FromMinutes(1)); var output = process.StandardOutput.ReadToEnd(); logger.LogInformation("Code execution output: {Output}", output); return output; }, description: "Execute the provided code.") ] }; ``` Dòng code này chính là 'trái tim' của công cụ 'thực thi code' của chúng ta. Nó nhận vào một đoạn `code` (string), sau đó 'biến' nó thành một file `.cs` tạm thời, và dùng lệnh `dotnet run` để 'hô biến' code đó thành hiện thực. Kết quả từ việc chạy code (bao gồm cả lỗi nếu có) sẽ được ghi lại và 'báo cáo' lại cho AI biết để nó 'học' hỏi và tự sửa lỗi nếu cần. À, bạn thấy `ChatOptions` và `UseFunctionInvocation` chứ? Đó chính là cách chúng ta 'kết nối' công cụ này với AI. Chúng ta 'treo' cái công cụ 'chạy code' vào `ChatOptions`, và khi AI nhận được một nhiệm vụ, nó sẽ tự động 'nghĩ' xem có cần dùng đến công cụ này để hoàn thành nhiệm vụ không. Nếu có, nó sẽ tự động 'kích hoạt' nó! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/YwNq9U1.png' alt='Quy trình tương tác: User Prompt -> LLM -> Tool Execution -> Feedback'> Giờ thì cần một 'chiếc kim chỉ nam' – chính là `system prompt` – để 'dạy' AI cách viết code sao cho đúng chuẩn, đặc biệt là cách 'gọi' các gói NuGet và cấu trúc code sao cho phù hợp với .NET 10. Bởi vì sao ư? Vì các 'bộ não' AI thường được huấn luyện trên code C# cũ kỹ, nên chúng hay có thói quen viết cái `Program class` với `Main method` rườm rà lắm! Phải 'ép' nó 'quên đi lối cũ' đó bạn! ```csharp var history = new List<ChatMessage> { new(ChatRole.System, """ Write code to answer the question. If you need to use a NuGet package, specify the package name in the code like this: #:package PackageName. Some examples: #:package [email protected] #:package SemanticKernel #:package Newtonsoft.Json A code block should start with the required NuGet packages, if any, followed by one or more using statements, followed by the code. You can directly write code statements without a program class with a main method. ### Example 1 #:package [email protected] #:package SomePackage using System; Console.WriteLine("123".Humanize()); ### Example 2 #:package Microsoft.Extensions.Logging.Console using System.IO; var text = await File.ReadAllTextAsync("c:\\temp\\file.txt"); Console.WriteLine(text); ### Write and execute code to answer the question. Do not ask the user for any input, just complete all the steps below by writing and executing the code without asking for clarification or consent. """), new(ChatRole.User, """ 1. Fetch the csv file from the url 'https://raw.githubusercontent.com/fgeorges/star-wars-dataset/refs/heads/master/csv/films/films.csv' 2. Analyze the content and determine the delimiter used in the csv file. Keep in mind that text columns may contain commas as well, e.g. "A New Hope, Episode IV". 3. Determine which columns are present in the csv file and what data the columns contain. 4. Order the movies by release date, Newest first. 5. Write a .docx word document at 'c:\\temp\\star_wars_movie.docx' with one line per page with the following information: - release date - title - description """ ) }; ``` Và đây là 'nhiệm vụ bất khả thi' mà chúng ta giao cho AI: đọc file CSV từ URL, xác định dấu phân cách, phân tích cột, sắp xếp phim theo ngày phát hành, rồi ghi tất cả vào một file Word! Nghe có vẻ 'khoai' đúng không? Nhưng AI của chúng ta sẽ 'cân' hết! Bước cuối cùng là 'đẩy' những 'chỉ dẫn' này vào mô hình và chờ đợi 'buổi code' đầy cảm hứng của AI hoàn thành: ```csharp var result = await client.GetResponseAsync(history, chatOptions); Console.WriteLine($"LLM response: {result}"); ``` <a href="#reviewing-the-performance"> </a> ### 'Khám Nghiệm' Hiệu Suất: AI Tự Học Từ Lỗi Lầm Bạn có thể xem toàn bộ 'phù phép' này trong file gist tại <a href="https://gist.github.com/Expecho/0f0e30a7097676ea777bec47b764e994" target="_blank" rel="noopener noreferrer">đây</a>. Sau khi 'cầm' được nó, bạn chỉ cần chạy `dotnet run vibecoding_agent.cs` là xong! Nếu 'AI nhà mình' đang trong 'vibe' tốt, bạn sẽ thấy chỉ một file duy nhất 'xuất hiện' trong `C:\Temp`. Nhưng thường thì, 'ẻm' cần vài lần 'thử sai' mới ra được code chuẩn chỉnh. Hay ở chỗ, AI sẽ 'đọc' output từ lệnh `dotnet run`, tự nhận diện lỗi (lỗi biên dịch hay lỗi lúc chạy), rồi tự động 'sửa sai' và thử lại. Giống như một lập trình viên thực thụ vậy đó! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/O6Ld04p.png' alt='Mô hình AI tự sửa lỗi và tối ưu code'> Và đây là 'thành quả' sau khi AI của mình 'vật lộn' một hồi (đây là phản hồi trực tiếp từ LLM): <blockquote> Analysis and Results: Delimiter: The delimiter used in the CSV is a comma (,). Columns present: title episode_id opening_crawl director producer release_date created edited url desc Data in Columns: title: The movie title (e.g. "A New Hope"). episode_id: The Star Wars episode number. opening_crawl: The long Star Wars intro text that appears at the start of the film. director: Film director name(s). producer: Producer name(s). release_date: Release date of the movie (e.g. "1977-05-25"). created, edited: Timestamps (likely for internal dataset management). url: URL reference for the film. desc: Another description, but appears redundant with opening_crawl. Word Document Output: The movies are ordered by release date, newest first, and written one per page. Each page includes release date, title, and description (using opening_crawl). File written: c:/temp/star_wars_movie.docx Summary of document: The document contains 7 movies, each on its own page, with release date, title, and description. Let me know if you want to see the content or need a different format! </blockquote> AI không chỉ cho ra kết quả phân tích CSV chi tiết mà còn 'tự động' tạo ra file Word với đúng định dạng yêu cầu nữa chứ! Quá đỉnh luôn! Bạn có thể tải toàn bộ 'tài liệu' này, bao gồm cả file Word cuối cùng và các 'phiên bản' code thử nghiệm của AI tại <a href="https://1drv.ms/f/c/e7c07309b5330772/EgzBSP2FZohMnJHhbGx97RYBrHt-EHheT2g2_Oc-f4BdiQ?e=3urUIh" target="_blank" rel="noopener noreferrer">đây</a>. <a href="#final-thoughts"> </a> ### Suy Ngẫm Cuối Cùng: Tiềm Năng và Cảnh Báo Mình đã thử với vài 'bộ não' AI khác nhau và kết quả thì... 'hên xui' lắm. Có em thì 'bỏ cuộc' giữa chừng, hỏi mình có muốn tiếp tục không. Có em thì viết code nhưng lại 'nhờ' mình chạy hộ, dù đã được 'trang bị' công cụ 'chạy code' rồi! Đúng là 'thuần hóa' AI cũng cần 'kiên nhẫn' và 'nghệ thuật prompt' đó bạn! **MỘT CẢNH BÁO CỰC KỲ QUAN TRỌNG:** Một điều bạn phải nhớ kỹ khi làm việc với các AI Agent có khả năng thực thi code: code do AI tạo ra (hoặc bất kỳ code nào chưa kiểm chứng) **CHỈ NÊN CHẠY TRONG MÔI TRƯỜNG CÔ LẬP, ĐƯỢC BẢO VỆ (SANDBOXED)**. Vì sao ư? Vì chúng ta không thể đảm bảo 100% rằng không có code độc hại hay các phụ thuộc 'lởm khởm' nào bị chèn vào đâu nhé! An toàn là trên hết! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/eB3R4zZ.png' alt='Môi trường sandbox an toàn cho việc thực thi code AI'> Vậy thì, những AI Agent kiểu này sẽ có 'đất diễn' ở đâu nhỉ? Thành thật mà nói, mình cũng chưa hình dung rõ lắm đâu. Mình được truyền cảm hứng từ <a href="https://microsoft.github.io/autogen-for-net/" target="_blank" rel="noopener noreferrer">AutoGen for .Net</a>, một dự án cho phép <a href="https://microsoft.github.io/autogen-for-net/articles/Run-dotnet-code.html" target="_blank" rel="noopener noreferrer">chạy các đoạn code</a>. Mình nghĩ .NET 10 đã 'hạ thấp rào cản' để chúng ta có thể tạo ra những AI Agent có khả năng 'code' đỉnh cao hơn nhiều. Bạn nghĩ sao? Đây có phải là một tính năng 'đáng đồng tiền bát gạo' không? Mình rất tò mò muốn nghe ý kiến của bạn đó, đừng ngại để lại bình luận bên dưới nhé!
Khám phá sức mạnh của async/await trong C# để xây dựng các ứng dụng phản hồi nhanh, hiệu quả và có khả năng mở rộng. Bài viết giải thích chi tiết cách hoạt động, lợi ích và các ví dụ thực tế giúp bạn làm chủ lập trình bất đồng bộ.
Khám phá cách xây dựng AI Agent thông minh dùng .NET để tự động viết và thực thi code C#. Tìm hiểu về vibe coding, .NET 10, LLM và khả năng gọi công cụ để giải quyết các nhiệm vụ phức tạp. Đừng bỏ lỡ bài hướng dẫn chi tiết này!
Khám phá cách triển khai Outbox Pattern "siêu đỉnh" với SQL Server và thư viện Brighter trong .NET 8+. Đảm bảo nhất quán giao dịch và tin nhắn không bao giờ thất lạc trong các hệ thống phân tán, từ thiết kế bảng Outbox đến tích hợp Dependency Injection và xử lý lỗi hiệu quả.
Bạn có "nghiện" LLM nhưng lại đau đầu với kiến trúc dự án? Khám phá Spiderly - Framework mã nguồn mở giúp xây dựng ứng dụng web nhanh chóng, chuẩn mực với khả năng tự động sinh mã quản trị Entity, xác thực, và nhiều tính năng thiết yếu khác. Tiết kiệm thời gian, tập trung vào logic nghiệp vụ và xây dựng nền tảng vững chắc cho mọi dự án.
Khám phá cách xây dựng Microservices 'chai lì' với C# và .NET: từ các nguyên tắc thiết kế cốt lõi đến các mẫu như Retry và Circuit Breaker. Tìm hiểu cách tạo ra các dịch vụ chịu lỗi, mở rộng hiệu quả và dễ quản lý, kèm theo ví dụ code thực tế và mẹo xử lý sự cố.
Bạn có bao giờ cảm thấy 'lạc lối' giữa rừng kiến thức về kiến trúc phần mềm không? Bài viết này sẽ 'mổ xẻ' khi nào các mẫu kiến trúc 'đình đám' như Domain-Driven Design (DDD), Clean Architecture hay Command Query Responsibility Segregation (CQRS) thực sự 'cứu cánh' chúng ta, và khi nào thì chúng ta lại tự 'gây họa' bằng những sự trừu tượng không cần thiết – mà điển hình là anh bạn Generic IRepository 'đa năng' quá mức. Chúng ta cũng sẽ 'khui' ra một anh chàng cực kỳ hữu ích trong .NET là IServiceScopeFactory để bạn hiểu rõ hơn về cách quản lý vòng đời dịch vụ sao cho 'chuẩn bài' nhất.
Khám phá cách xây dựng ứng dụng AI tạo sinh miễn phí với GitHub Models và Semantic Kernel trong C#. Hướng dẫn chi tiết từ cài đặt, tạo token đến xây dựng chatbot.
Chào các bạn coder và những ai đang "đắm chìm" trong thế giới AI đầy mê hoặc! Chắc hẳn bạn đã từng trải qua cảm giác phấn khích tột độ khi "thai nghén" ra một hệ thống AI siêu việt, đúng không? Nhưng khoan đã, hành trình chưa dừng lại ở đó đâu nhé! Một trong những thử thách "khó nhằn" nhất khi phát triển AI là làm sao để hệ thống của bạn không chỉ "ngon lành" lúc mới ra lò, mà còn phải "trường tồn" và thích nghi tốt khi nó lớn mạnh, được triển khai ra thế giới thật.Tưởng tượng mà xem, việc tạo mẫu (prototyping) AI có thể rất vui và đầy hào hứng, nhưng cuối cùng, "đứa con" AI của chúng ta cần được "thả" vào đời thực và "trưởng thành" theo thời gian. Và việc "trưởng thành" này có thể đến từ vô vàn thay đổi: Thay đổi "câu thần chú" (system prompt) để AI thông minh hơn hoặc sửa lỗi. "Đổi tim" cho AI bằng cách thay thế mô hình ngôn ngữ lớn (LLM) hoặc mô hình nhúng (embedding model) đang dùng. "Trang bị thêm vũ khí" cho AI, cho phép nó gọi thêm các công cụ mới (đặc biệt trong các kịch bản gọi hàm với Semantic Kernel hay Model Context Protocol). Thay đổi "sách vở" mà AI dùng để học (dữ liệu cho Retrieval Augmentation Generation - RAG), điều này thường diễn ra tự nhiên khi dữ liệu mới được thêm vào.Dù nguyên nhân thay đổi là gì đi nữa, các tổ chức đều cần một "công cụ" hiệu quả và lặp lại được để đánh giá xem hệ thống AI đàm thoại của họ phản hồi ra sao trong các tình huống phổ biến. Đây chính là lúc "siêu anh hùng" Microsoft.Extensions.AI.Evaluation xuất hiện! Đây là một thư viện mã nguồn mở giúp bạn "thu thập" và "so sánh" các chỉ số khác nhau liên quan đến hiệu suất của hệ thống AI của mình.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AICheckup.png' alt='Kiểm tra sức khỏe AI'>Trong bài viết này, chúng ta sẽ "mổ xẻ" cái khung kiểm thử LLM này, khám phá từng chỉ số đánh giá như Độ Tương Đồng (Equivalence), Độ Căn Cứ (Groundedness), Độ Trôi Chảy (Fluency), Mức Độ Liên Quan (Relevance), Độ Mạch Lạc (Coherence), Khả Năng Truy Xuất (Retrieval) và Độ Đầy Đủ (Completeness). Tất cả đều qua những đoạn code C# "thân thiện" trong một ứng dụng .NET nhỏ xinh.Đoạn code trong bài này sẽ sử dụng OpenAI để "tạo ra" các cuộc trò chuyện và sau đó dùng Microsoft.Extensions.AI.Evaluation để "chấm điểm" kết quả. À, bật mí nhỏ: Microsoft.Extensions.AI và Microsoft.Extensions.AI.Evaluation không chỉ "chơi" được với OpenAI đâu nhé! Chúng còn có thể làm việc với các nhà cung cấp mô hình khác, kể cả các mô hình chạy cục bộ (như Ollama) hay các dịch vụ có API tương thích OpenAI (như LM Studio).<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIEvaluationFlow.png' alt='Luồng đánh giá AI'>Các chỉ số đánh giá này được tạo ra bằng cách gửi một phiên trò chuyện đến OpenAI để "chấm điểm", đồng thời cung cấp một danh sách các "giám khảo" (evaluators) để chạy trên chỉ số đó. Vì vậy, chúng ta sẽ cần kết nối với OpenAI không chỉ để AI trả lời mà còn để lấy luôn các chỉ số đánh giá cho cuộc trò chuyện đó nữa.1. Kết nối với "não bộ" OpenAI:Để kết nối, bạn chỉ cần cung cấp một API key và tùy chọn là một endpoint (nếu bạn dùng OpenAI triển khai tùy chỉnh). Chúng ta sẽ dùng OpenAIClient và IChatClient từ gói NuGet Microsoft.Extensions.AI. Đoạn code này giống như việc bạn "thiết lập đường dây nóng" để máy tính của bạn có thể "tám chuyện" với OpenAI vậy đó!2. Xây dựng "kịch bản trò chuyện" (Chat History):Cả việc đánh giá và tạo phản hồi trò chuyện đều cần có một lịch sử cuộc trò chuyện. Hãy cùng "diễn tập" một tình huống nhỏ bằng cách tạo đối tượng ChatHistory và điền vào một cuộc tương tác ngắn gọn.Lịch sử cuộc trò chuyện của chúng ta gồm một "lệnh điều hướng" (system prompt), một lời chào từ trợ lý AI, và một tin nhắn giả định từ người dùng. Bình thường thì người dùng sẽ tự gõ tin nhắn, nhưng ở đây, để tập trung vào việc đánh giá một tương tác đơn giản, chúng ta "gõ cứng" nó vào code luôn.Cái "lệnh điều hướng" (system prompt) này thường là thứ bạn sẽ muốn "mày mò" và chỉnh sửa nhiều nhất để AI hoạt động tốt hơn, nên tôi sẽ chia sẻ cái prompt đơn giản trong ví dụ này: `You are a chatbot designed to help the user with simple questions. Keep your answers to a single sentence.` Dịch nôm na là: "Bạn là một chatbot được thiết kế để giúp người dùng trả lời các câu hỏi đơn giản. Hãy giữ câu trả lời của bạn trong một câu duy nhất." Mặc dù các chỉ số đánh giá mà chúng ta sẽ thu thập liên quan đến toàn bộ hệ thống AI, nhưng trên thực tế, một trong những mục đích chính bạn dùng các chỉ số này là để "tinh chỉnh" cái system prompt, giúp AI "ăn khớp" hơn với các tình huống cụ thể.À, lưu ý thêm là tôi đang "giả lập" Retrieval Augmentation Generation (RAG) ở đây bằng cách chèn một biến ragContext chứa một chuỗi đơn giản về ngày hiện tại. RAG không phải trọng tâm chính của bài này, nhưng nó sẽ "có mặt" trong chỉ số Retrieval (Khả Năng Truy Xuất) sau này. Nếu tò mò về RAG, bạn có thể xem bài viết của tôi về RAG với Kernel Memory.3. "Thụ lý hồ sơ" và "phản hồi" từ AI (Getting Chat Completions):Việc lấy phản hồi từ AI khá đơn giản một khi chúng ta có lịch sử trò chuyện. Chỉ cần một cuộc gọi "siêu tốc" đến IChatClient:Đoạn code này sẽ "chạy" đến OpenAI với lịch sử trò chuyện giả lập và lấy phản hồi cho tin nhắn, sau đó hiển thị cho người dùng. (Lưu ý: Tôi đang dùng Spectre.Console để làm ứng dụng mẫu dễ đọc hơn, nhưng bạn hoàn toàn có thể dùng Console.WriteLine bình thường.)Tình huống mẫu của chúng ta là một cuộc trò chuyện ngắn gọn nơi người dùng hỏi AI về ngày tháng: AI: How can I help you today? User: Is today after May 1st? If so, tell me what the next month will be. AI: Yes, today is after May 1st, and the next month will be June.Vì ngày trong tương tác này là 27 tháng 5, phản hồi của AI là "chuẩn không cần chỉnh" về mặt thực tế. Tuy nhiên, kết quả đánh giá sẽ "phán" rằng nó chưa thật sự "đầy đủ" vì AI không nói rõ ngày hiện tại trong phản hồi của mình.Với IChatClient đã sẵn sàng và phản hồi AI đã có, giờ là lúc "chấm điểm" thôi!4. "Chấm điểm" phản hồi AI (Evaluating Chat Completions):Microsoft.Extensions.AI.Evaluation cho phép bạn chỉ định một hoặc nhiều đối tượng "giám khảo" (evaluator) để "chấm điểm" hiệu suất của hệ thống AI cho một tương tác mẫu.Đây là một ví dụ đơn giản với CoherenceEvaluator, dùng để đảm bảo phản hồi của AI mạch lạc và dễ đọc:Đoạn code này sẽ tạo ra một đối tượng EvaluationResult chứa duy nhất một chỉ số về "độ mạch lạc" của hệ thống AI của bạn.Chỉ số này sẽ là một NumericMetric với giá trị số từ 1 đến 5 (1 là "khá tệ" và 5 là "gần như hoàn hảo"). Mỗi chỉ số cũng sẽ bao gồm một thuộc tính Reason (Lý do), giải thích tại sao LLM lại đưa ra xếp hạng đó. Điều này giúp bạn hiểu được điều gì còn thiếu sót ở những phản hồi dưới điểm 5 và cũng rất hữu ích cho việc báo cáo.5. "Đa điểm" – Chấm nhiều chỉ số cùng lúc (Evaluating Multiple Metrics):Hầu hết thời gian, bạn sẽ muốn xem xét không chỉ một mà rất nhiều chỉ số khác nhau. Ví dụ sau đây minh họa điều này bằng cách sử dụng CompositeEvaluator – một "hội đồng giám khảo" bao gồm nhiều giám khảo nhỏ hơn:Bạn có thể nhận thấy rằng chúng ta đang định nghĩa một tập hợp context (ngữ cảnh/tài liệu tham khảo) của các đối tượng EvaluationContext và cung cấp nó cho lời gọi EvaluateAsync.Các đối tượng ngữ cảnh này rất cần thiết cho một số "giám khảo" tiên tiến hơn. Mặc dù một số giám khảo có thể tự hoạt động, nhưng một vài trong số chúng cần bạn cung cấp thêm chi tiết về thông tin nào lẽ ra phải được truy xuất, một phản hồi lý tưởng trông như thế nào, và thông tin nào tuyệt đối phải có trong phản hồi.Nếu bạn quên cung cấp các đối tượng ngữ cảnh này, sẽ không có lỗi xảy ra, nhưng các giá trị chỉ số cho các giám khảo liên quan sẽ bị thiếu.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIContext.png' alt='Ngữ cảnh cho đánh giá AI'>6. "Báo cáo" kết quả đánh giá (Displaying evaluation results):Các chỉ số đánh giá rất hữu ích, nhưng nếu cứ nhìn thủ công thì "nhức mắt" lắm. May mắn thay, chúng không quá khó để hiển thị thành một bảng bằng Spectre.Console.Đoạn code C# sau sẽ lặp qua từng chỉ số trong EvaluationResult, thêm nó vào một Table và hiển thị ra console:Kết quả sẽ trông như một "bảng điểm" đẹp mắt như hình ảnh sau:<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2cbzelppwo5u68gzw6y.png' alt='Bảng kết quả đánh giá AI'>Có một bảng hiển thị chỉ số được định dạng đẹp mắt giúp bạn dễ dàng "chụp" và chia sẻ hiệu suất của hệ thống AI, cũng như giao tiếp với người khác.Microsoft.Extensions.AI.Evaluation còn có các khả năng báo cáo HTML và JSON tuyệt vời, cùng với khả năng kiểm tra nhiều lần lặp và tình huống trong cùng một lần chạy đánh giá. Phạm vi của những tính năng này nằm ngoài bài viết này, nhưng tôi dự định sẽ đề cập đến chúng trong một bài viết tương lai.Giờ thì chúng ta đã biết cách lấy các chỉ số đánh giá, hãy cùng "giải mã" ý nghĩa của từng chỉ số đó nhé!Các chỉ số "chất lượng" của hệ thống AI:Hãy cùng khám phá các chỉ số AI hiện đang được Microsoft.Extensions.AI.Evaluation hỗ trợ nhé.1. Độ Tương Đồng (Equivalence): AI nói có giống ý mình muốn không?Độ Tương Đồng kiểm tra xem phản hồi của hệ thống có "khớp" xấp xỉ với phản hồi mẫu mà chúng ta đã "mã hóa" trong CompletenessEvaluatorContext hay không. Nói một cách đơn giản, nó đo lường xem phản hồi của AI có "gần" với những gì chúng ta mong đợi hay không. Giống như bạn ra đề bài và AI trả lời có đúng trọng tâm không vậy đó!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIEquivalence.png' alt='Chỉ số tương đồng của AI'>2. Độ Căn Cứ (Groundedness): AI có nói "láo" không? Có dựa vào sự thật không?Độ Căn Cứ đảm bảo rằng AI đang sử dụng các "sự thật" liên quan để trả lời người dùng. Điều này giúp chắc chắn rằng LLM không đưa ra một câu trả lời "sai bét nhè" so với những gì chúng ta mong đợi. Chỉ số này rất hữu ích cho các tổ chức có danh sách các điểm cụ thể cần đề cập hoặc các thuật ngữ/định nghĩa riêng biệt có thể khác một chút so với thông tin công khai.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIGroundedness.png' alt='Chỉ số căn cứ của AI'>3. Độ Trôi Chảy (Fluency): AI nói có "thuận tai" không? Ngữ pháp đúng không?Độ Trôi Chảy kiểm tra tính đúng ngữ pháp và việc tuân thủ các quy tắc cấu trúc và cú pháp. Tóm lại, nó đánh giá xem hệ thống có đang tạo ra thứ gì đó "chuẩn tiếng Việt" (hoặc ngôn ngữ khác) hay chỉ là "một mớ bòng bong" khó hiểu. (Lưu ý: Tôi đoán Fluency cũng sẽ hoạt động với các ngôn ngữ khác mà LLM của bạn hỗ trợ, nhưng tôi chưa kiểm chứng điều này).<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIFluency.png' alt='Chỉ số trôi chảy của AI'>4. Độ Mạch Lạc (Coherence): AI nói có "dễ hiểu" không? Có trôi chảy không?Độ Mạch Lạc là một kiểm tra "độ dễ đọc" để đảm bảo câu trả lời của AI dễ đọc và có "dòng chảy" tốt. Nếu Độ Trôi Chảy có thể được coi là một "kiểm tra ngữ pháp", thì Độ Mạch Lạc giống như một "biên tập viên" giúp tối ưu hóa đầu ra của bạn để dễ đọc hơn.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AICoherence.png' alt='Chỉ số mạch lạc của AI'>5. Mức Độ Liên Quan (Relevance): AI trả lời có đúng trọng tâm không?Chỉ số này đã được dùng trong RelevanceTruthAndCompletenessEvaluator (RTC). Nó kiểm tra xem phản hồi của AI có liên quan đến câu hỏi của người dùng và các thông tin đã cung cấp hay không. Về cơ bản, nó đảm bảo AI không "lạc đề".<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIRelevance.png' alt='Chỉ số liên quan của AI'>6. Khả Năng Truy Xuất (Retrieval): RAG có tìm đúng thông tin không?Khả Năng Truy Xuất "chấm điểm" hiệu quả của các hệ thống RAG trong việc cung cấp "ngữ cảnh" (context) liên quan cho hệ thống AI để phản hồi truy vấn. Chỉ số này được thiết lập thông qua đối tượng RetrievalEvaluatorContext.Điểm truy xuất thấp có thể chỉ ra rằng bạn đang có "khoảng trống" trong nội dung của mình, nơi hệ thống không thể tìm thấy thông tin liên quan. Hoặc, bạn có thể có nội dung liên quan, nhưng nó không được tổ chức theo cách mà mô hình nhúng và chỉ mục của bạn có thể truy xuất hiệu quả.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AIRetrieval.png' alt='Chỉ số truy xuất của AI'>7. Độ Đầy Đủ (Completeness): AI nói có "đủ ý" không?Độ Đầy Đủ kiểm tra để đảm bảo rằng phản hồi của AI cho người dùng bao gồm tất cả các điểm chính mà phản hồi mẫu bạn đã cung cấp cho CompletenessEvaluatorContext chứa.Trong ví dụ của chúng ta, phản hồi của hệ thống là đúng nhưng "chưa đủ" vì nó không bao gồm ngày hiện tại trong đầu ra của mình.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AICompleteness.png' alt='Chỉ số đầy đủ của AI'>8. "Đánh giá toàn diện" – RTC Evaluators (Relevance, Truth, Completeness):Microsoft cũng cung cấp một "giám khảo" mới hơn và vẫn đang trong giai đoạn thử nghiệm – RelevanceTruthAndCompletenessEvaluator (RTC). Nó "gom" các hiệu ứng của RelevanceEvaluator, GroundednessEvaluator và CompletenessEvaluator vào một "giám khảo" duy nhất mà không cần bất kỳ ngữ cảnh nào."Giám khảo" RTC này vẫn đang trong giai đoạn xem trước và có thể thay đổi đáng kể hoặc bị loại bỏ, nhưng nó có một số ưu điểm cốt lõi so với việc sử dụng ba giám khảo riêng lẻ: Nhanh hơn: Chỉ cần một yêu cầu đánh giá duy nhất thay vì ba yêu cầu riêng biệt. Tiết kiệm: Tiêu thụ ít token hơn, dẫn đến chi phí đánh giá hệ thống của bạn rẻ hơn khi sử dụng các LLM tính phí theo token. Dễ dùng: Không yêu cầu bạn cung cấp thêm ngữ cảnh cho "giám khảo".Khi "giám khảo" RTC này thoát khỏi giai đoạn xem trước, nó có thể là một lựa chọn tốt cho các nhóm chỉ muốn làm việc với một "giám khảo" duy nhất vì lý do chi phí hoặc hiệu suất.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AITRC.png' alt='Chỉ số RTC của AI'>Những bước "thần tốc" tiếp theo:Trong bài viết này, chúng ta đã "mục sở thị" cách bạn có thể thu thập vô vàn chỉ số liên quan đến hiệu suất của các hệ thống AI chỉ với vài dòng code C# "thần thánh".Tôi rất khuyến khích bạn "nhảy" vào khám phá mã nguồn của bài viết này trên GitHub và "vọc vạch" nó với API Key và endpoint của riêng bạn. Microsoft cũng có rất nhiều mẫu ví dụ liên quan đến thư viện của họ, rất đáng để bạn tìm hiểu thêm.Khả năng này "mở khóa" rất nhiều con đường thú vị cho các tổ chức, bao gồm: Tạo các bài kiểm tra tích hợp (integration tests) sẽ "báo động" nếu các chỉ số thấp hơn một ngưỡng nhất định cho các tương tác quan trọng. "Thử nghiệm" với các system prompt khác nhau theo cách tương tự như A/B testing, nhưng sử dụng "giám khảo" LLM để "phân xử" ai thắng. Tích hợp các bài kiểm tra này vào quy trình MLOps hoặc CI/CD để đảm bảo bạn không bao giờ "lỡ tay" triển khai các hệ thống AI bị suy giảm hiệu suất đột ngột.Là một người "rất sợ tốn kém", việc có một framework tự động để đánh giá hiệu suất của các hệ thống dựa trên LLM và có thể cung cấp các mô hình của riêng mình (bao gồm cả Ollama) là một khả năng "thiết yếu" và mở ra nhiều quy trình làm việc mà tôi thường không thể tiếp cận.Mặc dù bài viết này đã bao quát các khả năng đánh giá của Microsoft.Extensions.AI.Evaluation, nhưng nó chỉ mới "chạm nhẹ" vào bề mặt các tính năng của thư viện này thôi. Hãy "đón xem" phần hai của bài viết này, nơi chúng ta sẽ "đào sâu" vào các tùy chọn báo cáo và khả năng A/B testing nâng cao hơn nhé!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AInextsteps.png' alt='Các bước tiếp theo cho AI'>
Khám phá cách kết hợp Object-Oriented Programming (OOP) và Functional Programming (FP) để xây dựng hệ thống phần mềm mạnh mẽ, dễ mở rộng và dễ bảo trì. Bài viết đi sâu vào các kỹ thuật như Result Type, Strategy Pattern, Result Pipelines, CQRS và cách loại bỏ các câu lệnh rẽ nhánh truyền thống bằng Java 21+ và C# .NET 9.0.
Bạn là dân .NET chính hiệu? Vậy chắc hẳn đã từng "xoắn não" khi nghĩ đến chuyện "dụ dỗ" mấy em AI xịn sò như Gemini của Google vào ứng dụng của mình rồi, đúng không? Bình thường, để làm được việc này, bạn phải "đổ mồ hôi sôi nước mắt" với cả tá công đoạn: nào là setup HTTP client, nào là cân đo đong đếm payload API, rồi còn phải "đấu tranh" với giới hạn tốc độ truy cập (rate limit), và cuối cùng là "mổ xẻ" cái mớ phản hồi trả về. Nghe thôi đã thấy "khó nuốt" rồi phải không?Nhưng mà khoan đã, nếu bạn mới chập chững bước vào thế giới LLM, hoặc đơn giản là muốn một giải pháp "nhanh-gọn-lẹ-siêu-tốc", thì đây rồi, "người hùng" <a href="https://deepmain.io">MaIN.NET</a> chính là "cứu cánh" của bạn! Thư viện này sẽ giúp bạn "kết nối" với Gemini chỉ bằng VÀI DÒNG CODE. Bạn không tin ư? Cứ đọc tiếp đi, bài viết này sẽ "bật mí" cho bạn cách cấu hình ứng dụng để "bắt tay" với Gemini và thậm chí còn có một dự án ví dụ "siêu to khổng lồ" (nhưng dễ hiểu) để bạn tự mình kiểm chứng sức mạnh của nó đó! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/main_net_hero.png' alt='MaIN.NET giúp tích hợp LLM dễ dàng'>Bạn cần chuẩn bị gì để "chiến" cùng MaIN.NET và Gemini?<li> **<a href="https://dotnet.microsoft.com/en-us/download">.NET SDK</a>:** Chắc chắn rồi, không có cái này thì sao "code" được đúng không?</li><li> **Khóa API Gemini:** Bạn có thể lấy từ <a href="https://aistudio.google.com/">Google AI Studio</a> hoặc Vertex AI. Đây là "chìa khóa" để ứng dụng của bạn "tám chuyện" được với Gemini đó.</li><li> **IDE hoặc trình soạn thảo văn bản:** Như Visual Studio Code, Rider, hoặc Cursor – tùy vào "gu" của bạn nhé!</li><li> **Kết nối Internet:** Cái này thì khỏi nói rồi, API mà không có mạng thì khác gì người không có "não" đâu!</li><img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/checklist_setup.png' alt='Những thứ cần chuẩn bị trước khi bắt đầu'>💡 **Bật mí cực xịn:** Tin nóng hổi đây! Hiện tại, Google đang "chiêu đãi" chúng ta một chính sách MIỄN PHÍ cực kỳ "hào phóng" cho việc sử dụng Gemini API thông qua cả AI Studio và Vertex AI. Đây chính là "thời điểm vàng" để bạn tha hồ vọc vạch, thử nghiệm các tính năng "đỉnh của chóp" của LLM mà không phải "xắn tay áo" móc ví ra đâu nhé! À, nhớ "ngó nghiêng" giới hạn quota của bạn trong Google Cloud Console hoặc tài khoản AI Studio để tránh "đụng trần" nha.Vậy MaIN.NET là “thứ” gì mà "hot" vậy?<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/main_net_architecture.png' alt='Kiến trúc MaIN.NET'>Hãy tưởng tượng MaIN.NET như một "phiên dịch viên" siêu đẳng, hay một "cánh cổng thần kỳ" vậy. Nó là một framework mã nguồn mở cực kỳ mạnh mẽ, được sinh ra để "chuẩn hóa" việc kết nối các ứng dụng .NET của bạn với đủ loại "bộ não" LLM khác nhau, dù chúng chạy "tại gia" trên máy tính của bạn hay "trên mây" ở tận đâu đó. MaIN.NET "nắm tay" rất nhiều "ngôi sao" trong giới AI như OpenAI, Gemini, Mistral, Llama, Deepseek, Qwen... và còn cả một "biệt đội" nữa đang chờ bạn khám phá.Cái "siêu hay ho" của MaIN.NET là nó "đóng gói" toàn bộ những cuộc gọi HTTP "rối rắm" cấp thấp lại, rồi "bày sẵn" cho bạn một giao diện API "đơn giản như đan rổ". Nghĩa là, bạn sẽ không còn phải "đánh vật" với từng dòng code HTTP khô khan nữa! Thay vào đó, bạn chỉ cần "chỉ mặt đặt tên" cho backend bạn muốn dùng, rồi "triệu hồi" các phương thức có sẵn của MaIN.NET, thế là xong! Nó sẽ "tự động lo liệu" mọi thứ từ A đến Z. Thật sự là DỄ NHƯ ĂN KẸO!Tích hợp Gemini vào .NET: Dễ không tưởng tượng nổi! Đến đây chắc bạn đang tò mò lắm đúng không? Vậy thì, "show hàng" luôn! Đây là toàn bộ đoạn code "thần thánh" bạn cần để "hô biến" Gemini xuất hiện trong ứng dụng .NET của mình với sự giúp sức của MaIN.NET:<pre><code>using MaIN.Core;using MaIN.Core.Hub;using MaIN.Domain.Configuration;MaINBootstrapper.Initialize(configureSettings: (options) =>{ options.BackendType = BackendType.Gemini; options.GeminiKey = "YOUR_GEMINI_API_KEY";});string prompt = "What is LLM?";var response = await AIHub.Chat() .WithModel("gemini-2.0-flash") .WithMessage(prompt) .CompleteAsync(interactive: true);string result = response.Message.Content;Console.WriteLine(result);</code></pre>Đừng quên thay `"YOUR_GEMINI_API_KEY"` bằng khóa API thật của bạn nhé! Chỉ vài dòng thế này là bạn đã có thể "chat" với Gemini rồi đó.Ứng dụng console "nhỏ nhưng có võ" để "hỏi chuyện" Gemini <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/console_app.png' alt='Ví dụ ứng dụng console giao tiếp với Gemini'>Okela! Giờ thì, hãy cùng nhau "xắn tay áo" tạo một ứng dụng console "mini" thôi, nhưng "có võ" đấy nhé! Ứng dụng này sẽ cho phép bạn "tâm sự" với Gemini, nhập câu hỏi và nhận về những câu trả lời "siêu chất lượng". Sẵn sàng chưa? "Chiến" thôi!**Từng bước một, "cầm tay chỉ việc" đây!**<ol><li> **Tạo dự án mới:**<pre><code>dotnet new console -n GeminiExamplecd GeminiExample</code></pre>Bạn đang "khai sinh" một dự án console mới tinh tươm tên là `GeminiExample` và ngay lập tức "chuyển nhà" vào thư mục của nó.</li><li> **Thêm gói MaIN.NET:**<pre><code>dotnet add package MaIN.NET</code></pre>Lệnh này sẽ "rước dâu" thư viện MaIN.NET về "nhà" dự án của bạn, sẵn sàng để bạn "khai thác" mọi tính năng tuyệt vời của nó.</li><li> **Thêm code của bạn:**Mở file `Program.cs` và dán đoạn code sau vào:<pre><code>using System;using System.Threading.Tasks;using MaIN.Core;using MaIN.Core.Hub;using MaIN.Domain.Configuration;// Khởi tạo MaIN.NET với GeminiMaINBootstrapper.Initialize(configureSettings: (options) =>{ options.BackendType = BackendType.Gemini; options.GeminiKey = "YOUR_GEMINI_API_KEY";});Console.Write("Ask Gemini something: ");var input = Console.ReadLine();var response = await AIHub.Chat() .WithModel("gemini-2.0-flash") .WithMessage(input) .CompleteAsync(interactive: true);Console.WriteLine("\nResponse:");Console.WriteLine(response.Message.Content);</code></pre>Đoạn code "thần kỳ" này sẽ "đánh thức" MaIN.NET, sau đó "nháy mắt" bảo người dùng nhập câu hỏi, rồi nó sẽ "âm thầm" gửi câu hỏi đó đến Gemini thông qua "cầu nối" MaIN.NET và cuối cùng là "trình làng" câu trả lời "độc quyền" nhận được. À, đừng quên "bí kíp" là thay khóa API "xịn" của bạn vào nhé!</li><li> **Chạy ứng dụng:**<pre><code>dotnet run</code></pre>Giờ thì, hãy cùng "thổi lửa" cho ứng dụng của bạn và "mắt tròn mắt dẹt" xem Gemini sẽ "trả lời" bạn như thế nào nhé!Bạn có thể thử hỏi những câu như:<li> `Explain how JWT tokens work` (Giải thích JWT token hoạt động thế nào)</li><li> `Generate 3 creative names for a coffee startup` (Tạo 3 cái tên sáng tạo cho một quán cà phê)</li><li> `What’s the difference between async and parallel in C#?` (Sự khác nhau giữa async và parallel trong C# là gì?)</li></ol>Đằng sau cánh gà: `CompleteAsync()` đang "làm mưa làm gió" gì thế?<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/behind_the_scenes.png' alt='Phía sau hậu trường của MaIN.NET'>Khi bạn "phẩy tay" gọi `CompleteAsync()`, đừng nghĩ MaIN.NET chỉ ngồi chơi xơi nước nha! Đây là những "bí mật" đang diễn ra "phía sau hậu trường" đó:<li> Thư viện MaIN.NET "soạn sửa" yêu cầu API với backend bạn đã chọn (ở đây là Gemini). Giống như việc bạn đang "soạn thảo" một bức thư điện tử cực kỳ chỉnh chu vậy.</li><li> Nó "đóng gói" câu hỏi (prompt) và lựa chọn mô hình của bạn vào đúng "khuôn khổ" mà Gemini mong đợi (chuyển đổi thành JSON hay các định dạng khác).</li><li> Sau đó, nó "tự động" gửi yêu cầu HTTP đi và "xuýt xoa" xử lý phần phản hồi nhận về. Bạn hoàn toàn không cần bận tâm về việc "đóng gói" hay "giải nén" dữ liệu thô nữa.</li><li> Cuối cùng, bạn nhận được kết quả dưới dạng một đối tượng được "đóng gói" gọn gàng, giúp bạn dễ dàng truy cập trực tiếp vào nội dung phản hồi. Nghe đã thấy tiện lợi "tụt quần" rồi đúng không nào?</li>Đi đâu tiếp theo? "Sân chơi" còn rộng lắm!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/next_steps.png' alt='Khám phá thêm với MaIN.NET'>Nếu bạn đã "cảm nắng" MaIN.NET rồi và muốn "nâng tầm" kỹ năng của mình lên một level mới, vậy thì sao không thử "ra tay" xây dựng một website lung linh dựa trên Blazor và tích hợp "em" Gemini vào đó xem sao? Đây nè, có ngay <a href="https://dev.to/paweljanda/build-a-local-chatgpt-like-app-with-blazor-and-mainnet-part-1-getting-started-with-llm-16j">bài hướng dẫn cực chi tiết về việc sử dụng MaIN.NET với Blazor</a>, đảm bảo bạn sẽ "khởi động" trơn tru thôi!Tổng kết lại: "Phép thuật" MaIN.NET đã "thay đổi cuộc chơi" như thế nào? <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/magic_wand.png' alt='MaIN.NET như cây đũa thần'>Tóm lại, với MaIN.NET, việc "bắt tay" ứng dụng .NET của bạn với Gemini trở nên "nhanh như chớp" và "sạch bong kin kít" hơn bao giờ hết. Bạn không cần phải "vật lộn" với mớ bòng bong như thiết lập HTTP, giải mã JSON hay các luồng xác thực "đau tim" nữa. Nếu bạn đang "ấp ủ" những ý tưởng "điên rồ" với LLM, thì đừng chần chừ! Tầng miễn phí hiện tại của Google chính là "sân chơi" tuyệt vời để bạn tha hồ "quẩy" và kiểm chứng mọi ý tưởng mà không lo "cháy túi". Chúc bạn có những giờ phút "code" thật "phiêu" và "thăng hoa" nhé!
Khám phá Server-Side Rendering (SSR) tĩnh trong Blazor .NET 9 giúp website tải nhanh "thần tốc" và tối ưu SEO hiệu quả. Tìm hiểu lợi ích và cách triển khai để nâng tầm ứng dụng Blazor của bạn.