AI Infrastructure Guide • 2025 Edition

Vector Database Comparison:
Pinecone vs Weaviate vs Chroma vs Qdrant vs pgvector

Everything you need to choose the right vector store for your RAG pipeline, semantic search, or embedding storage — with real cost numbers and code examples.

📅 Updated April 2025 ⏱ 15 min read 💻 Includes Python code 💰 Cost comparison included

Why Vector Databases Matter for AI

When you build a Retrieval-Augmented Generation (RAG) pipeline, a semantic search engine, or any AI application that needs to find "relevant" content, you quickly run into a fundamental problem: traditional databases are built for exact matches, not meaning.

Searching a relational database for WHERE title = 'machine learning' is easy. But finding all documents that are conceptually related to machine learning — including texts about neural networks, gradient descent, or model training — is an entirely different challenge. This is where vector databases shine.

What Are Embeddings?

Modern AI models like OpenAI's text-embedding-3-large, Cohere's embed-english-v3, or open-source models like nomic-embed-text convert text (or images, audio, or code) into high-dimensional numerical arrays called embeddings. A typical embedding might be 768, 1536, or 3072 floating-point numbers.

The key insight is that semantically similar content produces embeddings that are numerically close to each other in this high-dimensional space. The phrase "how do I train a neural network?" and "steps to fine-tune a deep learning model" will produce vectors that are very close together, even though they share almost no keywords.

The core value proposition: Vector databases store these embeddings and can find the most similar ones to a query embedding at sub-millisecond speeds — even across tens of millions of records. This makes them the backbone of every modern RAG system.

The RAG Architecture

Retrieval-Augmented Generation works in three stages:

  1. Ingestion: Your documents are chunked, embedded by an AI model, and stored in a vector database alongside their original text.
  2. Retrieval: When a user asks a question, the question is embedded and the vector database returns the top-k most semantically similar document chunks.
  3. Generation: Those retrieved chunks are injected into the LLM's context window as grounding context, dramatically improving answer accuracy and reducing hallucinations.

The quality of your vector database directly impacts the quality of your RAG system. A poor retrieval step means the LLM gets irrelevant context — and no matter how capable the model, garbage in means garbage out. This makes choosing the right vector store one of the most important architectural decisions in any AI application.

Beyond RAG: Other Vector Database Use Cases

  • Semantic search: Finding conceptually relevant results for e-commerce, documentation, or internal knowledge bases.
  • Recommendation systems: Finding items similar to what a user has engaged with.
  • Duplicate detection: Identifying near-duplicate content at scale.
  • Image and multimodal search: Finding visually similar images using CLIP embeddings.
  • Anomaly detection: Identifying vectors that are outliers relative to a known distribution.

How Vector Databases Work: Indexing Explained Simply

The naive approach to similarity search is brute force: compare your query vector against every stored vector and return the closest ones. This is called exact nearest neighbor search (or kNN). It's perfectly accurate but scales as O(n*d) — where n is the number of vectors and d is the dimension count. At 10 million vectors with 1536 dimensions, this becomes impossibly slow.

Vector databases solve this with Approximate Nearest Neighbor (ANN) algorithms that trade a tiny amount of recall accuracy for orders-of-magnitude speed improvements. Here are the three most important ones:

HNSW — Hierarchical Navigable Small World

HNSW is the dominant algorithm in modern vector databases (used by Weaviate, Qdrant, Chroma, and pgvector). It works by building a multi-layer graph of your vectors:

  • The top layer contains a small number of "hub" vectors with long-range connections, allowing fast traversal.
  • Lower layers progressively increase density with shorter-range connections for fine-grained search.
  • At query time, the algorithm starts at the top layer and greedily navigates toward the query vector, moving down layers until it finds the approximate nearest neighbors.

HNSW typically achieves 95-99% recall while being 10-100x faster than brute force. The main tradeoff is memory usage — the graph must fit in RAM, which becomes expensive at very large scale.

