Editar

Partilhar via


Recuperação de informações

Azure AI services
Azure AI Search
Azure OpenAI Service
Azure Machine Learning

Depois de gerar as incorporações para seus blocos, a próxima etapa é gerar o índice no banco de dados vetorial e experimentar para determinar as pesquisas ideais a serem realizadas. Quando você está experimentando a recuperação de informações, há várias áreas a serem consideradas, incluindo opções de configuração para o índice de pesquisa, os tipos de pesquisas que você deve realizar e sua estratégia de reclassificação. Este artigo aborda estes três tópicos.

Este artigo faz parte de uma série. Leia a introdução.

Índice de pesquisa

Nota

O Azure AI Search é um serviço de pesquisa do Azure de primeira parte. Esta seção mencionará alguns detalhes para a Pesquisa de IA. Se você estiver usando um armazenamento diferente, consulte a documentação para encontrar a configuração de chave para esse serviço.

O índice de pesquisa na sua loja tem uma coluna para cada campo nos seus dados. Os repositórios de pesquisa geralmente têm suporte para tipos de dados não vetoriais, como string, booleano, inteiro, único, duplo, datetime e coleções como Collection(single) e tipos de dados vetoriais, como Collection(single). Para cada coluna, você deve configurar informações como o tipo de dados, se o campo é filtrável, recuperável e/ou pesquisável.

A seguir estão algumas decisões importantes que você deve tomar para a configuração de pesquisa vetorial que são aplicadas a campos vetoriais:

  • Algoritmo de pesquisa vetorial - O algoritmo usado para procurar correspondências relativas. O Azure AI Search tem uma opção de algoritmo de força bruta que verifica todo o espaço vetorial chamado KNN exaustivo e uma opção de algoritmo com mais desempenho que executa uma pesquisa de vizinho mais próximo (ANN) aproximada chamada Hierarchical Navigable Small World (HNSW).
  • métrica - Esta configuração é a métrica de semelhança usada para calcular a proximidade pelo algoritmo. As opções na Pesquisa de IA do Azure são cosine, dotProduct e Euclidean. Se você estiver usando modelos de incorporação do Azure OpenAI, escolha cosine.
  • efConstruction - Parâmetro usado durante a construção do índice Hierarchical Navigable Small Worlds (HNSW) que define o número de vizinhos mais próximos que estão conectados a um vetor durante a indexação. Um valor de efConstruction maior resulta em um índice de melhor qualidade do que um número menor. A contrapartida é que um valor maior requer mais tempo, armazenamento e computação. efConstruction deve ser maior para um grande número de pedaços e menor para um número baixo de pedaços. Determinar o valor ideal requer experimentação com seus dados e consultas esperadas.
  • efSearch - Parâmetro que é usado no momento da consulta para definir o número de vizinhos mais próximos (ou seja, blocos semelhantes) usados durante a pesquisa.
  • m - A contagem de ligações bidirecionais. O intervalo é de 4 a 10, com números mais baixos devolvendo menos ruído nos resultados.

No Azure AI Search, as configurações de vetor são encapsuladas em uma vectorSearch configuração. Ao configurar suas colunas vetoriais, você faz referência à configuração apropriada para essa coluna vetorial e define o número de dimensões. O atributo dimensions da coluna vetorial representa o número de dimensões geradas pelo modelo de incorporação escolhido. Por exemplo, o modelo otimizado text-embedding-3-small para armazenamento gera 1.536 dimensões.

Pesquisas

Ao executar consultas do seu orquestrador de prompt em relação ao seu repositório de pesquisa, você tem muitas opções a considerar. Você precisa determinar:

  • Que tipo de pesquisa você vai realizar: vetor ou palavra-chave ou híbrido
  • Se você vai consultar uma ou mais colunas
  • Se você vai executar manualmente várias consultas, como uma consulta de palavra-chave e uma pesquisa vetorial
  • Se a consulta precisa ser dividida em subconsultas
  • Se a filtragem deve ser usada em suas consultas

