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 la instancia de servidor flexible de Azure Database for PostgreSQL, debe permitir la extensión en el nivel de instancia . 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 siguiente comando:
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
Una vez instalada la extensión, puede crear un índice diskann 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)
Una vez creado el índice, puede ejecutar consultas para encontrar los vecinos más cercanos.
La consulta siguiente busca los 5 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 lo use, 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
Al configurar enable_seqscan como desactivado, se desanima al planificador a utilizar el plan de escaneo secuencial del planificador de consultas si hay otros métodos disponibles. Dado que se deshabilita mediante el SET LOCAL comando , la configuración solo surte efecto 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. Tenga en cuenta que si la consulta implica 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. DiskANN con PQ puede mantener más datos en memoria, lo que reduce la necesidad de acceder al almacenamiento más lento, así como 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 ajustar más datos a la memoria, puede usar 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 vectorial (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 de vectores, se puede implementar una estrategia de reordenamiento en dos pasos al consultar con DiskANN y la cuantificació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:
Este es un ejemplo de reordenación mediante este enfoque de 2 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:
%s debe reemplazarse 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 ahora 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
La cuantificación de productos debe estar activada para aprovechar la compatibilidad dimensional alta.
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
Hay varias maneras de mejorar los tiempos de compilación del índice.
Uso de más memoria
Para acelerar la creación del índice, puede aumentar la memoria asignada en la instancia de Postgres para la compilación del índice. El uso de memoria se puede especificar mediante el maintenance_work_mem parámetro .
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
A continuación, 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
Puede escalar verticalmente los recursos de memoria durante la compilación de índices para mejorar la velocidad de indexación y, a continuación, reducir verticalmente cuando se complete la indexación.
Uso de la paralelización
Para acelerar la creación del índice, puede usar trabajos paralelos. El número de trabajadores se puede especificar mediante el parallel_workers parámetro de almacenamiento de la CREATE TABLE instrucción al crear la tabla. Y se puede ajustar más adelante mediante 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);
A continuación, 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 utilizando trabajadores paralelos, también debe establecer 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.
Puede establecer estos parámetros en diferentes niveles de granularidad. Por ejemplo, para establecerlos en el nivel de sesión, puede ejecutar las siguientes instrucciones:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Para más información sobre otras opciones para configurar estos parámetros en el servidor flexible de Azure Database for PostgreSQL, consulte Configuración de parámetros de servidor.
Nota:
El parámetro max_worker_processes 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, puede especificar 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 sería 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). 0 significa que se determina automáticamente, en función de las dimensiones de inserción. Se recomienda usar 1/3 de las dimensiones de inserción originales. -
pq_param_training_samples: número de vectores para entrenar la tabla de pivote PQ (predeterminados a 0). 0 significa que se determina automáticamente, 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. Puede hacer que los resultados queden desordenados.strict_order: similar arelaxed_order, permite que diskann busque iterativamente el gráfico hasta que se produzca el número deseado de tuplas. Sin embargo, garantiza que los resultados se devuelven en orden estricto ordenado por distancia.off: Usa la funcionalidad de búsqueda no iterativo, lo que significa que intenta capturardiskann.l_value_istuplas en un paso. 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_order, para 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 los usuarios tengan que experimentar con valores de parámetro diferentes para encontrar la configuración óptima para su escenario concreto.
PROGRESO DE CREATE INDEX y REINDEX
Con PostgreSQL 12 y versiones posteriores, 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 por las que pasa una operación CREATE INDEX o REINDEX, consulte fases CREATE INDEX.
Selección de la función de acceso al índice
El tipo de vector permite realizar tres tipos de búsquedas en los vectores almacenados. Debe seleccionar 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 se intenta insertar en una tabla con un índice obsoleto, se producirá un error, incluso si el índice aparece válido.
Cuando encuentre este error, puede resolverlo:
Opción 1: Ejecución de la instrucción
REINDEXoREDINDEX CONCURRENTLYen el índice.Opción 2: Recompilación del í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, puede resolverlo:
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';