IVF — Inverted File Index

IVF works by first clustering your vectors into N centroids using k-means. At query time, only the clusters whose centroids are closest to the query are searched. This dramatically reduces the search space. IVF is more memory-efficient than HNSW but requires tuning the number of clusters and the number of clusters to probe at query time.

PQ — Product Quantization

Product Quantization is a compression technique, often used alongside IVF (IVF-PQ). It divides each high-dimensional vector into sub-vectors and quantizes each independently, reducing storage requirements by 4-16x. The tradeoff is slightly lower recall. Pinecone uses PQ heavily in its managed infrastructure to achieve cost-effective storage at scale.

Scalar Quantization and Binary Quantization

Newer approaches compress float32 vectors into int8 (scalar quantization) or single bits (binary quantization). Qdrant supports both, achieving up to 32x memory savings with binary quantization at the cost of lower recall. These techniques are becoming increasingly important for cost management at the 10M+ vector scale.

Key insight: The choice of indexing algorithm, and the ability to tune it, varies significantly across vector databases. Pinecone abstracts this completely. Weaviate and Qdrant expose tuning knobs. Chroma uses HNSW by default with sensible defaults. For most applications, defaults work fine — but for high-performance production systems, tuning matters.

Comprehensive Vector Database Comparison Table

Here's how the five leading vector databases stack up across the dimensions that matter most for production AI applications:

Database Hosting Free Tier Pricing Model Index Type Filtering Hybrid Search Multimodal Python SDK
Pinecone Managed only Yes (2M vecs) Storage + QPS pods or Serverless PQ / HNSW Excellent Yes Limited Official
Weaviate Both Yes (Cloud) Dimension-based (Cloud) / Free (self-hosted) HNSW Excellent Yes (BM25) Native Official
Chroma Both Yes (local) Free (OSS) / Usage (Cloud) HNSW Basic Partial Via embeddings Official
Qdrant Both Yes (1GB Cloud) RAM-based (Cloud) / Free (self-hosted) HNSW + SQ/BQ Excellent Yes (sparse) Via embeddings Official
pgvector Both Yes Postgres hosting costs HNSW / IVFFlat Full SQL Manual Via embeddings Via psycopg2

Performance at a Glance (Approximate QPS, 1M vectors, 1536 dims)

Database p99 Latency Throughput (QPS) Recall @ 10 Index Build Time Memory Footprint
Pinecone (s1 pod) < 20ms ~150 QPS ~97% Automatic Managed
Weaviate (HNSW) < 15ms ~200+ QPS ~98% Medium High (in-memory)
Chroma (HNSW) < 30ms ~80 QPS ~96% Fast Medium
Qdrant (HNSW) < 10ms ~300+ QPS ~99% Fast Low (with SQ)
pgvector (HNSW) < 50ms ~50 QPS ~95% Slow Medium

Note: Performance varies significantly based on hardware, configuration, ef/nprobe parameters, and payload filtering complexity. Benchmarks are indicative — always test with your own data.

Deep-Dive: Pinecone

Pinecone is the most widely-adopted managed vector database, built from the ground up to handle production-scale similarity search with zero operational overhead. It was one of the first dedicated vector databases to achieve mainstream adoption, and its simplicity is both its greatest strength and, for some teams, its greatest limitation.

Architecture

Pinecone operates as a fully managed SaaS platform — you never touch a server. It uses a proprietary combination of HNSW and PQ indexing under the hood, optimized for their specific hardware. In 2024, Pinecone launched a Serverless architecture that separates storage from compute, dramatically reducing costs for sporadic workloads while enabling virtually unlimited vector storage.

Pinecone organizes data into indexes (one per use case or model dimension) and within each index, namespaces allow logical partitioning of data without performance penalties. This is particularly useful for multi-tenant applications.

Filtering

