Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Введение в RAG
intro_rag

Введение в RAG

Что такое RAG, зачем он нужен и как работает архитектура retrieval-augmented generation

Введение в RAG

Retrieval-Augmented Generation — мост между вашими данными и мощью больших языковых моделей.

#Что такое RAG и зачем он нужен

Представьте, что вы хотите создать чат-бота для компании. Бот должен отвечать на вопросы сотрудников о внутренних процессах, политиках и документах. Вы не можете просто использовать ChatGPT — он не знает ваших внутренних документов. Вы можете «скормить» все документы модели напрямую? Теоретически да, но у LLM есть ограничение на длину контекста (context window), да и знания модели застывают на момент обучения.

RAG (Retrieval-Augmented Generation) решает эту проблему элегантно. Вместо того чтобы загружать все документы в модель, система сначала находит релевантные фрагменты для конкретного вопроса, а затем генерирует ответ на основе найденного.

Проще говоря: RAG = Поиск + Генерация.

#Архитектура RAG-системы

RAG-систа состоит из двух основных пайплайнов:

#1. Indexing Pipeline (Индексация)

Прежде чем система сможет отвечать на вопросы, нужно подготовить документы:

# Упрощённая схема индексации документ → разбиваем на чанки → создаём embeddings → сохраняем в векторную БД

Каждый шаг важен:

  • Загрузка документов: чтение PDF, DOCX, TXT, HTML и других форматов
  • Chunking (разделение): разбиваем длинные документы на небольшие фрагменты (обычно 200–1000 слов). Если сунуть весь документ целиком, контекстное окно LLM переполнится, а поиск будет неточным
  • Embedding (векторизация): каждый чанк превращается в вектор чисел с помощью embedding-модели. Вектор — это компактное числовое представление смысла текста
  • Сохранение: векторы сохраняются в векторную базу данных (Chroma, FAISS, Qdrant и др.)

#2. Retrieval + Generation Pipeline (Поиск и генерация)

Когда пользователь задаёт вопрос:

# Упрощённая схема генерации ответа вопрос пользователя → embedding вопроса → поиск похожих чанков → промпт с чанками → LLM → ответ

Пошагово:

  1. Embedding вопроса: вопрос пользователя превращается в вектор той же моделью, что использовалась при индексации
  2. Retrieval (поиск): в векторной базе находятся ближайшие (похожие по смыслу) чанки к вектору вопроса
  3. Контекст: найденные чанки собираются вместе
  4. Промпт: формируется запрос к LLM вида «Ответь на вопрос, используя следующий контекст: [чанки]. Вопрос: [вопрос]»
  5. Генерация: LLM создаёт ответ, опираясь на предоставленный контекст

#Почему RAG лучше альтернатив

Существует три основных подхода к работе с собственными данными через LLM:

#Fine-tuning (дообучение модели)

Вы берёте базовую модель (например, GPT) и дообучаете её на своих данных. Проблемы:

  • Дорого и долго — нужны GPU и подготовленный датасет
  • Знания застывают — при обновлении документов нужно переобучать
  • Модель может «галлюцинировать» — выдумывать факты

#Контекстное окно (всё в промпт)

Вы просто вставляете все документы в промпт. Проблемы:

  • Ограничение context window — даже у GPT-4 предел ~128 000 токенов
  • Дороговизна — каждый запрос обрабатывает тонну текста
  • Шум — лишняя информация ухудшает качество ответов

#RAG (наш выбор)

Преимущества:

  • Актуальность: обновите документы — система сразу работает с новыми данными
  • Экономичность: в промпт попадают только релевантные фрагменты
  • Точность: LLM отвечает на основе конкретных документов, а не общих знаний
  • Прозрачность: вы всегда знаете, на каких документах основан ответ (цитирование источников)
  • Масштабируемость: векторная БД эффективно работает с миллионами документов

#Типичные сценарии применения RAG

#Корпоративные чат-боты

Сотрудник спрашивает: «Как оформить отпуск?» — бот находит соответствующий раздел HR-политики и формирует ответ со ссылкой на документ.

#Техническая поддержка

Клиент описывает проблему — система находит релевантные статьи из базы знаний и инструкций.

#Юридические консультации

Юрист задаёт вопрос о конкретном законе — система находит соответствующие статьи судебной практики и нормативных актов.

#Медицинские справочные системы

Врач ищет информацию о взаимодействии лекарств — система находит данные из медицинской базы и формулирует ответ.

#Исследования и аналитика

Аналитик работает с набором отчётов — RAG-система помогает быстро находить нужную информацию в массиве документов.

#Компоненты RAG-системы: обзор библиотек

Для построения RAG на Python мы будем использовать:

КомпонентБиблиотеки
Embeddingssentence-transformers, OpenAI API, Cohere API
Vector DBchromadb, faiss, qdrant-client
Document loadingpypdf, python-docx, beautifulsoup4
LLMopenai, anthropic, Ollama, OpenRouter
ChunkingКастомная логика на Python

В следующих темах мы подробно разберём каждый компонент и напишем работающий код.

#Простой пример RAG на Python

Вот минимальный пример того, как может выглядеть RAG-система с использованием chromadb и sentence-transformers:

import chromadb from chromadb.utils import embedding_functions # 1. Создаём embedding-функцию embedder = embedding_functions.SentenceTransformerEmbeddingFunction( model_name="all-MiniLM-L6-v2" ) # 2. Создаём клиент Chroma и коллекцию client = chromadb.PersistentClient(path="./my_rag_db") collection = client.get_or_create_collection( name="documents", embedding_function=embedder ) # 3. Индексация документов documents = [ "Отпуск оформляется через портал HR. Заявление подаётся за 2 недели.", "Больничный лист нужно отправить в бухгалтерию в течение 3 дней.", "Удалённая работа разрешена до 3 дней в неделю по согласованию." ] collection.add( documents=documents, ids=["doc_1", "doc_2", "doc_3"] ) # 4. Поиск релевантных документов results = collection.query( query_texts=["Как подать заявление на отпуск?"], n_results=2 ) print("Найденные документы:", results["documents"])

Этот код индексирует три коротких текста и находит наиболее релевантный для запроса. В следующих темах мы добавим загрузку реальных документов, продвинутый chunking и генерацию ответов через LLM.

#Проблемы и ограничения RAG

RAG — не серебряная пуля. Вот типичные проблемы:

  • Качество chunking: если чанки слишком короткие, теряется контекст. Если слишком длинные — поиск становится неточным
  • Семантический разрыв: embedding-модель может не уловить тонкие различия между похожими документами
  • Галлюцинации LLM: даже с контекстом модель может выдать информацию, которой нет в документах
  • Мультихоп-вопросы: вопросы, требующие информации из нескольких разных документов, обрабатываются плохо

Эти проблемы мы разберём в продвинутых темах курса и научимся их решать.

Далее: Векторные представления текста