Escolher um tipo de tarefa de embeddings

Este guia mostra como escolher o tipo de tarefa ideal ao gerar embeddings com a Vertex AI para melhorar a qualidade delas no seu caso de uso específico. Ele abrange os seguintes tópicos:

  • Benefícios de usar tipos de tarefa:saiba como os tipos de tarefa melhoram a qualidade do embedding para casos de uso como a Geração Aumentada de Recuperação (RAG).
  • Tipos de tarefas compatíveis:confira uma visão geral comparativa de todos os tipos de tarefas disponíveis para ajudar você a escolher o certo.
  • Análise detalhada de casos de uso:confira explicações e exemplos detalhados de cada tipo de tarefa, incluindo classificação, agrupamento, recuperação e similaridade semântica.

Com os modelos de embeddings da Vertex AI, é possível gerar embeddings otimizados para várias tarefas, como recuperação de documentos, perguntas e respostas e verificação de fatos. Um tipo de tarefa é um parâmetro especificado para otimizar os embeddings que o modelo gera para seu caso de uso pretendido. Este documento descreve como escolher o tipo de tarefa ideal para suas embeddings.

Modelos compatíveis

Os tipos de tarefa são compatíveis com os seguintes modelos:

  • text-embedding-005
  • text-multilingual-embedding-002
  • gemini-embedding-001

As limitações a seguir se aplicam ao uso desses modelos:

  • Não use esses modelos de pré-lançamento em sistemas críticos ou de produção.
  • Esses modelos estão disponíveis apenas em us-central1.
  • As previsões em lote não são compatíveis.
  • Não é possível personalizar.

Benefícios dos tipos de tarefa

Usar tipos de tarefa pode melhorar a qualidade dos embeddings gerados por um modelo.

As perguntas e as respostas delas não são semanticamente parecidas
Figura 1. As perguntas e as respostas não são semanticamente parecidas, o que significa que os embeddings não mostram automaticamente a relação entre eles.

Por exemplo, ao criar sistemas de geração aumentada de recuperação (RAG), um design comum é usar embeddings de texto e a Pesquisa Vetorial para realizar uma pesquisa de similaridade. Em alguns casos, essa abordagem pode resultar em uma qualidade de pesquisa menor porque as perguntas e respostas não são semanticamente semelhantes. Por exemplo, uma pergunta como "Por que o céu é azul?" e a resposta "A dispersão da luz solar causa a cor azul" têm significados distintos como frases. Isso significa que um sistema RAG pode não reconhecer automaticamente a relação entre elas, conforme demonstrado na Figura 1.

Sem os tipos de tarefas, um desenvolvedor RAG precisaria treinar o modelo para aprender a relação entre consultas e respostas, o que requer habilidades avançadas em ciência de dados, ou usar a expansão de consulta baseada em LLM ou o HyDE, que pode introduzir alta latência e custos.

O tipo de tarefa coloca perguntas e respostas mais próximas ao espaço de embeddings
Figura 2. Os tipos de tarefa otimizam embeddings para tarefas específicas. Nesse caso, as perguntas e respostas são unidas no espaço dos embeddings.

Os tipos de tarefa permitem gerar embeddings otimizados para tarefas específicas, o que economiza o tempo e o custo que seria necessário para desenvolver seus próprios embeddings específicos de tarefas. O embedding gerado para a consulta "Por que o céu é azul?" e sua resposta "A dispersão da luz solar faz com que a cor azul" estaria no espaço de embedding compartilhado que representa a relação entre eles, como mostrado na figura 2. Neste exemplo de RAG, os embeddings otimizados levariam a pesquisas de similaridade aprimoradas.

Além do caso de uso de consulta e resposta, os tipos de tarefa também oferecem um espaço de embeddings otimizado para tarefas como classificação, agrupamento e verificação de fatos.

Tipos de tarefas com suporte

A tabela a seguir descreve os tipos de tarefas compatíveis. O melhor tipo de tarefa para seu projeto depende do seu caso de uso. Para conferir todos os tipos de tarefas, consulte a referência do modelo.

