Что такое RAG?
RAG (Retrieval-Augmented Generation) — техника, при которой LLM перед генерацией ответа сначала ищет релевантные фрагменты в базе знаний. Это позволяет модели отвечать точно на вопросы о ваших документах, не требуя дообучения.
Как работает RAG: 1) Документ разбивается на чанки → 2) Каждый чанк превращается в вектор → 3) Вектора хранятся в векторной БД → 4) При запросе находятся похожие чанки → 5) LLM генерирует ответ с контекстом.
Компоненты RAG-системы
- Загрузчики документов — PDF, DOCX, TXT, веб-страницы
- Text Splitter — разбивка на чанки (500-1000 токенов)
- Embedding модель — преобразование текста в векторы
- Векторная БД — Chroma, Qdrant, FAISS
- LLM — генерация ответа на основе найденного контекста
Установка зависимостей
pip install langchain langchain-ollama langchain-community
pip install chromadb pypdf sentence-transformersПолный пример RAG на Python
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_ollama import OllamaLLM
from langchain.chains import RetrievalQA
# Загрузка и разбивка документа
loader = PyPDFLoader("document.pdf")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# Создание векторной базы
embeddings = OllamaEmbeddings(model="nomic-embed-text")
db = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
# RAG-цепочка
llm = OllamaLLM(model="llama3.2")
qa = RetrievalQA.from_chain_type(llm=llm, retriever=db.as_retriever())
result = qa.invoke("Какова главная тема документа?")
print(result["result"])Embedding модели для Ollama
# Скачать специализированную модель для эмбеддингов
ollama pull nomic-embed-text
# Или английский вариант
ollama pull mxbai-embed-largeРазмер чанков: Слишком большие чанки (2000+ токенов) снижают точность поиска. Слишком маленькие (100 токенов) теряют контекст. Оптимально: 300-800 токенов с 10-15% перекрытием.