Criar um repositório de vetores

No Azure AI Search, 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 o espaço de incorporação e configurações em definições de campo vetorial que são usadas em solicitações de consulta. A API Create Index cria o repositório vetorial.

Siga estas etapas para indexar dados vetoriais:

Este artigo aplica-se à versão geralmente disponível não pré-visualização da pesquisa vetorial, que pressupõe que o código do seu aplicativo chama recursos externos para fragmentação e codificação.

Nota

Procurando orientações sobre migração a partir de 2023-07-01-preview? Consulte Atualizar APIs REST.

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 suporta pesquisa vetorial. Se um índice contendo campos vetoriais não for criado ou atualizado, este é um indicador. Nessa situação, um novo serviço deve ser criado.

  • Incorporações vetoriais pré-existentes em seus documentos de origem. O Azure AI Search não gera vetores na versão geralmente disponível dos SDKs do Azure e APIs REST. Recomendamos modelos de incorporação do Azure OpenAI, mas você pode usar qualquer modelo para vetorização. Para obter mais informações, consulte Gerar incorporações.

  • Você deve saber o limite de dimensões do modelo usado para criar as incorporações e como a semelhança é calculada. No Azure OpenAI, para text-embedding-ada-002, o comprimento do vetor numérico é 1536. A semelhança é calculada usando cosine. Os valores válidos são de 2 a 3072 dimensões.

  • 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 dados numéricos gerados por modelos de incorporação, uma incorporação por campo. 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. Apenas campos vetoriais de nível superior de índice são suportados: subcampos vetoriais não são suportados no momento.

  3. Forneça outros campos com conteúdo alfanumérico legível por humanos para a resposta da consulta e para cenários de consulta híbridos 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 vetorial especifica o algoritmo de pesquisa vetorial e 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 funcionará: se você escolher exaustivo, não poderá solicitar posteriormente a pesquisa HNSW porque as estruturas de dados extras que permitem a pesquisa aproximada não existem.

Procurando orientação de migração de versão de visualização para estável? Consulte Atualizar APIs REST para conhecer as etapas.

A API REST versão 2023-11-01 suporta uma configuração vetorial com:

  • vectorSearch algoritmos, hnsw e exhaustiveKnn vizinhos mais próximos, com parâmetros para indexação e pontuação.
  • vectorProfiles para múltiplas combinações de configurações de algoritmos.

Certifique-se de ter uma estratégia para vetorizar seu conteúdo. A versão estável não fornece vetorizadores para incorporação incorporada.

  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": {
         "algorithms": [
             {
                 "name": "my-hnsw-config-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-hnsw-config-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "my-eknn-config",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "cosine"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "my-default-vector-profile",
             "algorithm": "my-hnsw-config-2"
           }
         ]
     }
    

    Pontos principais:

    • Nome da configuração. O nome deve ser exclusivo dentro do índice.
    • 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.
    • "hnsw" e "exhaustiveKnn" são os algoritmos ANN (Approximate Nearest Neighbors) usados para organizar o conteúdo vetorial durante a indexação.
    • "m" (contagem de links bidirecional) o padrão é 4. O intervalo é de 4 a 10. Valores mais baixos devem retornar menos ruído nos resultados.
    • "efConstruction" o padrão é 400. O intervalo é de 100 a 1.000. É o número de vizinhos mais próximos usado durante a indexação.
    • "efSearch" O padrão é 500. O intervalo é de 100 a 1.000. É o número de vizinhos mais próximos usado durante a pesquisa.
    • "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.

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 do tipo Collection(Edm.Single) e valores de ponto flutuante de precisão única. Um campo desse tipo também tem uma dimensions propriedade e especifica uma configuração vetorial.

Use esta versão se quiser apenas recursos disponíveis 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:

    • type deve ser Collection(Edm.Single).
    • 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.
    • 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=2023-11-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,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "dimensions": 1536,
                "vectorSearchProfile": "my-default-vector-profile"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "my-hnsw-config-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "my-default-vector-profile",
                    "algorithm": "my-hnsw-config-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 alfanumérico.

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

Use Documentos de índice (2023-11-01), Documentos de índice (2023-10-01-Preview) ou Adicionar, atualizar ou excluir documentos (2023-07-01-Preview) para enviar documentos por push contendo dados vetoriais.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "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.

Você pode usar o Search Explorer para consultar um índice. O explorador de pesquisa tem duas vistas: vista de consulta (predefinição) e vista JSON.

  • Use o modo de exibição JSON para consultas vetoriais, colando em uma definição JSON da consulta vetorial que você deseja executar.

  • 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.

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 Drop e 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.