Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Генерация с дополнением извлечением (RAG)

PRX реализует генерацию с дополнением извлечением (RAG) для улучшения ответов LLM релевантным контекстом из памяти и хранилищ знаний агента. Вместо того чтобы полагаться исключительно на параметрические знания LLM, RAG извлекает соответствующие документы и внедряет их в промпт -- снижая галлюцинации и обосновывая ответы на фактической актуальной информации.

Обзор

Конвейер RAG выполняется перед каждым вызовом LLM в цикле агента:

Сообщение пользователя


┌──────────────────────────┐
│  1. Формулировка запроса  │  Извлечение поисковых терминов из
│                           │  сообщения пользователя + контекста разговора
└──────────┬───────────────┘


┌──────────────────────────┐
│  2. Генерация эмбеддинга  │  Преобразование запроса в вектор с помощью
│                           │  настроенного провайдера эмбеддингов
└──────────┬───────────────┘


┌──────────────────────────┐
│  3. Поиск по памяти      │  Поиск по бэкендам памяти:
│                           │  векторное сходство + полнотекстовый
└──────────┬───────────────┘


┌──────────────────────────┐
│  4. Фильтрация           │  Скоринг и фильтрация результатов выше
│     по релевантности      │  порога релевантности
└──────────┬───────────────┘


┌──────────────────────────┐
│  5. Внедрение контекста   │  Форматирование результатов и внедрение
│                           │  в системный промпт / контекстное окно
└──────────┬───────────────┘


┌──────────────────────────┐
│  6. Генерация LLM         │  Модель генерирует ответ с
│                           │  полным доступным контекстом
└──────────────────────────┘

Конфигурация

Включите RAG в config.toml:

toml
[memory]
backend = "embeddings"  # RAG требует бэкенд эмбеддингов

[memory.embeddings]
# Провайдер эмбеддингов: "openai" | "ollama" | "local"
provider = "openai"
model = "text-embedding-3-small"
dimensions = 1536

# Бэкенд векторного хранилища
vector_store = "sqlite"  # "sqlite" | "postgres" | "qdrant"

[rag]
enabled = true

# Максимальное количество извлечённых чанков для внедрения в контекст.
max_results = 10

# Минимальный балл релевантности (0.0 до 1.0) для включения чанка.
relevance_threshold = 0.3

# Максимальное количество токенов, выделенных для RAG-контекста.
# Предотвращает переполнение контекстного окна.
max_context_tokens = 4000

# Стратегия выбора чанков при превышении max_context_tokens.
# "top_k" -- наивысшие баллы релевантности в первую очередь
# "mmr" -- максимальная маргинальная релевантность (разнообразие + релевантность)
selection_strategy = "top_k"

Провайдеры эмбеддингов

PRX поддерживает множество провайдеров эмбеддингов:

ПровайдерМодельРазмерностьПримечания
OpenAItext-embedding-3-small1536Лучшее соотношение качество/стоимость
OpenAItext-embedding-3-large3072Наивысшее качество
Ollamanomic-embed-text768Локальный, без стоимости API
Ollamamxbai-embed-large1024Локальный, более высокое качество
Localfastembed384Встроенный, без сети

Настройка провайдера эмбеддингов:

toml
# Эмбеддинги OpenAI
[memory.embeddings]
provider = "openai"
model = "text-embedding-3-small"
api_key = "${OPENAI_API_KEY}"

# Эмбеддинги Ollama (локальные)
[memory.embeddings]
provider = "ollama"
model = "nomic-embed-text"
endpoint = "http://localhost:11434"

# Встроенные локальные эмбеддинги (без внешнего сервиса)
[memory.embeddings]
provider = "local"
model = "fastembed"

Стратегии разбиения на чанки

Перед тем как документы могут быть преобразованы в эмбеддинги и найдены, они должны быть разбиты на чанки. PRX поддерживает несколько стратегий разбиения:

