Einbettungen mit MLTransform generieren

Auf dieser Seite wird erläutert, warum und wie Sie mit dem Feature MLTransform Daten für das Trainieren von ML-Modellen vorbereiten. Auf dieser Seite wird beschrieben, wie Sie Daten verarbeiten, indem Sie mit MLTransform Einbettungen generieren.

Durch die Kombination mehrerer Datenverarbeitungstransformationen in einer Klasse optimiert MLTransform den Prozess der Anwendung von Apache Beam ML-Datenverarbeitungsabläufe auf Ihren Workflow.

Diagramm des Dataflow ML-Workflows mit hervorgehobenem Schritt zur Datenverarbeitung.

Abbildung 1. Der vollständige Dataflow ML-Workflow. Verwenden Sie MLTransform im Vorverarbeitungsschritt des Workflows.

Einbettungen – Übersicht

Einbettungen sind für moderne Anwendungen für die semantische Suche und Retrieval-Augmented Generation (RAG) unerlässlich. Mithilfe von Einbettungen können Systeme Informationen auf einer tieferen, konzeptionelleren Ebene verstehen und mit ihnen interagieren. Bei der semantischen Suche werden Anfragen und Dokumente mithilfe von Einbettungen in Vektordarstellungen umgewandelt. Diese Darstellungen erfassen die zugrunde liegende Bedeutung und die Beziehungen. So können Sie relevante Ergebnisse finden, auch wenn die Keywords nicht direkt übereinstimmen. Das ist ein großer Fortschritt gegenüber der standardmäßigen keywordbasierten Suche. Sie können auch Embeddings für Produktempfehlungen verwenden. Dazu gehören multimodale Suchanfragen mit Bildern und Text, Log-Analysen und Aufgaben wie die Deduplizierung.

Bei RAG spielen Einbettungen eine entscheidende Rolle beim Abrufen des relevantesten Kontexts aus einer Wissensdatenbank, um die Antworten von Large Language Models (LLMs) zu fundieren. Durch das Einbetten sowohl der Nutzeranfrage als auch der Informationsblöcke in der Wissensdatenbank können RAG-Systeme die semantisch ähnlichsten Teile effizient identifizieren und abrufen. Durch diesen semantischen Abgleich wird sichergestellt, dass das LLM Zugriff auf die erforderlichen Informationen hat, um genaue und informative Antworten zu generieren.

Daten für Einbettungen aufnehmen und verarbeiten

Diagramm der Aufnahme von Wissen in Einbettungen mit hervorgehobenen Datenverarbeitungsschritten: Aufteilen in Chunks und Generieren von Einbettungen.

Abbildung 2. Ein Diagramm zur Wissensaufnahme. Hier sehen Sie die Eingabedaten für multimodale Dokumente und zwei Verarbeitungsschritte: Chunking und Generierung von Einbettungen. Chunking ist ein Vorverarbeitungsschritt, der für komplexe Daten vor der Generierung von Einbettungen verwendet wird. Nach der Verarbeitung der Daten werden die Einbettungen in einer Vektordatenbank gespeichert.

Bei den wichtigsten Anwendungsfällen für Einbettungen geht es darum, wie Wissen aufgenommen und verarbeitet wird. Die Aufnahme kann entweder im Batch- oder im Streaming-Verfahren erfolgen. Die Quelle dieses Wissens kann sehr unterschiedlich sein. Diese Informationen können beispielsweise aus Dateien stammen, die in Cloud Storage gespeichert sind, oder aus Streamingquellen wie Pub/Sub oder Google Cloud Managed Service for Apache Kafka.

Bei Streamingquellen können die Daten selbst der Rohinhalt (z. B. Nur-Text) oder URIs sein, die auf Dokumente verweisen. Unabhängig von der Quelle umfasst die erste Phase in der Regel die Vorverarbeitung der Informationen. Bei Rohtext kann dies minimal sein, z. B. eine einfache Datenbereinigung. Bei größeren Dokumenten oder komplexeren Inhalten ist jedoch das Aufteilen in Chunks ein wichtiger Schritt. Beim Chunking wird das Ausgangsmaterial in kleinere, überschaubare Einheiten unterteilt. Die optimale Chunking-Strategie ist nicht standardisiert und hängt von den jeweiligen Daten und der Anwendung ab. Plattformen wie Dataflow bieten integrierte Funktionen für verschiedene Anforderungen an die Aufteilung in Chunks, wodurch diese wichtige Vorverarbeitungsphase vereinfacht wird.

