Posts

Showing posts with the label python

Fine-tuning za administratore: kada ima smisla, a kada ne

Kad neko kaže „hoću da model nauči našu dokumentaciju", misli na fine-tuning. Skoro uvek greši — odgovor je RAG , i to je bio jedan od prvih zaključaka u ovom serijalu. Ali postoje slučajevi u kojima fine-tuning jeste pravi alat. Ovaj tekst objašnjava koji su, šta postupak stvarno zahteva i kako se izvodi na jednoj kartici. Šta fine-tuning menja Menja težine modela. Ne dodaje znanje na neki uredan način koji možeš da pregledaš — pomera brojeve tako da model drugačije reaguje na slične ulaze. Menja Ne menja Stil i ton odgovora Činjenice koje pouzdano zna Oblik izlaza Sposobnost rasuđivanja Poznavanje uskog domena Podatke koji se često menjaju Doslednost u ponašanju Veličinu modela i brzinu Ključna razlika: fine-tuning uči model kako da odgovara, ne šta da zna. Ako mu daš stotinu dokumenata o vašim procedurama, neće ih zapamtiti kao činjenice. Naučiće da zvuči kao neko ko ih poznaje — i onda...

MCP — kako model dobija pristup tvojim alatima

Tool calling iz teksta o API-ju radi, ali svaki alat pišeš iznova za svaku aplikaciju. Deset alata i tri aplikacije znače trideset komada koda koji rade isto. MCP je pokušaj da se to standardizuje: alat se opisuje jednom, a svaki klijent koji govori isti protokol ga koristi. Ovaj tekst pokazuje kako to izgleda na Linux serveru i gde su granice koje ne treba prelaziti. Šta rešava Bez MCP-a: aplikacija A → sopstvena definicija alata → tvoj kod aplikacija B → sopstvena definicija alata → isti tvoj kod aplikacija C → sopstvena definicija alata → opet isti kod Sa MCP-om: aplikacije A, B, C → MCP protokol → jedan server → tvoj kod Server izlaže tri vrste stvari: Vrsta Šta je Primer Tools Radnje koje model može da zatraži Provera statusa servisa Resources Podaci koje može da pročita Sadržaj konfiguracije Prompts Gotovi obrasci upita „Analiziraj pad servisa" Model i dalje ništa ne iz...

RAG nad sopstvenom dokumentacijom

„Hoću da model zna našu dokumentaciju" je najčešći zahtev koji ćeš dobiti. Odgovor gotovo nikad nije fine-tuning — nego RAG, postupak koji relevantne delove tvojih fajlova pronađe i ubaci u prompt pre nego što model odgovori. Open WebUI to već ume, kako je pokazano u tekstu o njemu . Ovaj tekst objašnjava šta se ispod dešava i kako se gradi sopstveno rešenje, jer ćeš ga pre ili kasnije trebati. Postupak Priprema (jednom): dokumenti → sečenje na delove → embeddings → vektorska baza Pri svakom pitanju: pitanje → embedding → pretraga po sličnosti → n najbližih delova → prompt: "Odgovori na osnovu ovog konteksta: ..." → model Model se ne menja. Težine ostaju iste; menja se samo ono što mu stiže u promptu. To je razlog zašto RAG radi na svakom modelu i zašto se dokument dodat jutros koristi već u podne. Embedding Numerički zapis značenja teksta. Dva teksta sličnog značenja imaju bliske zapise, i to bez ijedne zajedničke reči: "restart nginx ...

Python skripta koja komunicira sa lokalnim modelom

Dosad si sa modelom pričao kroz curl . To je dobro za razumevanje i za jednokratne provere, ali čim treba obraditi listu fajlova, ponoviti neuspeo zahtev ili proslediti izlaz dalje, bash postaje tesan. Ovaj tekst gradi Python klijent — od najmanjeg primera do alatke koju stvarno možeš staviti u /usr/local/bin . Priprema Zvanična openai biblioteka radi sa svakim OpenAI-kompatibilnim servisom, pa i sa tvojim: $ python3 -m venv ~/.venv/ai $ source ~/.venv/ai/bin/activate $ pip install openai Sistemski Python nemoj dirati; na novijim distribucijama pip to ionako odbija. Podešavanja idu u okruženje, ne u kod: $ cat ~/.ai_env export AI_BASE_URL=http://localhost:11434/v1 export AI_API_KEY=k_alen_3f8a2b91c7d45e6f export AI_MODEL=qwen3:8b $ chmod 600 ~/.ai_env $ source ~/.ai_env Ovim ista skripta radi i sa lokalnom Ollamom i sa vLLM-om iza proxy-ja , bez ijedne izmene. Najmanji klijent #!/usr/bin/env python3 import os from openai import OpenAI klijent = OpenAI( base...

