| name | langchain-vector-stores |
| description | Guide to using vector store integrations in LangChain including Chroma, Pinecone, FAISS, and memory vector stores |
| language | python |
langchain-vector-stores (Python)
Overview
Vector stores are databases optimized for storing and searching high-dimensional vectors (embeddings). They enable semantic search by finding documents similar to a query based on vector similarity rather than keyword matching. Essential for RAG (Retrieval-Augmented Generation) systems.
Key Concepts
- Vector Database: Specialized database for storing and querying embeddings
- Similarity Search: Finding similar documents using vector distance metrics (cosine, euclidean)
- Metadata Filtering: Combining vector search with metadata filters
- Persistence: Some vector stores run in-memory, others persist to disk/cloud
- Scaling: Different stores have different scalability characteristics
Vector Store Selection Decision Table
| Vector Store | Best For | Package | Persistence | Scalability | Key Features |
|---|
| FAISS | Local, high performance | langchain-community | Disk | Medium | Fast, CPU/GPU support, local |
| Chroma | Development, simplicity | langchain-chroma | Disk | Medium | Easy setup, local-first |
| Pinecone | Production, managed | langchain-pinecone | Cloud | High | Fully managed, auto-scaling |
| InMemory | Testing, prototyping | langchain-core | Memory only | Low | Simple, no setup, ephemeral |
| Weaviate | GraphQL, hybrid search | langchain-weaviate | Cloud/Self-hosted | High | GraphQL, hybrid search |
| Qdrant | High performance, filtering | langchain-qdrant | Cloud/Self-hosted | High | Fast, advanced filtering |
| PGVector | PostgreSQL users | langchain-postgres | PostgreSQL | High | PostgreSQL extension |
When to Choose Each Store
Choose FAISS if:
- You need high performance local vector search
- You want to avoid external dependencies
- You have many vectors (millions) to search quickly
Choose Chroma if:
- You want simple local development
- You need easy persistence without complex setup
- You're building a prototype or small application
Choose Pinecone if:
- You're building production applications
- You want zero operational overhead
- You need auto-scaling and high availability
Choose InMemory Vector Store if:
- You're testing or prototyping
- Data persistence isn't needed
- You want the simplest possible setup
Code Examples
InMemory Vector Store (Simplest)
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
vectorstore = InMemoryVectorStore(OpenAIEmbeddings())
from langchain_core.documents import Document
docs = [
Document(page_content="LangChain is a framework for LLM apps", metadata={"source": "docs"}),
Document(page_content="Vector stores enable semantic search", metadata={"source": "docs"}),
Document(page_content="Paris is the capital of France", metadata={"source": "wiki"}),
]
vectorstore.add_documents(docs)
results = vectorstore.similarity_search("What is LangChain?", k=2)
for doc in results:
print(doc.page_content)
results_with_score = vectorstore.similarity_search_with_score("LangChain", k=2)
for doc, score in results_with_score:
print(f"Score: {score}, Content: {doc.page_content}")
FAISS Vector Store
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
import faiss
embeddings = OpenAIEmbeddings()
docs = [
Document(page_content="Document 1 content", metadata={"id": 1}),
Document(page_content="Document 2 content", metadata={"id": 2}),
]
vectorstore = FAISS.from_documents(docs, embeddings)
results = vectorstore.similarity_search("query", k=3)
vectorstore.save_local("./faiss_index")
loaded_store = FAISS.load_local(
"./faiss_index",
embeddings,
allow_dangerous_deserialization=True
)
embedding_dim = len(embeddings.embed_query("test"))
index = faiss.IndexFlatL2(embedding_dim)
docstore = InMemoryDocstore()
vectorstore = FAISS(embeddings, index, docstore, {})
Chroma Vector Store
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(
documents=docs,
embedding=OpenAIEmbeddings(),
persist_directory="./chroma_db",
collection_name="my-collection",
)
results = vectorstore.similarity_search(
"query",
k=3,
filter={"category": "A"}
)
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=OpenAIEmbeddings(),
collection_name="my-collection",
)
vectorstore.delete_collection()
Pinecone Vector Store
from langchain_pinecone import PineconeVectorStore
from pinecone import Pinecone, ServerlessSpec
from langchain_openai import OpenAIEmbeddings
import os
pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY"))
index_name = "my-index"
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=1536,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index(index_name)
vectorstore = PineconeVectorStore.from_documents(
documents=docs,
embedding=OpenAIEmbeddings(),
index=index,
)
results = vectorstore.similarity_search(
"query",
k=3,
filter={"topic": "tech"}
)
retriever = vectorstore.as_retriever(
search_kwargs={"k": 5}
)
docs = retriever.get_relevant_documents("query")
Adding Documents Incrementally
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
vectorstore = InMemoryVectorStore(OpenAIEmbeddings())
vectorstore.add_documents([
Document(page_content="Document 1", metadata={}),
])
vectorstore.add_documents([
Document(page_content="Document 2", metadata={}),
Document(page_content="Document 3", metadata={}),
])
vectorstore.add_texts(
texts=["Text 1", "Text 2"],
metadatas=[{"source": "A"}, {"source": "B"}]
)
Using as a Retriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
vectorstore = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 4}
)
llm = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("""
Answer based on context:
{context}
Question: {input}
""")
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)
result = retrieval_chain.invoke({"input": "What is LangChain?"})
print(result["answer"])
Maximum Marginal Relevance (MMR)
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings
vectorstore = InMemoryVectorStore.from_texts(
texts=["text1", "text2", "text3"],
metadatas=[{}, {}, {}],
embedding=OpenAIEmbeddings()
)
results = vectorstore.max_marginal_relevance_search(
"query",
k=3,
fetch_k=10,
lambda_mult=0.5
)
Boundaries
What Agents CAN Do
✅ Initialize vector stores
- Set up any supported vector store
- Configure with embeddings and connection details
✅ Add and query documents
- Add documents with metadata
- Perform similarity search
- Use metadata filters
✅ Persist and load
- Save vector stores to disk (FAISS, Chroma)
- Load existing vector stores
- Manage collections
✅ Use as retrievers
- Convert vector stores to retrievers
- Integrate with chains and agents
- Configure search parameters
What Agents CANNOT Do
❌ Mix embeddings from different models
- Cannot use different embedding models within same vector store
- Must use consistent embeddings
❌ Bypass provider limits
- Cannot exceed Pinecone index size limits
- Cannot bypass free tier restrictions
❌ Modify vector dimensions after creation
- Cannot change embedding dimensions once store is created
- Must recreate store with new embeddings
Gotchas
1. FAISS Deserialization Warning
loaded_store = FAISS.load_local("./faiss_index", embeddings)
loaded_store = FAISS.load_local(
"./faiss_index",
embeddings,
allow_dangerous_deserialization=True
)
Fix: Add allow_dangerous_deserialization=True when loading FAISS indices.
2. Import from Correct Packages
from langchain.vectorstores import FAISS
from langchain.vectorstores import Chroma
from langchain_community.vectorstores import FAISS
from langchain_chroma import Chroma
from langchain_pinecone import PineconeVectorStore
Fix: Use provider-specific packages.
3. Pinecone Index Creation
from pinecone import Pinecone
pc = Pinecone(api_key=api_key)
index = pc.Index("nonexistent")
if "my-index" not in pc.list_indexes().names():
pc.create_index(
name="my-index",
dimension=1536,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
Fix: Create Pinecone index before using it.
4. Chroma Persistence
vectorstore = Chroma.from_documents(
docs,
OpenAIEmbeddings()
)
vectorstore = Chroma.from_documents(
docs,
OpenAIEmbeddings(),
persist_directory="./chroma_db"
)
Fix: Specify persist_directory for persistence.
5. Dimension Mismatch
pc.create_index(name="idx", dimension=1536, metric="cosine")
vectorstore = PineconeVectorStore.from_documents(
docs,
OpenAIEmbeddings(model="text-embedding-3-small", dimensions=512),
index=pc.Index("idx")
)
embeddings = OpenAIEmbeddings()
Fix: Ensure vector store and embedding dimensions match.
Links and Resources
Official Documentation
Provider Documentation
Package Installation
pip install langchain-community faiss-cpu
pip install langchain-chroma
pip install langchain-pinecone pinecone-client
pip install langchain-qdrant qdrant-client