Pangunahing nabigasyon

Kaya bang pangasiwaan ng Postgres ang iyong RAG pipeline?

Sinubukan namin ang database-first na paraan ng pgai upang makita kung saan nito pinapadali ang RAG—at kung saan kailangan pa ng mas flexible na solusyon.

Buod para sa mga ehekutibo

  • Limitadong dami lamang ng text ang kayang “makita” ng mga LLM nang sabay-sabay (ang context window). Gumagana ito para sa maliliit na gawain, ngunit hindi na kapag libo-libong pahina ang saklaw ng isang knowledge base. Kahit sapat ang context window, maaari pa ring bumaba ang performance dahil sa problemang “karayom sa bunton ng dayami.”

  • Ang RAG (‘retrieval augmented generation’) ay naging napakakaraniwang pattern kung saan nagpapanatili ka ng knowledge base (mga dokumento, wiki, patakaran, transcript, atbp.), nagsasagawa ng semantic search sa query ng user upang kunin ang mga pinakanauugnay na snippet gamit ang mga embedding, at pagkatapos ay ipinapasok ang mga chunk na iyon sa LLM kasama ng tanong. Nililimitahan nito ang context ng modelo at, kapag ginawa nang tama, maaari nitong pagandahin ang kalidad ng sagot at bawasan ang mga hallucination.

  • Ang pgai ay isang open-source na extension ng Postgres (at mga katuwang na tool) na tumutulong sa iyong bumuo ng mga workflow para sa “AI retrieval” gamit ang pinagkakatiwalaang open-source database na PostgreSQL.

  • Ang pangunahing ideya ay ilipat ang mas malaking bahagi ng karaniwang RAG pipeline sa database layer (ingest → chunk → embed → panatilihing naka-sync ang mga embedding), sa halip na ituring ang DB bilang “imbakan lang” ng mga embedding.

  • Sa aming unang pagsusuri, mukhang may potensyal ito, ngunit kapag medyo naging komplikado na ang iyong RAG pipeline—lalo na ang mga paraan ng pag-chunk—hindi na ito angkop. Gayunman, tututukan namin ang proyektong ito.

Ang RAG pattern

