Da CLIP a JinaCLIP: apprendimento generale di rappresentazioni testo-immagine per la ricerca e RAG multimodale
Recentemente, l'impennata dei modelli di embedding multimodali ha catturato l'attenzione in vari settori, trasformando il modo in cui le macchine interpretano testo e immagini. Tuttavia, nonostante i significativi progressi, questi modelli affrontano sfide fondamentali, una delle quali è il divario di modalità. Questo divario si manifesta nel fatto che gli embedding di immagini e testo sono spazialmente distanti nello spazio latente, anche quando descrivono lo stesso oggetto.
In un recente Unstructured Data Meetup ospitato da Zilliz, Bo Wang, Engineering Manager presso Jina AI, ci ha guidati attraverso le complessità del divario di modalità e la transizione dal modello CLIP di OpenAI a JinaCLIP.
In questo blog, riepilogheremo i suoi punti principali e implementeremo anche un sistema di ricerca di similarità multimodale. Questo sistema utilizzerà JinaCLIP per generare embedding multimodali e il database vettoriale Milvus per archiviare e recuperare embedding simili data una determinata query. Per maggiori dettagli, ti consigliamo di guardare l'intervento completo di Bo su YouTube.
Cosa rende buono un modello di embedding?
La funzione principale di un modello di embedding è mappare elementi come testi e immagini in vettori, rappresentazioni numeriche che catturano le relazioni semantiche all'interno dei dati. Ad esempio, la distanza tra due vettori dovrebbe riflettere la similarità dei due elementi che rappresentano, siano essi due immagini, due testi o uno di ciascuno.
I modelli di embedding sono al centro delle moderne attività di IA come la ricerca semantica, il recupero di immagini e altro ancora. Ma cosa rende buono un modello di embedding?
Versatilità tra domini
Un buon modello di embedding dovrebbe funzionare bene in un'ampia gamma di domini senza richiedere fine-tuning. Questa adattabilità garantisce che gli embedding siano universalmente utili, sia che l'input sia testo, immagini o altri tipi di dati. Ad esempio, se un'immagine viene incorporata in uno spazio vettoriale e un testo correlato viene incorporato nello stesso spazio, i due embedding dovrebbero essere vicini, a indicare la loro similarità semantica. Questa ampia applicabilità è essenziale per attività di IA come la ricerca di similarità, il recupero di immagini e le applicazioni cross-domain.
Similarità semantica accurata
Una caratteristica chiave di un buon modello di embedding è la sua capacità di collegare sinistra e destra producendo embedding con punteggi di similarità elevati per elementi semanticamente correlati. Questo va oltre i soli dati testuali, si applica a qualsiasi input multimodale. Che si confronti testo con testo, immagine con immagine o testo con immagine, il modello dovrebbe riflettere le relazioni corrette attraverso la prossimità degli embedding nello spazio vettoriale.
Tuttavia, i modelli più vecchi che collegavano le modalità testo e immagine avevano più difficoltà a raggiungere questo obiettivo. Si basavano su processi manuali, come l'etichettatura delle immagini o l'uso del testo circostante, per stabilire connessioni. Questi metodi portavano a una scarsa generalizzazione, in particolare negli scenari fuori distribuzione.
La sfida delle attività multimodali
Prima dell’introduzione di modelli come CLIP, collegare modalità diverse (testo e immagini) era un’attività altamente manuale e guidata da ipotesi. Che si trattasse di tag di Flickr o di descrizioni testuali aggiunte dagli utenti, il processo era tutt’altro che fluido. Gli approcci supervisionati, spesso basati su etichette di classificatori, erano soggetti a instabilità e le loro prestazioni fuori dominio erano insoddisfacenti. Ciò significava che, sebbene fosse possibile collegare immagini e testi, i risultati non erano sempre coerenti, soprattutto quando l’input era complesso.
Per risolvere questo problema, CLIP, un modello di preaddestramento contrastivo linguaggio-immagine, è stato sviluppato per migliorare le prestazioni dei modelli multimodali addestrandoli su coppie immagine-testo. La capacità di CLIP di allineare le due modalità in uno spazio di embedding condiviso è stata innovativa. Tuttavia, anche questo modello ha i suoi limiti.
Modello CLIP: una svolta con limitazioni
CLIP ha stabilito un nuovo standard addestrando due encoder separati, uno per il testo e uno per le immagini. L’idea centrale era apprendere uno spazio di embedding condiviso in cui i vettori di testo e immagine potessero coesistere, con testi e immagini semanticamente simili posizionati più vicini tra loro. I risultati sono stati impressionanti: CLIP ha consentito attività multimodali utilizzando una semplice funzione di similarità coseno.
Figura: Come funziona il modello CLIP
Tuttavia, CLIP presenta delle carenze. Un problema significativo è la sua incapacità di gestire efficacemente attività solo testuali. Poiché CLIP è stato ottimizzato principalmente per didascalie brevi (spesso inferiori a 77 caratteri), i testi più lunghi rappresentano una sfida. Inoltre, CLIP mancava di esempi hard-negative nel suo processo di addestramento. Gli hard negative sono esempi vicini ma errati e sono cruciali per perfezionare i modelli, soprattutto in attività come il recupero di testi. Senza di essi, le prestazioni di CLIP hanno raggiunto un plateau nelle attività che richiedono una comprensione testuale dettagliata.
Passaggio a JinaCLIP: affrontare le carenze di Clip
JinaCLIP si basa sull’architettura CLIP originale per affrontarne i limiti. Espande l’input testuale e utilizza un’architettura BERT v2 adattata per la codifica del testo. Per l’elaborazione delle immagini, JinaCLIP incorpora il modello EVA-02. Il processo di addestramento di JinaCLIP si concentra sul superamento delle sfide poste dagli input testuali brevi nelle didascalie delle immagini e sull’introduzione di hard negative. Questo processo avviene in tre fasi, come mostrato di seguito:
Figura: Processo di addestramento di JinaCLIP
Le fasi sono apprendimento dell’allineamento, integrazione di testi lunghi e fine-tuning:
Apprendimento dell’allineamento con testi brevi e didascalie: In questa fase, il modello viene addestrato utilizzando sia dati di immagini con didascalie sia coppie di testi con significati simili. L’obiettivo è allineare gli embedding di immagini e testo ottimizzando congiuntamente la similarità testo-immagine e testo-testo. Questo processo di co-addestramento garantisce che, mentre il modello impara ad associare il testo alle immagini, mantenga anche le sue capacità solo testuali. Sebbene le prestazioni solo testuali diminuiscano leggermente rispetto all’addestramento esclusivo su coppie di testi, questa fase preserva un approccio equilibrato.
Integrazione di descrizioni testuali lunghe: Durante la seconda fase, vengono introdotti dati sintetici per addestrare il modello. Questi dati allineano le immagini con testi più lunghi generati da modelli di IA, descrivendo il contenuto in maggiore dettaglio. Parallelamente, le coppie solo testuali continuano a essere utilizzate per l’addestramento. Il modello impara a gestire descrizioni testuali più estese mantenendo l’allineamento con le immagini, migliorando la sua capacità di comprendere relazioni testo-immagine sia brevi sia lunghe.
Fine-tuning con triplette di testo e negativi difficili: La fase finale si concentra sull’uso di triplette di testo che includono negativi difficili, coppie di testi in cui due sono semanticamente simili, ma uno è deliberatamente diverso. Questo aiuta il modello a fare distinzioni semantiche più sottili, soprattutto in scenari solo testuali. Allo stesso tempo, il modello continua ad addestrarsi con coppie sintetiche immagine-testo lungo. Questa fase migliora significativamente le prestazioni solo testuali del modello, garantendo al contempo che l’allineamento immagine-testo appreso nelle fasi precedenti rimanga robusto.
Questo approccio mantiene prestazioni elevate nei task multimodali, migliorando al contempo le capacità negli scenari solo testuali. Vediamo come questo nuovo approccio si confronta con il Clip originale.
Le metriche di performance indicano cambiamenti nelle prestazioni di recupero rispetto al modello CLIP originale: una variazione del 165% nel recupero testo-testo, del 12% in immagine-immagine, del 6% in immagine-testo e del 2% in testo-immagine, come mostrato nell’immagine qui sotto.
Figura: Confronto delle prestazioni del modello tra jina-clip, openai-clip-vit-b-16 e jina-embeddings-v2-base-en
Il nuovo processo di addestramento migliora la generalizzazione tra i task e aiuta a ridurre il divario di modalità. Parliamo del divario di modalità, un ostacolo importante nei modelli di IA multimodale, e del perché si verifica questo problema.
Il divario di modalità: perché si verifica
Il divario di modalità è la separazione spaziale tra embedding provenienti da diversi tipi di input, come testi e immagini semanticamente simili ma distanti nello spazio vettoriale. Questo divario indebolisce l’efficacia dei sistemi di recupero multimodale, poiché gli embedding non riflettono pienamente la vera relazione tra input correlati. Come puoi vedere nell’immagine qui sotto, la rappresentazione appare come un cono troncato, con gli embedding delle immagini a un’estremità e gli embedding dei testi all’altra, mostrando chiaramente il divario di modalità.
Figura: Le posizioni iniziali degli embedding di immagini e testo in Jina CLIP, con pesi interamente randomizzati e senza addestramento precedente, proiettate in due dimensioni
Ci sono alcune ragioni chiave per cui questo divario emerge, anche nei modelli moderni:
L’effetto cono durante l’inizializzazione
I modelli multimodali, in particolare quelli che gestiscono input di testo e immagini, spesso utilizzano encoder separati per ciascuna modalità. Questi encoder sono in genere inizializzati con pesi casuali o pre-addestrati, il che fa sì che gli embedding testuali si raggruppino in una regione dello spazio vettoriale e gli embedding delle immagini in un’altra, come si vede nell’immagine sopra. Questa separazione iniziale, chiamata effetto cono, rende difficile allineare correttamente gli embedding provenienti da modalità diverse (ad es. immagini e testi correlati). Ad esempio, l’embedding testuale per un gatto soffice e l’embedding dell’immagine di un gatto possono iniziare molto distanti a causa di questo bias di inizializzazione, anche se sono semanticamente correlati.
Scaling della temperatura
Durante l’addestramento, i modelli di IA utilizzano una tecnica chiamata scaling della temperatura nella loro funzione di perdita contrastiva per regolare quanto strettamente gli embedding vengono allineati. Sebbene aiuti a perfezionare le distanze tra gli embedding, lo scaling della temperatura può anche preservare involontariamente la separazione iniziale tra le modalità, rafforzando il divario di modalità. Ad esempio, se lo scaling della temperatura non è regolato con cura, gli embedding per un cucciolo giocoso e l’immagine di un cane potrebbero rimanere troppo distanti nello spazio vettoriale, anche se descrivono lo stesso concetto.
Falsi negativi nel batch
Quando si addestra con grandi dataset, le coppie non corrispondenti di punti dati (ad es., un’immagine di un cane abbinata al testo “una mela rossa”) vengono trattate come esempi negativi. Tuttavia, questi falsi negativi potrebbero comunque condividere una certa sovrapposizione semantica. Per esempio, se entrambi gli elementi sono correlati a un’ampia categoria di animali (ad es., una foto di un cane e il testo “un lupo giocoso”), il modello potrebbe allontanare questi embedding più del necessario, peggiorando ulteriormente il modality gap trattandoli erroneamente come completamente non correlati.
Capire perché si verifica il modality gap è solo il primo passo. Per colmare questo divario, sono state sviluppate varie strategie di addestramento per avvicinare gli embedding di diverse modalità, garantendo un recupero più accurato nei task multimodali.
Affrontare il Modality Gap: tecniche di addestramento e oltre
Il modality gap è un problema strutturale che non ha una soluzione semplice, ma esistono strategie per mitigarne l’impatto. La chiave è ridurre la separazione tra gli embedding di diverse modalità durante l’addestramento, assicurando che immagini e testi che appartengono insieme siano mappati più vicini nello spazio vettoriale.
Scaling della temperatura più elevato
In pratica, aumentare la temperatura durante l’addestramento può incoraggiare gli embedding di diverse modalità ad avvicinarsi aggiungendo più casualità al processo di apprendimento del modello. Per esempio, aumentare la temperatura può aiutare ad allineare più strettamente gli embedding di un’immagine di un gatto e del testo “un gatto soffice”. Tuttavia, questo avviene al costo di una convergenza più lenta e richiede maggiori risorse computazionali. Sebbene i modelli addestrati con scaling ad alta temperatura tendano a migliorare l’allineamento degli embedding di testo e immagini, il compromesso è spesso rappresentato da tempi di addestramento più lunghi e maggiori esigenze computazionali.
Campionamento hard-negative
L’introduzione di esempi hard-negative, coppie non corrispondenti che sono semanticamente vicine, è un’altra tecnica per ridurre il modality gap. Queste coppie hard-negative spingono il modello a imparare distinzioni più fini tra concetti correlati, migliorando l’accuratezza del recupero. Per esempio, abbinare un’immagine di un gatto al testo “una piccola tigre” potrebbe sembrare una mancata corrispondenza, ma il modello impara che questi due input hanno semantiche sovrapposte (entrambi sono felini) e dovrebbero comunque essere in qualche modo allineati nello spazio degli embedding. Questo processo insegna al modello a riconoscere sia le somiglianze sia le differenze tra concetti correlati, affinando la sua capacità di distinguere tra corrispondenze vicine.
Recupero multimodale con Milvus e JinaCLIP: un esempio pratico
Ora che abbiamo esplorato le ragioni tecniche alla base del modality gap, approfondiamo un esempio pratico di come costruire un sistema di recupero multimodale usando Milvus, un database vettoriale open-source, e JinaCLIP.
Milvus gestisce, cerca e interroga vettori ad alta dimensionalità, rendendolo una soluzione ideale per task di recupero multimodale e task di Retrieval Augmented Generation (RAG). Che tu stia lavorando con testo, immagini o altri tipi di dati, Milvus ti consente di archiviare gli embedding in modo efficiente e recuperare risultati pertinenti utilizzando tecniche avanzate di ricerca per similarità.
In questa sezione, illustreremo il processo di utilizzo di Milvus per creare un sistema di recupero multimodale che gestisce embedding di testo e immagini. Il sistema consentirà agli utenti di inserire testo o immagini e recuperare i risultati semanticamente più rilevanti da un dataset misto.
Passaggio 1: configurazione dell’ambiente
Per prima cosa, dobbiamo installare nel nostro ambiente le librerie di cui avremo bisogno per il nostro sistema:
!pip install pymilvus transformers torch timm
Poi, dobbiamo importare le librerie necessarie e configurare la nostra classe encoder.
# Import necessary libraries
from transformers import AutoModel
from pymilvus import MilvusClient
import torch
# Definire la classe Encoder per gestire la generazione di embedding di testo e immagini
class Encoder:
def __init__(self, model_name: str):
# Initialize the model (AutoModel from transformers instead of SentenceTransformer)
self.model = AutoModel.from_pretrained(model_name, trust_remote_code=True)
def encode_text(self, text: list[str]) -> list[float]:
# Generate embeddings for text only
with torch.no_grad():
text_emb = self.model.encode_text(text)
return text_emb
def encode_image(self, image_urls: list[str]) -> list[list[float]]:
# Generate embeddings for images only
with torch.no_grad():
image_emb = self.model.encode_image(image_urls)
return image_emb
# Initialize the encoder with the model jinaai/jina-clip-v1
model_name = "jinaai/jina-clip-v1"
encoder = Encoder(model_name)
Nel codice sopra, importiamo innanzitutto le librerie necessarie: AutoModel da transformers per il nostro modello di encoding, MilvusClient per interagire con Milvus e torch per le operazioni sui tensori.
Definiamo quindi una classe Encoder che incapsula AutoModel da transformers. I metodi encode_text e encode_image utilizzano il modello per generare embedding rispettivamente per testo e immagini. Il context manager torch.no_grad() viene utilizzato per disabilitare il calcolo dei gradienti, che non è necessario per l'inferenza e consente di risparmiare memoria.
Infine, inizializziamo l'encoder con il modello jinaai/jina-clip-v1, che può codificare sia testo sia immagini in uno spazio di embedding condiviso.
Passaggio 2: Preparazione dei dati
Successivamente, prepareremo i nostri dati di esempio per l'embedding e l'inserimento in Milvus.
# Load data: images and text for embeddings
sentences = ['A blue cat', 'A red cat', 'A red cat generated by AI', 'A dog biting on a stick']
image_urls = [
'https://i.pinimg.com/600x315/21/48/7e/21487e8e0970dd366dafaed6ab25d8d8.jpg',
'https://i.pinimg.com/736x/c9/f2/3e/c9f23e212529f13f19bad5602d84b78b.jpg',
'https://images.fineartamerica.com/images/artworkimages/mediumlarge/1/red-cat-art-3771-bb-james-ahn.jpg',
'https://images.squarespace-cdn.com/content/v1/54822a56e4b0b30bd821480c/29708160-9b39-42d0-a5ed-4f8b9c85a267/labrador+retriever+dans+pet+care.jpeg?format=1500w'
]
# Generate embeddings for text and images
text_embeddings = encoder.encode_text(sentences)
image_embeddings = encoder.encode_image(image_urls)
# Ensure consistent dimensions
dim = len(image_embeddings[0])
Qui, definiamo liste di frasi di esempio e URL di immagini. Gli URL contengono immagini di gatti rossi, gatti blu e un cane. Utilizziamo quindi il nostro encoder per generare embedding sia per il testo sia per le immagini. La variabile dim memorizza la dimensione degli embedding, che ci servirà quando creeremo la nostra collection Milvus.
Passaggio 3: Configurazione di Milvus
Ora configureremo il nostro client Milvus e creeremo una collection per i nostri dati multimodali.
# Insert embeddings into Milvus
collection_name = "multimodal_rag_demo"
milvus_client = MilvusClient(uri="./milvus_demo.db")
# Check if collection exists and drop it if so
if milvus_client.has_collection(collection_name):
print(f"Collection {collection_name} already exists. Deleting it...")
milvus_client.drop_collection(collection_name)
# Create Milvus collection
milvus_client.create_collection(
collection_name=collection_name,
auto_id=True,
dimension=dim,
enable_dynamic_field=True,
)
Inizializziamo un client Milvus e ci connettiamo a un file di database locale. Verifichiamo se esiste già una collection con il nome desiderato e, in tal caso, la eliminiamo per garantire una base pulita.
Creiamo quindi una nuova collection con il nome specificato. Il parametro auto_id=True indica a Milvus di generare automaticamente gli ID per le nostre voci. Impostiamo dimension in modo che corrisponda ai nostri embedding e abilitiamo i campi dinamici, il che ci consente di aggiungere metadati aggiuntivi alle nostre voci.
Passaggio 4: Creazione di un indice
Prima di inserire i dati, creeremo un indice per ottimizzare le prestazioni di ricerca:
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="vector", # The field to be indexed (your embedding field)
metric_type="COSINE", # Can be L2, COSINE, etc.
index_type="FLAT", # FLAT ensures exact search, ideal for small datasets
)
# Create the index for the collection
milvus_client.create_index(collection_name, index_params)
print(f"Index created successfully for collection: {collection_name}")
Il codice sopra crea un indice FLAT utilizzando la similarità coseno come metrica di distanza.
Passaggio 5: Inserimento dei dati in Milvus
Con la nostra raccolta e il nostro indice configurati, ora possiamo inserire i nostri dati in Milvus.
data_to_insert = []
# Insert text embeddings
for idx, txt_emb in enumerate(text_embeddings):
data_to_insert.append({"text": sentences[idx], "vector": txt_emb})
# Insert image embeddings
for idx, img_emb in enumerate(image_embeddings):
data_to_insert.append({"image_url": image_urls[idx], "vector": img_emb})
# Insert data into Milvus
insert_result = milvus_client.insert(
collection_name=collection_name,
data=data_to_insert,
)
print(f"Insert result: {insert_result}")
milvus_client.load_collection(collection_name)
Nel codice sopra, creiamo un elenco di dizionari, ciascuno contenente una frase di testo o un URL di immagine, insieme al suo vettore di embedding corrispondente. Utilizziamo quindi il metodo insert del client Milvus per aggiungere questi dati alla nostra raccolta. Dopo l'inserimento, carichiamo la raccolta in memoria per prepararci alla ricerca.
Passaggio 6: Esecuzione della ricerca multimodale
Infine, eseguiamo una ricerca multimodale utilizzando sia query di immagini sia query di testo.
# Multimodal search with a combination of image and text query
query_image_url = 'https://imgcdn.stablediffusionweb.com/2024/4/5/5e70d71c-a7f6-44e9-972d-8c5a27d45c3d.jpg'
query_text = "Give me similar red cats"
# Generate query embedding (image + text)
query_embedding_image = encoder.encode_image([query_image_url])[0]
query_embedding_text = encoder.encode_text([query_text])[0]
# Perform search in Milvus using image embedding
search_results_image = milvus_client.search(
collection_name=collection_name,
data=[query_embedding_image],
output_fields=["image_url", "text"], # Ensure both fields are included in the results
limit=5, # Number of results to return
search_params={"metric_type": "COSINE", "params": {"nprobe": 10}}
)
# Perform search in Milvus using text embedding
search_results_text = milvus_client.search(
collection_name=collection_name,
data=[query_embedding_text],
output_fields=["image_url", "text"], # Ensure both fields are included in the results
limit=5, # Number of results to return
search_params={"metric_type": "COSINE", "params": {"nprobe": 10}}
)
# Retrieve and print results from image query
print("Image Query Results:")
for result in search_results_image:
for hit in result:
image_url = hit['entity'].get('image_url')
text = hit['entity'].get('text')
if image_url:
print(f"Retrieved Image URL (from image query): {image_url}")
if text:
print(f"Retrieved Text (from image query): {text}")
# Retrieve and print results from text query
print("Text Query Results:")
for result in search_results_text:
for hit in result:
image_url = hit['entity'].get('image_url')
text = hit['entity'].get('text')
if image_url:
print(f"Retrieved Image URL (from text query): {image_url}")
if text:
print(f"Retrieved Text (from text query): {text}")
Nel codice precedente, dimostriamo il processo di esecuzione di una ricerca multimodale. Iniziamo definendo sia un URL dell'immagine di query sia un testo di query. L'immagine di query appare così:
Figura 2: Immagine di input della query di un gatto rosso e bianco
Codifichiamo quindi queste query usando il nostro encoder per generare i rispettivi embedding. Successivamente conduciamo due ricerche separate in Milvus: una usando l'embedding dell'immagine e un'altra usando l'embedding del testo. Per ogni ricerca, richiediamo sia i campi image_url sia text nell'output, consentendoci di recuperare entrambi i tipi di dati. Limitiamo i risultati a 5 per ogni ricerca e impieghiamo la similarità coseno come metrica di distanza. Il parametro nprobe nei nostri parametri di ricerca ci consente di perfezionare il numero di cluster da cercare, offrendo un equilibrio tra velocità di ricerca e accuratezza. Infine, visualizziamo i risultati, mostrando quali immagini o testi sono stati recuperati per ciascun tipo di query, dimostrando così la capacità del sistema di gestire e correlare sia query basate su testo sia query basate su immagini.
Puoi trovare il codice completo qui.
Ecco alcuni risultati di esempio:
Come puoi vedere, quando usiamo un'immagine per condurre una ricerca vettoriale otteniamo sia URL di immagini sia testo correlato all'immagine e viceversa. Questo è il potere della ricerca multimodale. Ecco una delle immagini che viene recuperata come immagine simile in entrambi i casi.
Figura 3: Immagine di output di un gatto rosso dopo aver condotto una ricerca di similarità in Milvus
Come puoi vedere, l'immagine è simile all'immagine del gatto rosso che abbiamo fornito al sistema come nostra query.
Puoi aggiungere un reranker a questo sistema per ordinare i risultati della ricerca in base alla rilevanza, con i risultati più pertinenti in cima. Anche se, come è evidente, Milvus fa un buon lavoro nel recuperare per prime le migliori corrispondenze. Puoi anche far evolvere questo sistema per creare un sistema RAG multimodale.
Conclusione
Bo Wang ha spiegato le complessità del colmare il divario tra modalità nei modelli multimodali e ha mostrato la transizione da CLIP a JinaCLIP. Ha analizzato le principali sfide dell'allineamento testo-immagine e ha dimostrato come JinaCLIP affronti questi problemi.
In questo articolo, abbiamo ampliato le sue intuizioni costruendo un sistema di ricerca di similarità multimodale usando JinaCLIP per generare embedding e Milvus per ottenere un recupero efficiente. Con queste conoscenze, ora puoi implementare le tue applicazioni di ricerca multimodale, garantendo prestazioni fluide tra query basate su testo e immagini, e persino spingerti oltre integrando tecniche di ricerca avanzate come il reranking.
Ulteriori risorse
Continua a leggere
Stop Building AI Data Infra for the Wrong Stage
Learn how AI data infrastructure should evolve from prototype to enterprise scale, and when Vector Lakebase becomes the right architecture for AI apps.

What Is a Vector Lakebase?
A Vector Lakebase is a unified, lake-native data architecture for AI that combines vector-database-grade serving with open lake storage, reusable lake-level indexes, and a shared semantic layer.

Zilliz Cloud Update: Smarter Autoscaling for Cost Savings, Stronger Compliance with Audit Logs, and More
What's new in Zilliz Cloud? Smarter autoscaling with scale-down, audit logs GA, enhanced SSO, and Milvus 2.6 in Private Preview.


