ПРОТОК

RAG без лишней сложности: как подключить документацию к LLM

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

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

В результате модель отвечает не только на основе общих знаний, но и с учётом ваших инструкций, регламентов, описаний API и внутренних материалов.

Как устроен RAG

Типичный RAG-конвейер состоит из пяти этапов:

  1. документы загружаются и очищаются;
  2. текст разбивается на фрагменты;
  3. для каждого фрагмента создаётся эмбеддинг — числовое представление смысла;
  4. эмбеддинги сохраняются в векторное хранилище;
  5. при вопросе пользователя система находит близкие фрагменты и добавляет их в запрос к LLM.

Упрощённая схема выглядит так:

Вопрос пользователя
        ↓
Эмбеддинг вопроса
        ↓
Поиск похожих фрагментов
        ↓
Контекст + вопрос
        ↓
Ответ языковой модели

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

Шаг 1. Подготовьте документы

Качество ответа начинается не с выбора модели, а с качества исходных данных. Перед индексацией стоит:

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

Если в базе есть несколько редакций одного регламента, система поиска может вернуть устаревший фрагмент. Метаданные позволяют фильтровать результаты, например искать только документы текущей версии или материалы конкретного подразделения.

Не стоит складывать в один индекс всё подряд. Техническая документация, инструкции для сотрудников и коммерческие материалы могут требовать разных фильтров и разных правил доступа.

Шаг 2. Разбейте текст на фрагменты

Модели работают с ограниченным контекстом, а поиск по слишком крупным блокам даёт неточные результаты. Поэтому документы делят на чанки — фрагменты, которые можно независимо передать модели.

Практические правила:

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

Слишком маленькие фрагменты теряют контекст. Слишком большие усложняют поиск и увеличивают расходы на каждый запрос. Оптимальный размер зависит от структуры документов, поэтому его лучше проверять на наборе реальных вопросов.

Шаг 3. Создайте эмбеддинги

Эмбеддинг превращает текст в вектор. Близкие по смыслу фрагменты получают близкие векторные представления, даже если в вопросе и документе используются разные формулировки.

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

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

На практике полезно сочетать семантический поиск с обычным поиском по ключевым словам. Это особенно важно для артикулов, названий методов API, кодов ошибок и точных терминов.

Шаг 4. Найдите контекст для вопроса

Когда пользователь задаёт вопрос, приложение создаёт эмбеддинг запроса и ищет ближайшие фрагменты. Затем результаты можно:

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

Не следует автоматически добавлять в контекст всё найденное. Лишние фрагменты увеличивают стоимость и могут запутать модель. Лучше передавать несколько наиболее релевантных частей и явно указывать их границы.

Полезный шаблон инструкции для генерации:

Отвечай только на основе контекста ниже.
Если в контексте нет ответа, скажи, что данных недостаточно.
Не придумывай номера документов, даты и параметры API.

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

Вопрос пользователя:
{{question}}

Такой подход не гарантирует абсолютную точность, но снижает риск уверенных ответов без подтверждения в базе знаний.

Шаг 5. Выберите модель для генерации

Модель стоит выбирать по сложности задачи, требованиям к скорости и бюджету. На Протоке можно разделить нагрузку между несколькими моделями.

Для сложных ответов по большим техническим документам подойдут Claude Opus 4.8 и Claude Opus 5: на дату публикации вход стоит 81,58 ₽ за 1M токенов, выход — 407,87 ₽. Claude Sonnet 5 на дату публикации стоит 48,95 ₽ за 1M входных токенов и 244,72 ₽ за 1M выходных токенов.

Для большинства прикладных RAG-сценариев можно начать с GLM-5.3: на дату публикации вход — 20,47 ₽, выход — 64,34 ₽ за 1M токенов. Если важна экономичность, GLM-5.3 Flash стоит 10,94 ₽ за 1M входных и 36,47 ₽ за 1M выходных токенов на дату публикации.

Для простых вопросов по инструкциям также можно протестировать GPT-5.6 Terra — 8,42 ₽ за 1M входных и 50,49 ₽ за 1M выходных токенов на дату публикации. GPT-5.6 Luna стоит 3,27 ₽ и 19,58 ₽ соответственно. Самый экономичный вариант в текущих котировках — GLM-5.2: 3,00 ₽ за 1M входных и 10,51 ₽ за 1M выходных токенов на дату публикации.

Цены указаны отдельно для входных и выходных токенов. В RAG вход обычно включает вопрос и найденный контекст, поэтому уменьшение лишних фрагментов напрямую влияет на расходы.

Пример запроса через API Протока

Проток совместим с OpenAI SDK: для подключения достаточно указать ключ и адрес API. В параметре model используется slug модели из котировок, а не её отображаемое название.

from openai import OpenAI

client = OpenAI(
    api_key="sk-dc-ВАШ_КЛЮЧ",
    base_url="https://dualchat.pro/v1"
)

context = """
Раздел: Авторизация API
Для обновления токена отправьте POST-запрос на /v1/auth/refresh.
Токен действует 30 минут.
"""

question = "Как обновить токен API?"

response = client.chat.completions.create(
    model="glm-5.3-flash",
    messages=[
        {
            "role": "system",
            "content": (
                "Отвечай только на основе переданного контекста. "
                "Если ответа нет, сообщи об отсутствии данных."
            )
        },
        {
            "role": "user",
            "content": f"Контекст:\n{context}\n\nВопрос: {question}"
        }
    ],
    temperature=0.1
)

print(response.choices[0].message.content)

Сам поиск по векторному хранилищу в этом примере заменён заранее подготовленным контекстом. В рабочем приложении на его место подставляется результат поиска по эмбеддингу вопроса.

Как контролировать качество и расходы

Перед запуском соберите тестовый набор из реальных вопросов и эталонных ответов. Проверяйте отдельно:

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

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

Проток поддерживает стриминг и кэширование промптов, а списание выполняется по факту за каждый запрос. Пополнить баланс можно картой онлайн, по счёту для организации или через СБП. Ключи вида sk-dc-… создаются в кабинете в разделе «Ключи».

Вывод

RAG — это не отдельное обучение модели, а управляемый конвейер: качественные документы, аккуратное разбиение, эмбеддинги, релевантный поиск и генерация ответа на основе найденного контекста. Такой подход позволяет быстро подключить внутреннюю базу знаний и обновлять её без переобучения модели.

Начните с нескольких десятков документов и набора реальных вопросов, сравните качество и стоимость разных моделей, затем расширяйте индекс. Посмотреть актуальные котировки и подключить API можно на dualchat.pro, а примеры интеграции доступны в документации Протока.

← все материалы