Что такое vector store в LangChain и какие векторные базы данных чаще всего используются (Chroma, Pinecone, FAISS)?
Vector store в LangChain — абстракция над векторной базой данных, позволяющая индексировать документы по эмбеддингам и выполнять similarity search. Chroma — локальная, Pinecone — управляемое облако, FAISS — быстрый in-memory индекс от Meta.
Что такое vector store
Vector store (векторное хранилище) — база данных, оптимизированная для хранения и поиска векторов эмбеддингов. В LangChain все vector stores реализуют единый интерфейс VectorStore с методами add_documents, similarity_search и as_retriever. Это позволяет переключаться между реализациями без изменения кода пайплайна.
Chroma — локальная векторная БД
Chroma — embedded база данных, работает в процессе Python или как отдельный сервер. Лучший выбор для прототипов, разработки и небольших проектов (до ~100k документов).
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_core.documents import Document
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# Создание и наполнение
vectorstore = Chroma(
collection_name="docs",
embedding_function=embeddings,
persist_directory="./chroma_db", # Сохраняем на диск
)
docs = [
Document(page_content="FastAPI is a modern Python web framework", metadata={"source": "docs.fastapi.tiangolo.com"}),
Document(page_content="Ktor is a Kotlin async web framework", metadata={"source": "ktor.io"}),
]
vectorstore.add_documents(docs)
# Поиск
results = vectorstore.similarity_search("Python web framework", k=2)
for doc in results:
print(doc.page_content, doc.metadata)
FAISS — быстрый in-memory индекс
FAISS (Facebook AI Similarity Search) — библиотека от Meta для высокопроизводительного поиска ближайших соседей. Работает в памяти, требует явного сохранения на диск. Лучший выбор для batch-обработки и задач с жёсткими требованиями к latency.
from langchain_community.vectorstores import FAISS
# Создание из документов
vectorstore = FAISS.from_documents(docs, embeddings)
# Сохранение и загрузка
vectorstore.save_local("faiss_index")
loaded = FAISS.load_local(
"faiss_index",
embeddings,
allow_dangerous_deserialization=True, # Требуется явно
)
# Similarity search с score
results = loaded.similarity_search_with_score("web framework", k=3)
for doc, score in results:
print(f"Score: {score:.4f} | {doc.page_content[:80]}")
Pinecone — управляемое облако
Pinecone — serverless облачный vector store с автоматическим масштабированием. Подходит для production при больших объёмах (миллионы векторов) и необходимости масштабироваться без DevOps.
from pinecone import Pinecone, ServerlessSpec
from langchain_pinecone import PineconeVectorStore
# Инициализация
pc = Pinecone(api_key="pc-...")
index_name = "langchain-demo"
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=1536, # text-embedding-3-small
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1"),
)
vectorstore = PineconeVectorStore(
index=pc.Index(index_name),
embedding=embeddings,
)
vectorstore.add_documents(docs)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
Использование как Retriever в цепочке
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
retriever = vectorstore.as_retriever()
prompt = ChatPromptTemplate.from_template(
"Answer the question based on this context:\n{context}\n\nQuestion: {question}"
)
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| ChatOpenAI(model="gpt-4o-mini")
| StrOutputParser()
)
print(chain.invoke("What is Ktor?"))
Подводные камни
- Chroma
persist_directoryне создаётся автоматически при первом запуске если путь не существует — создайте директорию заранее. - FAISS
load_localтребуетallow_dangerous_deserialization=Trueиз-за pickle — не загружайте индексы из ненадёжных источников. - Размерность эмбеддингов должна совпадать между созданием индекса и запросом — смена модели эмбеддингов требует переиндексации.
- Pinecone serverless тарифицирует per-запрос — высокий трафик без кэширования быстро увеличивает счёт.
- Metadata-фильтры поддерживаются не всеми store одинаково: Chroma поддерживает
where, FAISS — нет, Pinecone — черезfilter. - Поиск по косинусному сходству возвращает результаты даже при низком quality — добавляйте пороговую фильтрацию по score.
- При использовании Chroma в production-сервере (не embedded) нужен отдельный Docker-контейнер с персистентным volume.
Common mistakes
- Объяснять
vector storesтолько синтаксисом без shape, dtype, состояния или режима выполнения. - Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
- Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.
What the interviewer is testing
- Может ли связать
vector storesс реальным контрактом входов и выходов. - Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
- Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.