Categoria do tipo de tarefa Tipos de tarefa Descrição Casos de uso comuns
Recuperação (assimétrica) Para consultas: RETRIEVAL_QUERY, QUESTION_ANSWERING, FACT_VERIFICATION, CODE_RETRIEVAL_QUERY
Para corpus: RETRIEVAL_DOCUMENT
Gera embeddings para uma consulta curta e pesquisa em um grande corpus de documentos. As incorporações de consulta e documento são otimizadas para funcionar juntas. Pesquisa de documentos, sistemas RAG, respostas a perguntas, verificação de fatos, recuperação de código.
Classificação (simétrica) CLASSIFICATION Gera um embedding para uma única entrada de texto, otimizado para modelos de classificação. Análise de sentimento, classificação de tópicos, detecção de spam.
Clustering (simétrico) CLUSTERING Gera um embedding para uma única entrada de texto, otimizado para algoritmos de clusterização. Modelagem de tópicos, segmentação de clientes, identificação de conteúdo duplicado.
Similaridade semântica (simétrica) SEMANTIC_SIMILARITY Gera embeddings para comparar dois trechos de texto e determinar a similaridade semântica deles. Não destinado à recuperação. Cálculo de pontuações de similaridade para recomendações ou detecção de paráfrases.

Determinar seu caso de uso de embeddings

Os casos de uso de embeddings geralmente se enquadram em uma das quatro categorias: avaliar a similaridade de texto, classificar textos, agrupar textos ou recuperar informações com base em textos. Se o caso de uso não estiver alinhado com um caso de uso documentado, use o tipo de tarefa RETRIEVAL_QUERY por padrão.

Os tipos de tarefas podem ser simétricos ou assimétricos. Dependendo do caso de uso, você usa um tipo de tarefa simétrica ou assimétrica.

Casos de uso simétricos

Casos de uso simétricos são quando os textos comparados têm comprimento e conteúdo semelhantes, como comparar duas frases para verificar a similaridade.

Classificação

Para classificar textos de acordo com rótulos predefinidos, use o tipo de tarefa CLASSIFICATION. Esse tipo de tarefa gera embeddings otimizados para modelos de classificação. Por exemplo, se você gerar uma incorporação para a postagem de mídia social "Não gosto de viajar de avião", um modelo de classificação poderá usar a incorporação para classificar o sentimento como negativo.

Clustering

Para agrupar textos com base nas semelhanças deles, use o tipo de tarefa CLUSTERING. Esse tipo de tarefa gera embeddings otimizados para algoritmos de agrupamento. Por exemplo, depois de gerar e agrupar embeddings para artigos de notícias, você pode sugerir outros artigos relacionados a esportes para usuários que leem muito sobre o assunto.

Outros casos de uso para agrupamento incluem:

  • Segmentação de clientes:agrupe clientes com incorporações semelhantes geradas a partir dos perfis ou atividades deles para marketing direcionado e experiências personalizadas.
  • Segmentação de produtos:agrupe embeddings de produtos com base no título e na descrição, nas imagens ou nas avaliações dos clientes para ajudar as empresas a fazer análises de segmento dos produtos.
  • Pesquisa de mercado:agrupe respostas de pesquisas com consumidores ou incorporações de dados de mídias sociais para revelar padrões e tendências ocultos nas opiniões, preferências e comportamentos dos consumidores.
  • Saúde:agrupe embeddings de pacientes derivados de dados médicos para identificar grupos com condições ou respostas ao tratamento semelhantes, levando a planos de saúde mais personalizados.
  • Tendências de feedback do cliente:agrupe o feedback dos clientes de vários canais (pesquisas, mídias sociais, tickets de suporte) para identificar problemas comuns, solicitações de recursos e áreas para melhoria do produto.

Similaridade semântica

Para avaliar a semelhança de texto, use o tipo de tarefa SEMANTIC_SIMILARITY. Esse tipo de tarefa gera embeddings otimizados para comparar a similaridade semântica entre dois trechos de texto. Por exemplo, ao comparar embeddings de "O gato está dormindo" e "O felino está cochilando", a pontuação de similaridade seria alta porque os dois textos têm quase o mesmo significado.

