Skip to content
Esta página fue generada y traducida con asistencia de IA. Si encuentra alguna imprecisión, no dude en ayudar a mejorarla. Editar en GitHub

Generacion Aumentada por Recuperacion (RAG)

PRX implementa Generacion Aumentada por Recuperacion (RAG) para mejorar las respuestas del LLM con contexto relevante de la memoria y almacenes de conocimiento del agente. En lugar de depender unicamente del conocimiento parametrico del LLM, RAG recupera documentos pertinentes y los inyecta en el prompt -- reduciendo alucinaciones y fundamentando las respuestas en informacion factual y actualizada.

Vision general

El pipeline RAG se ejecuta antes de cada llamada LLM en el bucle del agente:

User Message


┌──────────────────────────┐
│  1. Query Formulation     │  Extract search terms from the
│                           │  user message + conversation context
└──────────┬───────────────┘


┌──────────────────────────┐
│  2. Embedding Generation  │  Convert query to a vector using
│                           │  the configured embedding provider
└──────────┬───────────────┘


┌──────────────────────────┐
│  3. Memory Search         │  Search across memory backends:
│                           │  vector similarity + full-text
└──────────┬───────────────┘


┌──────────────────────────┐
│  4. Relevance Filtering   │  Score and filter results above
│                           │  the relevance threshold
└──────────┬───────────────┘


┌──────────────────────────┐
│  5. Context Injection     │  Format results and inject into
│                           │  the system prompt / context window
└──────────┬───────────────┘


┌──────────────────────────┐
│  6. LLM Generation        │  Model generates response with
│                           │  full context available
└──────────────────────────┘

Configuracion

Habilita RAG en config.toml:

toml
[memory]
backend = "embeddings"  # RAG requires the embeddings backend

[memory.embeddings]
# Embedding provider: "openai" | "ollama" | "local"
provider = "openai"
model = "text-embedding-3-small"
dimensions = 1536

# Vector store backend
vector_store = "sqlite"  # "sqlite" | "postgres" | "qdrant"

[rag]
enabled = true

# Maximum number of retrieved chunks to inject into context.
max_results = 10

# Minimum relevance score (0.0 to 1.0) for a chunk to be included.
relevance_threshold = 0.3

# Maximum total tokens allocated for RAG context.
# Prevents context window overflow.
max_context_tokens = 4000

# Strategy for selecting which chunks to include when
# max_context_tokens would be exceeded.
# "top_k" -- highest relevance scores first
# "mmr" -- maximal marginal relevance (diversity + relevance)
selection_strategy = "top_k"

Proveedores de embeddings

PRX soporta multiples proveedores de embeddings:

ProveedorModeloDimensionesNotas
OpenAItext-embedding-3-small1536Mejor relacion calidad/costo
OpenAItext-embedding-3-large3072Mayor calidad
Ollamanomic-embed-text768Local, sin costo de API
Ollamamxbai-embed-large1024Local, mayor calidad
Localfastembed384Incluido, sin red

Configura el proveedor de embeddings:

toml
# OpenAI embeddings
[memory.embeddings]
provider = "openai"
model = "text-embedding-3-small"
api_key = "${OPENAI_API_KEY}"

# Ollama embeddings (local)
[memory.embeddings]
provider = "ollama"
model = "nomic-embed-text"
endpoint = "http://localhost:11434"

# Built-in local embeddings (no external service)
[memory.embeddings]
provider = "local"
model = "fastembed"

Estrategias de fragmentacion

Antes de que los documentos puedan ser embebidos y buscados, deben dividirse en fragmentos. PRX soporta varias estrategias de fragmentacion:

EstrategiaDescripcionIdeal para
fixed_sizeDividir en conteos fijos de tokens con superposicionDocumentos uniformes
sentenceDividir en limites de oracionesProsa y texto natural
paragraphDividir en limites de parrafosDocumentos estructurados
semanticDividir en limites de temas usando embeddingsDocumentos largos y variados
recursiveDivision jerarquica (encabezado > parrafo > oracion)Markdown/codigo
toml
[rag.chunking]
strategy = "recursive"

