Главна навигација

Може ли Postgres да управува со вашиот RAG-процес?

Го тестиравме пристапот на pgai насочен кон базата за да утврдиме каде ги поедноставува RAG-операциите, а каде сложените задачи сè уште бараат поголема флексибилност.

Извршно резиме

  • Големите јазични модели (LLM) можат да „видат“ само ограничено количество текст одеднаш (прозорецот за контекст). Ова функционира за мали задачи, но не и кога базата на знаење опфаќа илјадници страници. Дури и кога прозорецот за контекст е доволен, перформансите сепак може да се намалат поради проблемот со „игла во сено“.

  • RAG („генерирање збогатено со пребарување“) стана многу вообичаен пристап: одржувате база на знаење (документи, викија, политики, транскрипти итн.), вршите семантичко пребарување за корисничкото барање за да ги пронајдете најрелевантните извадоци преку векторски претставувања, а потоа тие делови, заедно со прашањето, ги внесувате во големи јазични модели (LLM). Ова го ограничува контекстот на моделот и, ако е правилно изведено, може да го подобри квалитетот на одговорите и да ги намали халуцинациите.

  • pgai е Postgres-проширување со отворен код (и придружни алатки) што помага да изградите работни процеси за „пребарување со ВИ“ врз доверливата база на податоци со отворен код PostgreSQL.

  • Главната идеја е поголем дел од стандардниот RAG-процес да се префрли во слојот на базата на податоци (внесување → делење → векторизирање → синхронизирање на векторските претставувања), наместо базата да се третира како „само складиште“ за нив.

  • Првичниот впечаток е дека решението ветува, но штом RAG-процесот стане барем малку посложен, особено во начинот на делење, веќе не е соодветно. Сепак, внимателно ќе го следиме овој проект.

RAG-пристапот