Formatiranje stringova u Pythonu

F-stringovi F-stringovi (formatted string literals) omogućavaju direktan unos izraza u string koristeći f ili F prefiks, a izrazi se izračunavaju i zamjenjuju tokom izvođenja: ime = "John" godine = 30 tekst = f"Moje ime je {ime} i imam {godine} godina." Metoda format() Metoda format() omogućava umetanje vrednosti u string koristeći zagrade {} kao oznake koje će se zameniti odgovarajućim vrednostima: ime = "John" godine = 30 tekst = "Moje ime je {} i imam {} godina.".format(ime, godine) Interpolacija stringova (f-stringovi sa format() ) Možete koristiti f-stringove zajedno sa format() metodama za dodatnu fleksibilnost: ime = "John" godine = 30 tekst = f"Moje ime je {ime} i imam {godine} godina.".format(ime=ime,                     godine=godine) % formatiranje Možete koristiti % operator za formatiranje stringova slično kao u jeziku C: ime = ...

Python PIP

pip je standardni alat za upravljanje Python paketima (bibliotekama). Koristi se za instalaciju, ažuriranje i deinstalaciju Python paketa sa Python Package Index (PyPI) i drugih izvora. Evo nekoliko osnovnih komandi i upotreba pip alata: Instalacija paketa Za instalaciju Python paketa koristite pip install komandu, praćenu imenom paketa: pip install ime_paketa Ažuriranje paketa Za ažuriranje instaliranih paketa na najnoviju verziju koristite pip install --upgrade komandu: pip install --upgrade ime_paketa Deinstalacija paketa Za deinstalaciju paketa koristite pip uninstall komandu: pip uninstall ime_paketa Lista instaliranih paketa Za prikaz liste instaliranih paketa koristite pip list ili pip freeze komande: pip list Kreiranje zahteva za instalaciju Možete generisati datoteku koja sadrži listu paketa i njihovih verzija koje se koriste u projektu. Ovo se često radi sa requirements.txt da...

Rad sa regex-om u Pythonu

Regex (Regular Expressions) je moćan alat za pretragu i manipulaciju tekstualnim podacima. U Pythonu, možete koristiti modul re za rad sa regularnim izrazima. Evo nekoliko primera koji objašnjavaju kako raditi sa regex-om u Pythonu: Pretraga uzorka u stringu Za pretragu uzorka u stringu koristite modul `re`: import re tekst = "Ovo je primer teksta sa brojevima 12345 i 67890." uzorak = r'\d+' # Traži sve nizove brojeva rezultat = re.findall(uzorak, tekst) print(rezultat) Zamena uzorka u stringu Možete zameniti uzorak u stringu koristeći `re.sub()` funkciju: import re tekst = "Dobar dan, John!" uzorak = r'John' zamena = 'Jane' novi_tekst = re.sub(uzorak, zamena, tekst) print(novi_tekst) Provera da li se uzorak podudara sa stringom Koristite `re.search()` da proverite da li se uzorak podudara sa stringom: import re tekst = "Python je sjajan jezik za programiranje." uzorak ...

Rad sa JSON-om u Python

Parsiranje JSON podataka Za parsiranje JSON podataka koristite `json.loads()` funkciju koja pretvara JSON string u Python objekat: import json json_string = '{"ime": "John", "prezime": "Doe", "godine": 30}' python_objekat = json.loads(json_string) print(python_objekat["ime"]) print(python_objekat["godine"]) Serijalizacija u JSON format Za serijalizaciju Python objekata u JSON format koristite `json.dumps()` funkciju: import json python_objekat = {"ime": "John", "prezime": "Doe", "godine": 30} json_string = json.dumps(python_objekat) print(json_string) Rad sa JSON fajlovima Možete čitati i pisati JSON podatke iz/ka JSON fajlovima: import json # Čitanje JSON podataka iz fajla with open("podaci.json", "r") as fajl: json_string = fajl.read() python_objekat = json.loads(json_s...

