Семантычныя пошукі ў PostgreSQL з pgvector і Node.js, няма патрэбы ў LLM
Семантычныя пошукі ў PostgreSQL з pgvector і Node.js, без LLM: эмбеддынгі MiniLM, чакі, індэкс IVFFlat, аператары адстані і спосабы чытання рэйтынгаў.
Крыніцы: Talk to Your Database Like a Human — No LLM Required: Semantic Search with Node.js + PostgreSQL
База дадзеных можа адпаведзець на запытанні, заданыя на звычнай англійскай мове, без выкарыстоўвання якога-лібо мовнага модэля. Гэта стаўша можлівым завдзяк вектарнаму пошуку. За дапамогою Node.js, PostgreSQL і расшырэння pgvector можна стварыць сістэму, якая адпаведзяе на запытанні на адпаведнасць іх намеру, а не ключоўых слоў, пры чым едым модэлем, які выкарыстоўваецца, ёсць маленькі модэль укладкі, які ператварае тэкст у цыфры.
Рэляцыйныя базы дадзеных завжды былі чырвонымі у збераганні і выкарыстоўванні дадзеных, за ўмовы, што запытанне задаецца абдзёльна правільна. Точныя адпаведнасці, фільтры і структураваныя запытанні ёсць моцнымі, але вузкімі засобамі. Вектарныя базы дадзеных, здаецца, рашаюць іншую проблему: пошук неструктураванага кантэнту на адпаведнасць яго значэнню, а не на адпаведнасць словам, якія ён мае.
Чатыры тэрміны, якія варта чытальна з’ясаваць
Токэн. Мінімальны элемент тэксту, з якім працюе мадэль. Токэны не завжды ўтвараюць цэлыя словы. Токэн можа быць цэлым словам, такім як „hello“, фрагментам (такім чынам „unbelievable“ можа стаць „un“, „believ“ і „able“), адзінным сімволам, напрыклад „!“, або часткай знака пунктуаціі чы розрыву ліній. Фраза на кшталт „ChatGPT is great“ можа быць разлучана на „Chat“, „G“, „PT“, „is“ і „great“.
Чанк. Невялікі, самостатны фрагмент большага дакумента, зазвычай калькі рэчэй чы адзін параграф. Уключэнне цэлага дакумента заодно працюе паслаба, таму яго спачатку дзеляць на чанкі. Раздзелэнне на чанкі прышвычае працэс апрацоўкі, павышае точнасць пошуку і дапамагае заставіць рэзультаты адпаведныя запіту.
Эмбеддынг. Чыслаўскі адпрацоўкаваны атавар ад часткі тэксту, зображэння або адгуку, які выражае яго значэнне. Ёго стварае мадэль машыннага навучэння, напрыклад MiniLM. Эмбеддынг можна спачатку спрыяць як ідэю, якая стоіць за данымі.
Вектар. Спосаб, якім фактычна зберагаецца эмбеддынг: масіва чысловых значэнняў.
[0.2, -0.5, 0.9, ...]
Гэта і форма, якая зберагаецца ў памяці і ў PostgreSQL пасля установкі такога расшырэння, як pgvector.
У сукупнасці ідэя выглядае так: словы, рэчызкі або зображэнні ператвараюцца на эмбеддынгі. Аб’екты з падобным значэннем маюць вектары, якія знаходзяцца блізка адзін да другога, а несупаўзнаныя аб’екты — далей адзін ад другога. Строка на кшталт “Hello world” ператвараецца на дзьвінкі спіс чыслаў з паводлівымі знакамі:
// "Hello world" turns into this embedding:
const embedding = [0.01, -0.42, 0.15, ..., 0.99]; // ← this is a vector
і гэты спіс пасля таго зберагаецца паляў пры самым аднагоначным тэксце:
INSERT INTO documents (content, embedding)
VALUES ('Hello world', embedding);
Чаму сабяродная база дадзэных недасты
Традыцыйны RDBMS працуе з табліцамі, радамі і столбцамі. Ён без працы обрабоцвае запіты на кшталт „все квіты з статусам OPEN“ або „выкарыстоўваннікі, створаныя пасля 2024 года“. Аднак савэцкія прыкладнікі таксама работаюць з дакументамі, кансэрваціямі, адпраўкамі і аудыя. Точная адпаведнасць не можа даць больш заўсёды з гэтымі дадзенымі.
Вектарная база дадзэных храніць эмбеддынгі разам з дадзенымі і знаходзіць элементы па сэмабільнасці і кантэксту. Такім чынам, уместо таго, каб запытацца пра дакументы, якія маюць слова „error“, можна запытацца пра дакументы пра проблемы аутэнтыфікаціі, і яны будуць атрыманы нават тады, калі слова „error“ ніколі не з’яўляюцца. Порэванае — гэта матэматычныя абстанцыі між вектарамі, а не адпаведнасць тэксту.
Звычны пракцэс выглядае так:
- Прыходзіць неапрануты кантэнт: дакументы, квіты або ўсё іншае.
- Мадэль умяшчэння ператварае яго ў вектары.
- Вектары зберагаюцца, напрыклад, у PostgreSQL з аддаткам pgvector.
- Індэкс апрыксіматыўага найбліжэйшага суседа (ANN) спрыяе шырокамасштабным пошукам.
- Запіт корыстніка таксама ператвараецца ў вектар.
- База дадзенаў вяртае вектары, якія знаходзяцца найбліжэй да яго, тое ў значэнні, якія ўсё больш супадаюць.
Што гэта дазволяе:
- Семантычны пошук, які базуецца на значэнні запіту, а не толькі на яго точных словах.
- Даўгастраўнае запамятованне для LLM, што дазволяе зберагаць пакульнія взаімадзеі, дакументы чы факты, якія мадэль можа прыгадаць, нават якія не былі ў яе навучальных дадзенах.
- Рэкамендаціі, што дазволяе знаходзіць айтэмы чы падзеі, якія супадаюць у прасторэ умяшчэння.
- Пошук супадзіння ў тэкстах, адпраўленнях, аудыя чы відэа.
PostgreSQL як хранальнік вектараў
Для всіх цых задач вам не трэба адаптаваць новую базу дадзеных. За дапамою pgvector база дадзеных PostgreSQL можа безпасоваць эмбедынгі безпосерэдзя, выкананыць запыты на аналігія і выкарыстоўваць індэксы, такія як IVFFlat, каб заліцца шырокай. База дадзеных, яку вы ужо выкарыстоўвайце, проста атрымлівае новую можлівасць — ад прытрымання дадзеных да можлівасці пораўнання ўсімернення ў іх. Пошук больш не стосуецца падбору слоў, а стосуецца падбору значэння.
Пашаговая наладка
1. Установіце PostgreSQL і актываціюйце pgvector. Установіце PostgreSQL з офіцыйнай сторонніцы завантажэння, з’яўіцеся ў ёй і увімкніце пашырэнне:
CREATE EXTENSION IF NOT EXISTS vector;
2. Створыце таблыцу дакументаў. Яна зберагае чысты тэкст і яго эмбеддынг. Чысла 384 у апісанні — гэта размер выходных дадзеных для модэлі all-MiniLM-L6-v2.
-- Note: 384 is the embedding size output by all-MiniLM-L6-v2
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(384)
);
3. Дадзіце вектарны індэкс. Чырабець кароткаго часу для пошуку адпоўненасці — выкорыстоўваеце індэкс апрыксіматыўага найбліжэйшага суседа:
CREATE INDEX documents_embedding_idx
ON documents
USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);
Ён выбірае IVFFlat для шырокагахованых пошукаваў, выконвае вімеры за дапамою відстані L2 (Евклідовай) і дзеліць вектары на 100 кластэраў.
4. Спаўнюйце адпаведнасць аператора запіту і індэкса. Аператор у вашым запыце павінен паспаўлявацца з класам аператораў, якімі быў створаны індэкс. pgvector праставляе калькі аператораў, кожны з якіх асоціюецца з своім класам. У даным прыкладзе запыт выкананы за дапамою <#>, а таксама налаштаваны параметр vector_l2_ops. Згадайце, што ў дасягліх матэрыялах pgvector відстань L2 зазвычай выражаецца за дапамою <->, а <#> — гэта ад’ёмнае скалярнае праўдзіве, таму пераканайцеся, што ваш запыт і індэкс супараднуюцца.
5. Запускайце праект. Полны працюючы прыклад знаходзіцца ў рэпазітарыі GitHub пад назвай vectorgarquer/vectorized-database-embeddings. Клонаваце яго або створыце форк, а пасля інсталюйце неабходныя залежнасці:
npm install
Копіюйце .env.example у файл .env у корні праекту і заполніце падзеі наявнасці з’яноўкі да PostgreSQL. Пасля чаго запускайце яго:
npm start
6. Спактуйце, як яно выконвае пошук. Калі програма запускаецца, яна нарабатвае з’янос, дадзеяе эмбедынгі і выконвае сэмантычны пошук без дадатковых вводаў. Пасля гэтага вы можэце падаць яй свае сабе дадзеныя і запыткі. У прыкладзе прабуецца знайсці «Што такое генератыўскі ІІ?», а рэзультаты, якія яна знаходзі ў базе дадзенаў, праказваюцца так:
Search Results:
[1] Distance: -0.7562
n be represented in another modality such as text.
2.2 A Model-, System-, and Application-Level View
of Generative AI
2.2.1 Model-Level View
A generative AI model is a type of machine learning
architecture that uses AI algorithms to create novel data
instances, drawing upon the patterns and relationships
observed in the training data. A generative AI model is of
critically central yet incomplete nature, as it requires fur-
ther fine-tuning to specific tasks thro
[2] Distance: -0.7562
n be represented in another modality such as text.
2.2 A Model-, System-, and Application-Level View
of Generative AI
2.2.1 Model-Level View
A generative AI model is a type of machine learning
architecture that uses AI algorithms to create novel data
instances, drawing upon the patterns and relationships
observed in the training data. A generative AI model is of
critically central yet incomplete nature, as it requires fur-
ther fine-tuning to specific tasks thro
[3] Distance: -0.7562
n be represented in another modality such as text.
2.2 A Model-, System-, and Application-Level View
of Generative AI
2.2.1 Model-Level View
A generative AI model is a type of machine learning
architecture that uses AI algorithms to create novel data
instances, drawing upon the patterns and relationships
observed in the training data. A generative AI model is of
critically central yet incomplete nature, as it requires fur-
ther fine-tuning to specific tasks thro
[4] Distance: -0.7562
n be represented in another modality such as text.
2.2 A Model-, System-, and Application-Level View
of Generative AI
2.2.1 Model-Level View
A generative AI model is a type of machine learning
architecture that uses AI algorithms to create novel data
instances, drawing upon the patterns and relationships
observed in the training data. A generative AI model is of
critically central yet incomplete nature, as it requires fur-
ther fine-tuning to specific tasks thro
[5] Distance: -0.7094
assistants, personalized education and service, and digital
art. As such, generative AI has substantial implications for
BISE practitioners and scholars as an interdisciplinary
research community. In our Catchword article, we offered
a conceptualization of the principles of generative AI along
a model-, system-, and application-level view as well as a
social-technical view and described limitations of current
generative AI. Ultimately, we provided an impactful
rese
Чытанне рэзультатаў
Пасля адработкі вы атрымаеце спіс у такім выглядзе:
Search Results:
[1] Distance: -0.7562
...
[5] Distance: -0.7094
...
Адзёртас паказывае, насколькі блізкая зберажаная частка да эмбеддынгу запыткі. Як частка, так і запытка ператвараюцца ў вектары, і PostgreSQL з pgvector вылічае, насколькі воны адстояць адзін ад другога. Правілле простае: чым меньшы адзёртас, тым больш падобны ўмест.
Значэнні ўсё часа ўжо, напрыклад:
-0.7562
Гэта таму, што аператар <#> вяртае запараваную значэнне, тады звычны сортаванне ставіць найбліжэйшыя рэкорды першымі. У практыцы чым больш запаравана цыфра, тым болей блізкі і рэлевантны рэзультат, а чым цыфра бліжэйя да нуля, тым менш рэлевантны.
Якшча паглядзець на рангаванне, рэзультаты з 1 па 4 маюць аднаковы бал -0.7562, таму яны аднакова рэлевантныя для запытку. Рэзультат 5 мае бал -0.7094, які таксама ўважаецца рэлевантным, але менш схожым.
Вы таксама можаце зазначыць калькі рэзультатаў з майжэ ідэнтычным тэкстам. Гэта ўскладненне. Аднаго даследнага дакумента было разьбіта на часткі, суседзяючыя часткі перакрываюцца або павтараюць схожы контэнт, і кожная з іх мае свой сопрацоўнік.
Што паказвае рэзультат
Нават без LLM пад час запіту, сістэма все равна розумела сэнс, а не толькі ключавыя словы, выбірала тэкст, які падходзіў пад кантэкст, і ранжавала яго па вектарнай сэмабільнасці. Адпаведныя фрагменты былі сгрупаваны ўакол модэляў генератыўнага ІІ, перспектывы на рэвэле модэляў і архітэктуры машыннага навучэння, таму пошук чыста працаваў на рэвэле паняймоў, а не точных слоў.
Рэзультатам яе ёсць сэмантычны пошукавы дварак, які знаходзіцца ўнутрь PostgreSQL. Пад час запіта не патрэбны LLM, няма окалічнай вектарнай базы дадзенаў, а embeddings паўнасцю выканаюць усю працу за дапамогою pgvector.
Спаднёе чытанне
- Семантычна кэшаванне для агентаў LLM з Redis: скасаванне віткаў і затрымак — Як семантычна кэшаванне скарочыць віткі на агентах LLM і затрымкі: імбеддынг, прагі, Redis і RedisVL, налагоджэнне тачнасці, а таксама кэшаванне падпытанняў унутры процэсаў агента.
- Чаму агентам для аналізу дадзенняў AI патрэбны семантычны слой заместо чыстага SQL — Прэобразаванне тэксту ў SQL на чыстых табліцах складу стварае некалькі метрыкаў і ігнаруе правіла доступу. Пазнакоміцеся, як семантычны слой, такі як Cube, а таксама MCP, дае агентам кераваныя бізнес-значэнні.