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

Бенчмарк пяці ўбудаваных вектарных сховішчаў: FAISS, Chroma, LanceDB, VectLite

Пяць убудаваных вектарных баз для лакальнага RAG: FAISS, Chroma, LanceDB, VectLite і NumPy у параўнанні па поўнасці, затрымцы, фільтрах і халодным старце.

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

Крыніцы: I Benchmarked 5 Vector Databases for a Local RAG. Only One Actually Surprised Me.

Большасць аналізаў „найлепшых баз даных вектараў“ выглядае як перапісаныя власныя старонкі-візыты відпаведных прымоўчыкаў: Pinecone — быстры, Qdrant — надзеяны, Chroma — просты, усі выграюць. Гэты аналіз пачынаецца з болей вузкай патрэбы. Ні кластэра, ні Docker, ні ачыненых портав, ні плану з адказным адарожненнем. Толькі вбудованая база даных вектараў, якая складаецца з аднаго локальнага файла, каманды pip install і трох ліній коду на Python. Тут прыводзіцца домашні тэст пяці двіжакаў для гэтага самэго выкарыстання.

Цыфры

Набір дадзеных містыў 5 000 вектараў з 384 вымірамі; было адбыта 50 запыткаў з выкарыстаннем косай схожасці. Усё працавала на macOS (x86_64) з Python 3.12.8, з выкарыстаннем стандартных налашчэнняў кожнага двіжака.

Двіжак Шырокае запрашанне (вектар/секунда) Пошук p95 Recall@10 Фільтрацыя p95 Recall@10 пасля фільтрацыі
FAISS 743,099 0.65 мс 1.000 n/a без фільтраў
NumPy exact 2,412,231 2,59 мс 1,000 9,25 мс 1,000
Chroma 2,011 3,14 мс 0,840 18,76 мс 1,000
VectLite 0,10,0 154 5,71 мс 0,966 10,28 мс 0,966
LanceDB 20,120 12,20 мс 1,000 14,11 мс 1,000

Чэрэз дзесяць секунд: FAISS ёсць найшырэйшы, хоць яго важка прызначыць базай дадзэнняў. Chroma — найпростэйшы варыянт для пачатку, але яго стандартны показнік вярнення дадзэнняў у розмерэ 84% ёсць проблемай, якую багато хто ігнаруе. VectLite у вбудоўаным рэжыме, без налагоджэння, досягае показніка вярнення 96,6%, што стало неспадзяванкай. LanceDB прагне ідэальнага показніка вярнення, але за гэта плаціць затрымкай. NumPy выступае як суддзі, а не як учаснік.

Чаму «найшырэйшы» — гэта некорэктная класафікацыя

