Einbettungen mit MLTransform generieren

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

Durch die Kombination mehrerer Datenverarbeitungstransformationen in einer Klasse optimiert MLTransform die Anwendung von Apache Beam ML-Datenverarbeitungsvorgängen 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.

Übersicht über Einbettungen

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

Bei RAG spielen Einbettungen eine entscheidende Rolle beim Abrufen des relevantesten Kontexts aus einer Wissensdatenbank, um die Antworten von LLMs (Large Language Models) zu untermauern. Durch das Einbetten sowohl der Abfrage des Nutzers als auch der Informationsblöcke in der Wissensdatenbank können RAG-Systeme die semantisch ähnlichsten Teile effizient identifizieren und abrufen. Diese semantische Übereinstimmung sorgt dafür, 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 für die Aufteilung in Chunks und die Erstellung von Einbettungen.

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

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

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 ein entscheidender Schritt das Chunking. Dabei 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 Chunking-Anforderungen, 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 Standard fenster verwenden.

Texteinbettungstransformationen :

Anwendungsfälle

In den Beispielnotebooks wird gezeigt, wie Sie MLTransform für bestimmte Anwendungsfälle verwenden.

Ich möchte Texteinbettungen für mein LLM mit Agent Platform Pipelines generieren
Verwenden Sie die Apache Beam-Klasse MLTransform mit der Text-Einbettungs-API von Agent Platform Pipelines , 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 SentenceTransformers -Framework 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 die zugehörigen Metadaten in AlloyDB for PostgreSQL zu laden. In diesem Notebook wird gezeigt, wie Sie skalierbare Batch- und Streaming-Beam-Datenpipelines erstellen, um eine AlloyDB for PostgreSQL-Vektordatenbank zu füllen. Dazu gehören die Verarbeitung von Daten aus verschiedenen Quellen wie Pub/Sub oder vorhandenen Datenbanktabellen, das Erstellen benutzerdefinierter Schemas und das Aktualisieren 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. Diese Transformation verwendet das Hugging Face-Framework SentenceTransformers, das Modelle zum Generieren von Satz- und Texteinbettungen bietet. Diese generierten Einbettungen und ihre Metadaten werden dann mit der Apache Beam-Transformation VectorDatabaseWriteTransform in BigQuery aufgenommen. Das Notebook zeigt außerdem Vektorähnlichkeitssuchen in BigQuery mit der Anreicherungstransformation.

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

MLTransform für die Einbettungsgenerierung verwenden

Wenn Sie die Klasse MLTransform verwenden möchten, um Informationen in Blöcke zu unterteilen 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 pro Element ein einzelner Block erstellt. Sie können aber auch LangChain verwenden, um Blöcke 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