Vektorski upiti u PostgreSQL-u: Ujedinjenje graf i relacijskih upita
Uvod u ujedinjenje vektorskih upita
U današnjem svijetu agenata koji koriste umjetnu inteligenciju, memorija nije samo pohrana podataka – ona je ključna za kontekst i donošenje odluka. Tradicionalno, agenti koriste različite sustave za vektorske upite (poput FAISS-a), graf baze (poput Neo4j) i relacijske baze (poput PostgreSQL-a). No, to dovodi do složenosti, kašnjenja i nekonzistentnosti. U RiNET-u smo odlučili izgraditi ujedinjeni upitni sloj koji omogućuje izvođenje svih triju vrsta upita u jednoj bazi podataka – PostgreSQL-u.
Arhitektura ujedinjenog sloja za vektorske upite
Naša arhitektura temelji se na proširenju PostgreSQL-a s pgvector dodatkom za vektorske upite i rekurzivnim CTE-ovima za graf pretraživanje. Ključni izbor bio je koristiti jednu bazu umjesto više specijaliziranih. Time smo postigli manju složenost održavanja i bolju konzistenciju podataka, ali uz određene kompromise u performansama za vrlo velike skupove podataka. Vektorski upiti su srž našeg sustava, omogućujući agentima da pronalaze slične entitete na temelju semantičke bliskosti.
Implementacija vektorskih upita s pgvector
Za vektorske upite koristimo pgvector koji omogućuje indeksiranje i pretraživanje vektora visoke dimenzije. Na primjer, agent može upitati: "Pronađi sve dokumente slične ovom vektoru" koristeći cosine sličnost. Kod je jednostavan: SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, ...]' LIMIT 10;. Ovo je brzo i skalabilno za milijune vektora. Vektorski upiti su ključni za semantičko pretraživanje i preporuke.
Graf pretraživanje s rekurzivnim CTE-ovima
Graf pretraživanje implementiramo koristeći rekurzivne CTE-ove (Common Table Expressions).
Na primjer, za pronalaženje svih povezanih čvorova u grafu znanja, koristimo: WITH RECURSIVE path AS (SELECT id, name FROM nodes WHERE id = 1 UNION ALL SELECT n.id, n.name FROM nodes n JOIN path p ON n.parent_id = p.id) SELECT * FROM path;. Ovo omogućuje agentima da pretražuju relacije poput "tko je povezan s kim" u jednom upitu. Kombiniranje graf pretraživanja s vektorskim upitima donosi dodatnu moć.
Relacijski spojevi i kombinirani upiti s vektorskim upitima
Najveća snaga našeg pristupa je mogućnost kombiniranja svih triju vrsta upita. Na primjer, agent može upitati: "Pronađi sve korisnike koji su slični ovom vektoru, a koji su povezani s određenim entitetom u grafu, i imaju više od 100 prijatelja". To radimo spajanjem vektorskog upita s graf CTE-om i relacijskim JOIN-om u jednoj SQL naredbi.
Primjer koda: SELECT u.* FROM users u JOIN (SELECT id FROM graph WHERE ...) g ON u.id = g.user_id WHERE u.embedding <=> '[0.1, 0.2]' < 0.5 AND u.friends > 100;. Vektorski upiti ovdje djeluju kao filter za semantičku sličnost.
Kompromisi i izazovi s vektorskim upitima
Iako je ujedinjenje moćno, postoje kompromisi. Prvo, performanse vektorskih upita u PostgreSQL-u su nešto sporije nego u specijaliziranim sustavima poput FAISS-a za milijarde vektora. Drugo, rekurzivni CTE-ovi mogu biti spori za duboke grafove. Treće, indeksiranje zahtijeva pažljivo planiranje. No, za većinu stvarnih primjena s do nekoliko milijuna vektora i umjerenim grafovima, ovo je više nego dovoljno. Vektorski upiti su optimizirani za brzinu i točnost.
Zaključak o vektorskim upitima
Ujedinjeni upitni sloj u RiNET-u omogućuje agentima da izvode složene upite koji kombiniraju vektorske upite, graf pretraživanje i relacijske spojeve u jednoj bazi podataka. Ovo pojednostavljuje arhitekturu, smanjuje kašnjenje i poboljšava konzistenciju podataka. Iako postoje kompromisi u performansama za ekstremne slučajeve, za većinu stvarnih primjena ovo je optimalno rješenje. Vektorski upiti su ključni za semantičko razumijevanje i donošenje odluka.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari