Fő navigáció

Képes a Postgres kezelni a RAG-folyamatot?

Teszteltük a pgai adatbázis-központú megközelítését, hogy kiderüljön, hol egyszerűsíti a RAG működtetését, és hol igényelnek az összetett feladatok nagyobb rugalmasságot.

Vezetői összefoglaló

  • Az LLM-ek egyszerre csak korlátozott mennyiségű szöveget képesek „látni” (ez a kontextusablak). Ez kisebb feladatoknál működik, de több ezer oldalnyi tudásbázis esetén már nem. Még elegendő méretű kontextusablak esetén is romolhat a teljesítmény a „tű a szénakazalban” probléma miatt.

  • A RAG („visszakereséssel támogatott generálás”) széles körben elterjedt megoldás: egy tudásbázisból (dokumentumokból, wikikből, szabályzatokból, átiratokból stb.) szemantikus kereséssel és beágyazások segítségével lekérik a felhasználói kérdéshez leginkább kapcsolódó részleteket, majd ezeket a kérdéssel együtt átadják az LLM-nek. Ez leszűkíti a modell kontextusát, és megfelelő megvalósítás esetén javíthatja a válaszok minőségét, valamint csökkentheti a hallucinációkat.

  • A pgai egy nyílt forráskódú Postgres-bővítmény és a hozzá tartozó eszközkészlet, amellyel „MI-alapú visszakeresési” munkafolyamatok építhetők a megbízható, nyílt forráskódú PostgreSQL adatbázisra.

  • A fő elgondolás az, hogy a szokásos RAG-folyamat minél nagyobb része az adatbázisrétegbe kerüljön (betöltés → darabolás → beágyazás → beágyazások szinkronban tartása), ahelyett, hogy az adatbázisra a beágyazások „puszta tárhelyeként” tekintenénk.

  • Első benyomásunk szerint ígéretes, de amint a RAG-folyamat kissé összetettebbé válik – különösen a darabolási módszerek terén –, már nem igazán alkalmas. Ennek ellenére szorosan követjük majd a projektet.

A RAG-minta

