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.jsonkhô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
IHttpClientFactorytrongProgram.csđã đọc chính xácApiKeytừIOptions<OpenAISettings>và đặt tiêu đềAuthorizationbằ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
modelhoặc cấu trúc không chính xác chomessages). - 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.