AI asistent unutar vaše Blazor aplikacije, a ne još jedan chat prozor
Kako u Blazor poslovnu aplikaciju dodati AI asistenta koji poznaje vaše podatke i poštuje ovlasti korisnika, uz Microsoft.Extensions.AI i .NET 10.
Vlado Pandžić · Osnivač · Senior .NET arhitekt
Objavljeno · 4 min čitanja
Većina zaposlenika već koristi ChatGPT. Kopiraju u njega narudžbu, reklamaciju ili odlomak ugovora, dobiju odgovor i kopiraju ga natrag. Pomaže, ali podaci firme završe u alatu koji nitko ne kontrolira, a asistent ne zna ništa o vašim kupcima, narudžbama ni o tome tko smije vidjeti što.
Asistent unutar vaše Blazor aplikacije radi drukčije. Živi pokraj ekrana na kojem korisnik radi, podatke čita kroz iste servise koje aplikacija već koristi i vidi samo ono što taj korisnik smije vidjeti.
Što može na običan radni dan
- “Koje narudžbe kupca Novak kasne i zašto?” Asistent pogleda narudžbe i datume isporuke i odgovori u dvije rečenice, umjesto da korisnik filtrira tri tablice.
- “Napiši nacrt odgovora na ovu reklamaciju.” Pročita reklamaciju i povijest narudžbi i pripremi nacrt koji korisnik doradi i pošalje.
- “Sažmi ovaj ugovor i izdvoji rokove.” Pročita priloženi dokument i izvuče ono što je važno, s poveznicom na točno mjesto u tekstu.
U svakom slučaju odlučuje čovjek. Asistent traži i priprema, a korisnik potvrđuje. Isti pristup u inboxu ili helpdesku opisujemo u članku o AI prijedlozima odgovora.
Kako radi, ljudskim jezikom
- 1Korisnik pita na ekranu
- 2Model odlučuje koji mu podaci trebaju
- 3Vaši servisi ih dohvate, s ovlastima korisnika
- 4Odgovor se ispisuje dok nastaje
Ključno je da model nikad sam ne ide u bazu. Dajete mu “alate”, odnosno obične metode vaših postojećih servisa, i samo njih smije pozvati. Kad želi narudžbe koje kasne, poziva OrderService, a OrderService provjerava ovlasti točno kao za svaki drugi ekran.
Kako to izgleda u .NET-u
U .NET-u se to radi s Microsoft.Extensions.AI, koji daje jedno sučelje IChatClient za Azure OpenAI i druge modele. Klijent se registrira jednom, s uključenim automatskim pozivanjem alata. Aplikacija se u Azure prijavljuje vlastitim managed identityjem, pa u konfiguraciji nema API ključa:
builder.Services.AddSingleton<IChatClient>(
new ChatClientBuilder(
new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deployment).AsIChatClient())
.UseFunctionInvocation()
.Build());
Blazor komponenta, koja radi u načinu Interactive Server, daje modelu jedan alat i prikazuje odgovor dok stiže:
@inject IChatClient Chat
@inject OrderService Orders
@inject AuthenticationStateProvider Auth
<textarea @bind="question"></textarea>
<button @onclick="AskAsync">Ask</button>
<p>@answer</p>
@code {
private string question = "";
private string answer = "";
private async Task AskAsync()
{
var user = (await Auth.GetAuthenticationStateAsync()).User;
var options = new ChatOptions
{
Tools = [AIFunctionFactory.Create(
(string customer) => Orders.GetLateOrdersAsync(customer, user),
"get_late_orders",
"Returns late orders for a customer that the current user is allowed to see")]
};
answer = "";
await foreach (var update in Chat.GetStreamingResponseAsync([new ChatMessage(ChatRole.User, question)], options))
{
answer += update.Text;
StateHasChanged();
}
}
}
GetLateOrdersAsync dobiva prijavljenog korisnika, pa asistent nikad ne može vidjeti više nego što bi taj korisnik vidio na bilo kojem drugom ekranu. To je isto pravilo kao u članku o sigurnosti Blazor aplikacije: ovlasti pripadaju servisu, a ne sučelju i ne promptu.
Prototip za jedan dan, produkcija za nekoliko tjedana
Microsoft ima predložak AI Chat Web App (dotnet new aichatweb). On izradi Blazor Interactive Server aplikaciju s gotovim chat sučeljem koje odgovara na pitanja iz dokumenata koje stavite u mapu. To je izvrstan način da upravi za jedan dan pokažete kako asistent izgleda na vašim dokumentima.
Ali to je prototip, a ne produkcija. Za stvarnu upotrebu još trebaju vaše ovlasti, vaši izvori podataka, bilježenje i kontrola troška.
Pravila za produkciju
- Asistent vidi samo ono što vidi korisnik. Svaki alat poziva vaše servise s prijavljenim korisnikom, a servis provjerava ovlasti.
- Svaku radnju potvrđuje čovjek. Asistent smije pripremiti e-mail, izmjenu narudžbe ili odobrenje, ali korisnik klikne “pošalji”.
- Ključevi i model ostaju na serveru. To je još jedan razlog da ekran s asistentom radi u načinu Interactive Server, a ne na WebAssemblyju, kako objašnjavamo u članku Blazor Server vs WebAssembly vs Auto.
- Sve se bilježi i nadzire. Microsoft.Extensions.AI podržava OpenTelemetry, pa pitanja, pozivi alata i vremena odgovora završe u istom nadzoru kao i ostatak aplikacije.
- Trošak ima granicu. Ograničenje po korisniku i po danu te provjera koja su pitanja najskuplja.
- Podaci ostaju gdje trebaju. Prema Microsoftu, upiti i odgovori u Azure OpenAI-ju nisu dostupni OpenAI-ju i ne koriste se za treniranje modela. Kod regionalnog deploymenta obrađuju se u geografiji koju odaberete, dok ih Global i Data Zone deploymenti mogu obrađivati šire, pa vrstu deploymenta birajte namjerno.
Kako krenuti
Odaberite jedan ekran i jednu vrstu pitanja koju vaš tim postavlja svaki dan, a koja danas traži nekoliko klikova ili telefonski poziv. Izradite asistenta samo za to, izmjerite koliko vremena štedi i tek onda širite. Širu sliku o tome gdje se AI u poslovanju isplati pronaći ćete na našoj stranici o AI-ju u poslovanju.
Kako mi radimo
Upravo to radimo: uvodimo AI u poslovne procese, uključujući asistente unutar postojećih Blazor i .NET aplikacija, s ovlastima, potvrdom čovjeka i kontrolom troška od prvog dana. Krećemo s jednim ekranom i jednom mjerljivom uštedom. Više o našem radu s AI-jem, a prvi korak je besplatan razgovor od 30 minuta.
Izvori
- Microsoft.Extensions.AI libraries, Microsoft Learn
- Invoke .NET functions using an AI model, Microsoft Learn
- Build an AI chat app with .NET, Microsoft Learn
- Create a .NET AI app using the AI app template, Microsoft Learn
- Data, privacy and security for Azure OpenAI, Microsoft Learn
Ovaj članak služi općem informiranju i nije pravni, porezni, financijski ni drugi stručni savjet. Scenariji, primjeri i izračuni su ilustrativni. Uvjeti korištenja i odricanje od odgovornosti.