Pinecone supports metadata filtering, allowing you to combine vector similarity with attribute filters (e.g., category = 'finance' AND date > '2024-01-01'). Filtering happens before the ANN search, which maintains performance — a critical architectural detail that some databases get wrong, causing dramatic slowdowns when filters are applied.

Pros

  • Zero infrastructure management
  • Excellent production reliability (SLA-backed)
  • Fast, accurate metadata filtering
  • Namespace-based multi-tenancy
  • Serverless tier for cost efficiency
  • Best-in-class documentation
  • Strong LangChain / LlamaIndex integration

Cons

  • Closed-source — no self-hosting
  • Can be expensive at high scale
  • Pod-based plans require capacity planning
  • Limited multimodal support
  • No built-in vectorization
  • Vendor lock-in risk

When to Use Pinecone

  • You need a production-ready vector database today with minimal setup.
  • Your team lacks infrastructure expertise to manage self-hosted deployments.
  • You're building a product where downtime is unacceptable and you need SLAs.
  • Your use case involves complex metadata filtering combined with semantic search.
  • You're on a startup budget and want to start with the free Serverless tier.

Deep-Dive: Weaviate

Weaviate is an open-source vector database written in Go, maintained by Weaviate BV (now part of Zilliz). It stands out from other vector databases by being more of a full knowledge graph + vector search platform than a pure vector store. This makes it more complex to learn but significantly more powerful for certain use cases.

Architecture

Weaviate uses HNSW for indexing and stores data in classes (similar to tables) with a defined schema. Each class has properties that can be filtered. One of Weaviate's most distinctive features is its module system — you can configure Weaviate to automatically vectorize data as it's inserted using built-in modules for OpenAI, Cohere, HuggingFace, and others. This eliminates the separate embedding step that most vector databases require.

Hybrid Search

Weaviate offers first-class hybrid search combining BM25 keyword search with vector similarity, merged using a configurable fusion algorithm. This is one of the best hybrid search implementations among all vector databases, and it's a major reason teams choose Weaviate for document retrieval workloads where precision matters.

GraphQL API

Weaviate's primary API is GraphQL, which feels unusual at first but is actually quite powerful for complex cross-referenced queries. A REST API and gRPC interface are also available. Most developers use the official Python client, which abstracts the GraphQL layer.

Pros

  • Open-source and self-hostable
  • Best-in-class hybrid search (BM25 + vector)
  • Built-in vectorization modules
  • Native multimodal support (text, image, audio)
  • Rich filtering with cross-references
  • Managed cloud option available
  • Active community and ecosystem

Cons

  • Steep learning curve (schema, modules)
  • High memory usage (HNSW in-memory)
  • GraphQL API can feel verbose
  • Managed cloud pricing less transparent
  • Operational complexity at scale
  • Slower index rebuild on large datasets

When to Use Weaviate

  • You need hybrid search combining keyword relevance and semantic similarity.
  • You're building a multimodal application handling text, images, and more.
  • You want the flexibility to self-host and avoid managed service costs at scale.
  • Your team has DevOps experience and can manage a stateful service.
  • You want automatic vectorization integrated directly into your database.

Deep-Dive: Chroma

Chroma has carved out a unique and important niche in the vector database ecosystem: it is the developer-friendliest option for local development, prototyping, and small-to-medium production workloads. If you've seen a RAG tutorial in the past two years, there's a good chance it used Chroma — and for good reason.

Architecture

Chroma is written in Python with a Rust-accelerated core. It can run in three modes:

  • In-memory: Zero setup. Import the library and go. Data is lost on process exit.
  • Persistent local: Data is persisted to a local directory with a single path argument. Ideal for development and small production deployments.
  • Client-server: Run Chroma as a Docker container and connect via the HTTP client. This is the production-ready deployment mode.

Chroma uses HNSW (via the hnswlib Python library) for indexing. Collections store vectors, documents, and metadata together. Chroma can optionally handle embedding generation using pluggable embedding functions, supporting OpenAI, Cohere, HuggingFace, and local models out of the box.

The Free/Local Angle

