Dyqanet online në Kosovë dhe Shqipëri i marrin porositë kryesisht në chat. Pastaj dikush duhet ta shkruajë me dorë çdo porosi në faqen e postës: emrin, telefonin, qytetin, adresën, produktin. Kjo merr një deri në dy minuta për porosi, dhe një shifër e gabuar në numrin e telefonit bëhet dërgesë e dështuar. Smart Extract e zëvendëson shkrimin me një screenshot. Ky artikull tregon si punon ky proces dhe çfarë u desh që 99.9% e screenshot-eve të procesohen me sukses.
Pse screenshot, e jo tekst
Shitësit e kanë bisedën të hapur në telefon. Nëse u kërkon të kopjojnë tekstin nga Instagram, Facebook ose WhatsApp, u shton një hap dhe humbet konteksti, p.sh. cili mesazh është i klientit e cili i dyqanit. Një screenshot është një prekje, dhe një model multimodal e lexon edhe pamjen e bisedës, jo vetëm fjalët.
Në fillim provova OCR me Tesseract, një librari open source. Punonte ngadalë, dhe teksti që nxirrte kërkonte shumë kod që të parsohej si duhet në emër, telefon dhe adresë. Kur provova me një model AI, puna shkoi shumë më shpejt dhe implementimi ishte shumë më i thjeshtë: modeli e kthen porosinë drejtpërdrejt, pa rregulla parsimi të shkruara me dorë.
Procesi
- Shitësi ngarkon një screenshot ose disa njëherësh, nga aplikacioni web ose aplikacioni Android.
- API në .NET ia dërgon imazhin Google Gemini dhe kërkon një porosi të strukturuar, jo tekst të lirë.
- Rezultati validohet dhe normalizohet: numrat e telefonit, qytetet, fushat e detyrueshme.
- Porosia e nxjerrë i kthehet shitësit për rishikim, pastaj regjistrohet te posta e zgjedhur përmes API-së së saj: Postman, Delex, Cheetah, Express Posta.
- Asgjë nuk ruhet. Imazhi dhe të dhënat e nxjerra mbahen vetëm në memorie dhe fshihen sapo dërgohet përgjigjja.
Zakonisht, i gjithë procesi zgjat 5-10 sekonda. Kur shitësi ngarkon disa screenshot-e njëherësh, secili dërgohet te Gemini në një thirrje të veçantë, paralelisht, në vend që të presin njëri pas tjetrit.
Kërko një skemë, jo një përmbledhje
Vendimi më i rëndësishëm është që modeli të plotësojë një formë të caktuar, në vend që të përshkruajë çfarë sheh. Porosia ka gjithmonë të njëjtat fusha, prandaj kërkesa i përcakton që në fillim dhe përgjigjja lexohet drejtpërdrejt në një record. Në formë të thjeshtuar:
public sealed record ExtractedOrder(
string? CustomerName,
string? Phone,
string? Country,
string? City,
string? Address,
string? OrderDetails);
Çdo fushë është nullable me qëllim. Një screenshot që nuk ka adresë duhet të japë null, jo një adresë që duket e besueshme por që modeli e ka shpikur. Për një fushë që mungon, aplikacioni mund ta pyesë shitësin; një fushë e shpikur shkon te posta.
Pjesën më të madhe të punës e bën prompt-i: i thotë modelit në cilën gjuhë është biseda, ku t’i kërkojë të dhënat e klientit dhe çfarë të nxjerrë.
Valido gjithçka që kthen modeli
Përgjigjja e modelit trajtohet si input nga përdoruesi. Në një strukturë me Clean Architecture dhe CQRS, nxjerrja e të dhënave është një command, dhe handler-i i saj nuk i beson përgjigjes derisa të kalojë të njëjtin validim si një porosi e shkruar me dorë.
Numrat e telefonit janë shembulli më i qartë. Klientët i shkruajnë në çdo format: me ose pa +383 ose +355, me 0 në fillim, me hapësira e viza. Kur normalizohen në një format të vetëm para se të shkojnë te posta, zhduket një kategori e tërë dërgesash të dështuara:
// E thjeshtuar: hiq formatimin, pastaj shto kodin e shtetit nëse mungon
static string NormalizePhone(string raw, string countryCode)
{
var digits = new string(raw.Where(char.IsDigit).ToArray());
if (digits.StartsWith("00")) digits = digits[2..];
if (digits.StartsWith(countryCode)) return "+" + digits;
if (digits.StartsWith('0')) digits = digits[1..];
return "+" + countryCode + digits;
}
Nëse qyteti nuk mund të njihet, sistemi nuk e merr me hamendje: shitësi e zgjedh vetë në formën e rishikimit, para se porosia të shkojë te posta.
Mos ruaj atë që nuk të duhet
Bisedat e klientëve janë të dhëna personale. Screenshot-et dhe të dhënat e nxjerra prej tyre procesohen në memorie dhe nuk ruhen kurrë; ekzistojnë vetëm sa t’i arrijnë shitësit për rishikim dhe të dërgohen te posta. Kështu shitësit marrin një përgjigje të thjeshtë për privatësinë, dhe nuk ka një grumbull imazhesh bisedash që duhen mbrojtur, ruajtur në backup ose fshirë më vonë.
Mbaji kostot e ulëta
Smart Extract ka çmime për dyqane të vogla, prandaj edhe infrastruktura duhet të jetë e lirë. API është një shërbim me .NET 10 në Docker në Google Cloud Run, mbi PostgreSQL 18 dhe Redis, me deploy përmes GitHub Actions. Punët që nuk duhet të ndodhin gjatë një kërkese, si rinovimet e abonimeve, faturat në shqip dhe anglisht, analitika dhe email-at, kryhen nga një worker i veçantë në .NET në një server të vogël të dedikuar, në vend të instancave cloud gjithmonë aktive.
Rezultatet
Nga prilli deri në shtator 2026, Smart Extract procesoi 35,797 screenshot-e, dhe 99.9% e tyre u procesuan me sukses. Regjistrimi i një porosie zbriti nga një deri në dy minuta shkrim me dorë në 5-10 sekonda, dhe vëllimi mujor u më shumë se trefishua nga prilli në gusht.
Pjesa e mbetur prej 0.1% ka shumë gjasa të ketë dështuar në periudhat kur modelet AI ishin të mbingarkuara, jo për shkak të vetë screenshot-eve. Kjo është pjesë e punës me një model të jashtëm: është një varësi që nuk e kontrollon ti.
E njëjta qasje vlen edhe përtej porosive për postë: fatura, fletëdërgesa, formularë, foto dokumentesh. Kudo që njerëzit kopjojnë me dorë të dhëna nga një imazh në një sistem, shikoni automatizimin me AI.
Po punoni në diçka të ngjashme?
Nëse kjo i ngjan një problemi që keni, më tregoni për të. Do t’ju them sinqerisht si do ta zgjidhja.