Share via


Projeções de índice na Pesquisa de IA do Azure

Importante

As projeções do índice estão em pré-visualização pública sob termos de uso suplementares. Está disponível através do portal do Azure, das APIs REST 2023-10-01-Preview, do portal do Azure e das bibliotecas de cliente beta que foram atualizadas para incluir a funcionalidade.

As projeções de índice são um componente de uma definição de conjunto de habilidades que define a forma de um índice secundário, suportando um padrão de índice um-para-muitos, onde o conteúdo de um pipeline de enriquecimento pode direcionar vários índices.

As projeções de índice pegam o conteúdo enriquecido com IA gerado por um pipeline de enriquecimento e o indexam em um índice secundário (diferente daquele que um indexador segmenta por padrão) em seu serviço de pesquisa. As projeções de índice também permitem remodelar os dados antes de indexá-los, de uma forma que permite separar exclusivamente uma matriz de itens enriquecidos em vários documentos de pesquisa no índice de destino, também conhecida como indexação "um-para-muitos". A indexação "um-para-muitos" é útil para cenários de fragmentação de dados, onde você pode querer um índice primário para conteúdo não fragmentado e um índice secundário para fragmentados.

Se você já usou habilidades cognitivas no passado, já sabe que os conjuntos de habilidades criam conteúdo enriquecido. Os conjuntos de habilidades movem um documento através de uma sequência de enriquecimentos que invocam transformações atômicas, como reconhecer entidades ou traduzir texto. Por padrão, um documento processado dentro de um conjunto de habilidades é mapeado para um único documento no índice de pesquisa. Isso significa que, se você executar o agrupamento de um texto de entrada e, em seguida, executar enriquecimentos em cada bloco, o resultado no índice quando mapeado via outputFieldMappings será uma matriz dos enriquecimentos gerados. Com projeções de índice, você define um contexto no qual mapear cada parte de dados enriquecidos para seu próprio documento de pesquisa. Isso permite que você aplique um mapeamento um-para-muitos dos dados enriquecidos de um documento ao índice de pesquisa.

Definição de projeções de índice

As projeções de índice são definidas dentro de uma definição de conjunto de habilidades e são definidas principalmente como uma matriz de seletores, onde cada seletor corresponde a um índice de destino diferente no serviço de pesquisa. Cada seletor requer os seguintes parâmetros como parte de sua definição:

  • targetIndexName: O nome do índice no serviço de pesquisa no qual os dados de projeção do índice são indexados.
  • parentKeyFieldName: O nome do campo no índice de destino que contém o valor da chave para o documento pai.
  • sourceContext: A anotação de enriquecimento que define a granularidade na qual mapear dados em documentos de pesquisa individuais. Para obter mais informações, consulte Contexto de habilidade e linguagem de anotação de entrada.
  • mappings: Uma matriz de mapeamentos de dados enriquecidos para campos no índice de pesquisa. Cada mapeamento consiste em:
    • name: O nome do campo no índice de pesquisa no qual os dados devem ser indexados,
    • source: O caminho de anotação de enriquecimento do qual os dados devem ser extraídos.

Cada mapping um também pode definir dados recursivamente com um campo e inputs opcionalsourceContext, semelhante ao armazenamento deconhecimento ou Habilidade Shaper. Esses parâmetros permitem que você modele os dados a serem indexados em campos do tipo Edm.ComplexType no índice de pesquisa.

O índice definido no parâmetro tem os targetIndexName seguintes requisitos:

  • Já deve ter sido criado no serviço de pesquisa antes que o conjunto de habilidades que contém a definição de projeções de índice seja criado.
  • Deve conter um campo com o nome definido no parentKeyFieldName parâmetro. Este campo deve ser do tipo Edm.String, não pode ser o campo chave e deve ter filtrável definido como true.
  • O campo-chave deve ter pesquisável definido como true e ser definido com o keyword analisador.
  • Deve ter campos definidos para cada um namedos s definidos em mappings, nenhum dos quais pode ser o campo chave.

Aqui está um exemplo de carga útil para uma definição de projeções de índice que você pode usar para projetar a saída de páginas individuais pela habilidade Dividir como seus próprios documentos no índice de pesquisa.

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "myTargetIndex",
            "parentKeyFieldName": "ParentKey",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*"
                }
            ]
        }
    ]
}

Tratamento de documentos pai

