Настройка LLM и AI-агентов под задачу/aka-gst

Эксперимент 5 · 3 мин

Лабораторная работа 5: embeddings и RAG

Содержание раздела
  1. Цель
  2. Компоненты
  3. Построение индекса
  4. Вопрос
  5. Как работает RAG
  6. Обновление документов
  7. Ограничения
  8. Тесты

Цель

Отвечать по локальным документам, которые можно обновлять без переобучения модели, и указывать проверяемые источники.

Компоненты

  • демонстрационные документы: data/demo/client-docs/;
  • embedding-модель: qwen3-embedding:0.6b;
  • генеративная модель: qwen3:8b;
  • локальный индекс: data/private/rag.sqlite3;
  • поиск: cosine similarity;
  • формат ответа: Pydantic-модель RagAnswer.

Построение индекса

bash
uv run python -m agent_lab.rag index

Программа разбивает Markdown по заголовкам ##, получает embedding каждого фрагмента и сохраняет вектор вместе с текстом и источником в SQLite.

Вопрос

bash
uv run python -m agent_lab.rag ask \
  "Сколько стоит доставка заказа на 4 000 рублей?"

Ожидается ответ 490 рублей со ссылкой на delivery.md#Стоимость.

Как работает RAG

  1. Документы разбиваются на небольшие фрагменты.
  2. Embedding-модель превращает каждый фрагмент в числовой вектор.
  3. Вопрос пользователя тоже превращается в вектор.
  4. По cosine similarity выбираются три ближайших фрагмента.
  5. Только эти фрагменты передаются генеративной модели.
  6. Модель формирует ответ и возвращает список источников.
  7. Python отклоняет ссылку на источник, которого не было среди найденных фрагментов.

Обновление документов

После изменения Markdown-файлов индекс нужно построить повторно:

bash
uv run python -m agent_lab.rag index

Это и есть важное отличие RAG от fine-tuning: новые факты подключаются переиндексацией документов, а веса модели не меняются.

Ограничения

  • учебный поиск перебирает все векторы в SQLite и не рассчитан на миллионы фрагментов;
  • качество зависит от разбиения, embedding-модели и формулировки вопроса;
  • наличие источника не доказывает, что модель правильно истолковала текст;
  • демонстрационные документы вымышлены и не являются правилами реального магазина;
  • приватный индекс исключён из Git, но исходные demo-документы публикуются вместе с проектом.

Тесты

bash
uv run pytest

Тесты проверяют разбиение документов, сравнение векторов, ранжирование и блокировку выдуманного источника без обращения к модели.