Галоўная / Артыкулы

Семантычныя пошукі ў PostgreSQL з pgvector і Node.js, няма патрэбы ў LLM

Семантычныя пошукі ў PostgreSQL з pgvector і Node.js, без LLM: эмбеддынгі MiniLM, чакі, індэкс IVFFlat, аператары адстані і спосабы чытання рэйтынгаў.

Выдавец: REACTAPP.TOP8 хв чытання1884 слоў

Крыніцы: 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“ ніколі не з’яўляюцца. Порэванае — гэта матэматычныя абстанцыі між вектарамі, а не адпаведнасць тэксту.

Звычны пракцэс выглядае так:

  1. Прыходзіць неапрануты кантэнт: дакументы, квіты або ўсё іншае.
  2. Мадэль умяшчэння ператварае яго ў вектары.
  3. Вектары зберагаюцца, напрыклад, у PostgreSQL з аддаткам pgvector.
  4. Індэкс апрыксіматыўага найбліжэйшага суседа (ANN) спрыяе шырокамасштабным пошукам.
  5. Запіт корыстніка таксама ператвараецца ў вектар.
  6. База дадзенаў вяртае вектары, якія знаходзяцца найбліжэй да яго, тое ў значэнні, якія ўсё больш супадаюць.

Што гэта дазволяе:

  • Семантычны пошук, які базуецца на значэнні запіту, а не толькі на яго точных словах.
  • Даўгастраўнае запамятованне для 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.

Спаднёе чытанне

  • Што насправды керуе нейральной сетчаткой: кампайляры AI пад Пайтонам — Следзіце за модэлем ад выразу на Пайтоне праз графы вычыслаў, злучэнне аператараў, IR-фарматы у стылі MLIR і пераклад у код для CPU, GPU і акселератараў.
  • Ваша сэмантычная модэль — гэта API: стварэнне сертыфікаваных паказнікаў для агентаў — Чаму агенты AI ствараюць прыватныя вялічыны для выявлення доходу і запасоў, і як кераваная сэмантычная модэль з дэталямі, власнікамі і адмовамі дае ўсім іх аднаковы контракт.
  • RAG без вектараў: як PageIndex чытае дакументы без эмбедынгаў — Вектарны пошук дзеліць дугія дакументы на часткі і втрачае кантэкст. Пазнакайце, як індэкс на аднойчыні, заснованы на логічных выводах, знаходзіць адпаведзі насупраць складным звярненням, з прыкладамі коду.
  • Развітыя тэхнікі RAG на Milvus: гібрыдны пошук, HyDE, перапісваць запітаў і перэранкіраванне — Створыце паэтапна канвейер RAG на Milvus: вектары тыпу dense і BM25, гібрыдны пошук RRF, фільтры метадаў, перапісваць запітаў, тэхніка HyDE, дэкомпанаванне і перэранкіраванне за дапамой крос-энкодэра.