Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
DiskANN es un algoritmo escalable de búsqueda aproximada de vecinos más cercanos para realizar búsquedas vectoriales eficientemente a cualquier escala. Ofrece una alta recuperación, consultas elevadas por segundo y baja latencia de consulta, incluso para conjuntos de datos de miles de millones de datos. Esas características lo convierten en una herramienta eficaz para controlar grandes volúmenes de datos.
Para obtener más información sobre DiskANN, consulte DiskANN: Búsqueda de vectores para búsqueda de escalado web y recomendación.
La pg_diskann extensión agrega compatibilidad con el uso de DiskANN para la indexación y búsqueda de vectores eficaces.
Habilitar pg_diskann
Para usar la extensión pg_diskann en su servidor flexible de Azure Database for PostgreSQL, debe habilitar la extensión a nivel de servidor. A continuación, debe crear la extensión en cada base de datos en la que desea usar la funcionalidad proporcionada por la extensión.
Dado que pg_diskann tiene una dependencia de la vector extensión, puede permitir y crear la vector extensión en la misma base de datos y ejecutar el siguiente comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
O bien, puede omitir el paso de permitir y crear explícitamente la extensión vector, y ejecutar en su lugar el comando anterior añadiendo la cláusula CASCADE. Esa cláusula PostgreSQL para ejecutar implícitamente CREATE EXTENSION en la extensión que depende. Para ello, ejecute el comando siguiente:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Para quitar la extensión de la base de datos a la que está conectado actualmente, ejecute el siguiente comando:
DROP EXTENSION IF EXISTS pg_diskann;
Uso del método de acceso al índice diskann
Después de instalar la extensión, puede crear un diskann índice en una columna de tabla que contenga datos vectoriales. Por ejemplo, para crear un índice en la columna embedding de la tabla demo, use el siguiente comando:
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
-- other columns
);
-- insert dummy data
INSERT INTO demo (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');
-- create a diskann index by using Cosine distance operator
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Después de crear el índice, puede ejecutar consultas para encontrar los vecinos más cercanos.
La consulta siguiente busca los cinco vecinos más cercanos al vector [2.0, 3.0, 4.0]:
SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;
Postgres decide automáticamente cuándo usar el índice DiskANN. Si decide no usar el índice en un escenario en el que desea que use el índice, ejecute el siguiente comando:
-- Explicit Transcation block to force use for DiskANN index.
BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;
Importante
Establecer enable_seqscan en off desincentiva que el planificador de consultas use un plan de escaneo secuencial si hay otros métodos disponibles. Dado que está deshabilitado mediante el SET LOCAL comando , la configuración surte efecto solo para la transacción actual. Después de un COMMIT o un ROLLBACK, la configuración de nivel de sesión vuelve a surtir efecto. Si la consulta incluye otras tablas, la configuración también desaconseja el uso de escaneos secuenciales en todas ellas.
Escalado eficaz con cuantificación (versión preliminar)
DiskANN usa la cuantificación de productos (PQ) para reducir drásticamente la superficie de memoria de los vectores. A diferencia de otras técnicas de cuantificación, el algoritmo PQ puede comprimir vectores de forma más eficaz, lo que mejora significativamente el rendimiento. Mediante el uso de PQ, DiskANN puede mantener más datos en memoria, reducir la necesidad de acceder al almacenamiento más lento y usar menos proceso al comparar vectores comprimidos. Esto da como resultado un mejor rendimiento y un ahorro significativo de costos al trabajar con grandes cantidades de datos (>1 millón de filas).
Importante
La compatibilidad con la cuantificación de productos en DiskANN está disponible a partir de pg_diskann v0.6 y versiones posteriores.
Para reducir el tamaño del índice y hacer que quepan más datos en la memoria, utilice PQ:
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops)
WITH(
product_quantized=true
);
Mejora de la precisión al usar PQ con reeranking de vectores
Reordenamiento con vectores completos es una técnica que se usa en sistemas de búsqueda de vecinos más cercanos aproximados (ANN), como DiskANN con cuantización de producto (PQ) para mejorar la precisión del resultado mediante la reordenación de los N principales candidatos recuperados mediante los vectores originales y sin comprimir (precisión completa). Esta técnica de reranking se basa exclusivamente en métricas exactas de similitud de vectores (por ejemplo, similitud de coseno o distancia euclidiana). Esta técnica no es lo mismo que el reordenamiento mediante un modelo de clasificación.
Para equilibrar la velocidad y la precisión en la búsqueda de similitud vectorial, implemente una estrategia de reordenación en dos pasos al realizar consultas con DiskANN y cuantización de productos para mejorar la precisión.
Búsqueda aproximada inicial: la consulta interna usa DiskANN para recuperar los 50 vecinos más cercanos aproximadas en función de la distancia de coseno entre las incrustaciones almacenadas y el vector de consulta. Este paso es rápido y eficaz, aprovechando las funcionalidades de indexación de DiskANN.
Reordenación precisa: la consulta externa reordena esos 50 resultados según su distancia real calculada y devuelve las 10 coincidencias más relevantes:
Aquí tienes un ejemplo de reordenación con este enfoque de dos pasos:
SELECT id
FROM (
SELECT id, embedding <=> %s::vector AS distance
FROM demo
ORDER BY embedding <=> %s::vector asc
LIMIT 50
) AS t
ORDER BY t.distance
LIMIT 10;
Nota:
Reemplace %s por el vector de consulta. Puede usar azure_ai para crear un vector de consulta directamente en Postgres.
Este enfoque equilibra la velocidad (a través de la búsqueda aproximada) y la precisión (a través de la recarga de vectores completa), lo que garantiza resultados de alta calidad sin examinar todo el conjunto de datos.
Compatibilidad con incrustaciones de alta dimensión
Las aplicaciones avanzadas de IA generativa suelen basarse en modelos de inserción dimensionales altos, como la inserción de texto-3-large para lograr una precisión superior. Sin embargo, los métodos de indexación tradicionales como HNSW en pgvector se limitan a vectores con hasta 2000 dimensiones, lo que restringe el uso de estos modelos eficaces.
A partir de pg_diskann v0.6 y versiones posteriores, DiskANN admite vectores de indexación con hasta 16 000 dimensiones, lo que amplía significativamente el ámbito de las cargas de trabajo de IA de alta precisión.
Importante
Active la cuantización de producto para aprovechar la compatibilidad con dimensiones altas.
Configuración recomendada:
-
product_quantized: establecido en true -
pq_param_num_chunks: se establece en un tercio de la dimensión de inserción para obtener un rendimiento óptimo. -
pq_param_training_samples: se determina automáticamente en función del tamaño de la tabla a menos que se establezca explícitamente.
Esta mejora permite una búsqueda escalable y eficaz en conjuntos de datos vectoriales de gran tamaño, a la vez que mantiene una alta recuperación y precisión.
Aceleración de la compilación de índices
Para mejorar los tiempos de compilación del índice, pruebe las siguientes recomendaciones.
Uso de más memoria
Para acelerar la creación del índice, aumente la memoria asignada en el servidor postgreSQL para la compilación del índice. Especifique el uso de memoria a través del maintenance_work_mem parámetro .
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
El CREATE INDEX comando usa la memoria de trabajo especificada, en función de los recursos disponibles, para compilar el índice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Sugerencia
Aumente los recursos de memoria durante la creación del índice para mejorar la velocidad de indexación y, a continuación, redúzcalos de nuevo cuando finalice la indexación.
Uso de la paralelización
Para acelerar la creación del índice, use trabajos paralelos. Especifique el número de trabajadores mediante el parámetro de almacenamiento parallel_workers de la instrucción CREATE TABLE al crear la tabla. Puede ajustar este número más adelante usando la cláusula SET de la instrucción ALTER TABLE.
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
) WITH (parallel_workers = 4);
ALTER TABLE demo SET (parallel_workers = 8);
El CREATE INDEX comando usa el número especificado de trabajos paralelos, según los recursos disponibles, para compilar el índice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Importante
El proceso líder no puede participar en compilaciones de índices paralelos.
Si desea crear el índice mediante trabajadores en paralelo, configure los parámetros max_parallel_workers, max_worker_processes y max_parallel_maintenance_workers en consecuencia. Para obtener más información sobre estos parámetros, consulte parámetros que controlan los usos de recursos y el comportamiento asincrónico.
Establezca estos parámetros en diferentes niveles de granularidad. Por ejemplo, para establecerlos a nivel de sesión, ejecute las siguientes sentencias:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Para obtener información sobre otras opciones para configurar estos parámetros en Azure Database for PostgreSQL servidor flexible, consulte Configurar parámetros.
Nota:
El max_worker_processes parámetro requiere que un reinicio del servidor surta efecto.
Si la configuración de esos parámetros y los recursos disponibles en el servidor no permiten iniciar los trabajos paralelos, PostgreSQL retrocede automáticamente para crear el índice en el modo no paralelo.
Parámetros de configuración
Al crear un diskann índice, especifique varios parámetros para controlar su comportamiento.
Parámetros de índice
-
max_neighbors: número máximo de bordes por nodo en el gráfico. El valor predeterminado es 32. Un valor más alto puede mejorar el recuerdo hasta cierto punto. -
l_value_ib: tamaño de la lista de búsqueda durante la compilación del índice. El valor predeterminado es 100. Un valor mayor hace que la compilación sea más lenta, pero el índice es de mayor calidad. -
product_quantized: habilita la cuantificación de productos para una búsqueda más eficaz. El valor predeterminado es falso. -
pq_param_num_chunks: número de fragmentos para la cuantificación de productos. El valor predeterminado es 0, lo que significa que el sistema determina automáticamente el valor en función de las dimensiones de inserción. Use un tercio de las dimensiones de inserción originales. -
pq_param_training_samples: Número de vectores para entrenar la tabla pivote de PQ. El valor predeterminado es 0, lo que significa que el sistema determina automáticamente el valor en función del tamaño de la tabla.
CREATE INDEX demo_embedding_diskann_custom_idx ON demo USING diskann (embedding vector_cosine_ops)
WITH (
max_neighbors = 48,
l_value_ib = 100,
product_quantized=true,
pq_param_num_chunks = 0,
pq_param_training_samples = 0
);
Parámetros de extensión
diskann.iterative_search: controla el comportamiento de búsqueda.Configuraciones para
diskann.iterative_search:relaxed_order(valor predeterminado): permite que Diskann busque iterativamente en el gráfico en lotes dediskann.l_value_is, hasta que se obtenga el número deseado de tuplas, posiblemente limitado por la cláusulaLIMIT. Esta opción puede hacer que los resultados no estén en orden.strict_order: similar arelaxed_order, pero garantiza que los resultados se devuelven en orden estricto ordenado por distancia.off: usa la funcionalidad de búsqueda nonitertiva. Intenta obtenerdiskann.l_value_istuplas de una sola vez. La búsqueda no iterativa solo puede devolver un máximo dediskann.l_value_isvectores para una consulta, independientemente de la cláusulaLIMITo del número de tuplas que coincidan con la consulta.
Para cambiar el comportamiento de búsqueda a
strict_orderpara todas las consultas ejecutadas en la sesión actual, ejecute la siguiente instrucción:SET diskann.iterative_search TO 'strict_order';Para cambiarlo para que solo afecte a todas las consultas ejecutadas en la transacción actual, ejecute la siguiente instrucción:
BEGIN; SET LOCAL diskann.iterative_search TO 'strict_order'; -- All your queries COMMIT;diskann.l_value_is: valor L para el examen de índices (el valor predeterminado es 100). Aumentar el valor mejora la recuperación, pero puede ralentizar las consultas.Para cambiar el valor L del examen de índices a 20 para todas las consultas ejecutadas en la sesión actual, ejecute la siguiente instrucción:
SET diskann.l_value_is TO 20;Para cambiarlo para que solo afecte a todas las consultas ejecutadas en la transacción actual, ejecute la siguiente instrucción:
BEGIN; SET LOCAL diskann.l_value_is TO 20; -- All your queries COMMIT;
Configuración recomendada de parámetros
| Tamaño del conjunto de datos (filas) | Tipo de parámetro | Nombre | Valor recomendado |
|---|---|---|---|
| <1 M | Compilación de índices | l_value_ib |
100 |
| <1 M | Compilación de índices | max_neighbors |
32 |
| <1 M | Hora de consulta | diskann.l_value_is |
100 |
| 1M-50M | Compilación de índices | l_value_ib |
100 |
| 1M-50M | Compilación de índices | max_neighbors |
64 |
| 1M-50M | Compilación de índices | product_quantized |
true |
| 1M-50M | Hora de consulta | diskann.l_value_is |
100 |
| >50 M | Compilación de índices | l_value_ib |
100 |
| >50 M | Compilación de índices | max_neighbors |
96 |
| >50 M | Compilación de índices | product_quantized |
true |
| >50 M | Hora de consulta | diskann.l_value_is |
100 |
Nota:
Estos parámetros pueden variar en función del conjunto de datos y el caso de uso específicos. Es posible que tenga que experimentar con valores de parámetro diferentes para encontrar la configuración óptima para su escenario concreto.
PROGRESO DE CREATE INDEX y REINDEX
A partir de PostgreSQL 12, puede usar pg_stat_progress_create_index para comprobar el progreso de las operaciones CREATE INDEX o REINDEX.
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
Para obtener más información sobre las posibles fases a través de las cuales va una operación CREATE INDEX o REINDEX, consulte LAS FASES CREATE INDEX.
Selección de la función de acceso al índice
El tipo de vector admite tres tipos de búsquedas en los vectores almacenados. Seleccione la función de acceso correcta para el índice para que la base de datos pueda considerar el índice al ejecutar las consultas.
pg_diskann admite los siguientes operadores de distancia:
-
vector_l2_ops: distancia euclidiana<-> -
vector_cosine_ops: distancia de coseno<=> -
vector_ip_ops:<#>Producto interno
Solución de problemas
Error: : assertion left == right failed left: 40 right: 0
DiskANN GA versión, v0.6.x presenta cambios importantes en el formato de metadatos del índice. Los índices creados con v0.5.x no son compatibles hacia adelante con las operaciones de inserción de v0.6.x. Si intenta insertar en una tabla con un índice obsoleto, obtendrá un error, incluso si el índice aparece válido.
Cuando encuentre este error, resílelo mediante:
Opción 1: Ejecución de la instrucción
REINDEXoREDINDEX CONCURRENTLYen el índice.Opción 2: Volver a generar el índice.
DROP INDEX your_index_name; CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
Error: : diskann index needs to be upgraded to version 2...
- Cuando encuentre este error, resílelo mediante:
Opción 1: Ejecución de la instrucción
REINDEXoREDINDEX CONCURRENTLYen el índice.Opción 2: Dado que
REINDEXpuede tardar mucho tiempo, la extensión también proporciona una función definida por el usuario denominadaupgrade_diskann_index(), que actualiza el índice más rápido, siempre que sea posible.Para actualizar el índice, ejecute la siguiente instrucción:
SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');Para actualizar todos los índices diskann de la base de datos a la versión actual, ejecute la instrucción siguiente:
SELECT upgrade_diskann_index(pg_class.oid) FROM pg_class JOIN pg_am ON (pg_class.relam = pg_am.oid) WHERE pg_am.amname = 'diskann';