# Компромисс качества и задержки в RAG
**Автор:** Salimov Shaliko Kamalovich, группа R4210
**Генератор:** Sphinx 8 + MyST
Retrieval-Augmented Generation (RAG) дополняет языковую модель найденными
фрагментами внешней базы знаний {cite:p}`lewis2020rag`. На этой странице
проверяется, как число переданных фрагментов $k$ связано с полнотой контекста,
фактической верностью ответа и задержкой.
```{raw} html
Важно: это детерминированная
синтетическая демонстрация структуры эксперимента, а не результат тестирования
конкретной LLM или поискового индекса.
```
(sec-method)=
## Методика
Для каждого $k \in \{1,2,4,6,8,10,12\}$ моделируются восемь повторов. Полнота
контекста растёт с увеличением $k$, тогда как лишний контекст постепенно снижает
фактическую верность и увеличивает задержку. Такое поведение согласуется с
наблюдением, что модель использует длинный контекст неравномерно
{cite:p}`liu2024lost`.
Интегральная полезность определяется уравнением {eq}`eq-rag-score`:
```{math}
:label: eq-rag-score
S(k) = 0.50R(k) + 0.35F(k) - 0.15\frac{L(k)}{\max_j L(j)},
```
где $R$ — полнота контекста, $F$ — фактическая верность, а $L$ — задержка.
Веса заданы заранее и не подбирались под результат.[^weights]
::::{grid} 1 1 2 2
:::{grid-item}
### Устройство конвейера
Запрос преобразуется в top-$k$ фрагментов, которые образуют контекст для LLM.
Параметр $k$ одновременно управляет объёмом доступных сведений и количеством
шума. Дальнейшие результаты интерпретируются по правилам из раздела
{ref}`sec-results`.
:::
:::{grid-item}
```{image} _static/rag_pipeline.svg
:alt: Схема RAG-конвейера
:width: 100%
```
:::
::::
(sec-results)=
## Результаты
```{raw} html
Таблица 1. Средние показатели синтетического RAG-эксперимента
| Режим | k | Полнота | Верность | Задержка, с | S(k) |
| Малый контекст | 1 | 0,566 | 0,888 | 0,525 | 0,556 |
| 2 | 0,656 | 0,874 | 0,622 | 0,588 |
| Сбалансированный | 4 | 0,757 | 0,841 | 0,867 | 0,610 |
| 6 | 0,812 | 0,814 | 1,113 | 0,610 |
| Большой контекст | 8 | 0,842 | 0,790 | 1,408 | 0,595 |
| 10 | 0,862 | 0,732 | 1,714 | 0,563 |
| 12 | 0,874 | 0,679 | 2,065 | 0,525 |
```
Максимум по неокруглённым данным достигается при **$k=6$**. После этой точки
небольшой прирост полноты не компенсирует снижение верности и рост задержки.
```{figure} _static/rag_quality_static.png
:name: fig-rag-quality
:alt: Статический график качества и задержки RAG
:width: 100%
Статический график Matplotlib. Качество насыщается, а задержка продолжает расти.
```
На {numref}`fig-rag-quality` виден общий тренд. Интерактивная версия ниже позволяет
сопоставить точные значения наведением курсора.
```{raw} html
```
## Воспроизводимый расчёт
```{code-block} python
:linenos:
:caption: Расчёт интегральной полезности для одной строки
def rag_utility(recall: float, faithfulness: float,
latency: float, max_latency: float) -> float:
"""Combine quality gains with a normalized latency penalty."""
return (
0.50 * recall
+ 0.35 * faithfulness
- 0.15 * latency / max_latency
)
```
Полный генератор данных использует фиксированное зерно `4210`, сохраняет исходные
повторы и агрегаты в CSV и создаёт оба графика из одной таблицы. Поэтому отличие
двух страниц определяется генератором сайта, а не данными.
## Вывод
Для заданной модели полезности разумный компромисс достигается при $k=6$.
Увеличивать контекст автоматически невыгодно: полнота продолжает расти, но ответ
становится медленнее и менее устойчив к нерелевантным фрагментам. Это вывод только
о синтетическом сценарии; для практической RAG-системы функции из раздела
{ref}`sec-method` нужно заменить измерениями на фиксированном датасете.
[^weights]: Другие веса отражают другую прикладную задачу и могут изменить оптимальное значение $k$.
## Литература
```{bibliography}
```