RAG или MCP: в чём разница и что выбрать для доступа модели к данным

RAG кладёт найденные куски в промпт, MCP даёт модели инструменты, которые она вызывает сама. Разбираем, чем они отличаются, сколько стоит каждый и как их сочетать.

6 мин · · сравнение · агенты

«RAG или MCP» звучит как выбор из двух конкурирующих технологий, но это сравнение разных уровней. RAG это схема: перед вопросом система сама находит нужные куски данных и кладёт их в запрос. MCP это протокол, по которому модели подключают инструменты: модель сама решает, какой инструмент вызвать и с какими аргументами. Ниже разбираем, чем отличаются эти подходы к доступу модели к данным, сколько стоит каждый и когда они работают вместе.

Что делает RAG

Retrieval-Augmented Generation устроен в три шага:

  1. Приложение получает вопрос пользователя.
  2. Приложение само ищет фрагменты в вашей базе (полнотекстовый или векторный поиск, подробнее в статье RAG-пайплайн на своих данных).
  3. Найденное кладётся в запрос, модель отвечает за один вызов.

Решение «что искать» принимает код приложения, а не модель. Вызов один, поведение предсказуемо.

Что делает MCP

MCP (Model Context Protocol) стандартизирует подключение внешних возможностей: сервер MCP предлагает набор инструментов (и другие сущности вроде ресурсов), а клиент, например Claude Code или ваше приложение, передаёт их описания модели. Модель в ходе диалога сама просит вызвать инструмент, клиент вызывает его и возвращает результат, модель продолжает. Это цикл из нескольких запросов. Общая картина в статье что такое MCP-сервер.

Важно, что MCP не является способом поиска. Это способ подключить функцию. Функция может искать в базе знаний, выполнять SQL, читать тикеты в трекере или создавать файл.

Главные отличия

КритерийRAGMCP
Кто решает, какие данные нужныкод приложениямодель
Число вызовов модели на вопросодиннесколько, цикл
Задержкаменьшебольше из-за шагов
Стоимость вопросапредсказуемазависит от числа шагов
Данныетекстовые куски из статичной базыживые системы, API, БД
Действия (записать, создать)нет, только чтениеда, если инструмент это позволяет
Контрольполныйзависит от формулировки инструментов
Источник для цитированияизвестенизвестен, если инструмент возвращает ссылки

Сколько стоит каждый вариант

Посчитаем один вопрос. Допущения: описания инструментов и системный промпт занимают 1 500 токенов, вопрос 500, результат каждого вызова инструмента 1 200 токенов, вызов инструмента с аргументами 150 выходных токенов, финальный ответ 500.

RAG. Один вызов: вход 3 000 токенов (пять фрагментов по 500 и вопрос 500), выход 500.

MCP, цикл из четырёх вызовов. История растёт: после каждого шага к ней добавляется вызов инструмента (150 токенов) и его результат (1 200).

ВызовВходВыход
12 000150
22 000 + 150 + 1 200 = 3 350150
33 350 + 1 350 = 4 700150
44 700 + 1 350 = 6 050500
Итого16 100950

Цены Zukko на 18 октября 2026 за 1M токенов, без кэша.

  • claude-sonnet-5-5 (вход 0.4, выход 2). RAG: 0,003 × 0,4 + 0,0005 × 2 = 0,0012 + 0,001 = $0.0022. MCP: 0,0161 × 0,4 + 0,00095 × 2 = 0,00644 + 0,0019 = $0.00834.
  • deepseek-v4.1-flash (вход 0.013, выход 0.038). RAG: 0,003 × 0,013 + 0,0005 × 0,038 = 0,000039 + 0,000019 = $0.000058. MCP: 0,0161 × 0,013 + 0,00095 × 0,038 = 0,000209 + 0,000036 = $0.000245.

На 10 000 вопросов в месяц с claude-sonnet-5-5: RAG 10 000 × 0,0022 = $22, MCP 10 000 × 0,00834 = $83.4. Цикл стоит дороже потому, что один и тот же префикс отправляется на каждом шаге заново. Для Claude в Anthropic-формате (/v1/messages) повторяющееся начало диалога читается из кэша по более низкой цене, и разрыв сокращается; в OpenAI-формате Claude идёт целиком по цене входа. Пошаговый расчёт с кэшем в статье о стоимости агента. Допущения условные: число шагов у MCP зависит от модели и инструментов, а описания 30 инструментов легко займут больше 1 500 токенов.

