Editar

Compartilhar via


Recuperação de informações

Serviços de IA do Azure
Azure AI Search
Serviço OpenAI do Azure
Azure Machine Learning

Depois de ter gerado as incorporações para seus fragmentos, a próxima etapa é gerar o índice no banco de dados vetorial e experimentar para determinar as pesquisas ideais a serem executadas. 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 executar e sua estratégia de reclassificação. Este artigo aborda estes tópicos:

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

Índice de pesquisa

Observação

A Pesquisa de IA do Azure é um serviço de pesquisa principal do Azure. Esta seção mencionará algumas especificidades para a pesquisa de IA. Se você estiver usando um repositório diferente, consulte a documentação para encontrar a configuração-chave para esse serviço.

O índice de pesquisa em seu repositório tem uma coluna para cada campo em seus dados. Os armazenamentos de pesquisa geralmente têm suporte para tipos de dados não vetoriais, como string, booliano, inteiro, único, duplo, data e hora 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 busca em vetores que são aplicadas a campos vetoriais:

  • Algoritmo de busca em vetores - O algoritmo usado para procurar correspondências relativas. A Pesquisa de IA do Azure 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 mais eficiente que executa uma pesquisa de vizinho mais próximo (ANN) chamada HNSW (Hierarchical Navigable Small World, Mundo pequeno navegável hierárquico).
  • métrica - Esta configuração é a métrica de similaridade usada para calcular a proximidade pelo algoritmo. As opções na Pesquisa de IA do Azure são cosseno, dotProduct e Euclidiano. Se você estiver usando modelos de incorporação do Azure OpenAI, escolha cosine.
  • efConstruction - Parâmetro usado durante a construção do índice HNSW (Hierarchical Navigable Small Worlds, Mundos pequenos hierárquicos navegáveis) que define o número de vizinhos mais próximos conectados a um vetor durante a indexação. Um valor maior de efConstruction resulta em um índice de qualidade melhor do que em um número menor. A compensação é que um valor maior requer mais tempo, armazenamento e computação. efConstruction deve ser maior para um grande número de fragmentos e menor para um pequeno número de fragmentos. Determinar o valor ideal requer experimentação com seus dados e consultas esperadas.
  • efSearch - Parâmetro usado no momento da consulta para definir o número de vizinhos mais próximos (ou seja, fragmentos semelhantes) usados durante a pesquisa.
  • m - A contagem de links bidirecionais. O intervalo é de 4 a 10, com números menores retornando menos ruído nos resultados.

Na Pesquisa de IA do Azure, as configurações de vetor são encapsuladas em uma configuração vectorSearch. 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 para armazenamento text-embedding-3-small gera 1.536 dimensões.

Searches

Ao executar consultas do seu orquestrador de prompt em relação ao seu armazenamento de pesquisa, você tem muitas opções a serem consideradas. É necessário determinar:

  • Que tipo de pesquisa você vai realizar: vetor ou palavra-chave ou híbrida
  • Se você vai consultar em uma ou mais colunas
  • Se você vai executar manualmente várias consultas, como uma consulta de palavra-chave e uma busca em vetores
  • Se a consulta precisar 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 ajudar você a experimentar para encontrar a abordagem certa para sua carga de trabalho.

Tipos de pesquisa

As plataformas de pesquisa geralmente oferecem suporte a texto completo e a busca em vetores. Algumas plataformas, como a Pesquisa de IA do Azure, oferecem suporte a pesquisas híbridas. Para ver os recursos de várias ofertas de busca em vetores, revise Escolher um serviço do Azure para busca em vetores.

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

Importante

Você deve executar as mesmas operações de limpeza que executou em fragmentos, antes de inserir a consulta. Por exemplo, se você colocou todas as palavras em seu fragmento incorporado em minúsculas, deverá colocar em minúsculas todas as palavras na consulta antes de incorporar.

Observação

Você pode executar uma busca em vetores em vários campos vetoriais na mesma consulta. Na Pesquisa de IA do Azure, essa é tecnicamente uma pesquisa híbrida. Para obter mais informações, consulte a seção sobre pesquisa híbrida.

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 busca em vetores no campo contentVector. 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 fragmentos antes da incorporação. O modelo de incorporação deve ser o mesmo modelo de incorporação que incorporou os fragmentos.

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 em que quaisquer termos ou todos os termos correspondam.