Vorteile

Die Klasse MLTransform bietet folgende Vorteile:

  • Einbettungen erstellen, mit denen Sie Daten in Vektordatenbanken verschieben oder Inferenzen ausführen können.
  • Transformieren Sie Daten, ohne komplexen Code zu schreiben oder zugrundeliegende Bibliotheken zu verwalten.
  • Mehrere Arten von Verarbeitungsvorgängen lassen sich mit einer Schnittstelle effizient verketten.

Unterstützung und Einschränkungen

Für die Klasse MLTransform gelten die folgenden Einschränkungen:

  • Verfügbar für Pipelines, die das Apache Beam Python SDK Version 2.53.0 und höher verwenden.
  • Pipelines müssen Standardfenster verwenden.

Texteinbettungstransformationen:

Anwendungsfälle

Die Beispiel-Notebooks zeigen, wie MLTransform für bestimmte Anwendungsfälle verwendet wird.

Ich möchte Texteinbettungen für mein LLM mit Vertex AI generieren
Verwenden Sie die Apache Beam-Klasse MLTransform mit der Vertex AI Text-Einbettungs-API, um Texteinbettungen zu generieren. Texteinbettungen sind eine Möglichkeit, Text als numerische Vektoren darzustellen, was für viele NLP-Aufgaben (Natural Language Processing) erforderlich ist.
Ich möchte mithilfe von Hugging Face Texteinbettungen für mein LLM generieren
Verwenden Sie die Apache Beam-Klasse MLTransform mit Hugging Face Hub-Modellen, um Texteinbettungen zu generieren. Das Hugging Face-Framework SentenceTransformers verwendet Python, um Satz-, Text- und Bildeinbettungen zu generieren.
Ich möchte Texteinbettungen generieren und in AlloyDB for PostgreSQL aufnehmen
Verwenden Sie Apache Beam, insbesondere die Klasse MLTransform mit Hugging Face Hub-Modellen, um Texteinbettungen zu generieren. Verwenden Sie dann VectorDatabaseWriteTransform, um diese Einbettungen und zugehörigen Metadaten in AlloyDB for PostgreSQL zu laden. In diesem Notebook wird gezeigt, wie skalierbare Batch- und Streaming-Beam-Datenpipelines erstellt werden, um eine AlloyDB for PostgreSQL-Vektordatenbank zu füllen. Dazu gehört die Verarbeitung von Daten aus verschiedenen Quellen wie Pub/Sub oder vorhandenen Datenbanktabellen, die Erstellung benutzerdefinierter Schemas und die Aktualisierung von Daten.
Ich möchte Texteinbettungen generieren und in BigQuery aufnehmen.
Verwenden Sie die Apache Beam-Klasse MLTransform mit Hugging Face Hub-Modellen, um Texteinbettungen aus Anwendungsdaten wie einem Produktkatalog zu generieren. Dazu wird die Apache Beam-Transformation HuggingfaceTextEmbeddings verwendet. Für diese Transformation wird das Hugging Face-Framework SentenceTransformers verwendet, das Modelle zum Generieren von Satz- und Texteinbettungen bietet. Diese generierten Einbettungen und ihre Metadaten werden dann mit dem Apache Beam-VectorDatabaseWriteTransform in BigQuery aufgenommen. Das Notebook enthält außerdem Beispiele für die Suche nach Vektorähnlichkeiten in BigQuery mit der Enrichment-Transformation.

Eine vollständige Liste der verfügbaren Transformationen finden Sie unter Transformationen in der Apache Beam-Dokumentation.

MLTransform für die Generierung von Einbettungen verwenden

Wenn Sie die Klasse MLTransform verwenden möchten, um Informationen in Chunks aufzuteilen und Einbettungen zu generieren, fügen Sie den folgenden Code in Ihre Pipeline ein:

  
  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)
        )

Im vorherigen Beispiel wird ein einzelner Chunk pro Element erstellt. Sie können aber auch LangChain verwenden, um Chunks zu erstellen:

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()

Nächste Schritte