Thursday, May 14, 2026
GitHubTwitter
GINBOK
Trang chủBài viếtTìm kiếmVề chúng tôi
|ENVIKhám phá
Trang chủBài viếtTìm kiếmVề chúng tôi
🇬🇧 English🇻🇳 Tiếng Việt
Bài viết›Development›Tích hợp OpenAI vào .NET 8 cho giải pháp Optimizely
Development

Tích hợp OpenAI vào .NET 8 cho giải pháp Optimizely

GinbokFeb 6, 20266 phút đọc

Việc tích hợp Trí tuệ Nhân tạo Sinh tạo (GenAI) đang nhanh chóng chuyển từ thử nghiệm chuyên biệt sang nhu cầu kinh doanh cốt lõi. Đối với các nhà phát triển làm việc với các nền tảng mạnh mẽ như Optimizely CMS 12 và Commerce 14, việc tận dụng AI—chẳng hạn như dịch vụ OpenAI hoặc Azure OpenAI—có thể mở khóa hiệu suất lớn trong việc tạo nội dung, cá nhân hóa và quản lý danh mục sản phẩm.

Bài viết này cung cấp hướng dẫn từng bước về cách tích hợp dịch vụ AI một cách sạch sẽ vào cấu trúc ứng dụng .NET 8 hiện có của bạn, đảm bảo khả năng mở rộng và dễ bảo trì, đặc biệt trong bối cảnh của một dự án Optimizely.

1. Thiết lập Nền tảng Dịch vụ AI trong .NET 8

Bảo mật và cấu hình là tối quan trọng khi xử lý các khóa API bên ngoài. Chúng ta sẽ sử dụng hệ thống cấu hình tiêu chuẩn của .NET 8 và mẫu IHttpClientFactory để giao tiếp API mạnh mẽ.

1.1 Thiết lập Cấu hình

Xác định các cài đặt API của bạn trong appsettings.json. Chúng tôi khuyến nghị sử dụng biến môi trường hoặc Azure Key Vault cho các bí mật sản xuất, nhưng cấu trúc này định nghĩa mục tiêu liên kết:

{
  "OpenAISettings": {
    "ApiKey": "sk-YOUR_SECRET_API_KEY",
    "ModelName": "gpt-4o-mini",
    "BaseUrl": "https://api.openai.com/v1/chat/completions"
  }
}

Tạo một lớp cài đặt tương ứng trong MyProject.Model/Settings/OpenAISettings.cs:

namespace MyProject.Model.Settings
{
    public class OpenAISettings
    {
        public const string Position = "OpenAISettings";
        public string ApiKey { get; set; } = string.Empty;
        public string ModelName { get; set; } = string.Empty;
        public string BaseUrl { get; set; } = string.Empty;
    }
}

1.2 Đăng ký Dịch vụ trong Program.cs

Chúng ta đăng ký các cài đặt và cấu hình một HttpClient được đặt tên để xử lý các tiêu đề Ủy quyền (Authorization) cần thiết bằng cách sử dụng các giá trị cấu hình.

// File: MyProject.Web/Program.cs

// ... (Các đăng ký Optimizely hiện có)

builder.Services.Configure<OpenAISettings>(
    builder.Configuration.GetSection(OpenAISettings.Position));

// Đăng ký IHttpClientFactory cho OpenAI
builder.Services.AddHttpClient("OpenAI", (serviceProvider, client) =>
{
    var settings = serviceProvider.GetRequiredService<IOptions<OpenAISettings>>().Value;
    
    client.BaseAddress = new Uri(settings.BaseUrl.Substring(0, settings.BaseUrl.LastIndexOf('/')));
    
    // Đặt tiêu đề khóa API bắt buộc
    client.DefaultRequestHeaders.Authorization = 
        new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", settings.ApiKey);
});

// Đăng ký Dịch vụ AI
builder.Services.AddSingleton<IAIService, OpenAIService>();

var app = builder.Build();
// ...

2. Xây dựng Lớp Dịch vụ AI Sinh tạo

Logic cốt lõi nằm trong một dịch vụ chuyên dụng quản lý việc tuần tự hóa yêu cầu và phản hồi. Chúng ta sẽ sử dụng System.Text.Json để xử lý JSON hiện đại.

2.1 Định nghĩa Hợp đồng Dịch vụ AI

Định nghĩa interface cho dependency injection (MyProject.Model/Services/IAIService.cs):

namespace MyProject.Model.Services
{
    public interface IAIService
    {
        Task<string> GenerateMarketingContentAsync(string inputTopic, int wordCount);
    }
}

2.2 Triển khai Dịch vụ OpenAI

Dịch vụ này xử lý việc xây dựng payload yêu cầu chat OpenAI tiêu chuẩn hóa.

using System.Text.Json;
using Microsoft.Extensions.Options;
using MyProject.Model.Settings;

namespace MyProject.Model.Services
{
    public class OpenAIService : IAIService
    {
        private readonly HttpClient _httpClient;
        private readonly OpenAISettings _settings;

