Полный поток RAG

Чему научитесь

Видео 8:00 и текст урока

К концу урока вы сможете:

Видео и текст урока.

Смотреть урок на Skilljar The full RAG flow · 8:00

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

Шаг 1. Разбиваем исходный текст

Сначала берём исходный документ и делим его на удобные фрагменты. В примере — два простых раздела:

Шаг 2. Генерируем эмбеддинги

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

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

В нашей воображаемой модели:

Для медицинского раздела получится, скажем, [0.97, 0.34] — в основном о медицине, но с долей программного из-за слова «bug». Для раздела о разработке — [0.30, 0.97]: в основном о ПО, но с медицинским оттенком из-за «infection vectors».

Нормализация

API эмбеддингов обычно выполняет нормализацию: масштабирует каждый вектор так, чтобы его длина была 1.0. Вникать в математику не нужно — это делается автоматически. Получаем нормализованные векторы вроде [0.944, 0.331] и [0.295, 0.955].

Единичная окружность: Medical Research направлен к медицине, Software Engineering — к ПО, каждая стрелка длиной 1.0.
Единичная окружность: стрелка Medical Research направлена к «медицине», Software Engineering — к «ПО»; длина каждой — 1.0.

Эти эмбеддинги можно изобразить на единичной окружности: каждая точка — один фрагмент текста.

Эмбеддинги 0.944, 0.331 и 0.295, 0.955 поступают в векторную базу данных.
Эмбеддинги [0.944, 0.331] и [0.295, 0.955] отправляются в векторную базу данных.

Шаг 3. Сохраняем в векторной базе данных

Сохраняем эмбеддинги в векторной базе данных — специализированной базе, оптимизированной для хранения, сравнения и поиска по длинным спискам чисел вроде наших эмбеддингов.

Воображаемая модель эмбеддит вопрос пользователя как 0.1, 0.89 — немного о медицине, но в основном о ПО.
Вопрос пользователя в той же модели: [0.1, 0.89] — немного о медицине, в основном о ПО.

На этом пауза. Всё, что сделано до сих пор, — предобработка, которая выполняется заранее. Теперь ждём, пока пользователь задаст вопрос.

Шаг 4. Обрабатываем вопрос пользователя

Когда пользователь спрашивает, например, «I'm curious about the company. In particular, what did the software engineering dept do this year?», мы пропускаем вопрос через ту же модель эмбеддингов.

Этап эмбеддинга вопроса и поиска ближайших эмбеддингов; Company слегка относится к медицине, но вопрос о ПО.
Эмбеддинг вопроса и поиск ближайших: «Company» слегка тянет к медицине, но вопрос — о разработке.

Вопрос превращается во что-то вроде [0.1, 0.89] — мало медицины, много разработки ПО. После нормализации — [0.112, 0.993].

Шаг 5. Ищем похожие эмбеддинги

Отправляем эмбеддинг вопроса в векторную базу и просим найти самые похожие из сохранённых.

Единичная окружность: вектор вопроса почти совпадает с Software Engineering и далёк от Medical Research.
Вектор вопроса почти совпадает с Software Engineering и далёк от Medical Research.

База возвращает раздел о разработке ПО — он ближе всего к тому, о чём спросил пользователь.

Как измеряется сходство: косинусное сходство

Векторная база определяет самые похожие эмбеддинги по косинусному сходству (cosine similarity) — косинусу угла между двумя векторами.

Единичная окружность с углом a от вопроса до Software Engineering и b до Medical Research и формулами косинуса.
Угол a — от вопроса до Software Engineering, угол b — до Medical Research; рядом формулы косинуса.

Главное о косинусном сходстве:

В нашем примере косинусное сходство вопроса и фрагмента о разработке — 0.983, очень высокое. С медицинским фрагментом — всего 0.398, намного ниже.

Косинусное расстояние

В документации векторных баз часто встречается «косинусное расстояние» (cosine distance). Оно считается просто как 1 − косинусное сходство. Для косинусного расстояния:

Такая поправка во многих случаях делает числа нагляднее.

Шаг 6. Собираем итоговый промпт

Наконец, берём вопрос пользователя и самый подходящий найденный фрагмент, объединяем в промпт и отправляем Claude за ответом.

Вопрос пользователя и найденный фрагмент о разработке подставляются в шаблон промпта.
Вопрос пользователя и найденный фрагмент о разработке подставляются в шаблон промпта.

Промпт может выглядеть так:

Answer the user's question about the financial document.

<user_question>
How many bugs did engineers fix this year?
</user_question>

<report>
## Section 2: Software Engineering
This division dedicated significant effort to studying various infection vectors in our distributed systems
</report>

Это весь конвейер RAG! Система нашла самую релевантную информацию по смысловому сходству и передала её как контекст для точного ответа.

Дальше

Следующий урок реализует этот поток в коде: векторное хранилище, добавление фрагментов и поиск.

Оригинал урока: The full RAG flow.