Um cenário real para avaliar a semelhança de entrada é um sistema de recomendação que identifica itens (por exemplo, produtos, artigos, filmes) semanticamente semelhantes aos itens preferidos de um usuário para fornecer recomendações personalizadas.

Casos de uso assimétricos

Os casos de uso assimétricos são quando você compara um texto de consulta curto com um grande conjunto de documentos mais longos.

Recuperação de informações

Ao criar um sistema de pesquisa ou recuperação, você trabalha com dois tipos de texto:

  • Corpus: a coleção de documentos que você quer pesquisar.
  • Consulta: o texto que um usuário fornece para pesquisar informações no corpus.

Para ter o melhor desempenho, use diferentes tipos de tarefa para gerar embeddings para seu corpus e suas consultas.

Primeiro, gere embeddings para toda a sua coleção de documentos usando o tipo de tarefa RETRIEVAL_DOCUMENT. Normalmente, essa etapa é realizada uma vez para indexar todo o corpus e armazenar os embeddings resultantes em um banco de dados de vetores.

Em seguida, quando um usuário envia uma pesquisa, gere um embedding para o texto da consulta em tempo real usando um tipo de tarefa que corresponda à intenção do usuário. Em seguida, seu sistema usa esse embedding de consulta para encontrar os embeddings de documentos mais semelhantes no banco de dados de vetores.

Os seguintes tipos de tarefas são usados para consultas:

  • RETRIEVAL_QUERY: use isso para uma consulta de pesquisa padrão em que você quer encontrar documentos relevantes.
  • QUESTION_ANSWERING: use quando as consultas forem perguntas adequadas, como "Por que o céu é azul?".
  • FACT_VERIFICATION: use quando quiser recuperar um documento do seu corpus que prove ou rejeite uma declaração.

Recuperação de código

O text-embedding-005 oferece suporte ao tipo de tarefa CODE_RETRIEVAL_QUERY, que pode ser usado para recuperar blocos de código relevantes usando consultas de texto simples. Para usar esse recurso, incorpore blocos de código com o tipo de tarefa RETRIEVAL_DOCUMENT e consultas de texto com CODE_RETRIEVAL_QUERY.

Veja um exemplo:

REST

PROJECT_ID=PROJECT_ID

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/text-embedding-005:predict -d \
$'{
  "instances": [
    {
      "task_type": "CODE_RETRIEVAL_QUERY",
      "content": "Function to add two numbers"
    }
  ],
}'

Python

Para saber como instalar o SDK da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Para mais informações, consulte a documentação de referência da API Python.

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

MODEL_NAME = "gemini-embedding-001"
DIMENSIONALITY = 3072


def embed_text(
    texts: list[str] = ["Retrieve a function that adds two numbers"],
    task: str = "CODE_RETRIEVAL_QUERY",
    model_name: str = "gemini-embedding-001",
    dimensionality: int | None = 3072,
) -> list[list[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    kwargs = dict(output_dimensionality=dimensionality) if dimensionality else {}

    embeddings = []
    # gemini-embedding-001 takes one input at a time
    for text in texts:
        text_input = TextEmbeddingInput(text, task)
        embedding = model.get_embeddings([text_input], **kwargs)
        print(embedding)
        # Example response:
        # [[0.006135190837085247, -0.01462465338408947, 0.004978656303137541, ...]]
        embeddings.append(embedding[0].values)

    return embeddings


if __name__ == "__main__":
    # Embeds code block with a pre-trained, foundational model.
    # Using this function to calculate the embedding for corpus.
    texts = ["Retrieve a function that adds two numbers"]
    task = "CODE_RETRIEVAL_QUERY"
    code_block_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

    # Embeds code retrieval with a pre-trained, foundational model.
    # Using this function to calculate the embedding for query.
    texts = [
        "def func(a, b): return a + b",
        "def func(a, b): return a - b",
        "def func(a, b): return (a ** 2 + b ** 2) ** 0.5",
    ]
    task = "RETRIEVAL_DOCUMENT"
    code_query_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

A seguir