Генерация ответа и цитирование источников

Финал пайплайна: превращаем контекст в ответ, которому можно верить и который можно проверить.

Grounded generation (ответ с опорой) — генерация, в которой модель обязана опираться на поданный контекст и указывать, откуда взят каждый факт.

Что делает LLM на этом шаге

Модель получает собранный промпт (инструкция + контекст + вопрос) и пишет ответ. Если промпт составлен правильно, модель пересказывает факты из контекста, а не из памяти, и добавляет ссылки на источники.

Реальный вызов (для чтения)

from openai import OpenAI
client = OpenAI()

resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "Отвечай только по контексту, цитируй [номер]."},
        {"role": "user", "content": rag_prompt},  # промпт из прошлого урока
    ],
)
print(resp.choices[0].message.content)

Как работает цитирование

Если чанки в контексте пронумерованы, а инструкция требует ссылаться на номера, модель вставляет их прямо в ответ. Дальше приложение сопоставляет номер с метаданными чанка (файл, страница, URL) и показывает пользователю кликабельный источник.

Смоделируем «генерацию с цитатами» шаблоном, чтобы увидеть формат на выходе.

context = {
    1: ("Возврат возможен в течение 14 дней.", "policy.pdf, стр. 4"),
    2: ("Нужен чек и товарный вид.",            "policy.pdf, стр. 5"),
}

def render_answer(used_ids):
    body = " ".join(context[i][0] for i in used_ids)
    cites = "; ".join(f"[{i}] {context[i][1]}" for i in used_ids)
    return f"Ответ: {body}\nИсточники: {cites}"

print(render_answer([1, 2]))

Вывод:

Ответ: Возврат возможен в течение 14 дней. Нужен чек и товарный вид.
Источники: [1] policy.pdf, стр. 4; [2] policy.pdf, стр. 5

Пользователь видит не только ответ, но и откуда он. Это и есть главное преимущество RAG над «голой» LLM: ответ проверяем. Можно открыть источник и убедиться.

Что делать, если контекст не отвечает

Хорошая система при пустом или нерелевантном контексте говорит «не нашёл в документах», а не выдумывает. Это поведение задаётся инструкцией в промпте и проверяется на этапе оценки (следующий раздел).

Цитирование повышает доверие

  • Пользователь может перепроверить факт по источнику.
  • Видно, на чём основан ответ, — меньше «магии».
  • Легче ловить и чинить ошибки извлечения.

Итог

  • LLM пишет ответ по контексту и ссылается на пронумерованные источники.
  • Номера сопоставляются с метаданными → кликабельная цитата.
  • Цитирование делает ответ проверяемым — ключевое отличие RAG.
Проверьте себя
1. Что означает «ответ с опорой на контекст» (grounded answer)?
AОтвет из памяти модели
BОтвет, основанный на поданном контексте с указанием источников
CСамый длинный возможный ответ
DОтвет без единого факта
2. Как технически реализуется кликабельная цитата источника?
AМодель сама знает URL
BНомер чанка из ответа сопоставляется с его метаданными (файл, страница)
CЧерез дообучение
DИсточники придумывает LLM
3. Главное преимущество цитирования в RAG?
AОтветы становятся короче
BОтвет становится проверяемым — источник можно открыть и сверить
CСнижается размерность
DУскоряется индексация
Поддержать проект