Окружение
# .env
GEMINI_API_KEY=ваш_ключ_из_Google_AI_Studio
| Пакет | Зачем нужен |
|---|---|
langchain | LCEL, промпты, runnable-цепочки, общая оркестрация. |
langchain-community | Интеграция FAISS и часть загрузчиков. |
langchain-google-genai | Gemini chat model и Google embeddings. |
langchain-text-splitters | RecursiveCharacterTextSplitter и другие 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, индексации и поиска, но требуют сверки лимитов, стоимости, форматов файлов и политики хранения данных.