        public OpenAIService(IHttpClientFactory httpClientFactory, IOptions<OpenAISettings> options)
        {
            _httpClient = httpClientFactory.CreateClient("OpenAI");
            _settings = options.Value;
        }

        public async Task<string> GenerateMarketingContentAsync(string inputTopic, int wordCount)
        {
            var systemPrompt = $@"You are an expert marketing copywriter for an e-commerce platform. 
                                  Generate a concise, SEO-friendly marketing description, exactly {wordCount} words long. 
                                  The output must only contain the generated text, nothing else.";
            
            var requestPayload = new
            {
                model = _settings.ModelName,
                messages = new[]
                {
                    new { role = "system", content = systemPrompt },
                    new { role = "user", content = inputTopic }
                },
                temperature = 0.7 
            };

            var jsonContent = JsonSerializer.Serialize(requestPayload);
            var content = new StringContent(jsonContent, System.Text.Encoding.UTF8, "application/json");

            var response = await _httpClient.PostAsync("chat/completions", content);

            if (!response.IsSuccessStatusCode)
            {
                // Ghi nhật ký chi tiết lỗi phản hồi tại đây
                throw new HttpRequestException($"OpenAI API call failed: {response.StatusCode}");
            }

            var responseJson = await response.Content.ReadAsStringAsync();
            
            // Cấu trúc khử tuần tự hóa đơn giản (giả sử phản hồi văn bản trực tiếp)
            using (JsonDocument document = JsonDocument.Parse(responseJson))
            {
                var choice = document.RootElement
                                     .GetProperty("choices")[0]
                                     .GetProperty("message")
                                     .GetProperty("content")
                                     .GetString();
                return choice?.Trim() ?? "Failed to generate content.";
            }
        }
    }
}

3. Tích hợp AI vào Trình chỉnh sửa Optimizely

Khi dịch vụ được xây dựng, các nhà phát triển Optimizely có thể chèn IAIService trực tiếp vào Controllers, Initialization Modules, hoặc các công cụ quản trị tùy chỉnh được sử dụng để chỉnh sửa Content Blocks hoặc các mục trong Commerce Catalog.

Ví dụ, sử dụng nó trong một Content Controller hiện có để cung cấp đề xuất dựa trên tên trang:

// File: MyProject.Web/Controllers/StandardPageController.cs (Ví dụ Khái niệm)
public class StandardPageController : PageControllerBase<StandardPage>
{
    private readonly IAIService _aiService;

    public StandardPageController(IAIService aiService)
    {
        _aiService = aiService;
    }

    [HttpGet]
    public async Task<ActionResult> Index(StandardPage currentPage)
    {
        // Ví dụ sử dụng: Tạo tóm tắt nội dung 
        if (currentPage.ContentSummary == null)
        {
            var topic = $"A marketing summary for the page titled '{currentPage.Name}' which focuses on {currentPage.MainBody}";
            var generatedSummary = await _aiService.GenerateMarketingContentAsync(topic, 30);
            
            // Lưu ý: Trong kịch bản Optimizely thực tế, điều này nên được thực hiện trong tác vụ Chỉnh sửa/Quản trị, 
            // chứ không phải trong quá trình hiển thị giao diện người dùng. Đây là ví dụ minh họa việc tiêu thụ dịch vụ.
        }

        var model = new StandardPageModel(currentPage);
        return View(model);
    }
}

4. Khắc phục sự cố Tích hợp Thường gặp

Lỗi Kết nối hoặc Ủy quyền (401/403)

  • Nguyên nhân: Khóa API trong appsettings.json không chính xác, đã hết hạn, hoặc tiêu đề Bearer token bị định dạng sai.
  • Giải pháp: Xác minh thiết lập IHttpClientFactory trong Program.cs đã đọc chính xác ApiKey từ IOptions<OpenAISettings> và đặt tiêu đề Authorization bằng cách sử dụng "Bearer", settings.ApiKey. Kiểm tra khoảng trắng thừa ở cuối khóa.

Sự cố Tuần tự hóa JSON

  • Nguyên nhân: Cấu trúc của payload yêu cầu được gửi đến dịch vụ AI không khớp với schema bắt buộc (ví dụ: thiếu model hoặc cấu trúc không chính xác cho messages).
  • Giải pháp: Đảm bảo cấu trúc đối tượng ẩn danh của bạn (hoặc POCO, nếu được sử dụng) hoàn toàn khớp với tài liệu API của OpenAI, đặc biệt là cấu trúc mảng lồng nhau cho messages.
#dotnet8#Optimizely#OpenAI#AIIntegration#GenAI
← Quay lại bài viết
GINBOK

Deep technical writing for developers and designers who care about the craft.

Content
  • All Articles
  • Engineering
  • Design
  • Product
Company
  • About Ginbok
  • Authors
  • Write for Us
  • Contact
Stay Updated
© 2026 Ginbok. All rights reserved.
PrivacyTerms