Usar embeddings personalizados

Se você já criou suas próprias embeddings vetoriais personalizadas para seus dados, é possível fazer upload delas para a Vertex AI Search e usá-las ao fazer consultas com a Vertex AI Search.

Esse recurso está disponível para repositórios de dados com dados estruturados genéricos ou não estruturados com metadados. Esse recurso não está disponível para mídia e pesquisa de saúde.

Por padrão, a pesquisa da Vertex AI gera automaticamente embeddings de vetores sem precisar de nenhuma configuração. Se você não sabe como criar embeddings, o Google recomenda deixar que a Vertex AI para Pesquisa crie e use embeddings para você. No entanto, se você criou suas próprias embeddings para seus dados, talvez seja melhor usá-las em vez das geradas pela pesquisa da Vertex AI, principalmente se as embeddings personalizadas contiverem mais contexto que pode enriquecer a recuperação e a classificação da pesquisa. Exemplo:

  • Seus embeddings foram treinados com palavras personalizadas, como termos internos cujos similaridades semânticas não seriam capturadas pelo treinamento com dados públicos, por exemplo, termos específicos da organização que aparecem apenas em documentos particulares.
  • Você criou embeddings para perfis de usuário e quer usá-los para criar uma classificação de documentos personalizada e semanticamente relevante. Você pode usar as informações incorporadas para receber classificações com base na personalização, que podem aumentar as informações incorporadas de documentos do Google para classificações com base na relevância.

Para trazer seus próprios embeddings:

  1. Antes de começar: verifique se os embeddings atendem a todos os requisitos
  2. Ingerir dados com embeddings: ingerir seus documentos com os embeddings
  3. Atualizar o esquema: atualize o esquema com os campos de propriedade chave e as especificações de dimensão.
  4. Especifique a incorporação: especifique a incorporação globalmente ou por solicitação de pesquisa.

Antes de começar

Antes de começar, verifique se as inclusões atendem aos seguintes requisitos:

  • As incorporação têm suporte para dados estruturados e não estruturados com metadados.
  • As incorporações precisam ser fornecidas como matrizes unidimensionais
  • A dimensionalidade de incorporação precisa estar entre 1 e 768, inclusive.
  • Os embeddings são aceitos para texto e imagens. Vídeos não são aceitos
  • Até dois campos podem ser marcados como campos de propriedade de chave de incorporação. Você pode usar dois campos para casos como testes A/B para suas incorporações.
  • No momento, as designações de propriedade de chave de campo de incorporação não podem ser removidas depois de serem definidas.

Ingerir dados com incorporações

É possível processar as incorporações de um documento em um ou dois campos incluídos como parte dos dados ou metadados do documento durante a ingestão.

Para transferir dados com embeddings:

  1. Prepare os dados para transferência de acordo com o tipo:

    • Dados estruturados: ao preparar seus dados, inclua as embeddings de cada documento como matrizes unidimensionais em um ou dois campos no documento. É possível fornecer até duas incorporações (por exemplo, se o teste A/B for entre incorporações). Cada incorporação precisa ser fornecida no próprio campo do documento, por exemplo: "example_embedding_vector": [0.1, 0.2, 0.3 ...]

      Siga as orientações para preparar dados estruturados na documentação Preparar dados para ingestão.

    • Dados não estruturados com metadados: ao preparar seus dados, inclua a incorporação de cada documento como uma matriz unidimensional em um campo nos metadados do documento. Você pode fornecer até duas incorporações (por exemplo, quando o teste A/B é feito entre elas). Cada incorporação precisa ser fornecida no próprio campo nos metadados do documento, por exemplo: "example_embedding_vector": [0.1, 0.2, 0.3 ...]

      Siga as orientações para preparar dados não estruturados com metadados para seu método de ingestão (Cloud Storage ou BigQuery) na documentação Preparar dados para ingestão.

  2. Siga as instruções para seu tipo de dados em Criar um mecanismo e transferir dados com a Vertex AI para Pesquisa para transferir seus documentos com embeddings.

