Этот практикум в 2026 уже не стоит строить вокруг старой схемы LangChain + ChromaDB + один retriever. Для русскоязычного RAG сегодня полезнее брать стек, который сразу допускает:
Поэтому в качестве baseline здесь используется Python + Qdrant + multilingual embeddings + grounded answer policy.
На русском retrieval чаще ломается из-за сочетания факторов:
Из-за этого baseline “взяли любую embedding model и всё взлетело” работает хуже, чем хотелось бы.
Этот практикум сознательно строится не как full production system, а как strong baseline:
Этого уже достаточно, чтобы дальше добавлять:
Практически полезны два класса:
Подходят, если важны:
Подходят, если нужны:
Для русского особенно полезно смотреть на:
multilingual-e5;BGE-M3;Chroma остаётся нормальным учебным инструментом, но для практикума 2026 Qdrant удобнее как baseline, потому что:
То есть этот практикум не про “самую простую локальную игрушку”, а про правильный стартовый стек, который не придётся сразу выбрасывать.
Практические правила:
Для русских документов особенно важно, чтобы chunking был structure-aware, а не только символо-ориентированным.
Даже в простом прототипе полезно сразу иметь:
Это помогает не только поиску, но и future scaling:
Для русскоязычного практикума лучше сразу задать модели простое правило:
Это скучнее, чем “креативный помощник”, но намного полезнее для реального RAG.
from qdrant_client import QdrantClient, models
from openai import OpenAI
qdrant = QdrantClient(":memory:")
client = OpenAI()
qdrant.create_collection(
collection_name="docs",
vectors_config=models.VectorParams(size=1536, distance=models.Distance.COSINE),
)
texts = [
"Электронику можно вернуть в течение 7 дней с момента покупки.",
"Для возврата нужен чек или номер заказа.",
]
embeddings = client.embeddings.create(
model="text-embedding-3-small",
input=texts,
)
qdrant.upsert(
collection_name="docs",
points=[
models.PointStruct(
id=i,
vector=item.embedding,
payload={"text": text, "source": "returns.md", "lang": "ru"},
)
for i, (text, item) in enumerate(zip(texts, embeddings.data))
],
)
Это hosted embedding path, но retrieval surface остаётся в вашем контроле. Если нужен fully local route, embeddings можно заменить на open multilingual model.
После working baseline логичный порядок такой:
И только потом стоит думать про agentic upgrades.