Один код для обоих подходов

Поисковую функцию можно написать один раз и использовать двояко. Вот заготовка для RAG:

bash
from openai import OpenAI

client = OpenAI(base_url="https://api.zukko.pro/v1", api_key="fetch_ваш_ключ")


def search_docs(query: str, k: int = 5) -> list[str]:
    ...  # ваш поиск: SQLite FTS5, pgvector, что угодно


def answer_with_rag(question: str) -> str:
    chunks = search_docs(question)
    context = "\n\n".join(chunks)
    resp = client.chat.completions.create(
        model="claude-sonnet-5-5",
        messages=[
            {"role": "system", "content": "Отвечай только по фрагментам. Если ответа нет, скажи об этом."},
            {"role": "user", "content": f"Фрагменты:\n{context}\n\nВопрос: {question}"},
        ],
    )
    return resp.choices[0].message.content

И та же функция как MCP-инструмент. Пример на официальном Python SDK для MCP (проверьте импорты и запуск по документации SDK вашей версии):

bash
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("docs")


@mcp.tool()
def search_docs(query: str) -> str:
    """Поиск по базе документов компании. Возвращает до 5 фрагментов."""
    return "\n\n".join(search_docs_impl(query))


if __name__ == "__main__":
    mcp.run()

Здесь search_docs_impl это ваша реализация поиска. Сервер подключается к Claude Code или другому клиенту с поддержкой MCP по инструкции этого клиента.

Если вы строите агента не через MCP, а напрямую через API, ту же функцию можно описать как инструмент в формате tool use: см. полный цикл вызова инструментов.

Когда что выбирать

RAG подходит, если:

  • данные это относительно стабильный набор документов: регламенты, справка, база знаний;
  • каждый вопрос требует одного поиска, а не цепочки действий;
  • важны предсказуемая цена и задержка;
  • нужно показать пользователю источник.

MCP подходит, если:

  • данные живые: заказы, тикеты, остатки, метрики, их нельзя заранее разрезать на фрагменты;
  • вопрос требует нескольких шагов: найти клиента, получить его заказы, посчитать сумму;
  • модели нужно что-то сделать, а не только прочитать: создать задачу, отправить запрос;
  • инструментов много, и заранее неизвестно, какой понадобится.

Сочетание. Часто работает такая схема: поиск по базе знаний оформлен как один MCP-инструмент, и модель вызывает его сама, когда считает нужным. Данные остаются в RAG, а MCP выступает способом подключения. Если ответ всегда нужен из базы знаний, надёжнее выполнять поиск в коде всегда, не оставляя это на усмотрение модели.

Подводные камни MCP

  • Описания инструментов расходуют контекст. Каждый подключённый сервер добавляет описания в каждый запрос; отключайте ненужные.
  • Доверие к результатам инструментов. Текст, который вернул инструмент (веб-страница, тикет, письмо), может содержать инструкции, написанные не вами. Не давайте агенту права, которые не готовы потерять, и ограничивайте действия записи.
  • Расход. Цикл без ограничения шагов может тратить много: поставьте на ключ дневной лимит в кабинете и ограничьте число шагов в коде.

Частые вопросы

RAG и MCP это одно и то же?

Нет. RAG это схема «найти и подставить в промпт», MCP это протокол подключения инструментов. Поиск для RAG можно предоставить через MCP, но можно обойтись без него.

Что дешевле?

Для одного вопроса обычно RAG: один вызов и небольшой вход. Цикл MCP отправляет историю на каждом шаге, поэтому стоит дороже, хотя кэш это смягчает. В расчёте выше $0.0022 против $0.00834 на claude-sonnet-5-5.

Можно ли заменить RAG на MCP?

Для живых данных да, для большой статичной базы знаний обычно нет: модель будет тратить шаги на поиск. Практичнее оставить поиск в коде или упаковать его в один инструмент.

Какие модели Zukko подходят для MCP?

Любые, которые поддерживают вызов инструментов в вашем клиенте. Проверьте выбранную модель на нескольких реальных вопросах: цена, контекст и индекс силы в каталоге помогают выбрать кандидатов, а проверка на своих задачах решает.

Чтобы попробовать, создайте ключ в кабинете Zukko и запустите пример с RAG; затем добавьте инструмент.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.