This is Chroma's killer feature: it is completely free when self-hosted. For teams building internal tools, prototypes, or applications with modest vector counts (under ~1 million), Chroma on a single server or even a developer's laptop is a perfectly viable solution that costs nothing beyond compute.

Pros

  • Simplest API of any vector database
  • 100% free when self-hosted
  • In-memory mode for instant prototyping
  • Built-in embedding function support
  • Excellent LangChain / LlamaIndex integration
  • Active OSS community
  • Docker-based deployment is trivial

Cons

  • Limited filtering capabilities vs. Pinecone/Qdrant
  • No native hybrid search (BM25)
  • Performance degrades at 5M+ vectors
  • No built-in multi-tenancy
  • Managed cloud is newer / less proven
  • Less suitable for ultra-high QPS workloads

When to Use Chroma

  • You're prototyping or building a proof-of-concept and want zero friction.
  • You need a free, local vector store for development or internal tooling.
  • Your vector count is under 2 million and your QPS requirements are modest.
  • You're building an open-source project or educational resource.
  • You want to let the LangChain/LlamaIndex defaults just work.

Qdrant & pgvector: The Other Strong Contenders

Qdrant

Qdrant deserves serious consideration and is arguably the best-performing open-source vector database available today. Written in Rust, it delivers exceptional throughput and memory efficiency, with an intuitive REST and gRPC API.

What sets Qdrant apart technically is its support for scalar quantization (SQ) and binary quantization (BQ), which can reduce memory usage by 4-32x with minimal recall loss. For teams storing tens of millions of vectors on self-hosted infrastructure, this dramatically reduces hardware costs. Qdrant also supports sparse vectors natively, enabling true hybrid search that combines dense embeddings with BM25-style keyword signals in a single index.

Qdrant offers a managed cloud service with a 1GB free cluster, making it accessible for getting started. For self-hosting, a single Docker container is all you need, and horizontal scaling is supported via its distributed mode.

Best for:

  • High-performance self-hosted deployments where you want control and low cost at scale
  • Workloads requiring true hybrid dense + sparse search
  • Teams that need advanced quantization to manage memory costs

pgvector

pgvector is a PostgreSQL extension that adds a vector data type and approximate nearest neighbor search to your existing Postgres database. It is the right choice when you already run PostgreSQL and want to avoid adding another system to your infrastructure.

pgvector supports both HNSW (added in version 0.5) and IVFFlat indexing. The HNSW implementation is surprisingly competitive for moderate scales. The killer advantage is transactional consistency — your vectors live in the same ACID-compliant database as the rest of your application data, with full SQL for filtering.

The limitations appear at scale. pgvector is not optimized for vector workloads the way purpose-built databases are, and at 10M+ vectors with high QPS requirements, you'll likely need to migrate to a dedicated solution. But for many applications — particularly those with <500K vectors — pgvector with a managed Postgres host (Supabase, Neon, RDS) is a perfectly sensible and operationally simple choice.

Best for:

  • Teams already using PostgreSQL who want to minimize operational complexity
  • Applications where transactional consistency between metadata and vectors matters
  • Supabase users who get pgvector out of the box

Code Examples: Ingesting and Querying with Each Database

Here's how to insert embeddings and query the top-3 most similar results in each database using Python. Assumes you have an embedding model already generating vectors.

Pinecone

 pinecone_rag.py
from pinecone import Pinecone, ServerlessSpec
from openai import OpenAI

# Initialize clients
pc = Pinecone(api_key="your-pinecone-api-key")
oai = OpenAI(api_key="your-openai-api-key")