Em seguida, atualize o esquema para usar os campos de incorporação corretos.

Atualizar o esquema

Atualize o esquema com mapeamentos e dimensões de propriedades importantes para seus campos de incorporação usando o console do Google Cloud ou a API.

Console

Para atualizar o esquema usando o console do Google Cloud, siga estas etapas:

  1. No Console do Google Cloud, acesse a página Criador de agentes.

    Agent Builder.

  2. No menu de navegação, clique em Repositórios de dados.

  3. Na coluna Nome, clique no repositório de dados com o esquema que você quer atualizar.

  4. Clique na guia Esquema para conferir o esquema dos seus dados.

  5. Clique no botão Editar.

  6. Encontre o campo de incorporação no esquema e, na coluna Propriedades principais, selecione embedding_vector como a propriedade principal desse campo.

    Se você tiver um segundo campo de incorporação, repita esta etapa para ele.

  7. Na coluna Dimensão, insira o número de dimensões para esse campo de embedding.

    Se você tiver um segundo campo de incorporação, repita esta etapa para ele.

  8. Clique em Salvar para aplicar as mudanças no esquema.

    Depois de atualizar o esquema, pode levar até 24 horas para refazer a indexação, dependendo do tamanho do repositório de dados.

REST

Para atualizar o esquema usando a API, siga estas etapas:

  1. Seguindo as instruções do REST em Atualizar um esquema, especifique o mapeamento da propriedade chave e o número de dimensões para cada campo de incorporação:

    • "keyPropertyMapping": "embedding_vector"
    • "dimension": NUMBER_OF_DIMENSIONS

    Por exemplo, aqui está um esquema JSON formatado com 768 dimensões para o campo example_embedding_vector:

      {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "example_embedding_vector": {
            "type": "array",
            "keyPropertyMapping": 'embedding_vector',
            "dimension": 768,
            "items": {
              "type": "number"
            }
          }
        }
      }
    

    Em uma solicitação de atualização de esquema, o JSON formatado acima seria incluído como uma string JSON:

      "jsonSchema": "{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"type\":\"object\",\"properties\":{\"example_embedding_vector\":{\"type\":\"array\",\"keyPropertyMapping\":\"embedding_vector\",\"dimension\":768,\"items\":{\"type\":\"number\"}}}}"
    

    Depois de atualizar o esquema, pode levar até 24 horas para refazer a indexação, dependendo do tamanho do repositório de dados.

Em seguida, especifique a incorporação.

Especificar o embedding

Depois que a indexação da atualização do esquema for concluída, será possível enviar solicitações de pesquisa que incluam uma especificação de embedding.

Há duas maneiras de especificar uma incorporação:

Especificar um embedding globalmente

É possível especificar a mesma incorporação em todas as solicitações de pesquisa usando o console do Google Cloud ou a API.

Console

Para fornecer a mesma especificação de incorporação a todas as solicitações de pesquisa, atualize as configurações de veiculação com uma especificação de incorporação.

  1. No Console do Google Cloud, acesse a página Criador de agentes.

    Agent Builder.

  2. Clique em Visualizar no repositório de dados com o esquema que você quer atualizar.

  3. Acesse a página Configurações e clique na guia Exibição.

  4. Em Caminho do campo de embedding, insira o nome do campo que você mapeou para a propriedade da chave de embedding.

  5. Em Expressão de classificação, insira uma ou mais funções para controlar a classificação dos resultados. As variáveis são ponderadas de acordo com a expressão que você digita. A expressão de classificação é uma única função ou várias funções que são unidas por + no formato function, { " + ", function }.

    As funções compatíveis são estas:

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    As seguintes variáveis são aceitas:

    • relevance_score: uma variável predefinida fornecida pela Vertex AI para Pesquisa para medir a relevância de um documento. A pontuação varia de 0 a 1,0, inclusive.
    • dotProduct(): uma função predefinida fornecida pela Vertex AI Search. Forneça o mesmo nome de campo para essa função que você fez para embeddingVector.fieldPath.

    Exemplo:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)