Rad sa datumima u Pythonu

Importovanje modula datetime Prvo morate importovati modul `datetime` kako biste mogli da radite sa datumima i vremenima: import datetime Trenutni datum i vreme Koristite `datetime.datetime.now()` za dobijanje trenutnog datuma i vremena: trenutni_datum_i_vreme = datetime.datetime.now() print(trenutni_datum_i_vreme) Rad sa datumima Koraci za rad sa datumima: # Kreiranje datuma datum = datetime.date(2023, 5, 15) # Trenutni datum trenutni_datum = datetime.date.today() # Prikazivanje datuma print(datum) print(trenutni_datum) Rad sa vremenima Koraci za rad sa vremenima: # Kreiranje vremena vreme = datetime.time(9, 30, 0) # Trenutno vreme trenutno_vreme = datetime.datetime.now().time() # Prikazivanje vremena print(vreme) print(trenutno_vreme) Formatiranje datuma i vremena Koristite metodu `strftime()` za formatiranje datuma i vremena prema željenom obrascu: # Formatiranje datuma formatira...

Python nizovi

Osnovna sintaksa niza Nizovi su uređene kolekcije podataka koje čuvaju više vrednosti. Elementi niza su odvojeni zarezima i definišu se pomoću uglatih zagrada: niz = [element1, element2, element3] Primer 1: Kreiranje i pristup elementima niza Ovaj primer kreira niz voća i pristupa elementima niza koristeći indekse: fruits = ["jabuka", "banana", "kivi", "nar"] print(fruits[0]) # Prikazuje "jabuka" print(fruits[2]) # Prikazuje "kivi" Primer 2: Dodavanje elemenata u niz Ovaj primer dodaje nove elemente u niz koristeći metode `append` i `insert`: fruits = ["jabuka", "banana"] fruits.append("kivi") fruits.insert(1, "nar") print(fruits) # Prikazuje ["jabuka", "nar", "banana", "kivi"] Primer 3: Promena vrednosti elementa niza Ovaj primer menja vrednost drugog elementa niza: ...

Python lambda funkcije

Osnovna sintaksa Lambda funkcija, takođe poznata kao anonimna funkcija, koristi se za definisanje kratkih funkcija bez ključne reči `def`. Osnovna sintaksa je: lambda argumenti: izraz Primer 1: Sabiranje dva broja Ova lambda funkcija sabira dva broja: saberi = lambda x, y: x + y rezultat = saberi(3, 5) print(rezultat) # Output: 8 Primer 2: Sortiranje liste Ovaj primer koristi lambda funkciju za sortiranje liste studenata po godinama: studenti = [ {"ime": "Marko", "godine": 25}, {"ime": "Jelena", "godine": 22}, {"ime": "Nikola", "godine": 28} ] studenti.sort(key=lambda student: student["godine"]) print(studenti) Primer 3: Filtriranje liste Ovaj primer koristi lambda funkciju za filtriranje parnih brojeva iz liste: brojevi = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] parni_brojevi = list(filter(lambda x: ...

Python funkcije

Osnovna sintaksa funkcije Funkcije u Pythonu su blokovi koda koji izvršavaju određene akcije ili računaju vrednosti i mogu se koristiti više puta u programu: def ime_funkcije(argumenti): # Blok koda funkcije naredba1 naredba2 return rezultat Primer 1: Funkcija bez argumenata Ova funkcija `pozdrav` ne prima argumente i vraća pozdravnu poruku: def pozdrav(): return "Zdravo, svete!" poruka = pozdrav() print(poruka) Primer 2: Funkcija sa argumentima Ova funkcija `sabiranje` prima dva argumenta, sabira ih i vraća rezultat: def sabiranje(a, b): rezultat = a + b return rezultat rezultat = sabiranje(3, 5) print(rezultat) Primer 3: Funkcija sa podrazumevanim vrednostima argumenata Ova funkcija `dobrodoslica` ima podrazumevanu vrednost za argument `ime` ako se ne navede vrednost: def dobrodoslica(ime="Gost"): poruka = "Dobrodošao, " + ime + "!" ...