# Create index (serverless)
pc.create_index(
    name="rag-index",
    dimension=1536,
    metric="cosine",
    spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index("rag-index")

# Embed and upsert documents
documents = [
    {"id": "doc1", "text": "Vector databases power semantic search."},
    {"id": "doc2", "text": "RAG improves LLM accuracy with retrieval."},
]
for doc in documents:
    embedding = oai.embeddings.create(
        model="text-embedding-3-small", input=doc["text"]
    ).data[0].embedding
    index.upsert(vectors=[{
        "id": doc["id"],
        "values": embedding,
        "metadata": {"text": doc["text"]}
    }])

# Query
query = "What is retrieval augmented generation?"
query_vec = oai.embeddings.create(
    model="text-embedding-3-small", input=query
).data[0].embedding

results = index.query(
    vector=query_vec,
    top_k=3,
    include_metadata=True,
    filter={"category": {"$eq": "ai"}}  # optional metadata filter
)
for match in results["matches"]:
    print(match["score"], match["metadata"]["text"])

Weaviate

 weaviate_rag.py
import weaviate
from weaviate.classes.config import Configure, Property, DataType
from openai import OpenAI

oai = OpenAI(api_key="your-openai-api-key")

# Connect to local Weaviate instance
client = weaviate.connect_to_local()

# Create collection with explicit vectorizer
if not client.collections.exists("Document"):
    client.collections.create(
        "Document",
        vectorizer_config=Configure.Vectorizer.none(),  # bring-your-own vectors
        properties=[
            Property(name="text", data_type=DataType.TEXT),
            Property(name="source", data_type=DataType.TEXT),
        ]
    )

collection = client.collections.get("Document")

# Ingest with embeddings
texts = [
    "Vector databases power semantic search.",
    "RAG improves LLM accuracy with retrieval.",
]
with collection.batch.dynamic() as batch:
    for i, text in enumerate(texts):
        vec = oai.embeddings.create(
            model="text-embedding-3-small", input=text
        ).data[0].embedding
        batch.add_object(properties={"text": text, "source": f"doc{i}"}, vector=vec)

# Query with near_vector
query = "What is retrieval augmented generation?"
query_vec = oai.embeddings.create(
    model="text-embedding-3-small", input=query
).data[0].embedding

import weaviate.classes.query as wq
results = collection.query.near_vector(
    near_vector=query_vec, limit=3,
    return_metadata=wq.MetadataQuery(certainty=True)
)
for obj in results.objects:
    print(obj.metadata.certainty, obj.properties["text"])

Chroma

 chroma_rag.py
import chromadb
from chromadb.utils import embedding_functions

# Persistent local client (no server needed)
client = chromadb.PersistentClient(path="./chroma_db")

# Use OpenAI embedding function (auto-embeds on insert)
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key="your-openai-api-key",
    model_name="text-embedding-3-small"
)

collection = client.get_or_create_collection(
    name="rag_docs",
    embedding_function=openai_ef,
    metadata={"hnsw:space": "cosine"}
)

# Add documents — Chroma handles embedding automatically
collection.add(
    documents=[
        "Vector databases power semantic search.",
        "RAG improves LLM accuracy with retrieval.",
    ],
    ids=["doc1", "doc2"],
    metadatas=[{"category": "ai"}, {"category": "ai"}]
)

# Query — also auto-embeds the query text
results = collection.query(
    query_texts=["What is retrieval augmented generation?"],
    n_results=3,
    where={"category": "ai"}  # metadata filter
)
for doc, dist in zip(results["documents"][0], results["distances"][0]):
    print(f"Score: {1-dist:.3f} | {doc}")

Qdrant

 qdrant_rag.py
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
from openai import OpenAI

oai = OpenAI(api_key="your-openai-api-key")
client = QdrantClient(url="http://localhost:6333")

# Create collection
client.recreate_collection(
    collection_name="rag_docs",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)

# Upsert points
texts = [
    "Vector databases power semantic search.",
    "RAG improves LLM accuracy with retrieval.",
]
points = []
for i, text in enumerate(texts):
    vec = oai.embeddings.create(
        model="text-embedding-3-small", input=text
    ).data[0].embedding
    points.append(PointStruct(
        id=i, vector=vec, payload={"text": text, "category": "ai"}
    ))