СтратегияОписаниеЛучше всего для
fixed_sizeРазбиение по фиксированному количеству токенов с перекрытиемОднородные документы
sentenceРазбиение по границам предложенийПроза и естественный текст
paragraphРазбиение по границам абзацевСтруктурированные документы
semanticРазбиение по тематическим границам с использованием эмбеддинговДлинные разнородные документы
recursiveИерархическое разбиение (заголовок > абзац > предложение)Markdown/код
toml
[rag.chunking]
strategy = "recursive"

# Целевой размер чанка в токенах.
chunk_size = 512

# Перекрытие между соседними чанками (предотвращает потерю контекста на границах).
chunk_overlap = 64

# Для рекурсивной стратегии: разделители в порядке приоритета.
separators = ["\n## ", "\n### ", "\n\n", "\n", ". "]

Конвейер извлечения

Шаги 1-3: Запрос, эмбеддинг, поиск

Модуль RAG извлекает поисковый запрос из последнего сообщения пользователя (опционально переформулированный через LLM при query_reformulation = true), преобразует его в вектор с помощью провайдера эмбеддингов и выполняет поиск по всем бэкендам памяти одновременно -- векторное сходство (косинусное) и полнотекстовый поиск (FTS5/pg_trgm). Результаты объединяются и дедуплицируются.

Шаг 4: Фильтрация по релевантности

Каждый результат получает балл релевантности от 0.0 до 1.0. Результаты ниже relevance_threshold отбрасываются. Скоринг учитывает:

  • Косинусное сходство векторов (основной сигнал)
  • Балл полнотекстового совпадения (коэффициент усиления)
  • Свежесть (более новые воспоминания получают небольшое преимущество)
  • Приоритет источника (основные воспоминания ранжируются выше разговорных)

Шаг 5: Внедрение контекста

Отфильтрованные результаты форматируются структурированными XML-тегами (<context><memory source="..." relevance="...">) и внедряются в промпт LLM. Общий внедрённый контекст ограничен max_context_tokens для предотвращения переполнения контекстного окна.

Стратегии выбора

Top-K

Стратегия по умолчанию. Выбирает K чанков с наивысшими баллами, вмещающихся в max_context_tokens. Простая и предсказуемая, но может возвращать избыточные результаты, когда несколько чанков покрывают одну тему.

Максимальная маргинальная релевантность (MMR)

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

toml
[rag]
selection_strategy = "mmr"

# Lambda управляет балансом релевантность-разнообразие.
# 1.0 = чистая релевантность (аналогично top_k)
# 0.0 = чистое разнообразие
mmr_lambda = 0.7

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

Индексация документов

Автоматическая индексация

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

Ручная загрузка документов

Для массовой загрузки документов используйте CLI:

bash
# Индексация одного файла или каталога
prx rag index /path/to/document.md
prx rag index /path/to/docs/ --recursive

# Переиндексация всех документов (пересоздание эмбеддингов)
prx rag reindex

Поддерживаемые форматы: Markdown (.md), простой текст (.txt), PDF (.pdf), HTML (.html) и исходный код (.rs, .py, .js).

Тонкая настройка производительности

ПараметрРекомендация
chunk_size256-512 токенов для Q&A, 512-1024 для суммаризации
chunk_overlap10-20% от chunk_size
max_results5-15 для большинства сценариев
relevance_threshold0.3-0.5 (настраивайте по качеству)

Замечания по безопасности

  • RAG-контекст внедряется в промпт LLM. Убедитесь, что сохранённые документы не содержат конфиденциальных данных, если агент не авторизован для доступа к ним.
  • При memory.acl_enabled = true RAG соблюдает списки контроля доступа. Извлекаются только воспоминания, доступные текущему принципалу.
  • Вызовы API эмбеддингов передают содержимое документов провайдеру эмбеддингов. Для конфиденциальных данных используйте локальный провайдер (ollama или local).

Связанные страницы

Released under the Apache-2.0 License.