Twoja organizacja ma lata, może dekady, inwestycji w systemy .NET. Bazy kodów, które działają, biznes logic sprawdzoną w boju, zintegrowane procesy. A potem przychodzi AI. Obietnica jest ekscytująca: inteligentna automatyzacja, orkiestracja systemów, agenty, które same rozumują i działają. Ale jak to dodać bez wieloletniego przepisywania? Ten przewodnik pokazuje praktyczną ścieżkę: budowę agentów AI, które orkiestrują twoje istniejące systemy .NET używając Microsoft Semantic Kernel i wzorca Fasady. Żadnego rip-and-replace. Tylko strategiczna integracja.
Dla architektów i liderów inżynierów utrzymujących systemy .NET produkcyjne, ten przewodnik zapewnia konkretną architekturę i kod, który pozwoli ci zacząć natychmiast.
1. 🎯 Wzorzec: Agent jako Orkiestrator
Kluczowa intuicja: nie zastępuj istniejących systemów – orkiestruj je.
Twoje legacy systemy .NET robią dokładnie to, co powinny: przetwarzają transakcje, zarządzają danymi, wykonują biznes logic. Nie musisz tego przepisywać. Zamiast tego, zbuduj cienkiego agenta AI, który:
- Rozumie intencje użytkowników (język naturalny → zadania)
- Podejmuje decyzje (które systemy wywołać, w jakiej kolejności)
- Orkiestruje wykonanie (wywołuje twoje istniejące API, usługi, bazy danych)
- Zwraca inteligentne odpowiedzi (tłumaczy wyniki techniczne na język zrozumiały dla ludzi)
Agent to most między użytkownikami a twoim legacy stack.
2. 🏗️ Architektura: Fasada + Semantic Kernel
A. Wzorzec Fasady dla Legacy Systems
Fasada to cienka warstwa abstrakcji nad twoimi legacy systemami. Enkapsuluje złożoność, wystawia czysty interfejs.
// Legacy system: Skomplikowany, wiele zależności
public class LegacyOrderService { ... }
// Fasada: Prosty, przyjazny dla AI interfejs
public interface IOrderFacade
{
Task GetOrderAsync(string orderId);
Task CreateOrderAsync(CreateOrderRequest request);
Task CancelOrderAsync(string orderId);
}
public class OrderFacade : IOrderFacade
{
private readonly LegacyOrderService _legacy;
public async Task GetOrderAsync(string orderId)
{
// Wywołaj legacy system, przekształć wynik
var legacyOrder = await _legacy.GetOrderByIdAsync(orderId);
return MapToOrderResult(legacyOrder);
}
} B. Semantic Kernel Plugins
Fasady stają się wtyczkami Semantic Kernel – funkcje, które agent może wywoływać:
public class OrderPlugin
{
private readonly IOrderFacade _orderFacade;
[KernelFunction("get_order")]
[Description("Retrieves order details by order ID")]
public async Task GetOrderAsync(
[Description("The order ID")] string orderId)
{
var result = await _orderFacade.GetOrderAsync(orderId);
return JsonSerializer.Serialize(result);
}
[KernelFunction("create_order")]
[Description("Creates a new order")]
public async Task CreateOrderAsync(
[Description("Product ID")] string productId,
[Description("Quantity")] int quantity)
{
var request = new CreateOrderRequest { ProductId = productId, Quantity = quantity };
var result = await _orderFacade.CreateOrderAsync(request);
return JsonSerializer.Serialize(result);
}
} C. Agent Orkiestracyjny
Semantic Kernel orkiestruje wtyczki bazując na intencjach użytkownika:
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(...);
builder.Plugins.AddFromObject(new OrderPlugin(orderFacade));
var kernel = builder.Build();
// Użytkownik: "Show me details for order 12345"
var response = await kernel.InvokePromptAsync("{{$input}}", new() {
{ "input", userMessage }
});Kernel automatycznie wybiera właściwą wtyczkę (get_order), wywołuje fasadę, zwraca wynik.
3. 🔐 Najlepsze Praktyki Integracji
A. Walidacja i Error Handling
Legacy systemy nie zawsze mają przyjazne komunikaty błędów. Fasada tłumaczy:
try
{
var result = await _legacy.GetOrderAsync(orderId);
return MapToOrderResult(result);
}
catch (LegacySystemException ex)
{
// Tłumacz legacy error na przyjazny format
return new OrderResult { Success = false, Message = "Order not found" };
}B. Caching dla Wydajności
Legacy systemy mogą być wolne. Cachuj gdy to możliwe:
public async Task GetOrderAsync(string orderId)
{
var cacheKey = $"order:{orderId}";
if (_cache.TryGetValue(cacheKey, out OrderResult cached))
return cached;
var result = await _orderFacade.GetOrderAsync(orderId);
_cache.Set(cacheKey, result, TimeSpan.FromMinutes(5));
return result;
} C. Idempotency dla Bezpieczeństwa
Agenty AI mogą retry operacje. Upewnij się, że mutating actions są idempotentne (wywołane wielokrotnie = ten sam efekt).
4. 🚀 Incremental Rollout
Nie próbuj integrować wszystkiego naraz. Zaczynaj małymi krokami:
- Wybierz Jeden Use Case: Np. "Check order status". Zbuduj fasadę, wtyczkę, przetestuj.
- Dodaj Kolejne Funkcje Stopniowo: Create order, cancel order, search products...
- Monitoruj i Ucz Się: Jak użytkownicy używają agenta? Które zapytania działają? Które failują?
- Iteruj: Poprawiaj prompty, dodawaj więcej fasad, rozszerzaj możliwości.
5. 💡 Przykładowe Scenariusze
A. Customer Support Automation
Agent odpowiada na pytania klientów, wywołując legacy CRM, order management, knowledge base:
- "What's the status of my order?" → wywołaj OrderFacade
- "Can I return this product?" → wywołaj PolicyFacade, ProductFacade
B. Internal Tools Automation
Agent dla pracowników, orkiestrujący HR, finance, inventory systems:
- "How many vacation days do I have left?" → wywołaj HRFacade
- "Order 100 units of product X" → wywołaj InventoryFacade, ProcurementFacade
C. Data Integration i Reporting
Agent agreguje dane z wielu legacy systemów, generuje raporty:
- "Show me Q4 revenue by region" → wywołaj SalesFacade, query legacy DB, formatuj wynik