Referencia: Almacén RAG de pgvector
Referencia compuesta para RAG de documentos en PostgreSQL 18.4 + pgvector 0.8+ (instancia de search dedicada, 64 GB RAM). ~40M fragmentos, embeddings de 1536 dimensiones, SaaS multi-inquilino con RLS.
Esquema
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE document_chunks (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
tenant_id uuid NOT NULL,
document_id uuid NOT NULL,
chunk_index int NOT NULL,
content text NOT NULL,
embedding vector(1536) NOT NULL,
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (tenant_id, document_id, chunk_index)
);
ALTER TABLE document_chunks ENABLE ROW LEVEL SECURITY;
CREATE POLICY chunks_tenant ON document_chunks
USING (tenant_id = current_setting('app.tenant_id', true)::uuid);Ajuste de Índices (HNSW)
CREATE INDEX document_chunks_embedding_hnsw_idx
ON document_chunks
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- Recuperación vs latencia en tiempo de consulta
SET hnsw.ef_search = 100;| Parámetro | Valor | Nota |
|---|---|---|
m | 16 | Equilibrio predeterminado para 1536 dimensiones |
ef_construction | 64 | Tiempo de construcción vs recuperación |
ef_search | 40-120 | SET por solicitud en la aplicación |
| Distancia | vector_cosine_ops | Coincide con los modelos de coseno de OpenAI |
Patrón de Consulta
SELECT id, document_id, content,
embedding <=> $1::vector AS distance
FROM document_chunks
WHERE tenant_id = $2::uuid
ORDER BY embedding <=> $1::vector
LIMIT 20;- Siempre filtrar
tenant_idantes de la ordenación vectorial (RLS + planificador). - Se consideraron índices parciales por inquilino grande con más de 5M de fragmentos.
- Escrituras de embeddings en lotes;
COPYpara ingesta masiva fuera de horas pico.
Topología
OLTP primario (cuentas, facturación)
│
└── Subconjunto de replicación lógica → instancia de búsqueda (solo fragmentos)Instancia de búsqueda dimensionada para RAM de HNSW (~2x margen para tamaño de índice). OLTP no está en la misma ubicación que el mantenimiento de la construcción de HNSW.
Operaciones
- Reindexar HNSW en la ventana de mantenimiento después de una actualización importante de pgvector.
- Monitorizar
idx_scany la latencia de búsqueda p95 por separado de los SLO de OLTP. - Eliminación de inquilino:
DELETE FROM document_chunks WHERE tenant_id = $1(trabajo asíncrono).
Relacionado
- Conceptos básicos de pgvector - introducción a la extensión
- Índices IVFFlat vs HNSW - elección de índice
- Esquema de almacenamiento RAG - profundidad del esquema
- Referencia: SaaS Multi-Inquilino - patrones de RLS
Versiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.