# Target chunk size in tokens.
chunk_size = 512

# Overlap between adjacent chunks (prevents losing context at boundaries).
chunk_overlap = 64

# For recursive strategy: separators in priority order.
separators = ["\n## ", "\n### ", "\n\n", "\n", ". "]

Pipeline de recuperacion

Pasos 1-3: Consulta, embedding, busqueda

El modulo RAG extrae una consulta de busqueda del mensaje mas reciente del usuario (opcionalmente reformulada via LLM con query_reformulation = true), la convierte en un vector usando el proveedor de embeddings, y busca a traves de todos los backends de memoria simultaneamente -- similitud vectorial (coseno) y busqueda de texto completo (FTS5/pg_trgm). Los resultados se fusionan y deduplican.

Paso 4: Filtrado por relevancia

Cada resultado recibe una puntuacion de relevancia entre 0.0 y 1.0. Los resultados por debajo de relevance_threshold se descartan. La puntuacion considera:

  • Similitud coseno vectorial (senal principal)
  • Puntuacion de coincidencia de texto completo (factor de impulso)
  • Recencia (memorias mas nuevas reciben un ligero impulso)
  • Prioridad de fuente (memorias centrales clasificadas mas alto que las de conversacion)

Paso 5: Inyeccion de contexto

Los resultados filtrados se formatean con etiquetas XML estructuradas (<context><memory source="..." relevance="...">) y se inyectan en el prompt del LLM. El contexto total inyectado se limita a max_context_tokens para prevenir desbordamiento de la ventana de contexto.

Estrategias de seleccion

Top-K

La estrategia por defecto. Selecciona los K fragmentos de mayor puntuacion que caben dentro de max_context_tokens. Simple y predecible, pero puede devolver resultados redundantes cuando multiples fragmentos cubren el mismo tema.

Relevancia Marginal Maxima (MMR)

MMR equilibra relevancia con diversidad. Selecciona iterativamente fragmentos que son tanto relevantes para la consulta como diferentes de los fragmentos ya seleccionados:

toml
[rag]
selection_strategy = "mmr"

# Lambda controls the relevance-diversity tradeoff.
# 1.0 = pure relevance (same as top_k)
# 0.0 = pure diversity
mmr_lambda = 0.7

MMR se recomienda cuando la base de conocimiento contiene informacion superpuesta o redundante.

Indexacion de documentos

Indexacion automatica

Las memorias almacenadas via la herramienta memory_store se convierten automaticamente en embeddings y se indexan. No se requiere configuracion adicional.

Ingesta manual de documentos

Para ingesta masiva de documentos, usa el CLI:

bash
# Index a single file or directory
prx rag index /path/to/document.md
prx rag index /path/to/docs/ --recursive

# Re-index all documents (rebuilds embeddings)
prx rag reindex

Formatos soportados: Markdown (.md), texto plano (.txt), PDF (.pdf), HTML (.html) y codigo fuente (.rs, .py, .js).

Ajuste de rendimiento

ParametroRecomendacion
chunk_size256-512 tokens para preguntas y respuestas, 512-1024 para resumen
chunk_overlap10-20% del chunk_size
max_results5-15 para la mayoria de casos de uso
relevance_threshold0.3-0.5 (ajustar segun calidad)

Notas de seguridad

  • El contexto RAG se inyecta en el prompt del LLM. Asegurate de que los documentos almacenados no contengan datos sensibles a menos que el agente este autorizado a acceder a ellos.
  • Cuando memory.acl_enabled = true, RAG respeta las listas de control de acceso. Solo se recuperan memorias accesibles para el principal actual.
  • Las llamadas a la API de embeddings transmiten el contenido del documento al proveedor de embeddings. Para datos sensibles, usa un proveedor de embeddings local (ollama o local).

Paginas relacionadas

Released under the Apache-2.0 License.