Partilhar via


Criar um índice de vetores

Na Pesquisa de IA do Azure, um repositório de vetores tem um esquema de índice que define campos vetoriais e não vetoriais, uma configuração de vetor para algoritmos que criam e compactam o espaço de incorporação e configurações em definições de campo vetorial usadas em solicitações de consulta.

A API Criar ou Atualizar Índice cria o repositório de vetores. Siga estas etapas para indexar dados vetoriais:

  • Definir um esquema com algoritmos vetoriais e compactação opcional
  • Adicionar definições de campo vetorial
  • Carregue dados pré-vetorizados como uma etapa separada ou use vetorização integrada para fragmentação e codificação de dados durante a indexação

Este artigo explica o fluxo de trabalho e usa REST para ilustração. Depois de entender o fluxo de trabalho básico, continue com os exemplos de código do SDK do Azure no repositório azure-search-vector-samples para obter orientação sobre como usar esses recursos no código de teste e produção.

Gorjeta

Use o portal do Azure para criar um índice de vetor e tente fragmentação e vetorização de dados integradas.

Pré-requisitos

  • Azure AI Search, em qualquer região e em qualquer camada. A maioria dos serviços existentes suporta pesquisa vetorial. Para serviços criados antes de janeiro de 2019, há um pequeno subconjunto que não pode criar um índice vetorial. Nessa situação, um novo serviço deve ser criado. Se você estiver usando vetorização integrada (conjuntos de habilidades que chamam a IA do Azure), a Pesquisa de IA do Azure deve estar na mesma região que os serviços do Azure OpenAI ou do Azure AI.

  • Incorporações vetoriais pré-existentes ou usam vetorização integrada, onde os modelos de incorporação são chamados a partir do pipeline de indexação.

  • Você deve saber o limite de dimensões do modelo usado para criar as incorporações. Os valores válidos são de 2 a 3072 dimensões. No Azure OpenAI, para text-embedding-ada-002, o comprimento do vetor numérico é 1536. Para text-embedding-3-small ou text-embedding-3-large, o comprimento do vetor é 3072.

  • Você também deve saber quais são as métricas de semelhança suportadas. Para o Azure OpenAI, a semelhança é calculada usando cosineo .

  • Você deve estar familiarizado com a criação de um índice. O esquema deve incluir um campo para a chave do documento, outros campos que você deseja pesquisar ou filtrar e outras configurações para comportamentos necessários durante a indexação e consultas.

Preparar documentos para indexação

Antes da indexação, monte uma carga útil do documento que inclua campos de dados vetoriais e não vetoriais. A estrutura do documento deve estar em conformidade com o esquema de índice.

Certifique-se de que os seus documentos:

  1. Forneça um campo ou uma propriedade de metadados que identifique exclusivamente cada documento. Todos os índices de pesquisa requerem uma chave de documento. Para satisfazer os requisitos de chave do documento, um documento de origem deve ter um campo ou propriedade que possa identificá-lo exclusivamente no índice. Este campo de origem deve ser mapeado para um campo de índice do tipo Edm.String e key=true no índice de pesquisa.

  2. Forneça dados vetoriais (uma matriz de números de ponto flutuante de precisão única) em campos de origem.

    Os campos vetoriais contêm uma matriz gerada por modelos de incorporação, uma incorporação por campo, onde o campo é um campo de nível superior (não parte de um tipo aninhado ou complexo). Para a integração mais simples, recomendamos os modelos de incorporação no Azure OpenAI, como text-embedding-ada-002 para documentos de texto ou a API REST de recuperação de imagem para imagens.

    Se você puder depender de indexadores e conjuntos de habilidades, considere o uso de vetorização integrada que codifica imagens e conteúdo textual durante a indexação. Suas definições de campo são para campos vetoriais, mas os dados de origem de entrada podem ser texto ou imagens, representados como matrizes vetoriais criadas durante a indexação.

  3. Forneça outros campos com conteúdo legível por humanos para a resposta da consulta e para cenários de consulta híbrida que incluam pesquisa de texto completo ou classificação semântica na mesma solicitação.

Seu índice de pesquisa deve incluir campos e conteúdo para todos os cenários de consulta aos quais você deseja oferecer suporte. Suponha que você queira pesquisar ou filtrar nomes, versões, metadados ou endereços de produtos. Neste caso, a pesquisa de semelhança não é especialmente útil. A pesquisa por palavras-chave, a pesquisa geográfica ou os filtros seriam a melhor escolha. Um índice de pesquisa que inclui uma coleção de campo abrangente de dados vetoriais e não vetoriais fornece a máxima flexibilidade para a construção de consultas e composição de respostas.

Um pequeno exemplo de uma carga útil de documentos que inclui campos vetoriais e não vetoriais está na seção de dados vetoriais de carga deste artigo.

Adicionar uma configuração de pesquisa vetorial

Uma configuração de vetor especifica os parâmetros usados durante a indexação para criar informações de "vizinho mais próximo" entre os nós vetoriais:

  • Pequeno Mundo Navegável Hierárquico (HNSW)
  • KNN exaustivo

