Gerar embeddings com o MLTransform

Nesta página, explicamos por que e como usar o recurso MLTransform para preparar seus dados para o treinamento de modelos de machine learning (ML). Especificamente, esta página mostra como processar dados gerando embeddings usando MLTransform.

Ao combinar várias transformações de processamento de dados em uma classe, o MLTransform simplifica o processo de aplicação de operações de processamento de dados de ML do Apache Beam no fluxo de trabalho.

Diagrama do fluxo de trabalho de ML do Dataflow com a etapa de processamento de dados destacada.

Figura 1. O fluxo de trabalho completo do Dataflow ML. Use MLTransform na etapa de pré-processamento do fluxo de trabalho.

Visão geral dos embeddings

Os embeddings são essenciais para a pesquisa semântica moderna e para aplicativos de geração aumentada de recuperação (RAG). Com os embeddings, os sistemas entendem e interagem com informações em um nível mais profundo e conceitual. Na pesquisa semântica, os embeddings transformam consultas e documentos em representações vetoriais. Essas representações capturam o significado e as relações subjacentes. Assim, você encontra resultados relevantes mesmo quando as palavras-chave não correspondem diretamente. Esse é um grande avanço em relação à pesquisa padrão baseada em palavras-chave. Também é possível usar incorporações para recomendações de produtos. Isso inclui pesquisas multimodais que usam imagens e texto, análise de registros e tarefas como remoção de duplicidade.

Na RAG, as incorporações têm um papel fundamental na recuperação do contexto mais relevante de uma base de conhecimento para fundamentar as respostas dos modelos de linguagem grandes (LLMs). Ao incorporar a consulta do usuário e os blocos de informações na base de conhecimento, os sistemas de RAG podem identificar e recuperar com eficiência as partes mais semanticamente semelhantes. Essa correspondência semântica garante que o LLM tenha acesso às informações necessárias para gerar respostas precisas e informativas.

Ingerir e processar dados para embeddings

Diagrama da ingestão de conhecimento de incorporação com as etapas de processamento de dados de
fragmentação e geração de incorporação
destacadas.

Figura 2. Um diagrama de ingestão de conhecimento. Isso mostra os dados de documentos multimodais de entrada e duas etapas de processamento: divisão em partes e geração de incorporação. O chunking é uma etapa de pré-processamento usada para dados complexos antes da geração de incorporações. Depois que os dados são processados, os embeddings são armazenados em um banco de dados de vetores.

Para os principais casos de uso de embedding, a consideração principal é como ingerir e processar conhecimento. Essa ingestão pode ser feita em lote ou por streaming. A fonte desse conhecimento pode variar bastante. Por exemplo, essas informações podem vir de arquivos armazenados no Cloud Storage ou de fontes de streaming, como o Pub/Sub ou o Serviço gerenciado do Google Cloud para Apache Kafka.

Para fontes de streaming, os dados podem ser o conteúdo bruto (por exemplo, texto simples) ou URIs que apontam para documentos. Independente da origem, a primeira etapa geralmente envolve o pré-processamento das informações. Para texto bruto, isso pode ser mínimo, como uma limpeza básica de dados. No entanto, para documentos maiores ou conteúdo mais complexo, uma etapa crucial é o chunking. A fragmentação envolve dividir o material de origem em unidades menores e gerenciáveis. A estratégia ideal de divisão não é padronizada e depende dos dados e do aplicativo específicos. Plataformas como o Dataflow oferecem recursos integrados para lidar com diversas necessidades de divisão, simplificando essa etapa essencial de pré-processamento.

Vantagens

A classe MLTransform oferece os seguintes benefícios:

  • Gere embeddings que podem ser usados para enviar dados a bancos de dados de vetores ou executar inferência.
  • Transforme seus dados sem escrever códigos complexos ou gerenciar bibliotecas.
  • Encadeie vários tipos de operações de processamento de maneira eficiente com uma só interface.

Suporte e limitações

A classe MLTransform tem as seguintes limitações:

  • Disponível para pipelines que usam as versões 2.53.0 e posteriores do SDK do Apache Beam para Python.
  • Os pipelines precisam usar janelas padrão.

Transformações de embedding de texto:

Casos de uso

Os notebooks de exemplo demonstram como usar o MLTransform para casos de uso específicos.

Quero gerar embeddings de texto para meu LLM usando a Vertex AI
Use a classe MLTransform do Apache Beam com a API text-embeddings da Vertex AI para gerar embeddings de texto. Os embeddings de texto são uma maneira de representar o texto como vetores numéricos, o que é necessário para muitas tarefas de processamento de linguagem natural (PLN).
Quero gerar embeddings de texto para meu LLM usando a Hugging Face
Use a classe MLTransform do Apache Beam com modelos do Hugging Face Hub para gerar embeddings de texto. O framework SentenceTransformers da Hugging Face usa Python para gerar embeddings de sentenças, textos e imagens.
Quero gerar embeddings de texto e ingerir no AlloyDB para PostgreSQL
Use o Apache Beam, especificamente a classe MLTransform com modelos do Hugging Face Hub para gerar embeddings de texto. Em seguida, use o VectorDatabaseWriteTransform para carregar essas embeddings e os metadados associados no AlloyDB para PostgreSQL. Este notebook demonstra a criação de pipelines de dados em lote e de streaming do Beam escalonáveis para preencher um banco de dados de vetores do AlloyDB para PostgreSQL. Isso inclui o processamento de dados de várias fontes, como Pub/Sub ou tabelas de banco de dados atuais, a criação de esquemas personalizados e a atualização de dados.
Quero gerar embeddings de texto e ingerir no BigQuery
Use a classe MLTransform do Apache Beam com modelos do Hugging Face Hub para gerar embeddings de texto com dados de aplicativos, como um catálogo de produtos. A transformação HuggingfaceTextEmbeddings do Apache Beam é usada para isso. Essa transformação usa o framework SentenceTransformers da Hugging Face, que fornece modelos para gerar embeddings de frases e textos. Esses embeddings gerados e os metadados deles são ingeridos no BigQuery usando o VectorDatabaseWriteTransform do Apache Beam. O notebook também demonstra pesquisas de similaridade de vetor no BigQuery usando a transformação de enriquecimento.

Para conferir uma lista completa de transformações disponíveis, consulte Transformações na documentação do Apache Beam.

Usar o MLTransform para geração de embeddings

Para usar a classe MLTransform para dividir informações e gerar embeddings, inclua o seguinte código no seu 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)
        )

O exemplo anterior cria um único bloco por elemento, mas também é possível usar LangChain para criar blocos:

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

A seguir