Maraming paraan upang bumuo ng RAG. Para sa mas detalyadong paliwanag sa iba't ibang paraan, basahin ang Mga Praktikal na Halimbawa ng Mga Customized na RAG Solution. Nakakagulat ang lalim ng mga posibilidad sa disenyo kapag mahalaga ang kalidad, at karaniwang ganito ang “default” na paraan:

  1. Kumuha ng maraming dokumento.

  2. Hatiin ang mga ito sa mga chunk. Maraming paraan upang gawin ito (hal., ayon sa mga talata o semantic grouping).

  3. Gawing embedding ang bawat chunk.

  4. I-store ang mga embedding sa isang vector database (Pinecone, Milvus, atbp.) o sa Postgres gamit ang pgvector.

  5. Kapag may query, hanapin ang pinakamalalapit na chunk `at ipasa ang mga ito sa LLM (muli...marami ring paraan upang gawin ito).

Sa maraming tech stack, nagaganap ang mga hakbang (1)–(3) sa labas ng database, sa application code o data pipeline, at pangunahing ginagamit ang database para sa:

  • pag-store ng mga embedding

  • paghahanap sa mga embedding

Layunin ng pgai

Ang pgai ay isang extension ng Postgres (open source, binuo ng Timescale) na naglalayong palabuin ang hangganang iyon.

Sa halip na ituring ang mga embedding bilang bagay na mano-manong pinamamahalaan ng iyong app, ginagawa ng pgai na feature ng database ang mga ito:

  • Tinutukoy mo kung aling table o mga dokumento ang lalagyan ng embedding.

  • Tinutukoy mo ang modelo para sa embedding at ang diskarte sa pag-chunk.

  • Pinamamahalaan ng pgai ang iba pa, kabilang ang pagpapanatiling updated ng mga embedding habang nagbabago ang source data mo.

Kaakit-akit ang pangako nito:

  • Mas kaunting custom na glue code na kailangang panatilihin.

  • Dapat mas madaling panatilihing ‘sariwa’ ang mga embedding habang nagbabago ang pinagmumulang mga dokumento.

  • Pinamamahalaan ng Postgres/pgai ang mga retry, rate limit, bigong job, atbp.

Paalala sa mambabasa: Kasama sa pgai ang pgvector (isa pang napakasikat na RAG extension para sa Postgres). Nagdaragdag ang pgvector ng vector storage at similarity search sa Postgres, habang ginagamit naman iyon ng pgai upang i-automate ang mga hakbang sa RAG pipeline tulad ng pag-chunk, pag-embed, at pagpapanatiling updated ng mga embedding.

Unang pagsusuri sa pgai

Ang nagustuhan namin

1) Madali itong paandarin.

Medyo simple ang pinakamadaling proseso:

  • Kunin ang mga Docker image ng Timescale (database + worker).

  • Ibigay ang API key ng iyong embedding provider.

  • Magpatakbo ng kaunting SQL upang ideklara ang vectoriser (sa madaling salita: ano ang ie-embed, paano ito hahatiin sa mga chunk, at aling modelo ang gagamitin).

Pagkatapos, inaayos ng pgai na tumakbo ang isang vectoriser worker bilang hiwalay na proseso at gumawa ng mga embedding nang asynchronous (hal., bawat 5 minuto o sa anumang iskedyul na gusto mo).

2) Magandang gawin ang buong pipeline “malapit” sa database.

Maaaring mag-ingest ang pgai ng content mula sa mga table at mag-load ng mga dokumento mula sa mga lokasyon gaya ng S3, saka i-parse, i-chunk, at i-embed ang mga ito. Kaya rin nitong pangasiwaan ang iba't ibang format ng text document gaya ng PDF, Markdown, at iba pa.

Mga naging limitasyon

1) Malaki ang nababawas sa kontrol mo (at kailangan kung minsan ng RAG ang kontrol).

Ang mga RAG system na mahusay ang performance batay sa kalidad ng sagot ay madalas na nangangailangan ng mga custom na pipeline, gaya ng:

  • mga custom na panuntunan sa pag-chunk (ayon sa heading, pahina, pagpapalitan ng speaker, atbp.)

  • pag-chunk na isinasaalang-alang ang metadata (panatilihin ang mga pamagat ng seksyon, timestamp, may-akda, at uri ng dokumento)

  • magkakaibang diskarte sa embedding para sa bawat uri ng dokumento

Mas limitado ang flexibility ng pgai sa mga nabanggit.

Sa ngayon, may dalawang pangunahing diskarte sa pag-chunk: character text splitter at recursive character text splitter, bukod pa sa opsyong walang pag-chunk. Maaaring sapat iyon para sa ilang use case, ngunit mas maraming customization ang kailangan ng maraming production RAG system.

Magiging mahusay kung maisasama ng Timescale ang ilan sa mas sopistikadong diskarte sa pag-chunk na makikita sa mga library gaya ng Chonkie, at masuportahan din ang mga advanced na disenyo tulad ng contextual retrieval ng Anthropic.

2) Text muna, hindi multimodal.

Maraming kawili-wiling problema sa RAG ang hindi na puro text lamang:

  • Mga PDF na may mga diagram

  • mga screenshot / larawan

  • mga audio recording

  • mga video clip

Kahit kaya mong “mag-extract ng text” mula sa mga source na ito, hindi iyon katumbas ng tunay na multimodal embedding pipeline.

Kung susuportahan kalaunan ng pgai ang mga multimodal na modelo nang end-to-end (load → chunk → embed para sa malalaking larawan/audio/video na naka-store sa S3, na may maaasahang pag-sync), magiging kapaki-pakinabang iyon. Ngunit sa ngayon, workflow ito para sa text embedding.

3) Kung mga embedding lang ang kailangan mo, baka hindi mo kailangan ang pgai.

Kung custom na ang iyong ingestion pipeline (o kailangan itong maging custom), hindi ang “pag-embed ng mga chunk ng text” ang pinakamahirap na bahagi ng RAG. Sa ganitong sitwasyon, ang pinakamadaling bahagi ng problema ang nilulutas ng pgai.

Dagdag pa, kung bihirang i-update ang iyong knowledge base, hindi ganoon kalaki ang pakinabang ng awtomatikong pag-sync ng mga embedding.

Text-to-SQL layer

Isang mahusay na paraan ng paggamit sa pgai ang pag-deploy ng text-to-SQL interface sa iyong mga database. Madali itong magagawa gamit ang semantic_catalog module na inaalok ng pgai. I-set up lang nang ganito:

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"

at ipakuha sa semantic catalog ang iyong mga data dictionary gamit ang pgai semantic-catalog create. Gumagawa ito ng context mula sa iyong datastore na ganito ang hitsura:

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....

Magagamit na ngayon ng pgai ang context na ito sa iba't ibang paraan;

Sa pamamagitan ng semantic search:

Ibabalik ng query na ito ang mga table, function, at iba pang object na maaaring nauugnay sa iyong natural-language query:

Bash

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

Kunin ang raw context:

Ire-render nito ang raw YAML context na nauugnay sa iyong natural-language query:

Bash

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

Bumuo ng SQL:

O maaari mong direktang buuin ang raw SQL na kailangan upang sagutin ang iyong query. Ipinapadala sa isang LLM ang context mula sa nakaraang hakbang at bumubuo ito ng sagot:

Bash

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

Paano mo magagamit ang pgai ngayon

Kung bumubuo ka ng medyo simpleng RAG system, sulit subukan ang pgai kung gusto mo ng:

  • Postgres bilang iyong system of record,

  • kaunting glue code,

  • mga embedding na awtomatikong nananatiling naka-sync,

  • mabilis na paraan upang maglapat ng text-to-SQL sa iyong mga database,

  • pagkakataong subukan ang mga bagong RAG tool at extension ng Postgres.

Kung saan kami mag-iingat

Mas mabuting maghintay muna bago gumamit ng pgai kung kailangan ng iyong RAG pipeline ang alinman sa mga sumusunod:

  • maraming custom na logic para sa pag-ingest o pag-chunk

  • maraming uri ng dokumento na may magkakaibang kinakailangan sa pag-parse

  • mga multimodal embedding

Panghuli, bagama't malinaw na malawak ang paggamit sa pgvector, hindi pa tiyak kung magkakaroon ang pgai ng kaparehong antas ng interes at suporta (bagama't humigit-kumulang 18 buwan pa lamang itong umiiral).

GitHub star-history chart na nagpapakita ng paggamit sa pgai ng Timescale sa paglipas ng panahon.

Buod

Ang pgai ay isang kawili-wiling paraan ng paggamit ng RAG na nagbibigay-daan sa mga database na gawin ang mas marami sa rutinang operational na gawain, upang maging mas simple ang application code mo.

Sa ngayon, ito ay:

  • magagamit at talagang madaling gamitin para sa mga simpleng RAG setup

  • hindi sapat ang flexibility para sa mas custom na pipeline (lalo na sa multimodal)

May potensyal ito at talagang sulit subaybayan ang pag-unlad nito.

May-akda

Andrew Liubinas