🔖 Справочник: RAG-компоненты и команды

← К оглавлению урока

⚡ Минимум для старта

# Windows PowerShell
python -m venv venv
venv\Scripts\Activate.ps1
pip install -U langchain langchain-community langchain-google-genai
pip install -U langchain-text-splitters faiss-cpu python-dotenv

Окружение

# .env
GEMINI_API_KEY=ваш_ключ_из_Google_AI_Studio
ПакетЗачем нужен
langchainLCEL, промпты, runnable-цепочки, общая оркестрация.
langchain-communityИнтеграция FAISS и часть загрузчиков.
langchain-google-genaiGemini chat model и Google embeddings.
langchain-text-splittersRecursiveCharacterTextSplitter и другие splitters.
faiss-cpuЛокальный vector store для учебного RAG.
python-dotenvЗагрузка ключа из .env.

Документы и чанки

# chunking.py
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter

docs = [
    Document(page_content="Длинный текст документа...", metadata={"source": "doc-1"}),
]

splitter = RecursiveCharacterTextSplitter(
    chunk_size=800,
    chunk_overlap=120,
    add_start_index=True,
)
chunks = splitter.split_documents(docs)
print(len(chunks), chunks[0].metadata)
⚠️ chunk_size и chunk_overlap не универсальны. Для учебных текстов можно начать с 600-1000 символов и overlap 80-200, затем измерять качество retrieval.

Эмбеддинги Gemini

# embeddings.py
import os
from dotenv import load_dotenv
from langchain_google_genai import GoogleGenerativeAIEmbeddings

load_dotenv()
embeddings = GoogleGenerativeAIEmbeddings(
    model="models/gemini-embedding-001",
    google_api_key=os.getenv("GEMINI_API_KEY"),
)

vector = embeddings.embed_query("Что такое RAG?")
print(len(vector))
⚠️ В старых материалах встречается text-embedding-004. По release notes Gemini API эта модель выключена 14 января 2026 года. Для text-only сценариев используйте актуальную модель из документации; в LangChain-примерах это models/gemini-embedding-001.

FAISS vector store

# vector_store.py
from langchain_community.vectorstores import FAISS

vector_store = FAISS.from_documents(chunks, embeddings)

question = "Где применяются трансформеры?"
found = vector_store.similarity_search(question, k=3)

for doc in found:
    print(doc.metadata)
    print(doc.page_content[:120])

LCEL-цепочка генерации

# chain.py
import os
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_google_genai import ChatGoogleGenerativeAI

load_dotenv()
llm = ChatGoogleGenerativeAI(
    model="gemini-3.5-flash",
    google_api_key=os.getenv("GEMINI_API_KEY"),
    temperature=0,
)

prompt = ChatPromptTemplate.from_messages([
    ("system", '''Ты отвечаешь только по контексту.
Если ответа нет в контексте, скажи: "В контексте нет информации".
Контекст:
<context>
{context}
</context>'''),
    ("human", "{question}"),
])

chain = prompt | llm | StrOutputParser()

Managed retrieval как альтернатива

Для production можно строить RAG вручную, как в этом уроке, или использовать managed-инструменты: например, OpenAI Vector Stores/File Search или Gemini File Search. Они берут на себя часть загрузки, chunking, индексации и поиска, но требуют сверки лимитов, стоимости, форматов файлов и политики хранения данных.