Seu orquestrador de prompt pode adotar uma abordagem estática ou uma abordagem dinâmica misturando as abordagens com base em pistas de contexto do prompt. As seções a seguir abordam essas opções para ajudá-lo a experimentar e encontrar a abordagem certa para sua carga de trabalho.

Tipos de pesquisa

As plataformas de pesquisa geralmente suportam texto completo e pesquisas vetoriais. Algumas plataformas, como o Azure AI Search, suportam pesquisas híbridas. Para ver os recursos de várias ofertas de pesquisa vetorial, consulte Escolher um serviço do Azure para pesquisa vetorial.

As pesquisas vetoriais correspondem à semelhança entre a consulta vetorizada (prompt) e os campos vetoriais.

Importante

Você deve executar as mesmas operações de limpeza executadas em partes antes de incorporar a consulta. Por exemplo, se você colocou em caixa baixa todas as palavras do bloco incorporado, deverá colocar em minúsculas todas as palavras da consulta antes de incorporá-las.

Nota

Você pode executar uma pesquisa vetorial em vários campos vetoriais na mesma consulta. No Azure AI Search, essa é tecnicamente uma pesquisa híbrida. Para obter mais informações, consulte essa seção.

embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)

vector = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)

results = client.search(
    search_text=None,
    vector_queries=[vector],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

O código de exemplo executa uma pesquisa vetorial no contentVector campo. Observe que o código que incorpora a consulta pré-processa a consulta primeiro. Esse pré-processo deve ser o mesmo código que pré-processa os blocos antes da incorporação. O modelo de incorporação deve ser o mesmo modelo de incorporação que incorporou as partes.

As pesquisas de texto completo correspondem ao texto sem formatação armazenado em um índice. É uma prática comum extrair palavras-chave de uma consulta e usar essas palavras-chave extraídas em uma pesquisa de texto completo em uma ou mais colunas indexadas. As pesquisas de texto completo podem ser configuradas para retornar correspondências onde quaisquer termos ou todos os termos coincidem.

Você tem que experimentar para determinar quais campos são eficazes para executar pesquisas de texto completo. Conforme discutido na fase Enriquecimento, os campos de palavras-chave e metadados de entidade são bons candidatos a serem considerados para pesquisa de texto completo em cenários em que o conteúdo tem significado semântico semelhante, mas entidades ou palavras-chave diferem. Outros campos comuns a serem considerados para a pesquisa de texto completo são título, resumo e o texto em bloco.

formatted_search_results = []

results = client.search(
    search_text=query,
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

formatted_search_results = format_results(results)

O código de exemplo executa uma pesquisa de texto completo nos campos título, conteúdo e resumo.

O Azure AI Search dá suporte a consultas híbridas em que sua consulta pode conter uma ou mais pesquisas de texto e uma ou mais pesquisas vetoriais. A plataforma realiza cada consulta, obtém os resultados intermediários, reclassifica os resultados usando o Reciprocal Rank Fusion (RRF) e retorna os melhores resultados N.

 embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)
vector2 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="questionVector",
    vector=embedding,
)

