iwantcoding.com
🔥 Daily 👥 Rooms 🏆 Top Log in Sign up

Vector Stores

Vector stores in LangChain: embeddings + similarity search for RAG. Chroma, Pinecone, Weaviate, Qdrant — when each fits.

LangChain — vector stores

EXAMPLE
from langchain_openai import OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

# ===== The flow =====
# raw docs -> split -> embed -> store -> later: query -> retrieve top-k

emb = OpenAIEmbeddings(model='text-embedding-3-small')

# ===== Load + split =====
docs = TextLoader('handbook.md').load()
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=120)
chunks = splitter.split_documents(docs)

# ===== Chroma (local, file-backed) =====
from langchain_chroma import Chroma
store = Chroma.from_documents(chunks, emb, persist_directory='./chroma')

# Query later:
results = store.similarity_search('how do refunds work?', k=4)
for r in results: print(r.page_content[:200])

# ===== Pinecone (managed) =====
from langchain_pinecone import PineconeVectorStore
import pinecone
pc = pinecone.Pinecone(api_key='...')
# Pre-create the index in the Pinecone console with the right dim (1536 for OpenAI small).
store2 = PineconeVectorStore.from_documents(chunks, emb, index_name='handbook')

# ===== Qdrant (open-source, self-host or cloud) =====
from langchain_qdrant import QdrantVectorStore
store3 = QdrantVectorStore.from_documents(
    chunks, emb,
    url='http://localhost:6333',
    collection_name='handbook',
)

# ===== Weaviate, Milvus, pgvector, FAISS =====
# Same shape: from_documents + similarity_search.

# ===== As a retriever =====
retriever = store.as_retriever(search_kwargs={'k': 4})
docs_for_q = retriever.invoke('how do refunds work?')

# Compose into a chain:
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template('Answer from this context:\n{context}\n\nQ: {q}\nA:')
llm = ChatOpenAI(model='gpt-4o-mini', temperature=0)
chain = (
    { 'context': retriever | (lambda d: '\n\n'.join(x.page_content for x in d)),
      'q': lambda x: x }
    | prompt | llm | StrOutputParser()
)
print(chain.invoke('how do refunds work?'))

# ===== Filtering / metadata =====
chunks_with_meta = [
    type(c)(page_content=c.page_content, metadata={'team': 'support', **c.metadata})
    for c in chunks
]
store.add_documents(chunks_with_meta)
results = store.similarity_search('refunds', k=4, filter={'team': 'support'})

# ===== Reranking =====
# Raw vector similarity is noisy. Add a reranker for top-N:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
rerank = CohereRerank(model='rerank-english-v3.0', top_n=4)
reranked = ContextualCompressionRetriever(base_compressor=rerank, base_retriever=store.as_retriever(search_kwargs={'k': 20}))

# ===== Which store to pick =====
# Chroma     local prototypes; single-machine
# Pinecone   fully managed; great DX; pay per RU
# Qdrant     self-host or managed; filtering + payload features
# Weaviate   schema-rich; modular ML integrations
# Milvus     huge scale (billions of vectors)
# pgvector   already on Postgres? smallest moving parts
# FAISS      offline batch search; fastest pure ANN

# ===== Patterns to internalise =====
# - chunk_size 600-1000 with overlap 100-200; tune by corpus
# - Match embedding dim to the index (1536 for text-embedding-3-small)
# - Filter by metadata for multi-tenant corpora
# - Rerank when k > 5; it pays for itself in answer quality

# ===== Pitfalls =====
# - Mixing embedding models across writes + queries (must match)
# - Chunks too small -> sentences split, embeddings lose meaning
# - No metadata filter on shared corpora -> data leaks across tenants
# - Trusting cosine similarity > 0.7 = 'relevant' (varies per model)

Why it matters

Vector stores are the storage half of RAG. Pick by deployment shape — Chroma local, Pinecone managed, Qdrant flexible, pgvector when Postgres is already there. Same shape across them: split + embed + store + similarity_search. Add metadata filters + reranking when answer quality matters.

Tip: Tweak the snippet with Try it Yourself », then sit the quiz at the bottom of the page.

Example

Example
from langchain_chroma import Chroma
store = Chroma.from_documents(chunks, emb, persist_directory='./chroma')
results = store.similarity_search('refund policy', k=4)
Try it Yourself »

Exercise

Build a Chroma store from docs.

store = Chroma. (chunks, emb)

Discussion

Loading…