client.upsert(collection_name="rag_docs", points=points)

# Search with filter
query_vec = oai.embeddings.create(
    model="text-embedding-3-small",
    input="What is retrieval augmented generation?"
).data[0].embedding

from qdrant_client.models import Filter, FieldCondition, MatchValue
results = client.search(
    collection_name="rag_docs",
    query_vector=query_vec,
    limit=3,
    query_filter=Filter(
        must=[FieldCondition(key="category", match=MatchValue(value="ai"))]
    )
)
for hit in results:
    print(hit.score, hit.payload["text"])

Cost Comparison at Different Scales

Cost is often the deciding factor for production vector database adoption. Here's a realistic cost breakdown at three common scales, using 1536-dimensional vectors (OpenAI text-embedding-3-small / ada-002) and assuming moderate query volume (1,000 queries/day).

10,000 Vectors (Small Scale — Prototypes, Internal Tools)

Pinecone

Serverless Free Tier$0/mo
Paid estimate$0/mo
NotesWithin free tier limits

Weaviate Cloud

Free Sandbox$0/mo
Standard$0/mo
NotesFree tier covers this

Chroma (self-hosted)

Software cost$0
Compute (small VPS)~$5/mo
NotesCheapest self-hosted option

pgvector (Supabase)

Free tier$0/mo
Pro plan$25/mo
NotesPostgres included

1,000,000 Vectors (Medium Scale — Production SaaS)

Pinecone

Serverless~$70-90/mo
p1.x1 pod~$70/mo
NotesServerless varies with queries

Weaviate (self-hosted)

Software cost$0
r6g.xlarge (16GB RAM)~$100/mo
NotesHNSW needs lots of RAM

Qdrant (self-hosted)

Software cost$0
m6g.large + SQ (8GB)~$55/mo
NotesQuantization saves memory

Chroma Cloud

Usage-based~$50-80/mo
Self-hosted~$60/mo
NotesCloud pricing evolving

10,000,000 Vectors (Large Scale — Enterprise)

Pinecone

p1 pods (4x)~$280/mo
With replicas~$560+/mo
NotesCosts scale steeply

Qdrant (self-hosted)

r6g.2xlarge + BQ~$200/mo
With HA (3 nodes)~$600/mo
NotesBest perf/$ at this scale

Weaviate (self-hosted)

r6g.4xlarge cluster~$500+/mo
NotesHigh RAM requirements

pgvector (RDS)

db.r6g.2xlarge~$450/mo
NotesNot recommended at this scale

Cost takeaway: At small scale, all options are essentially free. At medium scale (1M vectors), the differences narrow and operational simplicity often justifies Pinecone's slightly higher cost. At 10M+ vectors, self-hosted Qdrant with quantization offers the best performance-per-dollar, potentially saving $200-400/month versus managed options.

How to Choose the Right Vector Database

Use this decision framework to find the right vector store for your specific situation. Work through each question in order:

1
Are you prototyping or building for production?

If prototyping, exploring, or building a demo → go straight to Chroma. Its in-memory mode requires zero setup. You can always migrate later.

2
Do you have (or want) infrastructure team bandwidth?

If no — you want someone else to handle ops, scaling, and reliability → choose a managed service (Pinecone, Weaviate Cloud, Qdrant Cloud).
If yes — you're comfortable with Docker/Kubernetes and want full cost control → consider self-hosted Weaviate, Qdrant, or Chroma.

3
Do you need hybrid search (keyword + semantic)?

If yes (most document retrieval / RAG use cases benefit from this) → choose Weaviate or Qdrant. Both offer excellent BM25 + dense vector fusion. Pinecone's hybrid search is good but requires separate sparse index management.

4
How many vectors do you expect to store?

< 500K → any option works; optimize for developer experience.
500K – 5M → Pinecone Serverless, Weaviate, or Qdrant are all solid choices.
> 5M → self-hosted Qdrant with quantization is the most cost-effective. Pinecone scales but costs rise quickly.