results = client.search(
    search_text=query,
    vector_queries=[vector1, vector2],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

O código de exemplo executa uma pesquisa de texto completo nos campos title, content e summary e pesquisas vetoriais nos campos contentVector e questionVector. A plataforma Azure AI Search executa todas as consultas em paralelo, reclassifica os resultados e retorna os principais documentos retrieve_num_of_documents.

Múltiplos manuais

Você pode, é claro, executar várias consultas, como uma pesquisa vetorial e uma pesquisa de texto completo por palavra-chave, manualmente. Você agrega os resultados e reclassifica os resultados manualmente e retorna os resultados principais. A seguir estão os casos de uso para múltiplos manuais:

  • Está a utilizar uma plataforma de pesquisa que não suporta pesquisas híbridas. Você seguiria essa opção para realizar sua própria pesquisa híbrida.
  • Você deseja executar pesquisas de texto completo em consultas diferentes. Por exemplo, você pode extrair palavras-chave da consulta e executar uma pesquisa de texto completo no campo de metadados de palavras-chave. Em seguida, você pode extrair entidades e executar uma consulta no campo de metadados de entidades.
  • Você mesmo quer controlar o processo de reclassificação.
  • A consulta requer que várias subconsultas sejam executadas para recuperar dados de aterramento de várias fontes.

Várias subconsultas

Alguns prompts são complexos e exigem mais de uma coleção de dados para fundamentar o modelo. Por exemplo, a consulta "Como funcionam os carros elétricos e como eles se comparam aos veículos ICE?" provavelmente requer dados de aterramento de várias fontes.

É uma boa prática determinar se a consulta requer várias pesquisas antes de executar qualquer pesquisa. Se você considerar que várias subconsultas são necessárias, poderá executar várias consultas manuais para todas as consultas. Use um modelo de linguagem grande para determinar se várias subconsultas são necessárias. O seguinte prompt é obtido do acelerador de experimento RAG que é usado para categorizar uma consulta como simples ou complexa, com complexo exigindo várias consultas:

Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
  a. The question is asking for a straightforward fact or piece of information
  b. The answer could likely be found stated directly in a single passage of a relevant document
  c. Breaking the question down further is unlikely to be beneficial
  Examples: "What year did World War 2 end?", "What is the capital of France?, "What is the features of productX?"
2. Complex, multi-part question
  a. The question has multiple distinct components or is asking for information about several related topics
  b. Different parts of the question would likely need to be answered by separate passages or documents
  c. Breaking the question down into sub-questions for each component would allow for better results
  d. The question is open-ended and likely to have a complex or nuanced answer
  e. Answering it may require synthesizing information from multiple sources
  f. The question may not have a single definitive answer and could warrant analysis from multiple angles
  Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"

Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.

Example output:
{
  "category": "simple"
}

Um modelo de linguagem grande também pode ser usado para extrair subconsultas de uma consulta complexa. O prompt a seguir é retirado do acelerador de experimento RAG que converte uma consulta complexa em várias subconsultas.

Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.

Example input question:
What are the main causes of deforestation, and how can it be mitigated?

Example output:
{
  "questions": [
    "What are the primary human activities that contribute to deforestation?",
    "How does agriculture play a role in deforestation?",
    "What is the impact of logging and timber harvesting on deforestation?",
    "How do urbanization and infrastructure development contribute to deforestation?",
    "What are the environmental consequences of deforestation?",
    "What are some effective strategies for reducing deforestation?",
    "How can reforestation and afforestation help mitigate the effects of deforestation?",
    "What role can governments and policies play in preventing deforestation?",
    "How can individuals and communities contribute to reducing deforestation?"
  ]
}

Filtragem

Os campos no repositório de pesquisa configurados como filtráveis podem ser usados para filtrar consultas. Considere filtrar palavras-chave e entidades para consultas que usam esses campos para ajudar a restringir o resultado. A filtragem permite que você recupere apenas os dados que satisfazem determinadas condições de um índice, eliminando dados irrelevantes. Isso melhora o desempenho geral da consulta com resultados mais relevantes. Como em todas as decisões, é importante experimentar e testar. As consultas podem não ter palavras-chave ou palavras-chave, abreviaturas ou acrónimos errados. É preciso levar esses casos em consideração.

Reclassificação

A reclassificação permite executar uma ou mais consultas, agregar os resultados e classificá-los. Considere os seguintes motivos para reclassificar os resultados da pesquisa:

  • Realizou várias pesquisas manuais e pretende agregar os resultados e classificá-los.
  • As pesquisas vetoriais e de palavras-chave nem sempre são precisas. Você pode aumentar a contagem de documentos retornados da sua pesquisa, potencialmente incluindo alguns resultados válidos que, de outra forma, seriam ignorados, e usar a reclassificação para avaliar os resultados.

Você pode usar um modelo de linguagem grande ou um codificador cruzado para executar a reclassificação. Algumas plataformas, como o Azure AI Search, têm métodos proprietários para reclassificar os resultados. Você pode avaliar essas opções para seus dados para determinar o que funciona melhor para seu cenário. As seções a seguir fornecem detalhes sobre esses métodos.

Reclassificação de modelos linguísticos grandes

A seguir está um exemplo de prompt de modelo de linguagem grande do acelerador de experimento RAG que reclassifica os resultados.

A list of documents is shown below. Each document has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any last comma from the nested json elements if it's present.
Don't include any documents that are not relevant to the question. There should exactly be one documents element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user defined question

schema:
{
    "documents": {
        "document_1": "Relevance",
        "document_2": "Relevance"
    }
}

Reclassificação entre codificadores

O exemplo a seguir do acelerador de experimento RAG usa o CrossEncoder fornecido pelo Hugging Face para carregar o modelo Roberta. Em seguida, ele itera sobre cada bloco e usa o modelo para calcular a semelhança, dando-lhes um valor. Classificamos os resultados e devolvemos o topo N.

from sentence_transformers import CrossEncoder
...

model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)