Como as projeções de índice geram efetivamente documentos "filhos" para cada documento "pai" que passa por um conjunto de habilidades, você também tem as seguintes opções sobre como lidar com a indexação dos documentos "pai".

  • Para manter os documentos pai e filho em índices separados, você deve apenas garantir que a definição do targetIndexName indexador seja diferente da targetIndexName definida no seletor de projeção de índice.

  • Para indexar documentos pai e filho no mesmo índice, você precisa certificar-se de que o esquema para o índice de destino funcione com a definição definida fieldMappings e na definição do indexador e outputFieldMappings com o mappings seletor de projeção de índice. Em seguida, você apenas forneceria o mesmo targetIndexName para sua definição de indexador e seu seletor de projeção de índice.

  • Para ignorar documentos pai e apenas indexar documentos filho, você ainda precisa fornecer uma targetIndexName na sua definição de indexador (você pode apenas fornecer a mesma que você faz para o seletor de projeção de índice). Em seguida, defina um objeto separado parameters ao lado da sua selectors definição com uma projectionMode chave definida como skipIndexingParentDocuments, conforme mostrado aqui:

    "indexProjections": {
        "selectors": [
            ...
        ],
        "parameters": {
            "projectionMode": "skipIndexingParentDocuments"
        }
    }
    

A versão 2023-10-01-Preview da API REST pode ser usada para criar projeções de índice por meio de adições a um conjunto de habilidades.

Ciclo de vida do conteúdo

Se a fonte de dados do indexador oferecer suporte ao controle de alterações e à deteção de exclusão, o processo de indexação poderá sincronizar os índices primário e secundário para captar essas alterações.

Cada vez que você executa o indexador e o conjunto de habilidades, as projeções de índice são atualizadas se o conjunto de habilidades ou os dados de origem subjacentes tiverem sido alterados. Quaisquer alterações captadas pelo indexador são propagadas através do processo de enriquecimento para as projeções no índice, garantindo que os dados projetados sejam uma representação atual do conteúdo na fonte de dados de origem.

Nota

Embora você possa editar manualmente os dados nos documentos projetados usando a API de envio de índice, todas as edições serão substituídas na próxima chamada de pipeline, supondo que o documento nos dados de origem seja atualizado.

Valor-chave projetado

Cada documento de projeção de índice contém uma chave de identificação exclusiva que o indexador gera para garantir exclusividade e permitir que o controle de alterações e exclusões funcione corretamente. Esta chave contém os seguintes segmentos:

  • Um hash aleatório para garantir exclusividade. Esse hash muda se o documento pai for atualizado em execuções de indexador.
  • A chave do documento pai.
  • O caminho de anotação de enriquecimento que identifica o contexto a partir do qual esse documento foi gerado.

Por exemplo, se você dividir um documento pai com o valor-chave "123" em quatro páginas e, em seguida, cada uma dessas páginas for projetada como seu próprio documento por meio de projeções de índice, a chave para a terceira página de texto terá a aparência de "01f07abfe7ed_123_pages_2". Se o documento pai for atualizado para adicionar uma quinta página, a nova chave para a terceira página poderá, por exemplo, ser "9d800bdacc0e_123_pages_2", uma vez que o valor de hash aleatório muda entre as execuções do indexador, mesmo que o restante dos dados de projeção não tenha sido alterado.

Alterações ou adições

Se um documento pai for alterado de tal forma que os dados dentro de um documento de índice projetado sejam alterados (um exemplo seria se uma palavra fosse alterada em uma página específica, mas nenhuma nova página líquida fosse adicionada), os dados no índice de destino para essa projeção específica seriam atualizados para refletir essa alteração.

Se um documento pai for alterado de forma que haja novos documentos filho projetados que não estavam lá antes (um exemplo seria se uma ou mais páginas de texto fossem adicionadas ao documento), esses novos documentos filho serão adicionados na próxima vez que o indexador for executado.

Em ambos os casos, todos os documentos projetados são atualizados para ter um novo valor de hash em sua chave, independentemente de seu conteúdo específico ter sido atualizado.

Deletions

Se um documento pai for alterado de forma que um documento filho gerado por projeções de índice não exista mais (um exemplo seria se um texto fosse encurtado para que houvesse menos partes do que antes), o documento filho correspondente no índice de pesquisa seria excluído. Os documentos filho restantes também recebem sua chave atualizada para incluir um novo valor de hash, mesmo que seu conteúdo não tenha sido alterado de outra forma.

Se um documento pai for completamente excluído da fonte de dados, os documentos filho correspondentes só serão excluídos se a exclusão for detetada por uma dataDeletionDetectionPolicy definição definida na fonte de dados. Se você não tiver um documento pai configurado e precisar excluir um dataDeletionDetectionPolicy documento pai da fonte de dados, exclua manualmente os documentos filho se eles não forem mais desejados.