REST

Para fornecer a mesma especificação de incorporação a todas as solicitações de pesquisa, atualize servingConfig com embeddingConfig.

  1. Faça o patch da entidade servingConfig com os campos que você quer atualizar. Especifique os campos que você está atualizando com updateMask.

    No exemplo abaixo, embeddingConfig usa embeddings no campo example_embedding_field e atribui um peso de 0,5 a relevance_score.

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d '{
          "name": "projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search",
          "embeddingConfig": {
            "fieldPath": "example_embedding_field"
          },
          "ranking_expression": "0.5 * relevance_score"
        }' \
    'https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search?updateMask=embeddingConfig,rankingExpression'
    
    • fieldPath: o nome do campo que você mapeou para a propriedade de chave de incorporação.
    • ranking_expression: controla a classificação dos resultados. As variáveis são ponderadas de acordo com a expressão inserida. A expressão de classificação é uma única função ou várias funções unidas por + no formato function, { " + ", function }.

    As funções compatíveis são estas:

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    As seguintes variáveis são aceitas:

    • relevance_score: uma variável predefinida fornecida pela Vertex AI Search.
    • dotProduct(): uma função predefinida fornecida pela Vertex AI Search. O produto escalar é normalizado. É necessário fornecer o mesmo nome de campo para essa função que você fez para embeddingVector.fieldPath.

    Exemplo:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. Quando você envia solicitações de pesquisa, o servingConfig.embeddingConfig é incluído automaticamente.

    Se você enviar uma solicitação de pesquisa que inclua explicitamente um embeddingSpec diferente, ele vai substituir servingConfig.embeddingConfig. Consulte as instruções Por solicitação para saber como fornecer especificações de incorporação para solicitações de pesquisa únicas.

Especificar um embedding por solicitação de pesquisa

É possível fornecer uma especificação de incorporação para uma única solicitação de pesquisa usando a API. Uma especificação de incorporação por solicitação substitui qualquer especificação de incorporação global.

  1. Envie uma solicitação de pesquisa que inclua embeddingSpec.

    O exemplo a seguir de embeddingSpec usa embeddings no campo example_embedding_field, especifica "Example query" como o vetor de entrada e atribui um peso de 0,5 a relevance_score e 0,3 a example_embedding_field ao calcular a classificação.

      "embeddingSpec": {
        "embeddingVectors": [{
          "fieldPath": "example_embedding_field",
          "vector": [
            0.96241474,
            -0.45999944,
            0.108588696
          ]
        }]
      },
      "ranking_expression": "0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)"
    
    • fieldPath: o nome do campo que você mapeou para a propriedade de chave de incorporação.
    • vector: o vetor de entrada fornecido como uma matriz.
    • ranking_expression: controla a classificação dos resultados. As variáveis são ponderadas de acordo com a expressão inserida. A expressão de classificação é uma única função ou várias funções que são unidas por + no formato function, { " + ", function }.

      As funções compatíveis são estas:

      • DOUBLE * relevance_score
      • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

      As seguintes variáveis são aceitas:

      • relevance_score: uma variável predefinida fornecida pela Vertex AI para Pesquisa para medir a relevância de um documento. A pontuação varia de 0 a 1,0, inclusive.
      • dotProduct(): uma função predefinida fornecida pela Vertex AI Search. Forneça o mesmo nome de campo para essa função que você fez para embeddingVector.fieldPath.

      Exemplo:

      • 0.3 * relevance_score
      • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. Receber resultados na resposta da pesquisa. Cada resultado da pesquisa inclui a pontuação de relevância e os valores de ponto do produto. Exemplo:

    "modelScores": {
      "dotProduct(example_embedding_field)": [0.02150772698223591],
      "relevance_score": [ 0.8828125 ]
    }
    
    • dotProduct(): o produto interno calculado para o documento de resultado da pesquisa.
    • relevance_score: a pontuação de relevância calculada para o documento de resultado da pesquisa.

A seguir