cross_scores_ques = model.predict(
    [[user_prompt, item] for item in documents],
    apply_softmax=True,
    convert_to_numpy=True,
)

top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
    sub_context.append(documents[idx])

Classificação semântica

O Azure AI Search tem um recurso proprietário chamado classificação semântica. Esta funcionalidade utiliza modelos de aprendizagem profunda que foram adaptados do Microsoft Bing que promovem os resultados semanticamente mais relevantes. Leia o seguinte para ver Como funciona o ranker semântico.

Orientações de pesquisa

Considere as seguintes orientações gerais ao implementar sua solução de pesquisa:

  • Título, resumo, fonte e o conteúdo bruto (não limpo) são bons campos para retornar de uma pesquisa.
  • Determine antecipadamente se uma consulta precisa ser dividida em subconsultas.
  • Em geral, é uma boa prática executar consultas em vários campos, tanto vetoriais quanto de texto. Quando recebe uma consulta, não sabe se a pesquisa vetorial ou a pesquisa de texto são melhores. Além disso, você não sabe quais campos a pesquisa vetorial ou a pesquisa por palavra-chave são melhores para pesquisar. Você pode pesquisar em vários campos, potencialmente com várias consultas, reclassificar os resultados e retornar os resultados com as pontuações mais altas.
  • Os campos Palavras-chave e entidades são bons candidatos para considerar a filtragem.
  • É uma boa prática usar palavras-chave juntamente com pesquisas vetoriais. As palavras-chave filtram os resultados para um subconjunto menor. O armazenamento de vetores funciona contra esse subconjunto para encontrar as melhores correspondências.

Avaliação da pesquisa

Na fase de preparação, você deve ter reunido consultas de teste juntamente com informações do documento de teste. Pode utilizar as seguintes informações recolhidas nessa fase para avaliar os resultados da pesquisa:

  • A consulta - A consulta de exemplo
  • O contexto - A coleção de todo o texto nos documentos de teste que abordam a consulta de exemplo

A seguir estão três métodos de avaliação de recuperação bem estabelecidos que você pode usar para avaliar sua solução de pesquisa:

  • Precisão em K - A percentagem de itens relevantes corretamente identificados do total de resultados da pesquisa. Essa métrica se concentra na precisão dos resultados da pesquisa.
  • Recall em K - Recall em K mede a porcentagem de itens relevantes no K superior do total de itens relativos possíveis. Essa métrica se concentra na cobertura de resultados de pesquisa.
  • Classificação Recíproca Média (MRR) - MRR mede a média das classificações recíprocas da primeira resposta relevante nos resultados de pesquisa classificados. Essa métrica se concentra em onde o primeiro resultado relevante ocorre nos resultados da pesquisa.

Você deve testar exemplos positivos e negativos. Para os exemplos positivos, você quer que as métricas sejam o mais próximo possível de 1. Para os exemplos negativos, em que seus dados não devem ser capazes de endereçar as consultas, você deseja que as métricas sejam o mais próximo possível de 0. Você deve testar todas as consultas de teste e fazer a média dos resultados positivos e negativos da consulta para entender o desempenho agregado dos resultados da pesquisa.

Próximos passos