Рынак вектарных БД — гэта маркетынгавая борьба. Кожны віраспродавец публікуе рэзультаты тэстаў, у якіх якраз выграў, статты-порэвананні пераказваюць гэтыя цыфры без кантэксту, а всі зосераджваюцца на затрымцы. Толькі затрымка можа ввесты ў глухі кут. Адпаведзь у паўмілісэкундзе, але з некорэктнымі данымі, горша, чым знадобіцца 5 мс, каб атрымаць правільныя даны. Самэ гэта і мерыць практычнае выкарыстанне, і таму такія серйозныя інструменты, як ANN-Benchmarks (https://ann-benchmarks.com/), практычнае выкарыстанне паказваюць паўзаўзаема з працэсавай здатнасцю.

Таму гэты тэст мерыць аба показнікі адразу: з адной стороны — затрымкі p50, p95 і p99 адносна колькасці запытанняў за секунду, а з іншай — практычнае выкарыстанне@10 паўзаўзаема з точным пошукам за дапамогою косайнуса ў простам NumPy.

Што тэставалася, а што — ні

Праект — гэта невялы пакет на Python пад назвам vectlite-benchmark-lab. Кожны механізм рэалізуе адну спакаваную інтэрфейс VectorStore, а запускач вызывае іх па чэргу. Ён абарачва:

  • Пакетную загрузку
  • Пошук k-NN з вімераваннем рывня відтворэння
  • Фільтрацыю метаданоў на аднойчынны споўненні за параметрам tenant_id
  • Час пачатку працы
  • Архіўаванне і перэноснасць
  • Экспорт у фарматах CSV, JSON і графіках Matplotlib

А што ён не абарачва, гэта зазначаецца з самага пачатку: няма распраўленай чы мнага-вузловай наладкі, нічога за межамі 5 000 вектараў у гэтым раундзе, няма жадной наладкі індэкса, а таксама няма Qdrant чы pgvector, адтуды што ім трэба работаючы сервер, а мета была чыста локальная праца. Гэты выбор ўсвядомлены. Першыя корыстныя запытанні — гэта не тое, хто выграе пасля двух тыдзяней наладкі, а тое, як механізм будзе сабе весты, калі яго запусціць і нічога не змяніць.

Метод

„Ground truth“ — гэта пошук косінуса сілою методу у NumPy. Рывень відтворэння двіжка — гэта частка справжніх суседніх елементаў, якія ён вяртае, усерэднена па всіх запітах. Канфігурацыя для запуску:

vectlite      : 0.10.0
vectors       : 5,000 (synthetic, normalized)
dimensions    : 384
queries       : 50
top_k         : 10
metric        : cosine
filter        : tenant_id (exact-match)
warmup        : 5 queries discarded
hardware      : macOS x86_64, Python 3.12.8

Ёнколі хочаце ўтварыць гэта на сваём камп’ютары, запусціце цэлы каманду:

PYTHONPATH=src python -m vectlite_benchmark_lab run \
  --stores vectlite,faiss,chroma,lancedb,numpy_exact \
  --vectors 5000 --dimensions 384 --queries 50 \
  --top-k 10 --batch-size 500 \
  --output-dir results/vectlite-0.10.0 \
  --data-dir data/vectlite-0.10.0

Потым парабяруйце вашыя рэзультаты з гэтымі і разглядзіце разлікі.

FAISS: максімум скорасці

FAISS выграеў у всіх калонках з показнікамі латэнцыі: 0,65 мс п95 з ідэальным рывнем вярнага аднаходжэння даных, што ўзгодна з тым, чаго можна было б спакавацца ад бібліятэкі на C++, налаштаванай самэль для гэтых цэлей працоўнае гады. Але гэта не база дадзеных. У яе няма вбудованага фільтравання метаданых, няма вбудованай можлівасці зберагання даных і няма портабельных альтэрнатываў для рэзервнага копіювання. Можна абгорнуць яе слоем, які дадае гэтыя функцыі, і так і робяць, пры тым, што без дадатковых налаштаванняя яна больш сэрцаваеся да матэматычнай бібліятэкі, чым да інструмента, які можна было бы выдаваць кліентам. Парабяраванне яе з Chroma — гэта як парабяраванне двых аўтамабіляў: адны ўжо на трасе, другі прывозыт купаванні домой. Яна застаецца ў табліцы як апавядомленне. Калі вам патрэбна толькі чыстая пошукавая функцыя для вектараў, то гэта явны выбар.

Chroma: простае запусканне, старанна сачыце за рывнем вярнага аднаходжэння

Chroma ўтаманны выбар для пратэтапаў RAG, і ўжытак даўае гарны досвід распрацоўшчыка. Установіце chromadb, напісайце пяць ліній, і дакументы будуць індэксаваны.

Проблема заключаецца ў рэкале. За замовчаннем, без жадных фільтраў, Chroma знаходзіць толькі 84% справжніх суседніх дакументаў, што значыць, што прыблізна адна з шасці апэктыўных рэзультатаў так і не праказуецца. Гэта прыемна для пратэтапа. У продакшн-версіі RAG, дзе якасць адналічэння дакументаў вялічыць якасць адпаведзі модэлю, гэта ўсунутая втрата рэлевантнасі, якую API ніколі не адкрывае. Пры налагоджэнні налаштаванняў HNSW можна заполніць большую частку гэтага прыема, калі толькі ведаць, што гэта неабходна. За дапамогою фільтраў рэкал становіць 100%, але час адпаведзі p95 падыходзіць да 18,76 мс, што значна медленней, чым у іншых варыянтаў для той самай задачы. Вывад: чудова ў першы дзень і ўсё ўсё ж хораша ў трыдцяты дзень, калі толькі налагодзіце ўсё перад запускам у продакшн.

VectLite: неспадзянака

У версіі 0.10.0 падыннік даклэна складае 96,6% пры стандартных настройках, што ўсё вышэй за будзьшыя показнікі іншых вбудоўваных двахароў. Час адпаведнага пошуку п95 станавіць 5,71 мс, што знаходзіцца на сярэдзіне (Chroma 3,14, LanceDB 12,20). Пры фільтраванні даных час п95 станавіць 10,28 мс, проты 18,76 мс у Chroma, тое ў гэтым случае ён майжэ удвое быстрэй.

Відна прогрэсія з часу першых выданняў. Параўняўшы з версіяй v0,1.x, шырокаспектнае запрацоўванне дакументаў вырасла з 47 да 154 вектараў/секунду (прыблізна у 3,3 раза быстрэй), падыннік даклэна вырас з 0,948 да 0,966, а час фільтрацыі п95 зменіўся з 18,6 мс да 10,3 мс, тое ў 45% меней.

Шырокаспектнае запрацоўванне дакументаў ўстаўляе слабы момент. 154 вектараў/секунду — гэта медленна, у прыроўнанні з 2000 і болей у Chroma, і дужа медленна па версіі LanceDB. Для калькі тысяч дакументаў, індэксаваных аднойчы, гэта не мае значэння. Але для мільйона вектараў гэта значыць вечар чакання, таму, верагатна, гэта наступны пункт для практычнага выправлення. Тым не менш, гэты быў ўжо ўсё той двахароў у групе, чыяя показнікі не патрабавалі жадных вяскавак.

LanceDB: ідэальная точнасць, але повольны пошук

LanceDB дае 100% точнасць і можа обрабатваць 20,120 вектароў/секунду, што на паперы выглядае вражаюча. Але цена — гэта затрымка пад час пошуку: 12,20 мс (p95), што ўзято з усіх пяці ёсць самай высокай. Для пакетной обработкі тыяч запітоў за ноч чыгульнае, але для інтэрактывнага інструмента, калі чалавек чакае за клавіатурой, гэта стае значным недалекам. Хорашы для пакетной обработкі і аналізу, але трохі повольны для інтэрактывнага вікорыстоўвання.

NumPy: стандарт для адлікання

Пошук за допамогай косай велічыны па всій матрыцы за прыметнікам дае ідэальную точнасць, пры чым затрымка застаецца прыемлемай паўтароўка дзесяткаў тысяч вектароў, пасля чаго рэзка падыходзіць да нуля. Гэта не самастоятны продукт, а стандарт, па якому адлікаюць усі іншыя механізмы.

Калькі выбраць

Бенчмарк не выбірае паводзяючага, а выявляе компромісы. Прыблізныя парады па тыпам вікорыстоўвання:

  • Быстрый протатэп RAG: Chroma — дзякуючы двамі хвілінам на налагоджэнне і велікаму экасістэму
  • Вбудованая памяць AI: VectLite — для найкрашчага стандартнага выкарыстоўвання дадзеных і портатыўных файлаў
  • Локальны пайплайн апрацоўкі дадзеных: LanceDB — для ідэальнага выкарыстоўвання дадзеных і шырання іх за короткі час
  • Чыстыя сіткавыя нейронныя меры без фільтраў: FAISS — для найменшага часу адпаведзі
  • Распраўленая сістэма для прыменення: Qdrant або Milvus — іншая катэгорыя, якая тут не тэставалася

Пачатак працы і рэзервна копія

Два показнікі, якія большасць тэстаў праігноравае. Час запуску — час паўтарнага ачынення базы дадзеных пасля перзапуску: FAISS — 0,001 мс, LanceDB — 2 мс, Chroma — 5 мс, а VectLite — 3 059 мс. VectLite мае вялікія втраты часу пад час паўтарнага ачынення. Гэта не мае значэння для процэса, які працуе дзеўяльна, але для безсервернай функцыі аб інструмента CLI, які запускаецца за патрэбай, трысекундны час запуску ёсць значныя працяг і, шчыльна, першая рашынка для выправлення.

Архіўаванне: VectLite стварае портатыўны файл размерам 19 MB за 54 мс. Копіюванне, стварэнне версій і ўстановка — гэта проста праца з файламі. Гэта тае, што ў складзе „вбудоўаных“ рашэнняяў дапамагае ў ўсіх задачах, тая ж асоблівасць, якая дапамагала SQLite застаўацца актуальным прыблізна два дзесяткі гадоў.

Меры гэтага тэсту

Кожны тэст-кейс патрабуе адзінаго знака звёздкі. Тут пяць:

  1. 5 000 вектараў — гэта мала колькасць, а характэрыстыкі зміняюцца пры 100 тыс. і болей.
  2. Выкорыстоўваліся толькі стандартныя настройкі, а параметры Chroma і VectLite практычна напэўна можна налаштаваць вышэй.
  3. У тэсты не бралі удзеле жадныя серверныя двойнікі: Qdrant, Milvus, Weaviate і pgvector не выкорыстоўваліся.
  4. Гэта быў адзін тэст, без інтэрвалаў паверыльнасці і без паўтарэнняў.
  5. Тэст адбыўся на аднай машыне, таму іншыя апараты можа даць іншыя рэзультаты.

Код ёсць адкрытым, а рэзультаты можна паўтарыць, таму будзь-які выявленыя уперэчнення чы аблыякі вартаяяя адзначыць.

Наступныя крокі і выводы

Гэты тэст ёсць пачатковай точкай, а не вынікам. Короткі спіс для наступнага раунду: вектар дыяметрам 100 к, тэст у 768 вымерах для всіх двайнікаў; тэст у стылі RAG з вікорыстаннем корпуса Markdown і PDF, у якім запыткі пішаны людзьмі; налаштаванне практычнасці, каб двайнікі змагаліся за аднаковую тачнасць; скорыячы час запуску для VectLite; і паўтаральныя тэсты з інтэрваламі паверы.

Пошук „найлепшай базы дадзеных вектараў“ завершаецца без універсальнай адпаведзі, адколькі ён залежыць ад таго, як вы вазаваеце памяць пра аднаходжэнне дадзеных проты часу адпаведзення, працэсу ўваходжэння дадзеных і часу запуску. Не выдзеліўся жадны явны лідэр, а радыя кожны механізм мае сваю „персанальнасць“. FAISS — гэта параметр швальнасці, які выдавае ся за базу дадзеных. Chroma — гэта просты спосаб прыўязкі, які трэба налаштаваць пры вікорыстоўванні ў працэсе. LanceDB — гэта перфекціоніст, якому не шкодзіць медленнае адпаведзенне. NumPy — гэта беспакосьлівы суддзя, які не можа расшырвацца. VectLite — гэта той, хто тыха адпавядае цэлі памяці пра аднаходжэнне дадзеных без жадных компромісаў.

Для локальнага агента, інструмента CLI або рэшэння RAG, якое працуе без падключэння да інтэрнэту на ноутбуку, VectLite стварае пераканлівыя аргументы: SQLite зробіў локальныя рэляцыйныя дадзеныя нуднымі і портатыбнымі, а VectLite ставіць сабе за мету тую ж ролю з вікорыстоўванням AI-памяці. Гэта означае файл размерам 19 MB, які адпавядае за адзеўна 6 мс.

Спрамавочныя лінкі: ANN-Benchmarks на https://ann-benchmarks.com/, зьвіты пра тэставанні Qdrant на https://qdrant.tech/benchmarks/, FAISS на https://github.com/facebookresearch/faiss, дакументацыя Chroma на https://docs.trychroma.com/ і LanceDB на https://lancedb.github.io/lancedb/.