DiskANN: Una solución ANNS basada en disco con alta recuperación y alto QPS en conjuntos de datos a escala de miles de millones
“DiskANN: Búsqueda rápida y precisa de vecinos más cercanos en mil millones de puntos en un solo nodo” es un artículo publicado en NeurIPS en 2019. El artículo presenta un método de vanguardia para realizar la construcción de índices y la búsqueda en conjuntos de datos a escala de mil millones utilizando una sola máquina con solo 64GB de RAM y un SSD lo suficientemente grande. Además, satisface los tres requisitos de ANNS (Búsqueda aproximada de vecinos más cercanos) en conjuntos de datos a gran escala: alta exhaustividad, baja latencia y alta densidad (número de nodos en una sola máquina). Este método construye un índice basado en grafos en el conjunto de datos a escala de mil millones SIFT-1B utilizando una sola máquina con 64GB de RAM y una CPU de 16 núcleos, alcanzando 5000 QPS (consultas por segundo) con más de 95 % de recall@1, y una latencia promedio inferior a 3ms.
Autores
Suhas Jayaram Subramanya: Ex empleado del Instituto de Investigación de Microsoft India, estudiante de doctorado de CMU. Sus principales intereses de investigación son la computación de alto rendimiento y los algoritmos de aprendizaje automático para datos a gran escala.
Devvrit: Asistente de investigación de posgrado en The University of Texas at Austin. Sus intereses de investigación son la informática teórica, el aprendizaje automático y el aprendizaje profundo.
Rohan Kadekodi: Estudiante de doctorado en la University of Texas. Su línea de investigación es sistemas y almacenamiento, incluyendo principalmente almacenamiento persistente, sistema de archivos y almacenamiento kV.
Ravishankar Krishaswamy: Investigador principal del instituto de investigación de Microsoft India. Doctor por CMU. Su línea de investigación son los algoritmos de aproximación basados en grafos y agrupamiento.
Harsha Vardhan Simhadri: Investigador principal del instituto de investigación de Microsoft India. Doctor por CMU. En el pasado, estudió algoritmos paralelos y sistemas de tiempo de ejecución. Ahora su trabajo principal es desarrollar nuevos algoritmos y escribir modelos de programación.
Motivaciones
La mayoría de los algoritmos ANNS convencionales realizan ciertos compromisos entre el rendimiento de construcción de índices, el rendimiento de búsqueda y el recall. Los algoritmos basados en grafos como HNSW y NSG son actualmente métodos de vanguardia en términos de rendimiento de búsqueda y recall. Dado que el método de indexación basado en grafos residente en memoria ocupa demasiada memoria, es relativamente difícil indexar y buscar en un conjunto de datos a gran escala utilizando una sola máquina con recursos de memoria limitados.
Muchas aplicaciones requieren respuestas rápidas de ANNS basado en distancia euclidiana en conjuntos de datos a escala de mil millones. A continuación se presentan dos soluciones principales:
Índice invertido + cuantización: agrupar el conjunto de datos en M particiones y comprimir el conjunto de datos utilizando esquemas de cuantización como PQ (Cuantización de Producto). Esta solución produce bajo recall debido a una pérdida de precisión causada por la compresión de datos. Aumentar el topk ayuda a mejorar el recall, mientras que el QPS disminuiría correspondientemente.
Dividir e indexar: dividir el conjunto de datos en varios fragmentos disjuntos y construir un índice en memoria para cada fragmento. Cuando llegan solicitudes de consulta, la búsqueda se realizará en los índices de cada fragmento y los resultados se devolverán después de fusionarlos. Esta solución provoca la sobreexpansión de la escala del conjunto de datos y, por lo tanto, se necesitan más máquinas debido a la restricción de recursos de memoria en una sola máquina, lo que conduce a un bajo QPS.
Ambas soluciones mencionadas anteriormente están limitadas por la restricción de memoria de una sola máquina. Este artículo propone el diseño de un mecanismo de indexación residente en SSD para resolver este problema. El desafío de la indexación residente en SSD es reducir el número de accesos aleatorios al disco y el número de solicitudes de acceso al disco.
Contribuciones
Este artículo presenta un esquema ANNS residente en SSD llamado DiskANN, que puede respaldar eficazmente la búsqueda en conjuntos de datos a gran escala. Este esquema se basa en un algoritmo basado en grafos presentado en este artículo: Vamana. Las contribuciones de este artículo incluyen:
DiskANN puede indexar y buscar en un conjunto de datos a escala de mil millones de más de 100 dimensiones en una sola máquina con 64GB RAM, proporcionando más de 95% de recall@1 con latencias inferiores a 5 milisegundos.
Se propuso un nuevo algoritmo basado en grafos llamado Vamana, con un radio de búsqueda menor que los de NSG y HNSW, para minimizar el número de accesos a disco.
Vamana puede funcionar en memoria y su rendimiento no es más lento que el de NSG y HNSW.
Los índices Vamana más pequeños construidos sobre particiones solapadas del gran conjunto de datos pueden fusionarse en un solo grafo sin perder conectividad.
Vamana puede combinarse con esquemas de cuantización como PQ. La estructura del grafo y los datos originales se almacenan en el disco, mientras que los datos comprimidos se mantienen en memoria.
Vamana
Este algoritmo es similar a la idea de NSG[2][4] (para quienes no entiendan NSG, consulten la Referencia [2], y si no desean leer artículos, pueden consultar la Referencia [4]). Su principal diferencia radica en la estrategia de recorte. Para ser precisos, se ha añadido un interruptor alpha a la estrategia de recorte de NSG. La idea principal de la estrategia de recorte de NSG es que la elección de vecinos del punto objetivo sea lo más diversa posible. Si el nuevo vecino está más cerca de un vecino del punto objetivo que del punto objetivo, no necesitamos añadir este punto al conjunto de puntos vecinos. En otras palabras, para cada vecino del punto objetivo, no puede haber otros puntos vecinos dentro del radio circundante dist (punto objetivo, punto vecino). Esta estrategia de recorte controla eficazmente el grado de salida del grafo y es relativamente radical. Reduce la huella de memoria del índice, mejora la velocidad de búsqueda, pero también reduce la precisión de búsqueda. La estrategia de recorte de Vamana consiste en controlar libremente la escala del recorte mediante el parámetro alpha. El principio de funcionamiento es multiplicar la dist (un punto vecino, punto candidato) en la condición de recorte por un parámetro alpha (no menor que 1). Solo cuando la dist (punto objetivo, un cierto punto candidato) es mayor que la distancia de referencia ampliada se adopta la estrategia de recorte, aumentando la tolerancia de exclusión mutua entre vecinos del punto objetivo.
El proceso de indexación de Vamana es relativamente simple:
Inicializar un grafo aleatorio;
Calcular el punto de partida, que es similar al punto de navegación de NSG. Primero, encontrar el centroide global y luego encontrar el punto más cercano al centroide global como punto de navegación. La diferencia entre Vamana y NSG es que la entrada de NSG ya es un grafo de vecinos más cercanos, por lo que los usuarios pueden simplemente realizar una búsqueda aproximada de vecinos más cercanos sobre el punto centroide directamente en el grafo de vecinos inicial. Sin embargo, Vamana inicializa un grafo aleatorio de vecinos más cercanos, por lo que los usuarios no pueden realizar una búsqueda aproximada directamente sobre el grafo aleatorio. Necesitan hacer una comparación global para obtener un punto de navegación como punto de partida de las iteraciones posteriores. El propósito de este punto es minimizar el radio de búsqueda promedio;
Realizar una búsqueda aproximada de vecinos más cercanos en cada punto basándose en el grafo aleatorio de vecinos inicializado y en el punto de partida de búsqueda determinado en el paso 2, hacer que todos los puntos de la ruta de búsqueda sean los conjuntos de vecinos candidatos y ejecutar la estrategia de recorte de aristas usando alpha = 1. De manera similar a NSG, seleccionar el conjunto de puntos en la ruta de búsqueda que parte del punto de navegación como conjunto de vecinos candidatos aumentará algunas aristas largas y reducirá eficazmente el radio de búsqueda.
Ajustar alpha > 1 (el artículo recomienda 1.2) y repetir el paso 3. Mientras que el paso 3 se basa en un grafo aleatorio de vecinos más cercanos, el grafo es de baja calidad después de la primera iteración. Por lo tanto, se necesita otra iteración para mejorar la calidad del grafo, lo cual es muy importante para la tasa de recuperación.
Este artículo compara los tres índices de grafo, es decir, Vamana, NSG y HNSW. En términos de rendimiento de indexación y consulta, Vamana y NSG son relativamente cercanos, y ambos superan ligeramente a HNSW. Consulte la sección Experimento a continuación para ver los datos.
Figura 1.
Para visualizar el proceso de construcción del índice Vamana, el artículo proporciona un gráfico, en el que se utilizan 200 puntos bidimensionales para simular dos rondas de iteración. La primera fila utiliza alpha = 1 para recortar las aristas. Se puede ver que la estrategia de recorte es relativamente radical, y se recorta una gran cantidad de aristas. Después de aumentar el valor de alpha y relajar las condiciones de recorte, obviamente se vuelven a añadir muchas aristas. En el gráfico final, se añaden bastantes aristas largas. Puede reducir eficazmente el radio de búsqueda.
DiskANN
Un ordenador personal con solo 64GB de memoria ni siquiera podría contener mil millones de piezas de datos sin procesar, y mucho menos el índice construido sobre ellas. Hay dos desafíos por delante: 1. ¿Cómo indexar un conjunto de datos a tan gran escala con recursos de memoria limitados? 2. ¿Cómo calcular la distancia al buscar si los datos originales no pueden cargarse en memoria?
El artículo propuso las siguientes soluciones:
Para el primer desafío: primero, dividir los datos en k clústeres usando k-means, y luego asignar cada punto a los i clústeres más cercanos. Generalmente, 2 es suficiente para el número i. Construir un índice Vamana basado en memoria para cada clúster y, finalmente, fusionar k índices Vamana en uno.
Para el segundo desafío: construir el índice sobre los vectores originales y consultar vectores comprimidos. Construir índices sobre el vector original garantiza la calidad del grafo, mientras que el vector comprimido puede cargarse en la memoria para una búsqueda de grano grueso. Aunque buscar con los vectores comprimidos puede causar una pérdida de precisión, la dirección general será correcta siempre que la calidad del grafo sea lo suficientemente alta. El resultado final de distancia se calculará usando el vector original.
El diseño del índice de DiskANN es similar al de los índices de grafos generales. El conjunto de vecinos de cada punto y los datos del vector original se almacenan juntos. Esto hace un mejor uso de la localidad de los datos.
Como se mencionó anteriormente, si los datos del índice se almacenan en el SSD, el número de accesos a disco y las solicitudes de lectura y escritura en disco deben reducirse tanto como sea posible para garantizar una baja demora de búsqueda. Por lo tanto, DiskANN propone dos estrategias de optimización:
Caché de puntos calientes: almacenar en caché en memoria todos los puntos dentro de C saltos desde el punto de partida. Es mejor establecer el valor de C entre 3 y 4.
Búsqueda por haz: En pocas palabras, consiste en precargar la información de vecinos. Al buscar el punto p, el punto vecino de p debe cargarse desde el disco si no está en memoria. Dado que una pequeña cantidad de operaciones de acceso aleatorio al SSD toma aproximadamente el mismo tiempo que una operación de acceso a un único sector del SSD, la información de vecinos de W puntos no accedidos puede cargarse a la vez. W no puede establecerse ni demasiado grande ni demasiado pequeño. Un W grande desperdiciará recursos de cómputo y ancho de banda del SSD, mientras que uno pequeño aumentará la demora de búsqueda.
Experimento
El experimento consta de tres grupos:
Comparación entre índices basados en memoria: Vamana VS. NSG VS. HNSW
Conjuntos de datos: SIFT1M (128 dimensiones), GIST1M (960 dimensiones), DEEP1M (96 dimensiones) y un conjunto de datos de 1M muestreado aleatoriamente de DEEP1B.
Parámetros de índice (todos los conjuntos de datos utilizan el mismo conjunto de parámetros):
HNSW:M = 128, efc = 512.
Vamana: R = 70, L = 75, alpha = 1.2.
NSG: R = 60, L = 70, C= 500.
Los parámetros de búsqueda no se proporcionan en el artículo, lo que puede ser coherente con los parámetros de indexación. Para la selección de parámetros, los parámetros de NSG mencionados en el artículo se basan en los parámetros enumerados en el repositorio de GitHub de NSG para seleccionar el grupo con mejor rendimiento. Vamana y NSG son relativamente cercanos, por lo que los parámetros también se establecen cercanos. Sin embargo, no se da la razón de la selección de parámetros de HNSW. Creemos que el parámetro M de HNSW está establecido relativamente grande. Podría conducir a una comparación menos convincente entre índices basados en grafos si sus grados de salida no se establecen al mismo nivel.
Bajo los parámetros de indexación anteriores, el tiempo de indexación de Vamana, HNSW y NSG es de 129s, 219s y 480s respectivamente. El tiempo de indexación de NSG incluye el tiempo para construir el grafo de vecinos inicial con EFANN [3].
Curva Recall-QPS:
Figura 2.
Se puede ver en la Figura 3 que Vamana tiene un rendimiento excelente en los tres conjuntos de datos, similar a NSG y ligeramente mejor que HNSW.
Comparación del radio de búsqueda:
De la Figura 2.c, podemos ver que Vamana tiene la ruta de búsqueda promedio más corta bajo la misma tasa de recall en comparación con las de NSG y HNSW.
Comparación entre un índice construido de una sola vez y un índice grande fusionado
Conjunto de datos: SIFT1B
Los parámetros del índice construido de una sola vez: L = 50, R = 128, alpha = 1.2. Después de ejecutarse durante 2 días en una máquina DDR3 de 1800G, la memoria máxima es de aproximadamente 1100 G, y el out-degree promedio es 113.9.
Procedimiento de indexación basado en la fusión:
Entrenar 40 clústeres en el conjunto de datos usando kmeans;
Cada punto se distribuye en los 2 clústeres más cercanos;
Construir un índice Vamana con L = 50, R = 64 y alpha = 1.2 para cada clúster;
Fusionar los índices de cada clúster.
Este índice generó un índice de 384GB con un out-of-degree promedio de 92.1. Este índice se ejecutó durante 5 días en una máquina DDR4 de 64GB.
Los resultados de la comparación son los siguientes (Figura 2a):
Figura 3.
En conclusión:
El índice construido de una sola vez es significativamente mejor que el índice basado en fusión;
El índice basado en fusión también es excelente;
El esquema de indexación basado en fusión también es aplicable al conjunto de datos DEEP1B (Figura 2b).
Índice basado en disco: DiskANN VS. FAISS VS. IVF-OADC+G+P
IVFOADC+G+P es un algoritmo propuesto en la Referencia [5].
Este artículo solo compara DiskANN con IVFOADC+G+P, ya que la referencia [5] ha demostrado que IVFOADC+G+P es mejor que FAISS. Además, FAISS requiere recursos de GPU, que no son compatibles con todas las plataformas.
IVF-OADC+G+P parece ser una combinación de HNSW e IVF-PQ. Determina clústeres usando HNSW, y realiza la búsqueda añadiendo algunas estrategias de poda al clúster objetivo.
El resultado está en la Figura 2a. El 16 y el 32 en la figura son el tamaño del codebook. El conjunto de datos es SIFT1B, cuantificado por OPQ.
Detalles de implementación del código
El código fuente de DiskANN es open-source en https://github.com/microsoft/DiskANN
En enero de 2021, el código fuente de la solución de disco se hizo open-source.
A continuación se presenta principalmente el proceso de indexación y el proceso de búsqueda.
Construcción del índice
Hay 8 parámetros para construir el índice:
data_type: las opciones incluyen float/int8/uint8.
data_file.bin: El archivo binario de datos original. Los dos primeros enteros del archivo representan respectivamente el número total n de vectores del conjunto de datos y la dimensión dim del vector. Los últimos n * dim * sizeof(data_type) bytes son datos vectoriales continuos.
index_prefix_path: El prefijo de ruta del archivo de salida. Después de construir el índice, se generarán varios archivos relacionados con el índice. Este parámetro es el prefijo común del directorio donde se almacenan.
R: El out-degree máximo del índice global.
L: El parámetro L del índice Vamana, el límite superior del tamaño del conjunto de candidatos.
B: El umbral de memoria al consultar. Controla el tamaño del codebook PQ, en GB.
M: El umbral de memoria al construir un índice. Determina el tamaño del fragmento, en GB.
T: El número de hilos.
Proceso de indexación (función de entrada: aux_utils.cpp::build_disk_index):
Generar varios nombres de archivos de salida según index_prefix_path.
Verificación de parámetros.
Leer los metadatos de data_file.bin para obtener n y dim. Determinar el número de subespacios de codebook m de PQ según B y n.
generate_pq_pivots: Muestrear el punto central del conjunto de entrenamiento de PQ usando la tasa de muestreo de p = 1500000/n uniformemente para entrenar PQ globalmente.
generate_pq_data_from_pivots: Generar el codebook PQ global, y guardar el punto central y el codebook por separado.
build_merged_vamana_index: dividir el conjunto de datos original, construir índices Vamana en segmentos y finalmente fusionar los índices en uno.
partition_with_ram_budget: Determinar el número de fragmentos k según el parámetro M. Muestrear el conjunto de datos usando kmeans, distribuyendo cada punto a los dos clústeres más cercanos. Fragmentar el conjunto de datos, y cada fragmento produce dos archivos: un archivo de datos y un archivo de ID. El archivo de ID y el archivo de datos se corresponden entre sí, y cada ID en el archivo de ID corresponde a un vector en el archivo de datos. Los ID se obtienen numerando cada vector de los datos originales de 0 a n-1. El ID es relativamente importante y está relacionado con la fusión.
Muestrear globalmente de forma uniforme el conjunto de entrenamiento con una tasa de muestreo de 1500000 / n;
Inicializar num_parts = 3. Iterar desde 3:
- Hacer num_parts-means++ en el conjunto de entrenamiento en el paso i;
- Usar una tasa de muestreo de 0.01 para muestrear un conjunto de prueba de forma uniforme globalmente, y dividir el conjunto de prueba en los 2 clústeres más cercanos;
- Contar el número de puntos en cada clúster y dividirlo por la tasa de muestreo para estimar el número de puntos en cada clúster;
- Estimar la memoria requerida por el clúster más grande en el paso 3 según el tamaño del índice Vamana; si no excede el parámetro M, continuar al paso iii; de lo contrario, num_parts ++ y volver al paso 2;
Dividir el conjunto de datos original en num_parts archivos de grupo, cada grupo de archivos incluye archivos de datos fragmentados y archivos de ID correspondientes a los datos fragmentados.
Crear índices Vamana por separado para todos los fragmentos del paso a y guardarlos en disco;
merge_shards: fusionar num_parts fragmentos Vamana en un índice global:
Leer el archivo de ID de num_parts fragmentos en idmap. Este idmap equivale a establecer un mapeo directo de fragmento->id;
Establecer un mapeo inverso de id-> fragmentos según idmap, y saber en qué dos fragmentos está cada vector;
Usar un lector con caché de 1GB para abrir num_parts índices Vamana de fragmentos, y usar un escritor con caché de 1GB para abrir el archivo de salida, listo para fusionar;
Colocar num_parts puntos de navegación del índice Vamana en el archivo de puntos centrales, que se usará al buscar;
Comenzar a fusionar según el ID de menor a mayor, leer el conjunto de puntos vecinos de cada vector original en cada fragmento por turno según el mapeo inverso, eliminar duplicados, mezclar, truncar y escribir en el archivo de salida. Debido a que el particionado originalmente estaba ordenado globalmente, y ahora la fusión también está en orden, el ID en el índice final volcado y el ID de los datos originales tienen una correspondencia uno a uno.
Eliminar archivos temporales, incluidos archivos de fragmentos, índices de fragmentos y archivos de ID de fragmentos.
7.create_disk_layout: El índice global generado en el paso 6 solo tiene únicamente una tabla de adyacencia compacta. Este paso es para alinear el índice. La tabla de adyacencia y los datos originales se almacenan juntos. Al buscar, se carga la tabla de adyacencia y se lee el vector original junto con ella para un cálculo de distancia preciso. También existe el concepto de SECTOR, cuyo tamaño predeterminado es 4096. Cada SECTOR solo contiene 4096 / node_size piezas de información de vector. node_size = tamaño de un solo vector + tamaño de la tabla de adyacencia de un solo nodo.
8.Finalmente, hacer un muestreo uniforme global de 150000 / n, guardarlo y usarlo para warmup al buscar.
Búsqueda
Hay 10 parámetros de búsqueda:
index_type: Las opciones incluyen Float/int8/uint8, similar al primer parámetro data_type al construir un índice.
index_prefix_path: Consultar el parámetro de índice index_prefix_path.
num_nodes_to_cache: Número de puntos calientes de caché.
num_threads: Número de hilos de búsqueda.
beamwidth: Límite superior del número de puntos de precarga. El sistema determina si se establece en 0.
query_file.bin: Archivo del conjunto de consultas.
truthset.bin: Archivo del conjunto de resultados, "null" significa que no se proporciona el conjunto de resultados, el programa lo calcula por sí mismo;
K: topk;
result_output_prefix: Ruta para guardar los resultados de búsqueda;
L*: Lista de parámetros de búsqueda. Se pueden agregar múltiples valores. Para cada L, se proporcionará información estadística al buscar con diferentes L.
Proceso de búsqueda:
Cargar datos relacionados: cargar el conjunto de consultas, los datos de puntos centrales de PQ, los datos del codebook, el punto de inicio de búsqueda y otros datos, y leer los metadatos del índice.
Usar el conjunto de datos muestreado durante la indexación para realizar cached_beam_search, contar las veces de acceso de cada punto y cargar en la caché los num_nodes_to_cache puntos con la mayor frecuencia de acceso.
Hay una operación WARMUP por defecto. Al igual que en el paso 2, este conjunto de datos de muestra también se usa para realizar un cached_beam_search.
Según el número de parámetros L dados, cada L se ejecutará con cached_beam_search nuevamente con el conjunto de consultas, y se generarán estadísticas como la tasa de recall y QPS. El proceso de warmup y los datos hotspot de estadísticas no se contabilizan en el tiempo de consulta.
Acerca de cached_beam_search:
Encontrar el candidato más cercano al punto de consulta desde el punto inicial candidato. Aquí se usa la distancia PQ, y el punto inicial se agrega a la cola de búsqueda.
Comenzar la búsqueda:
Desde la cola de búsqueda, no hay más de beam_width + 2 puntos no visitados. Si estos puntos están en la caché, agréguelos a la cola de aciertos de caché. Si no aciertan, agréguelos a la cola de fallos. Asegúrese de que el tamaño de la cola de fallos no exceda beam_width.
Enviar solicitudes asincrónicas de acceso a disco a los puntos en la cola de fallos.
Para los puntos acertados por la caché, usar los datos originales y los datos de consulta para calcular la distancia exacta, agregar a la cola de resultados y luego usar PQ para calcular la distancia a los puntos vecinos que no han sido visitados antes de agregarlos a la cola de búsqueda. La longitud de la cola de búsqueda está limitada por parámetros.
Procesar los puntos de fallo de caché en el paso a, de forma similar al paso c.
Cuando la cola de búsqueda está vacía, la búsqueda termina y se devuelve el topk de la cola de resultados.
Resumen
Aunque este es un trabajo relativamente extenso, en general es excelente. Las ideas del artículo y del código son claras: dividir una serie de buckets superpuestos mediante k-means, y luego dividir los buckets para construir un índice de mapa, y finalmente fusionar los índices, lo cual es una idea relativamente nueva. En cuanto al índice de grafo basado en memoria Vamana, es esencialmente una versión inicializada aleatoriamente de NSG que puede controlar la granularidad del recorte. Al consultar, aprovecha al máximo la caché + pipeline, oculta parte del tiempo de io y mejora QPS. Sin embargo, según el artículo, incluso si las condiciones de la máquina no son extraordinarias, el tiempo de entrenamiento llega hasta 5 días, y la usabilidad es relativamente baja. Las optimizaciones del entrenamiento son definitivamente necesarias en el futuro. Desde la perspectiva del código, la calidad es relativamente alta y puede usarse directamente en el entorno de producción.
Referencias
[Cong Fu, Chao Xiang, Changxu Wang, and Deng Cai. Búsqueda rápida aproximada de vecinos más cercanos con los grafos de expansión navegante. PVLDB, 12(5):461 – 474, 2019. doi: 10.14778/3303753.3303754.] (http://www.vldb.org/pvldb/vol12/p461-fu.pdf)
Cong Fu and Deng Cai. GitHub - ZJULearning/efanna: biblioteca rápida para búsqueda ANN y construcción de grafos KNN.
Motor de búsqueda para AI:solución industrial para recuperación de datos de alta dimensión
Sigue leyendo

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Announcing the General Availability of Zilliz Cloud BYOC on Google Cloud Platform
Zilliz Cloud BYOC on GCP offers enterprise vector search with full data sovereignty and seamless integration.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.



