Genera embedding con MLTransform

Questa pagina spiega perché e come utilizzare la funzionalità MLTransform per preparare i dati per l'addestramento di modelli di machine learning (ML). In particolare, questa pagina mostra come elaborare i dati generando embedding utilizzando MLTransform.

Combinando più trasformazioni di elaborazione dei dati in una sola classe, MLTransform semplifica il processo di applicazione delle operazioni di elaborazione dei dati ML di Apache Beam al flusso di lavoro.

Diagramma del flusso di lavoro ML di Dataflow con il passaggio di elaborazione dei dati evidenziato.

Figura 1. Il flusso di lavoro completo di Dataflow ML. Utilizza MLTransform nel passaggio di pre-elaborazione del flusso di lavoro.

Panoramica sugli embedding

Gli embedding sono essenziali per le moderne applicazioni di ricerca semantica e Retrieval-Augmented Generation (RAG). Gli embedding consentono ai sistemi di comprendere e interagire con le informazioni a un livello più profondo e concettuale. Nella ricerca semantica, gli embedding trasformano le query e i documenti in rappresentazioni vettoriali. Queste rappresentazioni acquisiscono il significato e le relazioni sottostanti. Di conseguenza, puoi trovare risultati pertinenti anche quando le parole chiave non corrispondono direttamente. Si tratta di un passo avanti significativo rispetto alla ricerca standard basata su parole chiave. Puoi anche utilizzare gli embedding per i consigli sui prodotti. Sono incluse le ricerche multimodali che utilizzano immagini e testo, l'analisi dei log e attività come la deduplicazione.

All'interno di RAG, gli embedding svolgono un ruolo cruciale nel recupero del contesto più pertinente da una knowledge base per basare le risposte dei modelli linguistici di grandi dimensioni (LLM). Incorporando sia la query dell'utente sia i blocchi di informazioni nella knowledge base, i sistemi RAG possono identificare e recuperare in modo efficiente i pezzi semanticamente più simili. Questa corrispondenza semantica garantisce che l'LLM abbia accesso alle informazioni necessarie per generare risposte accurate e informative.

Importare ed elaborare i dati per gli embedding

Diagramma dell'incorporamento dell'importazione delle conoscenze con i passaggi di elaborazione dei dati di
chunking e generazione di incorporamenti
evidenziati.

Figura 2. Un diagramma di importazione della conoscenza. Mostra i dati dei documenti multimodali di input e due passaggi di elaborazione: suddivisione in blocchi e generazione di embedding. La suddivisione in blocchi è un passaggio di pre-elaborazione utilizzato per i dati complessi prima della generazione degli embedding. Una volta elaborati i dati, gli embedding vengono archiviati in un database vettoriale.

Per i casi d'uso principali degli embedding, la considerazione chiave è come importare ed elaborare la conoscenza. Questa importazione può essere in modalità batch o flusso. L'origine di questa conoscenza può variare notevolmente. Ad esempio, queste informazioni possono provenire da file archiviati in Cloud Storage o da origini di streaming come Pub/Sub o Google Cloud Managed Service per Apache Kafka.

Per le origini di streaming, i dati stessi potrebbero essere i contenuti non elaborati (ad esempio, testo normale) o gli URI che rimandano ai documenti. Indipendentemente dall'origine, la prima fase in genere prevede la pre-elaborazione delle informazioni. Per il testo non elaborato, potrebbe essere minima, ad esempio la pulizia di base dei dati. Tuttavia, per documenti più grandi o contenuti più complessi, un passaggio cruciale è la suddivisione in blocchi. La suddivisione in blocchi comporta la suddivisione del materiale di origine in unità più piccole e gestibili. La strategia di suddivisione in blocchi ottimale non è standardizzata e dipende dai dati e dall'applicazione specifici. Piattaforme come Dataflow offrono funzionalità integrate per gestire le diverse esigenze di suddivisione in blocchi, semplificando questa fase di pre-elaborazione essenziale.

Vantaggi

La classe MLTransform offre i seguenti vantaggi:

  • Genera embedding che puoi utilizzare per inserire i dati nei database vettoriali o per eseguire l'inferenza.
  • Trasforma i dati senza scrivere codice complesso o gestire le librerie sottostanti.
  • Concatena in modo efficiente più tipi di operazioni di elaborazione con un'unica interfaccia.