RAG може да се изгради на многу начини. За подетален преглед на различните пристапи, прочитајте Практични примери на приспособени RAG-решенија. Кога квалитетот е важен, можностите за дизајн стануваат изненадувачки сложени, а вообичаениот „стандарден“ пристап главно изгледа вака:

  1. Земете збирка документи.

  2. Поделете ги на делови. Постојат многу начини за тоа (на пр. според пасуси или семантички групи).

  3. Претворете го секој дел во векторско претставување.

  4. Зачувајте ги векторските претставувања во векторска база на податоци (Pinecone, Milvus итн.) или во Postgres преку pgvector.

  5. При барање, пронајдете ги најблиските делови `и внесете ги во големи јазични модели (LLM) (повторно... и ова може да се направи на многу начини).

Во многу технолошки системи, чекорите (1)–(3) се извршуваат надвор од базата, во апликациски код или податочен процес, а базата главно служи за:

  • чување векторски претставувања

  • пребарување векторски претставувања

Намената на pgai

pgai е Postgres-проширување (со отворен код, развиено од Timescale) што се обидува да ја избрише таа граница.

Наместо апликацијата рачно да управува со векторските претставувања, pgai ги претвора во функција на базата на податоци:

  • Одредувате која табела или кои документи сакате да се векторизираат.

  • Ги наведувате моделот за векторизација и стратегијата за делење.

  • pgai управува со сè друго, вклучително и со ажурирањето на векторските претставувања кога се менуваат изворните податоци.

Ветувањето е привлечно:

  • Помалку наменски поврзувачки код што треба да се одржува.

  • Полесно одржување на „свежи“ векторски претставувања при промена на изворните документи.

  • Postgres/pgai управува со повторните обиди, ограничувањата на стапката, неуспешните задачи итн.

Забелешка за читателите: pgai го вклучува pgvector (уште едно многу популарно Postgres-проширување за RAG). pgvector додава векторско складирање и пребарување според сличност во Postgres, а pgai се надоврзува на него за да ги автоматизира чекорите на RAG-процесот, како делење, векторизирање и ажурирање на векторските претставувања.

Првични впечатоци за pgai

Што ни се допадна

1) Лесно се поставува и стартува.

Во идеални услови, постапката е прилично едноставна:

  • Преземете ги Docker-сликите на Timescale (база на податоци + работник).

  • Внесете го API-клучот од давателот на услугата за векторизација.

  • Извршете малку SQL за да го дефинирате векторизаторот (односно: што да се векторизира, како да се подели и кој модел да се користи).

Потоа pgai овозможува работникот за векторизација да работи како посебен процес и асинхроно да создава векторски претставувања (на пр. на секои 5 минути или според саканиот распоред).

2) Практично е целиот процес да се одвива „блиску“ до базата на податоци.

pgai може да внесува содржина од табели, но и да вчитува документи од места како S3, а потоа да ги анализира, дели и векторизира. Поддржува и различни формати на текстуални документи, како PDF, Markdown итн.

Што нè ограничуваше

1) Губите голем дел од контролата (а на RAG понекогаш му е потребна контрола).

RAG-системите со високи перформанси (мерени според квалитетот на одговорите) често бараат приспособени процеси, како:

  • приспособени правила за делење (според наслови, страници, промени на говорникот итн.)

  • делење што ги зема предвид метаподатоците (задржување на насловите на деловите, временските ознаки, авторите и видот на документот)

  • различни стратегии за векторизација за секој вид документ

pgai нуди помала флексибилност за наведеното.

Во моментов има две главни стратегии за делење: делител на текст според знаци и рекурзивен делител според знаци, како и опција без делење. Тоа може да биде доволно за некои случаи, но многу продукциски RAG-системи бараат поголемо приспособување.

Би било одлично ако Timescale вклучи некои од пософистицираните стратегии за делење што ги среќаваме во библиотеки како Chonkie и слично поддржи напредни решенија како контекстуалното пребарување на Anthropic.

2) Првенствено за текст, а не за мултимодални содржини.

Многу интересни RAG-проблеми веќе не се ограничени само на текст:

  • PDF-документи со дијаграми

  • снимки од екранот / слики

  • аудиоснимки

  • видеоклипови

Дури и ако можете да „извлечете текст“ од овие извори, тоа не е исто што и вистински мултимодален процес за векторизација.

Ако pgai на крајот понуди целосна поддршка за мултимодални модели (вчитување → делење → векторизирање на големи слики, аудио и видео зачувани во S3, со сигурна синхронизација), тоа би било привлечно. Но денес станува збор за процес за векторизација на текст.

3) Ако ви требаат само векторски претставувања, можеби не ви треба pgai.

Ако вашиот процес на внесување веќе е приспособен (или мора да биде), тогаш „векторизирањето делови од текст“ не е најтешкиот дел од RAG. Во таков случај, pgai го решава најлесниот дел од проблемот.

Исто така, ако базата на знаење ретко се ажурира, автоматската синхронизација на векторските претставувања не носи толкава вредност.

Слој за претворање текст во SQL

Особено добар начин за користење на pgai би бил поставување интерфејс за претворање текст-во-SQL над вашите бази на податоци. Ова може прилично лесно да се постигне со модулот semantic_catalog што го нуди pgai. Едноставно поставете го вака:

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"

а потоа овозможете му на семантичкиот каталог да ги прочита вашите податочни речници со pgai semantic-catalog create. Ова создава контекст од вашето складиште на податоци, кој изгледа приближно вака:

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

Овој контекст сега му е достапен на pgai на повеќе начини:

Преку семантичко пребарување:

Ова барање ќе ги врати табелите, функциите и другите објекти што може да бидат релевантни за вашето барање на природен јазик:

Bash

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

Добивање необработен контекст:

Ова ќе го прикаже необработениот YAML-контекст поврзан со вашето барање на природен јазик:

Bash

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

Генерирање SQL:

Или можете директно да го генерирате необработениот SQL потребен за одговор на вашето барање. Контекстот од претходниот чекор се испраќа до големи јазични модели (LLM), по што се создава одговор:

Bash

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

Како можете да го користите pgai уште сега

Ако градите релативно едноставен RAG-систем, вреди да го испробате pgai доколку сакате:

  • Postgres како главен извор на податоци,

  • минимум поврзувачки код,

  • векторски претставувања што автоматски остануваат синхронизирани,

  • брз начин да примените претворање текст-во-SQL врз вашите бази на податоци,

  • да експериментирате со нови RAG-алатки и Postgres-проширувања.

Каде би биле претпазливи

Веројатно е подобро да почекате со pgai ако на вашиот RAG-процес му треба нешто од следново:

  • многу приспособена логика за внесување или делење

  • многу видови документи со различни барања за анализа

  • мултимодални векторски претставувања

На крајот, иако pgvector очигледно е широко прифатен, не е јасно дали pgai ќе привлече исто ниво на интерес, а со тоа и поддршка (иако постои само околу 18 месеци).

Графикон од GitHub за историјата на ѕвезди, кој го прикажува прифаќањето на pgai од Timescale со текот на времето.

Резиме

pgai е интересен RAG-пристап што им препушта на базите на податоци поголем дел од рутинската оперативна работа, со што апликацискиот код може да биде поедноставен.

Во моментов, тој е:

  • употреблив и навистина пријатен за едноставни RAG-поставувања

  • недоволно флексибилен за поспецифични процеси (особено мултимодални)

Ветува и дефинитивно вреди да се следи неговиот развој.

Автор

Andrew Liubinas