Se você escolher HNSW em um campo, poderá optar por KNN exaustivo no momento da consulta. Mas a outra direção não funciona: se você escolher exaustiva, não poderá solicitar posteriormente a pesquisa HNSW porque as estruturas de dados extras que permitem a pesquisa aproximada não existem.

Uma configuração de vetor também especifica métodos de quantização para reduzir o tamanho do vetor:

  • Escalar
  • Binário (disponível apenas em 2024-07-01 e em pacotes mais recentes do SDK do Azure)

Para obter instruções sobre como migrar para a versão mais recente, consulte Atualizar API REST.

2024-07-01 está disponível em geral. Ele suporta uma configuração vetorial tendo:

  • vectorSearch.algorithms suporte HNSW e KNN exaustivo.
  • vectorSearch.compressions suporta quantização escalar e binária, sobreamostragem e reclassificação com vetores originais.
  • vectorSearch.profiles fornecem várias combinações de configurações de algoritmo e compressão.

Certifique-se de ter uma estratégia para vetorizar seu conteúdo. Recomendamos vetorização integrada e vetorizadores de tempo de consulta para codificação integrada.

  1. Use a API Criar ou Atualizar Índice para criar o índice.

  2. Adicione uma vectorSearch seção no índice que especifique os algoritmos de pesquisa usados para criar o espaço de incorporação.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

    Pontos principais:

    • Os nomes para cada configuração de compressão, algoritmo e perfil devem ser exclusivos para seu tipo dentro do índice.

    • vectorSearch.compressions.kind pode ser scalarQuantization ou binaryQuantization.

    • vectorSearch.compressions.rerankWithOriginalVectors usa os vetores originais não compactados para recalcular a semelhança e reclassificar os principais resultados retornados pela consulta de pesquisa inicial. Os vetores não compactados existem no índice de pesquisa, mesmo que stored seja falso. Esta propriedade é opcional. A predefinição é verdadeiro.

    • vectorSearch.compressions.defaultOversampling considera um conjunto mais amplo de resultados potenciais para compensar a redução da informação a partir da quantização. A fórmula para resultados potenciais consiste no k na consulta, com um multiplicador de sobreamostragem. Por exemplo, se a consulta especificar um k de 5 e a sobreamostragem for 20, a consulta solicitará efetivamente 100 documentos para uso na reclassificação, usando o vetor não compactado original para essa finalidade. Apenas os k melhores resultados reclassificados são retornados. Esta propriedade é opcional. O padrão é 4.

    • vectorSearch.compressions.scalarQuantizationParameters.quantizedDataType deve ser definido como int8. Este é o único tipo de dados primitivo suportado no momento. Esta propriedade é opcional. A predefinição é int8.

    • vectorSearch.algorithms.kind são ou "hnsw" "exhaustiveKnn". Estes são os algoritmos ANN (Approximate Nearest Neighbors) usados para organizar o conteúdo vetorial durante a indexação.

    • vectorSearch.algorithms.m é a contagem de ligações bidirecionais. O padrão é 4. O intervalo é de 4 a 10. Valores mais baixos devem retornar menos ruído nos resultados.

    • vectorSearch.algorithms.efConstruction é o número de vizinhos mais próximos usados durante a indexação. O padrão é 400. O intervalo é de 100 a 1.000.

    • "vectorSearch.algorithms.fSearch é o número de vizinhos mais próximos usado durante a pesquisa. O padrão é 500. O intervalo é de 100 a 1.000.

    • vectorSearch.algorithms.metric deve ser "cosseno" se você estiver usando o Azure OpenAI, caso contrário, use a métrica de semelhança associada ao modelo de incorporação que você está usando. Os valores suportados são cosine, dotProduct, euclidean, hamming (usado para indexar dados binários).

    • vectorSearch.profiles Adicione uma camada de abstração para acomodar definições mais ricas. Um perfil é definido em e, em vectorSearchseguida, referenciado pelo nome em cada campo vetorial. É uma combinação de compressão e configurações de algoritmo. Esta é a propriedade que você atribui a um campo vetorial e determina o algoritmo e a compactação dos campos.

Adicionar um campo vetorial à coleção de campos

A coleção de campos deve incluir um campo para a chave do documento, campos vetoriais e quaisquer outros campos necessários para cenários de pesquisa híbrida.

Os campos vetoriais são caracterizados por seu tipo de dados, uma dimensions propriedade baseada no modelo de incorporação usado para produzir os vetores e um perfil vetorial.

