RAG без лишней сложности: как подключить документацию к LLM
Практический гайд по RAG: как подготовить документацию, создать эмбеддинги, находить релевантный контекст и контролировать расходы на генерацию через API Протока.
Большая языковая модель умеет объяснять сложные темы, писать код и работать с текстом, но сама по себе не знает внутренние правила компании, актуальную документацию и содержимое закрытой базы знаний. RAG (Retrieval-Augmented Generation) решает эту задачу без обучения модели на каждом обновлении данных: перед генерацией ответа система находит релевантные фрагменты документов и передаёт их модели как контекст.
В результате модель отвечает не только на основе общих знаний, но и с учётом ваших инструкций, регламентов, описаний API и внутренних материалов.
Как устроен RAG
Типичный RAG-конвейер состоит из пяти этапов:
- документы загружаются и очищаются;
- текст разбивается на фрагменты;
- для каждого фрагмента создаётся эмбеддинг — числовое представление смысла;
- эмбеддинги сохраняются в векторное хранилище;
- при вопросе пользователя система находит близкие фрагменты и добавляет их в запрос к 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, а примеры интеграции доступны в документации Протока.