5
Do you already run PostgreSQL?

If yes and your vector count is < 500K with modest QPS → strongly consider pgvector. Adding a Postgres extension is operationally simpler than adding a new system, and Supabase or Neon make it trivial to set up.

6
Is multimodal support (text + image) required?

If yesWeaviate is the standout choice, with native CLIP integration and schema support for multiple modalities in a single class.

7
Still undecided?

Default to Pinecone Serverless for managed, or Qdrant for self-hosted. Both are battle-tested, well-documented, and have strong Python SDKs that integrate cleanly with LangChain and LlamaIndex. You can migrate between vector databases later — the embedding model is more important to get right than the storage layer.

Quick Reference Summary

If you need... Best choice Runner-up
Fastest to get startedChromaPinecone Serverless
Best managed servicePineconeWeaviate Cloud
Best self-hosted performanceQdrantWeaviate
Best hybrid searchWeaviateQdrant
Lowest cost at 10M+ vectorsQdrant (self-hosted)Weaviate (self-hosted)
Multimodal (text + image)WeaviateQdrant
Already using PostgrespgvectorChroma
Completely free optionChroma (local)Qdrant (local Docker)

Plan Your RAG Stack with AI

Not sure which vector database fits your specific architecture? TechStackopoly's AI workflow planner recommends the right vector store, embedding model, and LLM combination for your use case — in under 2 minutes.

Build My RAG Stack →

Frequently Asked Questions

What is the best vector database for RAG in 2025?

For production RAG, Pinecone is the top managed option due to reliability and excellent metadata filtering. For self-hosted production, Qdrant offers the best performance-to-cost ratio. For local development and prototyping, Chroma is the easiest to start with. The best choice depends on your scale, budget, and operational preferences.

What is the difference between Pinecone and Weaviate?

Pinecone is fully managed, closed-source, and optimized for pure vector search simplicity. Weaviate is open-source, self-hostable or cloud-hosted, and offers native multimodal support, built-in vectorization modules, and superior hybrid search. Pinecone has a gentler learning curve; Weaviate offers more flexibility and lower long-term costs at scale.

Is Chroma free to use?

Yes — Chroma is fully open-source and free when self-hosted. You can run it in-memory for zero-cost prototyping, or persist it to disk on any server. Chroma Cloud offers a managed option with a free tier. For most small-to-medium projects, self-hosted Chroma is the most cost-effective vector database available.

How does a vector database work?

A vector database stores high-dimensional numerical embeddings generated by AI models. At query time, you provide a query embedding and the database finds the most similar stored vectors using Approximate Nearest Neighbor (ANN) algorithms like HNSW or IVF. These trade a small amount of recall accuracy for massive speed improvements over brute-force search, enabling sub-millisecond similarity lookup across millions of vectors.

What is the difference between a vector database and pgvector?

pgvector is a PostgreSQL extension that adds vector similarity search to an existing Postgres database. Purpose-built vector databases (Pinecone, Weaviate, Qdrant, Chroma) are optimized specifically for vector workloads and offer higher throughput, better filtering, and more advanced indexing options. pgvector is ideal when you already run Postgres and want to avoid adding another service; purpose-built options shine at 1M+ vectors or high QPS.

How much does it cost to store 1 million vectors in Pinecone?

Storing 1 million 1536-dimensional vectors in Pinecone costs approximately $70-90/month depending on the plan. The Serverless tier charges separately for reads, writes, and storage, which can be more cost-effective for bursty workloads. Pod-based plans (p1.x1) offer more predictable pricing for consistent query volumes.

Does Qdrant support hybrid search?

Yes. Qdrant supports hybrid search combining dense vector search with sparse vector search (BM25/SPLADE-style). This allows combining semantic similarity with keyword relevance in a single query, significantly improving retrieval quality for RAG applications. Qdrant uses a built-in fusion algorithm to merge results from both search methods efficiently.