Сборка промпта: как вставить контекст

Найти мало — нужно правильно подать найденное модели. Разбираем анатомию RAG-промпта.

Augmentation (сборка промпта) — формирование финального запроса к LLM: системная инструкция + найденный контекст + вопрос пользователя.

Анатомия RAG-промпта

Хороший RAG-промпт состоит из трёх частей:

  1. Инструкция: «отвечай только по контексту, если ответа нет — скажи об этом».
  2. Контекст: вставленные top-k чанки (часто пронумерованные).
  3. Вопрос: исходный запрос пользователя.

Собираем промпт из чанков (запускаемый)

retrieved = [
    "Возврат товара возможен в течение 14 дней.",
    "Для возврата нужен чек и сохранённый товарный вид.",
]
question = "Сколько дней есть на возврат и что нужно?"

def build_prompt(question, chunks):
    context = "\n".join(f"[{i+1}] {c}" for i, c in enumerate(chunks))
    return (
        "Ответь на вопрос, опираясь ТОЛЬКО на контекст ниже.\n"
        "Если ответа в контексте нет — скажи 'Не нашёл в документах'.\n"
        "Указывай номера источников в квадратных скобках.\n\n"
        f"Контекст:\n{context}\n\n"
        f"Вопрос: {question}"
    )

print(build_prompt(question, retrieved))

Вывод:

Ответь на вопрос, опираясь ТОЛЬКО на контекст ниже.
Если ответа в контексте нет — скажи 'Не нашёл в документах'.
Указывай номера источников в квадратных скобках.

Контекст:
[1] Возврат товара возможен в течение 14 дней.
[2] Для возврата нужен чек и сохранённый товарный вид.

Вопрос: Сколько дней есть на возврат и что нужно?

Этот текст целиком уходит в LLM. Модель видит факты прямо перед собой и инструкцию опираться на них. Нумерация [1], [2] позволит модели сослаться на источник в ответе.

Почему инструкция так важна

Без явного указания «только по контексту» модель смешает поданные факты со своими «воспоминаниями» и снова может соврать. Фраза про «скажи, если не нашёл» — главный предохранитель от галлюцинаций: она разрешает модели честно признать незнание вместо выдумки.

Следите за бюджетом контекста

Контекстное окно конечно. Если top-k чанков не влезают, их обрезают или уменьшают k. Поэтому чанки делают компактными, а в промпт кладут только реально релевантное — иначе важное вытеснится или вырастет цена.

Итог

  • RAG-промпт = инструкция + контекст (top-k чанки) + вопрос.
  • Инструкция «только по контексту, иначе скажи 'не знаю'» гасит галлюцинации.
  • Нумерация чанков включает цитирование источников.
Проверьте себя
1. Из каких трёх частей обычно состоит RAG-промпт?
AЛогин, пароль, токен
BИнструкция + найденный контекст + вопрос пользователя
CМодель, температура, seed
DЗаголовок, тело, подвал
2. Зачем в промпт добавляют фразу «если ответа в контексте нет — скажи об этом»?
AДля красоты
BЧтобы разрешить модели признать незнание вместо галлюцинации
CЧтобы ускорить ответ
DЧтобы увеличить k
3. Зачем нумеровать чанки в контексте ([1], [2], ...)?
AЧтобы занять место
BЧтобы модель могла сослаться на конкретный источник в ответе
CЧтобы ускорить эмбеддинг
DЭто обязательное требование Python
Поддержать проект