2024-07-01 está disponível em geral.

  1. Use o Criar ou Atualizar Índice para criar o índice.

  2. Defina um campo vetorial com os seguintes atributos. Você pode armazenar uma incorporação gerada por campo. Para cada campo vetorial:

    • typedeve ser um tipo de dados vetoriais. Collection(Edm.Single) é o mais comum para incorporar modelos.
    • dimensions é o número de dimensões geradas pelo modelo de incorporação. Para text-embedding-ada-002, é 1536.
    • vectorSearchProfile é o nome de um perfil definido em outra parte do índice.
    • searchable deve ser verdade.
    • retrievable pode ser verdadeiro ou falso. True retorna os vetores brutos (1536 deles) como texto simples e consome espaço de armazenamento. Defina como true se você estiver passando um resultado vetorial para um aplicativo downstream.
    • stored pode ser verdadeiro ou falso. Ele determina se uma cópia extra de vetores é armazenada para recuperação. Para obter mais informações, consulte Reduzir o tamanho do vetor.
    • filterable, facetable, sortable deve ser falso.
  3. Adicione campos não vetoriais filtráveis à coleção, como "title" com filterable set to true, se quiser invocar pré-filtragem ou pós-filtragem na consulta vetorial.

  4. Adicione outros campos que definam a substância e a estrutura do conteúdo textual que você está indexando. No mínimo, você precisa de uma chave de documento.

    Você também deve adicionar campos que sejam úteis na consulta ou em sua resposta. O exemplo a seguir mostra campos de vetor para título e conteúdo ("titleVector", "contentVector") que são equivalentes a vetores. Ele também fornece campos para conteúdo textual equivalente ("título", "conteúdo") útil para classificar, filtrar e ler em um resultado de pesquisa.

    O exemplo a seguir mostra a coleção fields:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Carregar dados vetoriais para indexação

O conteúdo fornecido para indexação deve estar em conformidade com o esquema de índice e incluir um valor de cadeia de caracteres exclusivo para a chave do documento. Os dados pré-vetorizados são carregados em um ou mais campos vetoriais, que podem coexistir com outros campos contendo conteúdo não vetorial.

Você pode usar metodologias push ou pull para ingestão de dados.

Use Documents - Index para carregar dados vetoriais e não vetoriais em um índice. As APIs push para indexação são idênticas em todas as versões estáveis e de visualização. Use qualquer uma das seguintes APIs para carregar documentos:

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2024-07-01

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Verifique o seu índice para conteúdo vetorial

Para fins de validação, você pode consultar o índice usando o Gerenciador de Pesquisa no portal do Azure ou uma chamada de API REST. Como a Pesquisa de IA do Azure não pode converter um vetor em texto legível por humanos, tente retornar campos do mesmo documento que forneçam evidências da correspondência. Por exemplo, se a consulta vetorial tiver como alvo o campo "titleVector", você poderá selecionar "title" para os resultados da pesquisa.

Os campos devem ser atribuídos como "recuperáveis" para serem incluídos nos resultados.

  • Revise os índices em Índices de gerenciamento de>pesquisa para exibir o tamanho total do índice e o tamanho do índice vetorial. Um tamanho de índice vetorial positivo indica que os vetores estão presentes.

  • Use o Search Explorer para consultar um índice. O Search Explorer tem dois modos de exibição: modo de exibição de consulta (padrão) e modo de exibição JSON.

    • Definir opções>de consulta Oculte valores vetoriais nos resultados da pesquisa para obter resultados mais legíveis.

    • Use o modo de exibição JSON para consultas vetoriais. Você pode colar em uma definição JSON da consulta vetorial que deseja executar ou usar a conversão interna de texto para vetor ou de imagem para vetor se o índice tiver uma atribuição de vetorizador. Para obter mais informações sobre a pesquisa de imagens, consulte Guia de início rápido: pesquisar imagens no Search Explorer.

    • Use o modo de exibição Consulta padrão para uma confirmação rápida de que o índice contém vetores. A vista de consulta destina-se à pesquisa de texto completo. Embora não seja possível usá-lo para consultas vetoriais, você pode enviar uma pesquisa vazia (search=*) para verificar o conteúdo. O conteúdo de todos os campos, incluindo campos vetoriais, é retornado como texto sem formatação.

    • Consulte Criar uma consulta vetorial para obter mais detalhes.

Atualizar um repositório de vetores

Para atualizar um repositório vetorial, modifique o esquema e, se necessário, recarregue documentos para preencher novos campos. As APIs para atualizações de esquema incluem Create or Update Index (REST), CreateOrUpdateIndex no SDK do Azure para .NET, create_or_update_index no SDK do Azure para Python e métodos semelhantes em outros SDKs do Azure.

A orientação padrão para atualizar um índice é abordada em Atualizar ou reconstruir um índice.

Os pontos-chave incluem:

  • Soltar e reconstruir geralmente é necessário para atualizações e exclusão de campos existentes.

  • No entanto, você pode atualizar um esquema existente com as seguintes modificações, sem necessidade de reconstrução:

    • Adicione novos campos a uma coleção de campos.
    • Adicione novas configurações vetoriais, atribuídas a novos campos, mas não a campos existentes que já foram vetorizados.
    • Altere "recuperável" (os valores são true ou false) em um campo existente. Os campos vetoriais devem ser pesquisáveis e recuperáveis, mas se você quiser desabilitar o acesso a um campo vetorial em situações em que soltar e reconstruir não é viável, você pode definir recuperável como falso.

Próximos passos

Como próxima etapa, recomendamos Consultar dados vetoriais em um índice de pesquisa.

Exemplos de código no repositório azure-search-vector demonstram fluxos de trabalho de ponta a ponta que incluem definição de esquema, vetorização, indexação e consultas.

Há código de demonstração para Python, C# e JavaScript.