← Назад к вопросам

Что такое Retrieval Augmented Generation?

1.0 Junior🔥 111 комментариев
#Опыт и soft skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Retrieval Augmented Generation (RAG)

RAG — техника, где LLM (Large Language Model) использует внешние данные для генерации более точных ответов. Это решает проблему "галлюцинаций" (выдумывания информации) в больших языковых моделях.

Проблема, которую решает RAG

Без RAG:

# Спрашиваем LLM (GPT-4, Claude)
question = "Какой доход компании X в Q4 2025?"

# LLM отвечает на основе своих весов (данные до Feb 2025)
response = llm.generate(question)
# Результат может быть неточным или вымышленным
# "Компания X имела доход $500M в Q4 2025" (вымышлено!)

С RAG:

question = "Какой доход компании X в Q4 2025?"

# Шаг 1: Найти релевантные документы
documents = vector_store.search(question, top_k=3)
# [Квартальный отчёт X за Q4 2025, пресс-релиз, финансовый обзор]

# Шаг 2: Передать контекст LLM
context = "\n".join([doc.text for doc in documents])
prompt = f"На основе этого контекста, ответь на вопрос:\n{context}\n\nВопрос: {question}"

response = llm.generate(prompt)
# "По квартальному отчёту, доход компании X в Q4 2025 составил $512M"
# Точный ответ на основе реальных данных

Как работает RAG (архитектура)

Компоненты RAG:

┌─────────────────────────────────────┐
│ 1. Подготовка документов            │
│ - Загрузка данных (PDF, DB, API)   │
│ - Разбиение на chunks              │
│ - Создание embeddings              │
└─────────────────────────────────────┘
           ↓
┌─────────────────────────────────────┐
│ 2. Vector Store (хранилище)         │
│ - Pinecone, Weaviate, Milvus       │
│ - Или локально: FAISS              │
└─────────────────────────────────────┘
           ↓
┌─────────────────────────────────────┐
│ 3. Поиск релевантных документов    │
│ - Embedding пользовательского вопроса
│ - Similarity search в Vector Store │
└─────────────────────────────────────┘
           ↓
┌─────────────────────────────────────┐
│ 4. LLM с контекстом                │
│ - Передача найденных документов     │
│ - Генерация ответа                  │
└─────────────────────────────────────┘

Реализация RAG для Data Engineer

Шаг 1: Подготовка документов

from langchain.document_loaders import PDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

# Загрузить документы
loader = PDFLoader("financial_reports.pdf")
documents = loader.load()

# Разбить на chunks (важно для контекста LLM)
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # Размер куска
    chunk_overlap=200  # Перекрытие между кусками
)
chunks = splitter.split_documents(documents)

# Создать embeddings (векторные представления)
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_documents(chunks, embeddings)
vector_store.save_local("financial_reports_db")

Шаг 2: Поиск и генерация

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser

# Загрузить Vector Store
vector_store = FAISS.load_local("financial_reports_db", embeddings)
retriever = vector_store.as_retriever(search_kwargs={"k": 3})  # Top 3 документа

# Создать RAG pipeline
template = """На основе этого контекста, ответь на вопрос.

Контекст:
{context}

Вопрос: {question}

Ответ:"""

prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(model="gpt-4", temperature=0)

rag_chain = (
    {"context": retriever | (lambda docs: "\n".join([d.page_content for d in docs])), 
     "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

# Запрос
result = rag_chain.invoke("Какой доход в Q4 2025?")
print(result)

RAG для Data Engineer задач

1. Документирование данных

# RAG помогает найти информацию о схеме БД
user_query = "Как рассчитывается метрика MAU?"

# RAG поиск в документации:
# - wiki страницы про метрики
# - SQL код витрин
# - Комментарии в коде
# - Jira тикеты

relevant_docs = retriever.get_relevant_documents(user_query)
# [Документ о методологии MAU, SQL запрос витрины, техдок]

2. Поиск по метаданным схемы

# Вопрос: "Какие таблицы содержат информацию о платежах?"

documents = [
    {"content": "fact_payment table contains transaction data", "source": "schema.md"},
    {"content": "dim_payment_method describes payment types", "source": "schema.md"},
    {"content": "fact_subscription has renewal payments", "source": "schema.md"},
]

vector_store = FAISS.from_texts([d["content"] for d in documents], embeddings)
results = vector_store.similarity_search("payment tables", k=2)
# fact_payment, fact_subscription

3. Анализ логов и ошибок

# RAG для поиска решения проблемы в логах
error = "ETL failed: connection timeout after 30s"

# Поиск в базе логов прошлых ошибок и решений
similar_errors = retriever.get_relevant_documents(error)
# [Решение #123 от 2025-03-15, Similar error #456, Runbook]

response = llm.generate(
    f"Error: {error}\n\nSimilar cases: {similar_errors}\n\nProposed solution:"
)

Улучшения RAG

Hybrid Search — комбинация semantic (embeddings) и keyword (BM25) поиска:

from langchain.retrievers import BM25Retriever, EnsembleRetriever

bm25_retriever = BM25Retriever.from_documents(documents)
semantic_retriever = vector_store.as_retriever()

ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, semantic_retriever],
    weights=[0.5, 0.5]  # 50/50 вес
)

results = ensemble_retriever.get_relevant_documents(question)

Re-ranking — улучшение качества найденных документов:

from langchain.retrievers.multi_query import MultiQueryRetriever

# LLM генерирует несколько вариантов вопроса
multi_query_retriever = MultiQueryRetriever.from_llm(
    retriever=vector_store.as_retriever(),
    llm=model
)

# Ищет по всем вариантам и комбинирует результаты
results = multi_query_retriever.get_relevant_documents(question)

Когда RAG полезен для Data Engineer

Хорошо подходит:

  • Поиск информации в документации и wiki
  • Анализ логов и багов
  • Ответы на вопросы о схеме БД
  • Объяснение метрик и KPI
  • Генерация SQL запросов на основе примеров

Не подходит:

  • Реальная обработка больших данных (Spark/SQL быстрее)
  • Точные вычисления (используй SQL)
  • Сложная логика преобразований (код + unit тесты)

Инструменты для RAG

  • LangChain — фреймворк для построения RAG приложений
  • LlamaIndex — специализирован на работе с документами
  • Pinecone — managed Vector Database
  • Weaviate — open-source Vector DB
  • FAISS — локальное хранилище векторов (от Meta)

Итог

RAG — это способ улучшить ответы LLM, предоставляя ему свежие и релевантные данные из внешних источников. Для Data Engineer это особенно полезно для:**

  • Быстрого поиска информации в документации
  • Генерации SQL запросов на основе примеров
  • Анализа и объяснения проблем в логах
  • Создания chatbot'ов для данных и аналитики