Store and search embeddings for RAG applications
Vector databases store high-dimensional vectors (embeddings) and enable fast similarity search. They're essential for:
Managed, scalable
Simple, embedded
Feature-rich, hybrid
Fast, Rust-based
| Feature | Pinecone | Chroma | Weaviate | Qdrant |
|---|---|---|---|---|
| Hosting | Cloud only | Local/Cloud | Local/Cloud | Local/Cloud |
| Free Tier | Yes (limited) | Yes (unlimited) | Yes | Yes |
| Setup | Easy | Easiest | Moderate | Moderate |
| Scale | Billions | Millions | Billions | Billions |
| Metadata Filter | โ | โ | โ | โ |
| Hybrid Search | โ | โ | โ | โ |
Recommendation: Start with Chroma for prototyping (zero setup). Move to Pinecone or Qdrant for production.
pip install chromadb
import chromadb
# Create client (in-memory)
client = chromadb.Client()
# Or persistent storage
client = chromadb.PersistentClient(path="./chroma_db")
# Create collection
collection = client.create_collection(name="my_docs")
# Add documents (auto-embeds with default model)
collection.add(
documents=["Hello world", "How are you?"],
ids=["doc1", "doc2"],
metadatas=[{"source": "web"}, {"source": "file"}]
)
# Query
results = collection.query(
query_texts=["greeting"],
n_results=2
)
print(results["documents"])
from chromadb.utils import embedding_functions
# OpenAI embeddings
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-api-key",
model_name="text-embedding-3-small"
)
collection = client.create_collection(
name="my_docs",
embedding_function=openai_ef
)
pip install pinecone-client
from pinecone import Pinecone
# Initialize
pc = Pinecone(api_key="your-api-key")
# Create index (once)
pc.create_index(
name="my-index",
dimension=1536, # OpenAI embedding size
metric="cosine"
)
# Connect to index
index = pc.Index("my-index")
# Upsert vectors
index.upsert(vectors=[
{
"id": "doc1",
"values": [0.1, 0.2, ...], # Your embedding
"metadata": {"text": "Hello world"}
}
])
# Query
results = index.query(
vector=[0.1, 0.2, ...], # Query embedding
top_k=5,
include_metadata=True
)
pip install qdrant-client
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
# In-memory client
client = QdrantClient(":memory:")
# Or connect to server
client = QdrantClient(host="localhost", port=6333)
# Create collection
client.create_collection(
collection_name="my_docs",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)
# Add points
client.upsert(
collection_name="my_docs",
points=[
PointStruct(
id=1,
vector=[0.1, 0.2, ...],
payload={"text": "Hello world"}
)
]
)
# Search
results = client.search(
collection_name="my_docs",
query_vector=[0.1, 0.2, ...],
limit=5
)
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# Create from documents
vectorstore = Chroma.from_documents(
documents=docs,
embedding=embeddings,
persist_directory="./chroma_db"
)
# Use as retriever
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
from langchain_pinecone import PineconeVectorStore
vectorstore = PineconeVectorStore.from_documents(
documents=docs,
embedding=embeddings,
index_name="my-index"
)
retriever = vectorstore.as_retriever()