Supporto e limitazioni

La classe MLTransform presenta le seguenti limitazioni:

  • Disponibile per le pipeline che utilizzano le versioni 2.53.0 e successive dell'SDK Apache Beam Python.
  • Le pipeline devono utilizzare le finestre predefinite.

Trasformazioni di text embedding:

Casi d'uso

I blocchi note di esempio mostrano come utilizzare MLTransform per casi d'uso specifici.

Voglio generare text embedding per il mio LLM utilizzando le pipeline di Agent Platform
Utilizza la classe MLTransform di Apache Beam con l' API text-embeddings delle pipeline di Agent Platform per generare text embedding. I text embedding sono un modo per rappresentare il testo come vettori numerici, necessari per molte attività di elaborazione del linguaggio naturale (NLP).
Voglio generare text embedding per il mio LLM utilizzando Hugging Face
Utilizza la classe MLTransform di Apache Beam con i modelli di Hugging Face Hub per generare text embedding. Il framework SentenceTransformers di Hugging Face utilizza Python per generare embedding di frasi, testo e immagini.
Voglio generare text embedding e importarli in AlloyDB per PostgreSQL
Utilizza Apache Beam, in particolare la classe MLTransform con i modelli di Hugging Face Hub per generare text embedding. Quindi, utilizza VectorDatabaseWriteTransform per caricare questi embedding e i metadati associati in AlloyDB per PostgreSQL. Questo blocco note mostra come creare pipeline di dati Beam in modalità batch e flusso scalabili per popolare un database vettoriale AlloyDB per PostgreSQL. È inclusa la gestione dei dati provenienti da varie origini, come Pub/Sub o tabelle di database esistenti, la creazione di schemi personalizzati e l'aggiornamento dei dati.
Voglio generare text embedding e importarli in BigQuery
Utilizza la classe MLTransform di Apache Beam con i modelli di Hugging Face Hub per generare text embedding dai dati delle applicazioni, ad esempio un catalogo di prodotti. A questo scopo viene utilizzata la trasformazione HuggingfaceTextEmbeddings di Apache Beam. Questa trasformazione utilizza il framework Hugging Face SentenceTransformers, che fornisce modelli per la generazione di embedding di frasi e testo. Questi embedding generati e i relativi metadati vengono quindi importati in BigQuery utilizzando VectorDatabaseWriteTransform di Apache Beam. Il blocco note mostra inoltre le ricerche sulla similarità vettoriale in BigQuery utilizzando la trasformazione Enrichment.

Per un elenco completo delle trasformazioni disponibili, consulta Trasformazioni nella documentazione di Apache Beam.

Utilizzare MLTransform per la generazione di embedding

Per utilizzare la classe MLTransform per suddividere le informazioni in blocchi e generare embedding, includi il seguente codice nella pipeline:

  
  def create_chunk(product: Dict[str, Any]) -> Chunk:
    return Chunk(
        content=Content(
            text=f"{product['name']}: {product['description']}"
        ),
        id=product['id'],  # Use product ID as chunk ID
        metadata=product,  # Store all product info in metadata
    )

  [...]
  with beam.Pipeline() as p:
    _ = (
            p
            | 'Create Products' >> beam.Create(products)
            | 'Convert to Chunks' >> beam.Map(create_chunk)
            | 'Generate Embeddings' >> MLTransform(
  write_artifact_location=tempfile.mkdtemp())
  .with_transform(huggingface_embedder)
            | 'Write to AlloyDB' >> VectorDatabaseWriteTransform(alloydb_config)
        )

L'esempio precedente crea un singolo blocco per elemento, ma puoi anche utilizzare LangChain per creare i blocchi:

splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=20)
provider = beam.ml.rag.chunking.langchain.LangChainChunker(
document_field='content', metadata_fields=[], text_splitter=splitter)

with beam.Pipeline() as p:
_ = (
p
| 'Create Products' >> beam.io.textio.ReadFromText(products)
| 'Convert to Chunks' >> provider.get_ptransform_for_processing()

Passaggi successivi