Python FOR petlja

Osnovna sintaksa `for` petlja se koristi za iteriranje kroz sekvence i izvršavanje određenih akcija za svaki element u toj sekvenci: for element in sekvenca: # Blok koda koji se izvršava za svaki element u sekveneci naredba1 naredba2 Primer 1: Iteriranje kroz listu Ovaj primer ispisuje sve brojeve u listi: brojevi = [1, 2, 3, 4, 5] for broj in brojevi: print(broj) Primer 2: Iteriranje kroz string Ovaj primer ispisuje svako slovo u stringu "Ana": ime = "Ana" for karakter in ime: print(karakter) Primer 3: Korišćenje range() funkcije Ovaj primer koristi `range()` funkciju za generisanje sekvence brojeva od 0 do 4 i ispisuje ih: for i in range(5): print(i) Primer 4: Iteriranje kroz rečnik Ovaj primer ispisuje informacije o studentima iz rečnika: studenti = {"Marko": 25, "Jelena": 22, "Nikola": 28} for ime, godin...

Python WHILE petlja

Osnovna sintaksa `while` petlja se koristi za ponavljano izvršavanje bloka koda dok je određeni uslov tačan: while uslov: # Blok koda koji se izvršava dok je uslov tačan naredba1 naredba2 Primer 1: Jednostavna while petlja Ovaj primer ispisuje brojeve od 1 do 5 koristeći `while` petlju: broj = 1 while broj <= 5: print(broj) broj += 1 Primer 2: Unos korisnika Ova petlja traži od korisnika da unese broj 5, i ponavlja unos dok se ne unese tačan broj: broj = 0 while broj != 5: broj = int(input("Unesite broj 5: ")) Primer 3: Kombinacija while i if izjava Ovaj primer koristi `while` petlju za ispisivanje parnih i neparnih brojeva od 1 do 10: broj = 1 while broj <= 10: if broj % 2 == 0: print(broj, "je paran broj.") else: print(broj, "je neparan broj.") broj += 1 Bitno je osigurati da će uslov u `while` petlji post...

Python If else

Osnovna if izjava Osnovna `if` izjava se koristi za izvršavanje određenog koda ako je uslov tačan: if uslov: # Izvršava se ako je uslov tačan naredba1 naredba2 Primer: broj = 10 if broj > 5: print("Broj je veći od 5.") if i else izjava if i else izjava se koristi za donošenje odluke između dva moguća toka izvršavanja: if uslov: # Izvršava se ako je uslov tačan naredba1 naredba2 else: # Izvršava se ako uslov nije tačan naredba3 naredba4 Primer: broj = 3 if broj > 5: print("Broj je veći od 5.") else: print("Broj nije veći od 5.") if, elif (else if) i else izjava if, elif i else izjava se koristi za donošenje odluka između više mogućih toka izvršavanja: if uslov1: # Izvršava se ako je uslov1 tačan naredba1 naredba2 elif uslov2: # Izvršava se ako je uslov2 tačan (opciono) naredba3 naredba4 else: ...

Python rečnici (dictionaries)

U Pythonu, rečnik (dictionary) je kolekcija parova ključ-vrednost (key-value), gde svaki ključ mapira na određenu vrednost. Rečnici su neuređeni, promenljivi i omogućavaju brz pristup vrednostima putem ključeva. Ključevi u rečniku su jedinstveni, što znači da ne možete imati više istih ključeva u istom rečniku. Evo osnovnih operacija i primera za rad sa rečnicima: Kreiranje rečnika Rečnik se može kreirati koristeći vitičaste zagrade {} i dodavanjem parova ključ-vrednost unutar njih. my_dict = {"ime": "Ana", "godine": 30, "grad": "Beograd"} Pristup vrednostima Koristite ključ da biste pristupili odgovarajućoj vrednosti u rečniku. ime = my_dict["ime"] Izmena vrednosti Možete promeniti vrednost za određeni ključ. my_dict["godine"] = 31 Dodavanje novih parova Možete dodati novi par ključ-vrednost u rečnik. my_dict["jezik"] = "P...