A RAG sokféleképpen megvalósítható; a különböző megközelítések részletesebb bemutatásáért olvassa el a Gyakorlati példák testreszabott RAG-megoldásokra című cikket. Ha fontos a minőség, a tervezési lehetőségek meglepően szerteágazóvá válnak. Az elterjedt „alapértelmezett” megközelítés általában így néz ki:

  1. Gyűjtsön össze egy halom dokumentumot.

  2. Darabolja fel őket. Erre számos különböző módszer létezik (például bekezdések vagy szemantikai csoportok szerint).

  3. Minden darabból készítsen beágyazást.

  4. Tárolja a beágyazásokat vektoradatbázisban (Pinecone, Milvus stb.), vagy a pgvector használatával Postgresben.

  5. Lekérdezéskor keresse meg a legközelebbi darabokat, `és adja át őket az LLM-nek (ismét csak... erre is számos módszer létezik).

Sok technológiai rendszerben az (1)–(3) lépés az adatbázison kívül, alkalmazáskódban vagy adatfeldolgozási folyamatban történik, az adatbázist pedig főként a következőkre használják:

  • beágyazások tárolása

  • keresés a beágyazások között

A pgai célja

A pgai egy nyílt forráskódú, a Timescale által fejlesztett Postgres-bővítmény, amely megpróbálja elmosni ezt a határvonalat.

Ahelyett, hogy az alkalmazásnak kellene kézzel kezelnie a beágyazásokat, a pgai adatbázis-funkcióvá teszi őket:

  • Ön határozza meg, hogy melyik táblát vagy dokumentumokat szeretné beágyazni.

  • Ön adja meg a beágyazási modellt és a darabolási stratégiát.

  • A többit a pgai kezeli, beleértve a beágyazások naprakészen tartását a forrásadatok változásakor.

Az ígéret vonzó:

  • Kevesebb karbantartandó, egyedi összekötő kód.

  • Könnyebb lehet „frissen” tartani a beágyazásokat az alapul szolgáló forrásdokumentumok változásakor.

  • A Postgres/pgai kezeli az újrapróbálkozásokat, a sebességkorlátokat, a sikertelen feladatokat stb.

Megjegyzés az olvasónak: a pgai magában foglalja a pgvectort, egy másik rendkívül népszerű RAG-bővítményt a Postgreshez. A pgvector vektortárolással és hasonlósági kereséssel egészíti ki a Postgrest, a pgai pedig erre építve automatizálja a RAG-folyamat olyan lépéseit, mint a darabolás, a beágyazás és a beágyazások naprakészen tartása.

Első benyomások a pgai-ról

Ami tetszett

1) Egyszerűen üzembe helyezhető.

Ideális esetben a folyamat meglehetősen egyszerű:

  • Töltse le a Timescale Docker-rendszerképeit (adatbázis + feldolgozó).

  • Adja meg a beágyazási szolgáltató API-kulcsát.

  • Néhány SQL-utasítással állítsa be a vektorizálót: mit kell beágyazni, hogyan kell darabolni, és melyik modellt kell használni.

Ezután a pgai gondoskodik arról, hogy egy vektorizáló feldolgozó külön folyamatként fusson, és aszinkron módon készítse el a beágyazásokat (például 5 percenként vagy bármilyen kívánt ütemezés szerint).

2) Kényelmes, hogy a teljes folyamat az adatbázis „közelében” zajlik.

A pgai táblákból is képes tartalmat betölteni, emellett például az S3-ból is beolvashat dokumentumokat, majd feldolgozhatja, feldarabolhatja és beágyazhatja őket. Különböző szöveges dokumentumformátumokat, például PDF-et és Markdownt is képes kezelni.

Ami korlátozónak bizonyult

1) Jelentősen csökken az irányítás lehetősége – márpedig a RAG-nál erre néha szükség van.

A válaszminőség alapján nagy teljesítményűnek számító RAG-rendszerekhez gyakran egyedi folyamatokra van szükség, például:

  • egyedi darabolási szabályok (címsorok, oldalak, beszélőváltások stb. alapján)

  • metaadatokat figyelembe vevő darabolás (szakaszcímek, időbélyegek, szerzők és dokumentumtípus megőrzése)

  • dokumentumtípusonként eltérő beágyazási stratégiák

A pgai a fentiekben kevesebb rugalmasságot kínál.

Jelenleg két fő darabolási stratégia létezik: a karakteralapú szövegfelosztó és a rekurzív karakteralapú szövegfelosztó, emellett a darabolás ki is kapcsolható. Ez bizonyos felhasználási esetekhez elegendő lehet, de sok éles RAG-rendszer nagyobb mértékű testreszabást igényel.

Nagyszerű lenne, ha a Timescale beépítene néhányat az olyan könyvtárakban látható, kifinomultabb darabolási stratégiákból, mint a Chonkie, és támogatná az olyan fejlett megoldásokat is, mint az Anthropic kontextuális visszakeresése.

2) Elsősorban szöveges, nem multimodális.

Sok érdekes RAG-probléma már nem kizárólag szöveges:

  • ábrákat tartalmazó PDF-ek

  • képernyőképek/képek

  • hangfelvételek

  • videoklipek

Még ha ezekből a forrásokból „ki is nyerhető a szöveg”, az nem ugyanaz, mint egy valóban multimodális beágyazási folyamat.

Meggyőző lenne, ha a pgai idővel teljes folyamatukban támogatná a multimodális modelleket – vagyis az S3-ban tárolt nagyméretű képek, hang- és videófájlok betöltését → darabolását → beágyazását, megbízható szinkronizálással –, jelenleg azonban csak szövegbeágyazási munkafolyamatot kínál.

3) Ha csak beágyazásokra van szüksége, lehet, hogy nincs szüksége a pgai-ra.

Ha a betöltési folyamat már eleve egyedi – vagy annak kell lennie –, akkor a „szövegdarabok beágyazása” nem a RAG legnehezebb része. Ebben az esetben a pgai a probléma legegyszerűbb részét oldja meg.

Ha pedig a tudásbázis ritkán frissül, az automatikus beágyazásszinkronizálás értéke is kisebb.

Szövegből SQL-t előállító réteg

A pgai egyik különösen jó felhasználási módja egy szövegből SQL-t előállító felület telepítése az adatbázisok fölé. Ez meglehetősen egyszerűen megvalósítható a pgai semantic_catalog moduljával. Egyszerűen állítsa be így:

Bash

OPENAI_API_KEY="your-OpenAPI-key-goes-here"TARGET_DB="postgres://user:password@host:port/database"CATALOG_DB="postgres://user:password@host:port/database"

majd a pgai semantic-catalog create paranccsal olvastassa be az adatszótárakat a szemantikai katalógussal. Ez az alábbihoz hasonló kontextust hoz létre az adattárból:

Plain Text

---schema: postgres_airname: aircrafttype: tabledescription: Lists aircraft models with performance characteristics and unique codes.columns:- name: model  description: Commercial name of the aircraft model.- name: range  description: Maximum flight range in kilometers.- name: class  description: Airframe class category or configuration indicator.- name: velocity  description: Cruising speed of the aircraft.- name: code  description: Three-character aircraft code serving as the primary key....

Ez a kontextus mostantól többféleképpen is elérhető a pgai számára:

Szemantikus kereséssel:

Ez a lekérdezés visszaadja azokat a táblákat, függvényeket és egyéb objektumokat, amelyek kapcsolódhatnak a természetes nyelvű lekérdezéshez:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!"

Nyers kontextus lekérése:

Ez megjeleníti a természetes nyelvű lekérdezéshez kapcsolódó nyers YAML-kontextust:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!" --render

SQL generálása:

Közvetlenül is előállíthatja a lekérdezés megválaszolásához szükséges nyers SQL-t. Az előző lépésben létrehozott kontextust elküldi egy LLM-nek, amely választ generál:

Bash

pgai semantic-catalog generate-sql -p "Your natural language question goes here!"

Hogyan használható most a pgai?

Ha viszonylag egyszerű RAG-rendszert épít, érdemes kipróbálnia a pgai-t, ha a következőket szeretné:

  • a Postgres legyen a hiteles adatforrás,

  • minimális mennyiségű összekötő kód,

  • automatikusan szinkronban maradó beágyazások,

  • a szövegből SQL-t előállító megoldás gyors alkalmazása az adatbázisokra,

  • új RAG-eszközök és Postgres-bővítmények kipróbálása.

Amivel óvatosak lennénk

Valószínűleg érdemes még várni a pgai-jal, ha a RAG-folyamatnak az alábbiak bármelyikére szüksége van:

  • nagymértékben testreszabott betöltési vagy darabolási logika

  • sokféle, eltérő feldolgozást igénylő dokumentumtípus

  • multimodális beágyazások

Végezetül: bár a pgvector egyértelműen széles körben elterjedt, nem tudni, hogy a pgai hasonló érdeklődésre és így támogatásra számíthat-e – igaz, csak körülbelül 18 hónapja létezik.

GitHub-csillagok számának időbeli alakulását bemutató diagram a Timescale pgai elterjedéséről.

Összegzés

A pgai érdekes RAG-megközelítés: a rutinszerű üzemeltetési feladatok nagyobb részét az adatbázisra bízza, így egyszerűbbé teheti az alkalmazáskódot.

Jelenleg:

  • egyszerű RAG-rendszerekhez jól használható és kifejezetten kellemes

  • egyedibb folyamatokhoz nem elég rugalmas, különösen multimodális esetekben

Ígéretes, és mindenképpen érdemes figyelemmel kísérni a fejlődését.

Szerző

Andrew Liubinas