Kā strādā

Kā tapa NVO datu pārlūks

Sociālajos tīklos redzēju, kā Ministru prezidents 5. augusta sēdē prezentēto informāciju par valsts maksājumiem nevalstiskajām organizācijām (NVO) nodēvē par “sūdu un mēslu”.Apskatīju ziņai pievienotos failus, un no datu faila dažās stundās tapa interaktīvs pārlūks: pieci īsi uzdevumi mākslīgā intelekta aģentam, un rezultātā sabiedrībai ērti pārlūkojami dati.

Izejas punkts

Sanāksmes par valsts budžeta naudu nevalstiskajām organizācijām materiālos Finanšu ministrija / Valsts kase publicēja 16 MB lielu Excel failu: 76 819 maksājumu rindas par 2024.–2026. gadu, kopā 396,70 miljoni eiro.MK paziņojums un materiāli ↗

Failā bija viena būtiska problēma: saņēmēju nosaukumi ierakstīti brīvā formā. Autortiesību aģentūra AKKA/LAA parādījās 26 dažādās rakstībās, Latvijas Sarkanais Krusts 18 versijās, ieskaitot “SAKKANAIS”. Ja tabulu grupē pēc nosaukuma teksta, viena organizācija izskatās pēc desmit mazām, un summas nav precīzas.

Sagatavošanās pirms aģenta darbināšanas: lejupielādēju failus (Excel un trīs prezentācijas) vienā mapē, atvēru Excel un izveidoju aģentam “metadati” lapas ekrānšāviņu, lai aģentam vieglāk saprast pārējās.

Pieci prompti (vaicājumi)

Visa pirmā lietojamā versija, no faila izpētes līdz gatavai un notestētai vietnei, tapa vienā Claude Code sesijā 6. augustā: sākums ap 11:15, apvienošana 14:48. Cilvēka darbs: pieci īsi prompti (uzdevumi aģentam). Šeit tie ir burtiski, ar visām drukas kļūdām:

hey, we have stupid unnormalized data which Kulbergs called sūds/mēsls. see that big excel and the metadata. Any ideas if it's possible to make a static (html/js) with self contained data to let people browse/compare that data better?

Aģents izpētīja visas 13 Excel lapas, atrada, ka 11 no tām ir vienas un tās pašas datu lapas kopsavilkumi, un pēc pāris precizējošiem jautājumiem uzrakstīja specifikāciju. Statisku html/js lapu prasīju apzināti.

dude, let's use uv here

Rīku izvēles korekcija, redzot, ka Claude sāk ar citu pieeju. Viens teikums, un visi datu apstrādes skripti pārgāja uz modernāku Python rīku.

also - make sure that we normalize the data - use org ids - reģistrācijas numurs. There's a lot of misspellings of names

Pārbaude apstiprināja: visi 2 482 reģistrācijas numuri atrodami Uzņēmumu reģistra sarakstā (tajā pašā failā), tātad katrai organizācijai var piešķirt vienu pareizo nosaukumu pilnīgi mehāniski.

commit raw data. As an intermediate fun fact i'd like a nice report that shows all misspelings that were normalized ordered by most errors. Otherwise go implement. We probably want astro and nice js ui? did you write that?

Tā radās nosaukumu variantu saraksts, un sākās pati būvēšana. Astro un Svelte nebija nejauša izvēle.

go on continue without me for sure, i'' be back in 90min+

Dots ap 12:30. Atlikušos deviņus uzdevumus, gala pārbaudi un apvienošanu aģents pabeidza viens pats. Vairāk nekā divas stundas bez cilvēka.

Kā izskatījās process

Trīs fāzes. No ~11:15 cilvēks sagatavo mapi ar izejas failiem (Excel, prezentācijas, metadati) un dod pirmo promptu; aģents izpēta datus, uzdod jautājumus, un 11:37 ir gatava specifikācija. Līdz ~12:30 strādā kopā ar cilvēku: plāns un viss datu slānis, jauns solis ik pa piecām minūtēm. No ~12:30 līdz 14:48 aģents strādā viens: visas lapas, gala pārbaude, labojumi un apvienošana. Aptuveni trīsarpus stundas kopā, no kurām vairāk nekā divas bez cilvēka.

Aģents nestrādā “uzraksti visu vienā rāvienā” stilā. Vispirms saruna par mērķi, tad specifikācija, tad plāns ar 15 uzdevumiem, un tikai tad kods. Katram uzdevumam vispirms tiek uzrakstīts tests, kas sākumā nestrādā, un tad kods. Katru uzdevumu izpildīja atsevišķs palīgaģents, un vēl viens neatkarīgs palīgaģents pārbaudīja padarīto. Kopā ap 30 palīgaģentu palaišanu un 21 saglabāts koda solis.

Visi pirmās dienas koda soļi

Sagatavošana un spec (~11:15–11:37)

  • ~11:15cilvēks lejupielādē failus no MK lapas, saliek mapē, parāda metadatu lapu un dod pirmo promptu; aģents pēta Excel
  • 11:37specifikācija

Kopā ar cilvēku: dati un plāns (11:41–12:28)

  • 11:41izejas dati saglabāti krātuvē
  • 11:44nosaukumu variantu atskaite
  • 11:52spec pārrakstīts (Astro + Svelte) un 15 uzdevumu plāns
  • 11:56datu apstrāde: kompaktais datu fails ar pašpārbaudēm
  • 11:58plāna labojums: FM prezentācijas skaitlis izrādās nepilnīgs
  • 12:07vietnes karkass ar testu rīkiem
  • 12:10latvisko skaitļu formatētājs
  • 12:14datu dekodēšana un testu paraugdati
  • 12:18filtri, ko var kopīgot ar saiti
  • 12:23summēšanas slānis
  • 12:28CSV eksports

Aģents viens pats (~12:30–14:48)

  • 12:36pamata izkārtojums, stili, filtru josla
  • 12:55stabiņu un mēnešu diagrammas
  • 13:07pārskata lapa
  • 13:08(sānu lūgums no cilvēka citā sarunā: variantu atskaites izskats video vajadzībām)
  • 13:22saņēmēju saraksts un organizāciju profili
  • 13:37ministriju saraksts un profili
  • 13:48labojums: filtra noplūde ministriju saitēs
  • 14:00salīdzināšanas lapa
  • 14:13metodikas lapa un publicēta variantu atskaite
  • 14:22labojums: variantu aritmētika metodikas tekstā
  • 14:28automātiskā izlikšana internetā
  • 14:44gala pārbaudes labojumi: saites patur filtrus, 2026* piezīmes
  • 14:48apvienošana, gatavs

Drošības tīkls: datu apstrāde katrā palaišanā pati pārbauda rindu skaitu, kopsummu (396 702 708,91 €) un gadu summas pret paša Excel kopsavilkuma lapām. Ja kaut viens cents nesakrīt, apstrāde apstājas ar kļūdu.

Ko pārbaudes noķēra

  • Saite uz ministrijas lapu “nesa līdzi” filtru, kas pēc tam sabojāja visu sarakstu: pēc “Atpakaļ” 27 iestāžu vietā rādījās viena.
  • Klikšķis uz organizācijas citā lapā pazaudēja izvēlētos filtrus, un atvērtā profila summa nesakrita ar to, uz kuras nupat uzklikšķināts.
  • Faktu kļūda metodikas tekstā (variantu aritmētika).
  • Pati interesantākā ir kļūda plānā: sagaidāmā Sarkanā Krusta kopsumma bija paņemta no Finanšu ministrijas prezentācijas (14,39 milj. €), bet pēc reģistrācijas numura patiesā summa ir 16,08 milj. €. Prezentācijas tabula skaitīja tikai vienu no 18 rakstībām.

Pirmā versija

Pirmajai versijai bija savs dizains: tumšā tēma, karmīna akcents (acīmredzot Claude izvēlējās Latvijas karoga krāsu, jo šis ir par valsts budžetu) un grāmatvedības dubultlīnija zem katras galīgās summas.

Pirmās versijas pārskata lapa: tumša tēma, karmīna akcenti, četri lielie skaitļi un lielāko saņēmēju stabiņi
Pārskats: 396,70 milj. €, 2 482 saņēmēji, 76 819 maksājumu rindas.
Pirmās versijas saņēmēju lapa ar meklēšanu un visu 2 482 organizāciju tabulu
Saņēmēji: visas 2 482 organizācijas ar meklēšanu un summām pa gadiem.
Pirmās versijas ministriju lapa ar 27 iestāžu tabulu
Ministrijas (vēlāk pārsauktas par iestādēm, jo sarakstā ir arī Saeima un Prokuratūra).

Pieslēgšana edgarsjekabsons.lv lapai

Nākamajā rītā uzsāku jaunu darba ciklu, lai datu pārlūku publicētu šajā, jau esošajā, manā lapā. Tapa jauna darbnīcas sadaļa, un pārlūks pārģērbās vietnes zaļajās krāsās. Viss dizains ir CSS mainīgajos, tāpēc pārkrāsošana ir dažu rindu darbs. Pa ceļam automātiskā koda pārbaude noķēra vēl vienu jauku kļūdu: noapaļošana uz augšu varēja izdot “52,100 milj. €” tur, kur jābūt “53,00 milj. €”. Un “Ministriju” sadaļa kļuva par “Iestādēm”, jo sarakstā ir arī Saeima, Prokuratūra un Sabiedrisko pakalpojumu regulēšanas komisija.

Tā pati pārskata lapa pēc iebūvēšanas edgarsjekabsons.lv: gaiša tēma, zaļā palete, cilne Iestādes
Tā pati pārskata lapa pēc pārvākšanās: zaļā palete, “Iestādes” un poga “Avots un atrunas”.

Padomi, ja mēģināsi pats

Daži principi no šī projekta, kas pārnesami uz jebkuru līdzīgu darbu ar AI aģentu:

  • Sāc ar jautājumu, ne plānu. Pirmais prompts bija “vai vispār iespējams?”. Ļauj aģentam izpētīt datus un piedāvāt formu; tas bieži redz iespējas, ko pats nebūtu iedomājies.
  • Dod failus, ne aprakstus. Aģents pats izlasīja visas 13 Excel lapas. Ekrānattēls ar “skaties šeit” aizstāj garu skaidrošanu vārdiem.
  • Nemaināmās prasības pasaki vienā teikumā.“Normalizē pēc reģistrācijas numura” bija vērtīga instrukcija. Viens skaidrs princips dod vairāk nekā desmit sīkas piezīmes.
  • Prasi pašpārbaudes. Testi un skaitļu validācija pret avotu ir tas, kas ļauj aģentu droši atstāt vienu: kļūda apstādina darbu, nevis klusi ielien rezultātā.
  • Pirmajai versijai nav jābūt perfektai. Labojumi ir lēti: “ministrijas” kļuva par “iestādēm” ar vienu teikumu arī pēc publicēšanas.

Kur tas dzīvo un ko var lejupielādēt

Pārlūks ir statiska lapa: nekāda servera, nekādas datubāzes; visi dati ir viens JSON fails, ko pārlūkprogramma ielādē vienu reizi. Tāpēc to var turēt uz Cloudflare bez maksas, un tas nevar “nokrist” no apmeklētāju skaita. Pirmās versijas kods un dati ir publiskā GitHub krātuvē.