Python set

Python set je kolekcija jedinstvenih elemenata bez određenog redosleda. Setovi se koriste za čuvanje jedinstvenih vrednosti, a imaju nekoliko osnovnih operacija kao što su dodavanje, brisanje, petlje, i razne metode. Evo objašnjenja tih operacija i nekoliko primera: Dodavanje elemenata Koristite metodu add() da biste dodali element u set. Brisanje elemenata Koristite metodu remove() da biste uklonili određeni element iz seta. Ako element ne postoji, izazvaće grešku. Koristite metodu discard() da biste uklonili element iz seta. Neće izazvati grešku ako element ne postoji. Koristite metodu pop() da biste uklonili i vratili proizvoljni element iz seta. Petlje kroz set Koristite petlju for da biste iterirali kroz elemente seta. Spajanje (join) elemenata Setovi nemaju redosled, pa se ne "spajaju" na isti način kao stringovi ili liste. Metode setova Koristite različite metode za operacije sa setovima: ...

Python Tuple

Python tuple je uređeni, nepromenljivi, i heterogeni kolekcionarni podatak. To znači da tuple može sadržavati različite tipove podataka (npr. brojevi, stringovi, itd.) i da se elementi ne mogu promeniti nakon što su dodati u tuple. Tuple se često koriste za čuvanje povezanih podataka koji ne bi trebali da budu promenjeni. Ključne Karakteristike Tuple-a Uređeni: Elementi u tuple-u se čuvaju u određenom redosledu, što znači da možete pristupiti elementima prema njihovim indeksima. Nepromenljivi: Nakon što kreirate tuple, ne možete menjati njegove elemente. To znači da ne možete dodavati, brisati ili menjati elemente u tuple-u. Heterogeni: Tuple može sadržavati elemente različitih tipova podataka. Na primer, možete imati tuple koji sadrži brojeve, stringove i druge podatke. Ograničenja i Performanse: Tuple su obično brži od lista jer su nepromenljivi, ali imaju ograničene metode u poređenju sa listama. Kreiranje Tuple-a ...

Metode za rad sa listama u Pythonu

Python nudi mnoge korisne metode za rad sa listama. Evo nekoliko često korišćenih metoda za liste i odgovarajućih primera: Dodavanje Elementa append() : Dodaje element na kraj liste. brojevi = [1, 2, 3] brojevi.append(4) Rezultat: [1, 2, 3, 4] Uklanjanje Elementa remove() : Uklanja prvi pojavljivanje određenog elementa iz liste. pop() : Uklanja element na određenom indeksu i vraća ga. gradovi = ["Beograd", "Novi Sad", "Niš"] gradovi.remove("Novi Sad") Rezultat: ["Beograd", "Niš"] izbaceni_grad = gradovi.pop(0) Rezultat: izbaceni_grad = "Beograd", gradovi = ["Niš"] Pronalaženje Indeksa Elementa index() : Vraća indeks prvog pojavljivanja određenog elementa. brojevi = [1, 2, 3, 4, 5] indeks = brojevi.index(3) Rezultat: indeks = 2 Provera Prisustva Elementa in operator: Provera...

Liste u Pythonu

U Pythonu, lista je vrsta podataka koja omogućava skladištenje više elemenata u jednoj promenljivoj. Liste su promenljive i uređene, što znači da možete dodavati, uklanjati i menjati elemente unutar liste, a elementi se čuvaju u redosledu u kojem su dodavani. Evo osnovnih informacija o listama i nekoliko primera: Kreiranje Liste Listu možete kreirati koristeći uglaste zagrade [] i razdvajajući elemente zapetama: brojevi = [1, 2, 3, 4, 5] gradovi = ["Beograd", "Novi Sad", "Niš"] meseci = ["Januar", "Februar", "Mart"] prazna_lista = [] Pristup Elementima Liste Elementima liste možete pristupiti korišćenjem indeksa (počevši od 0): grad = gradovi[0] # Pristup prvoj stavci (Beograd) mesec = meseci[2] # Pristup trećoj stavci (Mart) Izmena i Dodavanje Elementa Možete izmeniti vrednost elementa i dodavati nove elemente: gradovi[1] = "Subotica"...