Gere incorporações com o MLTransform

Esta página explica por que motivo e como usar a funcionalidade MLTransform para preparar os seus dados para a preparação de modelos de aprendizagem automática. Em concreto, esta página mostra-lhe como processar dados gerando incorporações através da MLTransform.

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

Diagrama do fluxo de trabalho de ML do Dataflow com o passo de tratamento de dados realçado.

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

Vista geral das incorporações

As incorporações são essenciais para a pesquisa semântica moderna e as aplicações de geração aumentada de recuperação (RAG). As incorporações permitem que os sistemas compreendam e interajam com informações a um nível mais profundo e conceptual. Na pesquisa semântica, as incorporações transformam as consultas e os documentos em representações vetoriais. Estas representações captam o respetivo significado subjacente e relações. Consequentemente, isto permite-lhe encontrar resultados relevantes mesmo quando as palavras-chave não correspondem diretamente. Este é um avanço significativo em relação à pesquisa padrão baseada em palavras-chave. Também pode usar incorporações para recomendações de produtos. Isto inclui pesquisas multimodais que usam imagens e texto, registam estatísticas e para tarefas como a remoção de duplicados.

Na RAG, as incorporações desempenham um papel crucial na obtenção do contexto mais relevante de uma base de conhecimentos para fundamentar as respostas dos modelos de linguagem (conteúdo extenso) (MDIs/CEs). Ao incorporar a consulta do utilizador e os fragmentos de informações na base de conhecimentos, os sistemas RAG podem identificar e obter de forma eficiente as partes semanticamente mais semelhantes. Esta correspondência semântica garante que o GML tem acesso às informações necessárias para gerar respostas precisas e informativas.

Carregue e processe dados para incorporações

Diagrama da ingestão de conhecimentos incorporados com os passos de processamento de dados de
divisão em partes e geração de incorporações
realçados.

Figura 2. Um diagrama de carregamento de conhecimentos. Isto mostra os dados de documentos multimodais de entrada e dois passos de processamento: divisão em blocos e geração de incorporações. A divisão em partes é um passo de pré-processamento usado para dados complexos antes da geração de incorporações. Após o tratamento dos dados, as incorporações são armazenadas numa base de dados vetorial.

Para exemplos de utilização de incorporação essenciais, a principal consideração é como carregar e processar conhecimento. Este carregamento pode ser feito em lote ou por streaming. A origem deste conhecimento pode variar bastante. Por exemplo, estas informações podem ser provenientes de ficheiros armazenados no Cloud Storage ou de origens de streaming, como o Pub/Sub ou o Google Cloud Managed Service para Apache Kafka.

Para origens de streaming, os dados em si podem ser o conteúdo não processado (por exemplo, texto simples) ou URIs que apontam para documentos. Independentemente da origem, a primeira fase envolve normalmente o pré-processamento das informações. Para texto não processado, isto pode ser mínimo, como a limpeza básica de dados. No entanto, para documentos maiores ou conteúdo mais complexo, um passo crucial é a divisão em partes. A segmentação envolve dividir o material de origem em unidades mais pequenas e geríveis. A estratégia de divisão em partes ideal não é padronizada e depende dos dados e da aplicação específicos. As plataformas como o Dataflow oferecem capacidades integradas para processar diversas necessidades de divisão em partes, simplificando esta fase de pré-processamento essencial.

Vantagens

A classe MLTransform oferece as seguintes vantagens:

  • Gere incorporações que pode usar para enviar dados para bases de dados vetoriais ou para executar inferências.
  • Transforme os seus dados sem escrever código complexo nem gerir bibliotecas subjacentes.
  • Encadeie de forma eficiente vários tipos de operações de processamento com uma interface.

Apoio técnico 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 Python do Apache Beam.
  • Os pipelines têm de usar janelas predefinidas.

Transformações de incorporação de texto:

Exemplos de utilização

Os blocos de notas de exemplo demonstram como usar MLTransform para casos de utilização específicos.

Quero gerar incorporações de texto para o meu MDI/CE usando o Vertex AI
Use a classe MLTransform do Apache Beam com a API Vertex AI text-embeddings para gerar incorporações de texto. As incorporações de texto são uma forma de representar texto como vetores numéricos, o que é necessário para muitas tarefas de processamento de linguagem natural (PNL).
Quero gerar incorporações de texto para o meu MDI/CE usando o Hugging Face
Use a classe MLTransform do Apache Beam com modelos do Hugging Face Hub para gerar incorporações de texto. A framework Hugging Face SentenceTransformers usa o Python para gerar incorporações de frases, texto e imagens.
Quero gerar incorporações de texto e carregá-las no AlloyDB para PostgreSQL
Use o Apache Beam, especificamente a classe MLTransform com os modelos do Hugging Face Hub para gerar incorporações de texto. Em seguida, use o VectorDatabaseWriteTransform para carregar estas incorporações e os metadados associados no AlloyDB para PostgreSQL. Este bloco de notas demonstra a criação de pipelines de dados do Beam escaláveis em lote e por streaming para preencher uma base de dados vetorial do AlloyDB for PostgreSQL. Isto inclui o processamento de dados de várias origens, como o Pub/Sub ou tabelas de bases de dados existentes, a criação de esquemas personalizados e a atualização de dados.
Quero gerar incorporações de texto e carregá-las para o BigQuery
Use a classe MLTransform do Apache Beam com modelos do Hugging Face Hub para gerar incorporações de texto a partir de dados de aplicações, como um catálogo de produtos. A transformação HuggingfaceTextEmbeddings do Apache Beam é usada para este fim. Esta transformação usa a framework SentenceTransformers da Hugging Face, que fornece modelos para gerar incorporações de frases e texto. Em seguida, estas incorporações geradas e os respetivos metadados são carregados para o BigQuery através do Apache Beam VectorDatabaseWriteTransform. O bloco de notas demonstra ainda mais as pesquisas de semelhança vetorial no BigQuery através da transformação de enriquecimento.

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

Use o MLTransform para a geração de incorporações

Para usar a classe MLTransform para dividir as informações em partes e gerar incorporações, 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 fragmento por elemento, mas também pode usar o LangChain para criar fragmentos:

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

O que se segue?