Você precisa experimentar para determinar quais campos são eficazes para executar pesquisas de texto completo. Conforme discutido na fase Enriquecimento , os campos de palavra-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 texto em fragmentos.

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.

A Pesquisa de IA do Azure dá suporte a consultas híbridas em que sua consulta pode conter uma ou mais pesquisas de texto e uma ou mais buscas em vetores. A plataforma realiza cada consulta, obtém os resultados intermediários, reclassifica os resultados usando o RRF (Reciprocal Rank Fusion, Fusão de classificação recíproca) e retorna os resultados N superiores.

 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 Título, Conteúdo e Resumo e buscas em vetores nos campos contentVector e questionVector. A plataforma Pesquisa de IA do Azure executa todas as consultas em paralelo, reclassifica os resultados e retorna os principais documentos retrieve_num_of_documents.

Várias manuais

Você pode, é claro, executar várias consultas, como uma busca em vetores e uma pesquisa de texto completo de palavra-chave, manualmente. Você agrega os resultados e reclassifica os resultados manualmente e retorna os principais resultados. Estes são os casos de uso para várias manuais:

  • Você está usando uma plataforma de pesquisa que não oferece suporte a 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 deseja controlar o processo de reclassificação.
  • A consulta requer que várias subconsultas sejam executadas para recuperar dados de fundamentação 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 fundamentação 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 prompt a seguir é retirado do repositório do GitHub do Acelerador de Experimentos 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 Repositório GitHub do Acelerador de Experimentos 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?"
  ]
}

Passar imagens em consultas

Alguns modelos multimodais, como GPT-4V e GPT-4o, podem interpretar imagens. Se você estiver usando esses modelos, poderá escolher se deseja evitar o agrupamento de suas imagens e passar a imagem como parte da solicitação para o modelo multimodal. Você deve experimentar para determinar como essa abordagem é executada em comparação com o agrupamento das imagens com e sem passagem de contexto adicional. Você também deve comparar a diferença de custo entre as abordagens e fazer uma análise de custo-benefício.

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 toda decisão, é importante experimentar e testar. As consultas podem não ter palavras-chave ou palavras-chave, abreviaturas ou siglas erradas. É 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 seus resultados de pesquisa:

  • Você realizou várias pesquisas manuais e deseja agregar os resultados e classificá-los.
  • As buscas em vetores e de palavras-chave nem sempre são precisas. Você pode aumentar a contagem de documentos retornados de sua pesquisa, possivelmente 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 a Pesquisa de IA do Azure, 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 informações detalhadas sobre esses métodos.

Reclassificação de modelo de linguagem grande

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 do codificador cruzado

O exemplo a seguir do Repositório GitHub do Acelerador de Experimentos RAG usa o CrossEncoder fornecido pelo Hugging Face para carregar o modelo Roberta. Em seguida, ele itera sobre cada fragmento e usa o modelo para calcular a similaridade, dando-lhes um valor. Classificamos os resultados e retornamos o N superior.

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

A Pesquisa de IA do Azure tem um recurso proprietário chamado classificação semântica. Esse recurso usa modelos de aprendizado profundo que foram adaptados do Microsoft Bing que promovem os resultados semanticamente mais relevantes. Leia a seguir para ver Como funciona o classificador semântico.

Diretrizes 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, vetoriais e de texto. Quando você recebe uma consulta, não sabe se a busca em vetores ou a pesquisa de texto são melhores. Você também não sabe quais campos a busca em vetores ou a pesquisa de palavras-chave são melhores para pesquisar. Você pode pesquisar em vários campos, possivelmente com várias consultas, reclassificar os resultados e retornar os resultados com as pontuações mais altas.
  • Os campos de palavras-chave e de entidades são bons candidatos a serem considerados para filtragem.
  • É uma boa prática usar palavras-chave junto com buscas em vetores. As palavras-chave filtram os resultados para um subconjunto menor. O repositório de vetores funciona com esse subconjunto para encontrar as melhores correspondências.

Avaliação da pesquisa

Na fase de preparação, você deve ter reunido consultas de teste junto com as informações do documento de teste. Você pode usar as seguintes informações coletadas 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 porcentagem 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 dos resultados de pesquisa.
  • MRR (Mean Reciprocal Rank, Classificação Recíproca Média) - MRR mede a média das classificações recíprocas da primeira resposta relevante em seus 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ê deseja 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 abordar 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 como os resultados da pesquisa estão se comportando de forma agregada.

Próximas etapas