Porównanie ośmiu darmowych baz danych wektorowych dla agentów AI: ograniczenia, dopasowanie oraz kompromisy.
Osiem baz danych wektorowych z darmowymi wersjami w porównaniu pod kątem pamięci agentów: ograniczenia techniczne, dostosowanie do implementacji, współbieżność oraz to, która z nich nadaje się dla agentów AI w Twoim środowisku.
Osiem baz danych wektorowych pojawia się raz po raz, gdy ludzie budują agenty przy ograniczonym budżecie: VectorAI DB Community Edition, Qdrant, Weaviate, Milvus, ChromaDB, LanceDB, pgvector i Pinecone. Każda z nich jest dostępna bezpłatnie na początku. To coś innego niż dostępność bezpłatna w skali dużych systemów, a jeszcze coś innego niż możliwość wdrożenia w dowolnym miejscu, gdzie musi działać agent.
Agenty polegają na bazie danych wektorowych bardziej niż pojedynczy pipeline RAG. Ich pamięć jest wielokrotnie zapisywana i odczytywana podczas licznych sesji. Dlatego musisz wiedzieć, czy ta pamięć przetrwa restart, jak zachowują się czasy odpowiedzi, gdy połączenia się nakładają, oraz czy silnik może działać obok agenta, nawet na urządzeniu z niestabilnym lub brakującym połączeniem.
Pakiet darmowy nie jest w stanie sprostać temu wszystkiemu. Aby sprawdzić, jak radzi sobie opóźnienie przy rzeczywistym jednoczesnym obciążeniu, zazwyczaj potrzebny jest płatny plan wystarczająco duży, by wytworzyć takie obciążenie. Mimo to pakiety darmowe pokazują, gdzie każdy dostawca ustala swoje granice, a niektóre z tych ograniczeń eliminują dany wybór jeszcze przed napisaniem jakiegokolwiek kodu. Jeden z usług usuwa nieaktywny klastr po 14 dniach. Inny nie oferuje wersji self-hosted, co wyklucza go w przypadku, gdy dane nie mogą opuścić twojej infrastruktury. Każda z poniższych pozycji jasno podaje swoje ograniczenia, dzięki czemu możesz dopasować bazę danych do swojego rozwiązania i zobaczyć, co musiałbyś poświęcić. Ograniczenia, limity i ceny często się zmieniają, więc przed podjęciem decyzji sprawdź aktualne dane na stronie cenowej każdego dostawcy.
Kryteria
Porównano osiem baz danych pod kątem pięciu aspektów istotnych szczególnie dla agentów.
- Rodzaj planu darmowego. Pełna możliwość samodzielnego hostowania bez ograniczeń dotyczących wektorów, zarządzany plan darmowy z limitem przechowywania lub wektorów, albo biblioteka zamiast bazy danych.
- Współgrający wzorzec pamięci. Taki projekt pamięci agenta, który ułatwia praca z bazą danych.
- Opóźnienie przy obciążeniu. Jak system zachowuje się, gdy kilka żądań agentów przychodzi jednocześnie.
- Zdatność do używania lokalnie. Czy system może działać wyłącznie na twoich własnych maszynach bez zależności od chmury.
- To, co psuje się po przekroczeniu planu darmowego. Punkt, w którym coś przestaje działać lub zaczyna kosztować pieniądze.
Większość opublikowanych porównań dotyczy zadań typu RAG lub rekomendacji, w których baza danych odpowiada na żądania bez przechowywania stanu i jest odbudowywana na podstawie ustalonej kolekcji dokumentów. Agenty różnią się tym, że gromadzą pamięć w trakcie różnych sesji. Sklep musi przechowywać stan, a nie tylko odpowiadać na zapytania, co zmienia to, jakie kompromisy są do przyjęcia.
Osiem rozwiązań, po jednym
1. VectorAI DB Community Edition
VectorAI DB to baza danych wektorowych, którą uruchamiasz samodzielnie, zaprojektowana tak, by działać identycznie na laptopie programisty i w odłączonej środowisku produkcyjnym.
Pakiet darmowy. Community Edition jest uruchamiana lokalnie i ma ograniczenie do 5 000 wektorów, co stanowi najniższe sztywne ograniczenie. Podobno osobny okres próbny trwający 30 dni podnosi to ograniczenie do miliona wektorów. Dostępna jest jako pojedynczy kontener Docker bez żadnych zewnętrznych zależności, takich jak Kubernetes, etcd czy systemy przechowywania obiektów. Twórca opublikował wyniki testów, według których na maszynie o pojemności 64 GB uzyskuje się około 745 zapytań na sekundę przy użyciu 10 milionów wektorów o 768 wymiarach, co daje 22-krotną przewagę nad Milvus i Qdrant Local na tej samej sprzętowej platformie. Traktuj to jako twierdzenie producenta: opisuje ono wersję płatną z obsługą 10 milionów wektorów, a nie darmową wersję z ograniczeniem do 5 000 wektorów.
Podobają się agentom, gdy agent musi działać tam, gdzie znajdują się dane, a nie tam, gdzie znajduje się centrum danych dostawcy chmury: w lokalizacjach odizolowanych od sieci, przy ścisłych zasadach rezydencji danych, z użyciem sprzętu typu NVIDIA Jetson i Raspberry Pi, lub w każdym miejscu, gdzie sam wyjście danych do chmury stanowi problem. Dostawca przedstawia konfiguracje gotowe do spełnienia wymogów regulacyjnych dla aplikacji, które budujesz na ich bazie, co nie jest tym samym co certyfikat dostępny w wersji darmowej.
Wzorzec pamięci. Pamięć dla agentów działających lokalnie i offline, a także trwała pamięć w ogóle. Dane są zapisywane na dysku i przywracane po ponownym uruchomieniu, a fakt, że wystarczy jeden kontener do działania, sprawia, że użycie w trybie offline i odizolowanym od sieci pozostaje praktyczne, gdy Kubernetes nie jest dostępny.
Wada. Sam musisz go hostować, koniec. Nie istnieje żaden bezpłatny plan chmurowy z zarządzaniem, w odróżnieniu od Pinecone czy Qdrant Cloud, więc zespół, który nie chce, aby ktoś inny zarządzał serwerami, powinien wybrać inne rozwiązanie.
# VectorAI DB -- basic similarity search.
from actian_vectorai import VectorAIClient, VectorParams, Distance
with VectorAIClient("localhost:6574") as client:
client.collections.create(
"agent_memory",
vectors_config=VectorParams(size=768, distance=Distance.Cosine),
)
client.points.upsert(
"agent_memory",
points=[{"id": 1, "vector": [0.1] * 768, "payload": {"text": "example memory"}}],
)
results = client.points.search(
"agent_memory",
query_vector=[0.1] * 768,
limit=5,
)
2. Qdrant
Qdrant to baza danych wektorowych o otwartym kodzie źródłowym napisana w języku Rust. Można ją uruchomić samodzielnie bez ograniczeń dotyczących wektorów lub użyć usługi Qdrant Cloud.
Pakiet darmowy. Uruchamiając ją na własnym sprzęcie, Qdrant nie kosztuje nic i nie ma żadnych ograniczeń (licencja Apache 2.0). W Qdrant Cloud plan bezpłatny oferuje jeden stały węzeł z pół vCPU, 1 GB pamięci i 4 GB przestrzeni dyskowej – co wystarcza mniej więcej na milion wektorów o 768 wymiarach.
Odpowiedni dla agentów, gdy potrzebujesz szybkiego wyszukiwania z filtrowaniem w środowisku produkcyjnym oraz chcesz mieć biblioteki klienta dla Pythona, TypeScript, Rust, Go, Java i .NET.
Wzorzec pamięci. Trwała pamięć agenta. Filtrowanie ładunku danych w połączeniu z wyszukiwaniem wektorowym umożliwia agentowi przechowywanie informacji wraz z metadanymi, takimi jak użytkownik, sesja i data/w godzinie, a następnie pobieranie z filtrowanym podzbiorem w momencie wyszukiwania.
Wada. Plan chmurowy dostępny za darmo funkcjonuje, ale ma ograniczenie w postaci 1 GB pamięci RAM. Samodzielne hostowanie znosi to ograniczenie, ale wiąże się z koniecznością obsługi i monitorowania własnego klastra. Opóźnienia w wykonywaniu zapytań zmieniają się również w zależności od rozmiaru zestawu danych i złożoności filtrów, dlatego należy przeprowadzić testy przy rzeczywistym obciążeniu agenta.
# Qdrant -- basic similarity search.
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance, PointStruct
client = QdrantClient(url="http://localhost:6333")
client.create_collection(
collection_name="agent_memory",
vectors_config=VectorParams(size=768, distance=Distance.COSINE),
)
client.upsert(
collection_name="agent_memory",
points=[PointStruct(id=1, vector=[0.1] * 768, payload={"text": "example memory"})],
)
results = client.query_points(
collection_name="agent_memory",
query=[0.1] * 768,
limit=5,
)
Pamięć agenta uruchamianego lokalnie w Qdrant to dziś sprawdzona konfiguracja. W przypadku sieci izolowanych problemem jest to, że nadal musisz sam zarządzać całym infrastrukturą.
3. Weaviate
Weaviate to baza danych wektorowych o otwartym kodzie źródłowym, w której każde zapytanie zawiera funkcję wyszukiwania hybrydowego łączącą gęste wektory z dopasowywaniem słów kluczowych metodą BM25.
Pakiet darmowy. Weaviate uruchamiany lokalnie jest dostępny bezpłatnie i nieograniczenie na licencji BSD-3. Jego wersja chmurowa oferuje obecnie 14-dniowy okres próbny w środowisku sandbox, a po nim dostępne są plany płatne – sprawdź stronę z cenami, aby poznać aktualne warunki.
Odpowiada agentom wtedy, gdy jedno zapytanie musi łączyć dopasowywanie słów kluczowych z podobieństwem semantycznym. Przykładem może być agent przywołujący pamięć, która musi jednocześnie odpowiadać dokładnej nazwie entity oraz niejednoznacznemu pojęciu. Weaviate umożliwia realizację takich hybrydowych procesów za pomocą interfejsów REST i GraphQL.
Wzorzec pamięci. Hybrydowa pamięć do odzyskiwania informacji. Połączenie BM25 z wektorami to główny powód wyboru Weaviate zamiast czystego silnika wektorowego do odzyskiwania danych, szczególnie gdy pamięć zależy zarówno od koncepcji, jak i dokładnego terminu.
Wada. W przypadku używania w chmurze darmowa oferta wygasa – jest to krótki okres próbny, a nie stała subskrypcja. Samodzielne hostowanie unika tego problemu, choć koszt pamięci rośnie wraz z rozmiarem danych, ponieważ graf HNSW jest przechowywany wyłącznie w pamięci RAM.
# Weaviate -- basic similarity search.
import weaviate
from weaviate.classes.config import Configure
from weaviate.classes.query import MetadataQuery
client = weaviate.connect_to_local()
memories = client.collections.create(
name="AgentMemory",
vector_config=Configure.Vectors.self_provided(),
)
memories.data.insert(
properties={"text": "example memory"},
vector=[0.1] * 768,
)
response = memories.query.near_vector(
near_vector=[0.1] * 768,
limit=5,
return_metadata=MetadataQuery(distance=True),
)
client.close()
Agent, który musi działać na ograniczonym sprzęcie brzegowym, a nie w zawsze połączonym klastrze chmurowym, będzie miał trudności z przechowywaniem indeksu w całości w pamięci RAM.
4. Milvus
Milvus to silnik otwartego oprogramowania, rozproszony i przeznaczony do obsługi zbiorów zawierających miliardy wektorów.
Pakiet darmowy. Można go pobrać i uruchomić samodzielnie bez ograniczeń liczby wektorów (licencja Apache 2.0). Istnieją dwa lżejsze warianty: Milvus Lite do pracy lokalnej oraz Standalone dla jednego węzła. Klastry produkcyjne wymagające wysokiej dostępności potrzebują zamiast tego rozwiązania rozproszonego, w którym wykorzystuje się Kubernetes, etcd oraz magazyn obiektów takiego jak MinIO. Dla bardzo dużych zbiorów danych obsługiwane jest również indeksowanie przyspieszone kartami GPU.
Odpowiada agentom wtedy, gdy baza wiedzy będzie zawierać setki milionów wektorów lub więcej, a chce się mieć wybór spośród jedenastu lub większej liczby typów indeksów, aby można było dostosować szybkość i efektywność wyszukiwania do poszczególnych zbiorów.
Wzorzec pamięci. Trwała pamięć w bardzo dużym skali. Znajduje zastosowanie wtedy, gdy to objętość danych spowalnia przechowywanie w pamięci, natomiast nie nadaje się, gdy presja pochodzi od wielu sesji lub z implementacji na brzegu sieci.
Wada. Koszty operacyjne są wysokie. Tryb rozproszony nie nadaje się do projektów pobocznych, skalowanie wielu węzłów wprowadza rzeczywistą złożoność, a rozwiązanie to nie pasuje do sprzętu na brzegu sieci lub o ograniczonych możliwościach.
# Milvus -- basic similarity search.
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
client.create_collection(collection_name="agent_memory", dimension=768)
client.insert(
collection_name="agent_memory",
data={"id": 1, "vector": [0.1] * 768, "text": "example memory"},
)
results = client.search(
collection_name="agent_memory",
data=[[0.1] * 768],
limit=5,
)
Gdy szukasz rozwiązania lżejszego, dokładnie przemyśl konfigurację opartą na Kubernetes przed zdecydowaniem się na jej użycie do wyszukiwania wektorowego.
5. ChromaDB
ChromaDB to repozytorium wektorowe o otwartym kodzie, które można włączyć do własnego procesu praktycznie bez żadnej konfiguracji.
Płatna wersja darmowa. Jest dostępna bezpłatnie i nie ma ograniczeń dotyczących wektorów, zarówno gdy jest włączona do procesu Pythona, jak i uruchamiana jako samodzielny kontener Docker. Według informacji na stronie projektu nie oferuje on usług chmurowych typu managed, choć możliwe, że istnieje już wersja hostowana, więc sprawdź stronę projektu.
Odpowiednie dla agentów, gdy celem są szybkie eksperymenty na warstwie pamięci, testowanie rozmiarów fragmentów danych, ustawień wyszukiwania i promptów, zanim zostanie stworzona jakakolwiek infrastruktura.
Wzorzec pamięci. Pamięć robocza. Nadaje się do krótkotrwałej lub fazowej pamięci w obrębie jednego procesu agenta, ale jest słabsza jako długotrwałe magazynowanie używane jednocześnie przez wiele instancji agentów.
Wada. Nie zostało to udowodnione na dużą skalę produkcyjną. Usuwanie elementów nie zmniejsza rozmiaru indeksu, ponieważ usuwanie węzłów w grafie jest kosztowne, a struktura HNSW tylko się powiększa; fragmentacja utrzymuje się, dopóki indeks nie zostanie skompresowany lub odbudowany. Agent, który ciągle dodaje i usuwa dane pamięciowe, musi sam zajmować się ich oczyszczaniem, a także radzić sobie z ograniczeniami pojedynczego węzła i ręczną rekonstrukcją.
# ChromaDB -- basic similarity search.
import chromadb
client = chromadb.PersistentClient(path="./agent_memory")
collection = client.get_or_create_collection(name="agent_memory")
collection.add(
ids=["1"],
embeddings=[[0.1] * 768],
documents=["example memory"],
)
results = collection.query(
query_embeddings=[[0.1] * 768],
n_results=5,
)
Gdy kilka instancji agentów musi dzielić się jednym magazynem pamięci, to model wbudowany jest tym, który wyczerpuje zasoby najwcześniej. Zwykłą rozwiązaniami są samodzielne serwery, do których łączą się różne procesy, a nie coś, co funkcjonuje wewnątrz jednego procesu Pythona.
6. LanceDB
LanceDB jest o otwartym kodzie źródłowym i ma formę wbudowaną: działa z plikami przechowywanymi w systemach obiektowych i w ogóle nie wymaga procesu serwerowego.
Pakiet darmowy. LanceDB zarządzany lokalnie lub wbudowany jest dostępny bezpłatnie, bez żadnych ograniczeń dotyczących wektorów, pod licencją Apache 2.0. Zarządzany, bezserwerowy LanceDB Cloud znajdował się w fazie prywatnego beta i wymagał aplikacji w momencie pisania tego tekstu, więc jedynym rozwiązaniem, na które można polegać, jest jego lokalne zarządzanie.
Odpowiedni dla agentów, gdy agenci działają na brzegu sieci lub w ramach procesów analityki danych, gdzie przeskoczenie przez sieć do oddzielnego bazy danych jest niedopuszczalne, a chce się, aby magazyn znajdował się w tym samym systemie plików co reszta procesu.
Wzorzec pamięci. Pamięć na krańcach sieci i rozproszona pamięć. Projekt wbudowany, bez serwera, doskonale pasuje do agenta, który nie może mieć stabilnego połączenia z procesem bazy danych.
Wada. Model wbudowany, który sprawia, że rozwiązanie jest skuteczne na krańcach sieci, to samo ogranicza je w warunkach równoczesności. Systemy wieloagentowe często mają kilka procesów piszących jednocześnie do jednej tabeli, co stanowi najtrudniejszy obciążenie dla magazynu wewnątrz procesu. Przed zatwierdzeniem przetestuj tę sytuację.
# LanceDB -- basic similarity search.
import lancedb
db = lancedb.connect("./agent_memory")
table = db.create_table(
"agent_memory",
data=[{"id": 1, "vector": [0.1] * 768, "text": "example memory"}],
)
results = table.search([0.1] * 768).limit(5).to_list()
7. pgvector
pgvector to rozszerzenie dla PostgreSQL, które umożliwia bazy danych, z którymi już pracujesz, wyszukiwanie na podstawie podobieństwa wektorowego, dzięki czemu nie trzeba instalować nowego systemu.
Pakiet darmowy. Rozszerzenie jest bezpłatne i ma otwarty kod źródłowy. Wszyscy, którzy już płacą za Postgres, mogą go używać bezpłatnie. Ci, którzy nie mają Postgresa, muszą zainstalować całą bazę danych relacyjną tylko po to, by móc wyszukiwać wektory.
Odpowiednie dla agentów, gdy aplikacja już działa na Postgresie, a dodatkowe miejsce przechowywania wyłącznie w pamięci byłoby niepożądane.
Wzorzec pamięciowy. Trwała pamięć przechowywana wewnątrz głównej bazy danych. Przewagą nad dedykowanym silnikiem jest spójność transakcyjna, ponieważ zapisy w pamięci są zatwierdzane razem z rzędami relacyjnymi aplikacji.
Wada. Specjalnie zaprojektowane bazy danych wektorowych przewyższają je w przypadku dużych zapytań filtrowanych, a ich użycie w środowiskach izolowanych lub na brzegu sieci nie jest realne, chyba że jesteś gotów uruchomić tam również pełną instancję Postgresa.
# pgvector -- basic similarity search.
import psycopg
from pgvector.psycopg import register_vector
conn = psycopg.connect("dbname=agent_memory")
register_vector(conn)
conn.execute("CREATE EXTENSION IF NOT EXISTS vector")
conn.execute(
"CREATE TABLE IF NOT EXISTS memories (id bigserial PRIMARY KEY, "
"text text, embedding vector(768))"
)
conn.execute(
"INSERT INTO memories (text, embedding) VALUES (%s, %s)",
("example memory", [0.1] * 768),
)
results = conn.execute(
"SELECT text FROM memories ORDER BY embedding <-> %s LIMIT 5",
([0.1] * 768,),
).fetchall()
Jeśli twoja praca wymaga wydajności, której pgvector nie jest w stanie osiągnąć, będziesz musiał całkowicie porzucić model Postgres – to jest kompromis, który trzeba rozważyć.
8. Pinecone
Pinecone działa jako zarządzana usługa typu serverless i nie można jej uruchomić samodzielnie.
Pakiet darmowy. Wersja Starter oferuje 2 GB przestrzeni na przechowywanie indeksów, maksymalnie pięć indeksów, dwa miliony jednostek zapisu i jeden milion jednostek odczytu miesięcznie, wszystko w jednym regionie AWS (us-east-1) i w ramach jednego projektu. Nie ma publikowanego limitu wektorów, co oznacza, że pierwszym ograniczeniem będzie przestrzeń dyskowa.
Odpowiada agentom, gdy nie chcesz, aby cokolwiek działało podczas prototypowania, i nie masz nic przeciwko temu, aby pamięć agenta znajdowała się w pełni na infrastrukturze kogoś innego.
Wzorzec pamięci. Pamięć jest zużywana podczas tworzenia prototypów. Plan bezpłatny przeznaczony jest do prób i małych projektów oraz nie nadaje się do przechowywania rosnących ilości danych przez agenty w warunkach produkcji.
Wada. Limit przechowywania nie jest głównym problemem agentów – większym problemem jest brak opcji self-hosted. Jeśli dane muszą pozostać wewnątrz twojej infrastruktury, Pinecone nie nadaje się, bez względu na to, jak hojny jest plan bezpłatny.
# Pinecone -- basic similarity search.
from pinecone import Pinecone, ServerlessSpec
import os
pc = Pinecone(api_key=os.environ["PINECONE_API_KEY"])
pc.create_index(
name="agent-memory",
dimension=768,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
while not pc.describe_index("agent-memory").status["ready"]:
pass
index = pc.Index("agent-memory")
index.upsert(vectors=[("1", [0.1] * 768, {"text": "example memory"})])
results = index.query(vector=[0.1] * 768, top_k=5)
Baza danych działająca wyłącznie w chmurze po prostu nie jest opcją dla implementacji, których ograniczenia całkowicie wykluczają usługi chmurowe.
Jak podjąć decyzję
Należy decydować w następującej kolejności: gdzie ma być zainstalowana, co już się tam uruchamia oraz jak duża będzie w przyszłości.
Najpierw należy rozważyć miejsce instalacji, ponieważ tylko ten czynnik może całkowicie odrzucić dany wybór. Baza danych istniejąca wyłącznie w chmurze nie może zostać umieszczona na serwerze izolowanym od sieci, a gdy przepisy wymagają, aby dane pozostały w tym samym miejscu, żaden darmowy plan nie zmienia tej decyzji. Limit przechowywania to jedynie kwota, którą trzeba zapłacić, aby później go zwiększyć.
Dwie kwestie wykraczają poza tę sekwencję. Jeśli Postgres jest już częścią twojego stacku, pgvector oszczędza ci konieczności utrzymywania dodatkowej bazy danych, niezależnie od miejsca implementacji. Jeśli dążysz do skali miliardów wektorów, Milvus został stworzony specjalnie do tego celu od samego początku. A jeśli tylko tworzysz prototypy, zacznij od ChromaDB lokalnie i przenieś się do hostowanego endpointu, gdy naprawdę będzie to konieczne.
Dla implementacji lokalnych, izolowanych lub na krańcach sieci, realistycznym wyborem są opcje samohostowane, a mianowicie VectorAI DB, Qdrant, Milvus, LanceDB i pgvector; wybór pomiędzy nimi zależy od skali, wymagań dotyczących równoczesności oraz ilości pracy operacyjnej, jaką może sprostać twoz zespół.
Literatura pokrewna
- Jak działa RAG: Embeddingi, bazy danych wektorowych i dzielenie na fragmenty — Prześledź jeden fragment tekstu od tokenizacji, przez proces agregacji, aż po wyszukiwanie za pomocą podobieństwa kosinowego i zrozum, dlaczego dzielenie tekstu na fragmenty oraz modele embeddingów decydują o jakości RAG.
- Znaczenie jako współrzędne: Od embeddingów do baz danych wektorowych i RAG — Proste omówienie embeddingów zdań, podobieństwa kosinowego, baz danych wektorowych oraz cyklu RAG, z czterema krótkimi zdaniami o psach, kotach i Paryżu pokazującymi, jak funkcjonuje wyszukiwanie na podstawie znaczenia.