Compartilhar via


Tutorial: Maximizar a relevância (RAG na Pesquisa de IA do Azure)

Neste tutorial, saiba como aprimorar a relevância dos resultados da pesquisa usados em soluções RAG. O ajuste de relevância pode ser um fator importante na entrega de uma solução RAG que atenda às expectativas do usuário. Na Pesquisa de IA do Azure, o ajuste de relevância inclui classificação semântica L2 e perfis de pontuação.

Para implementar esses recursos, você revisita o esquema do índice para adicionar configurações de classificação semântica e perfis de pontuação. Em seguida, executa novamente as consultas usando os novos constructos.

Neste tutorial, você modificará o índice de pesquisa e as consultas existentes a serem usadas:

  • Classificação semântica L2
  • Perfil de pontuação para aumento de documentos

Este tutorial atualiza o índice de pesquisa criado pelo pipeline de indexação. As atualizações não afetam o conteúdo existente, portanto, nenhuma recompilação é necessária e você não precisa executar novamente o indexador.

Observação

Há mais recursos de relevância na visualização, incluindo a ponderação de consulta de vetor e a definição de limites mínimos, mas os omitimos deste tutorial porque eles estão na visualização.

Pré-requisitos

Baixar o exemplo

O notebook de amostra inclui um índice atualizado e uma solicitação de consulta.

Executar uma consulta de linha de base para comparação

Vamos começar com uma nova consulta: "Há alguma formação de nuvem específica para oceanos e grandes corpos d'água?".

Para comparar os resultados depois de adicionar recursos de relevância, execute a consulta em relação ao esquema de índice existente, antes de adicionar uma classificação semântica ou um perfil de pontuação.

Ao usar a nuvem Azure Government, modifique o ponto de extremidade da API no provedor de token para "https://cognitiveservices.azure.us/.default".

from azure.search.documents import SearchClient
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
     api_version="2024-06-01",
     azure_endpoint=AZURE_OPENAI_ACCOUNT,
     azure_ad_token_provider=token_provider
 )

deployment_name = "gpt-4o"

search_client = SearchClient(
     endpoint=AZURE_SEARCH_SERVICE,
     index_name=index_name,
     credential=credential
 )

GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# Focused query on cloud formations and bodies of water
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    select=["title", "chunk", "locations"],
    top=5,
)

sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model=deployment_name
)

print(response.choices[0].message.content)

A saída dessa solicitação pode ser semelhante ao exemplo a seguir.

Yes, there are cloud formations specific to oceans and large bodies of water. 
A notable example is "cloud streets," which are parallel rows of clouds that form over 
the Bering Strait in the Arctic Ocean. These cloud streets occur when wind blows from 
a cold surface like sea ice over warmer, moister air near the open ocean, leading to 
the formation of spinning air cylinders. Clouds form along the upward cycle of these cylinders, 
while skies remain clear along the downward cycle (Source: page-21.pdf).

Atualizar o índice para classificação semântica e perfis de pontuação

Em um tutorial anterior, você projetou um esquema de índice para cargas de trabalho RAG. Propositalmente omitimos aprimoramentos de relevância desse esquema para que você pudesse se concentrar nos conceitos básicos. Adiar a relevância para um exercício separado fornece uma comparação antes e depois da qualidade dos resultados da pesquisa após as atualizações serem feitas.

  1. Atualize as instruções de importação para incluir classes para classificação semântica e perfis de pontuação.

     from azure.identity import DefaultAzureCredential
     from azure.identity import get_bearer_token_provider
     from azure.search.documents.indexes import SearchIndexClient
     from azure.search.documents.indexes.models import (
         SearchField,
         SearchFieldDataType,
         VectorSearch,
         HnswAlgorithmConfiguration,
         VectorSearchProfile,
         AzureOpenAIVectorizer,
         AzureOpenAIVectorizerParameters,
         SearchIndex,
         SemanticConfiguration,
         SemanticPrioritizedFields,
         SemanticField,
         SemanticSearch,
         ScoringProfile,
         TagScoringFunction,
         TagScoringParameters
     )
    
  2. Adicione a configuração semântica a seguir ao índice de pesquisa. Este exemplo pode ser encontrado na etapa de esquema de atualização no notebook.

    # New semantic configuration
    semantic_config = SemanticConfiguration(
        name="my-semantic-config",
        prioritized_fields=SemanticPrioritizedFields(
            title_field=SemanticField(field_name="title"),
            keywords_fields=[SemanticField(field_name="locations")],
            content_fields=[SemanticField(field_name="chunk")]
        )
    )
    
    # Create the semantic settings with the configuration
    semantic_search = SemanticSearch(configurations=[semantic_config])
    

    Uma configuração semântica tem um nome e uma lista priorizada de campos para ajudar a otimizar as entradas para o classificador semântico. Para obter mais informações, consulte Configurar classificação semântica.

  3. Em seguida, adicione uma definição de perfil de pontuação. Assim como acontece com a configuração semântica, um perfil de pontuação pode ser adicionado a um esquema de índice a qualquer momento. Este exemplo também está na etapa de esquema de atualização no notebook, seguindo a configuração semântica.

    # New scoring profile
    scoring_profiles = [  
        ScoringProfile(  
            name="my-scoring-profile",
            functions=[
                TagScoringFunction(  
                    field_name="locations",  
                    boost=5.0,  
                    parameters=TagScoringParameters(  
                        tags_parameter="tags",  
                    ),  
                ) 
            ]
        )
    ]
    

    Esse perfil usa a função de marca que impulsiona as pontuações de documentos em que uma correspondência foi encontrada no campo locais. Lembre-se de que o índice de pesquisa tem um campo de vetor e vários campos não vetor para título, partes e locais. O campo locais é uma coleção de cadeias de caracteres e as coleções de cadeias de caracteres podem ser impulsionadas usando a função de marcas em um perfil de pontuação. Para obter mais informações, consulte Adicionar um perfil de pontuação e Aprimorando a relevância da pesquisa com o aumento de documentos (postagem no blog).

  4. Atualizar a definição de índice no serviço de pesquisa.

    # Update the search index with the semantic configuration
     index = SearchIndex(name=index_name, fields=fields, vector_search=vector_search, semantic_search=semantic_search, scoring_profiles=scoring_profiles)  
     result = index_client.create_or_update_index(index)  
     print(f"{result.name} updated")  
    

Atualizar consultas para classificação semântica e perfis de pontuação

Em um tutorial anterior, você executou consultas que são executadas no mecanismo de pesquisa, passando a resposta e outras informações para uma LLM para conclusão do chat.

Este exemplo modifica a solicitação de consulta para incluir a configuração semântica e o perfil de pontuação.

Ao usar a nuvem Azure Government, modifique o ponto de extremidade da API no provedor de token para "https://cognitiveservices.azure.us/.default".

# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
     api_version="2024-06-01",
     azure_endpoint=AZURE_OPENAI_ACCOUNT,
     azure_ad_token_provider=token_provider
 )

deployment_name = "gpt-4o"

search_client = SearchClient(
     endpoint=AZURE_SEARCH_SERVICE,
     index_name=index_name,
     credential=credential
 )

# Prompt is unchanged in this update
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# Queries are unchanged in this update
query="Are there any cloud formations specific to oceans and large bodies of water?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Add query_type semantic and semantic_configuration_name
# Add scoring_profile and scoring_parameters
search_results = search_client.search(
    query_type="semantic",
    semantic_configuration_name="my-semantic-config",
    scoring_profile="my-scoring-profile",
    scoring_parameters=["tags-ocean, 'sea surface', seas, surface"],
    search_text=query,
    vector_queries= [vector_query],
    select="title, chunk, locations",
    top=5,
)
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model=deployment_name
)

print(response.choices[0].message.content)

A saída de uma consulta classificada semanticamente e impulsionada pode ser semelhante ao exemplo a seguir.

Yes, there are specific cloud formations influenced by oceans and large bodies of water:

- **Stratus Clouds Over Icebergs**: Low stratus clouds can frame holes over icebergs, 
such as Iceberg A-56 in the South Atlantic Ocean, likely due to thermal instability caused 
by the iceberg (source: page-39.pdf).

- **Undular Bores**: These are wave structures in the atmosphere created by the collision 
of cool, dry air from a continent with warm, moist air over the ocean, as seen off the 
coast of Mauritania (source: page-23.pdf).

- **Ship Tracks**: These are narrow clouds formed by water vapor condensing around tiny 
particles from ship exhaust. They are observed over the oceans, such as in the Pacific Ocean 
off the coast of California (source: page-31.pdf).

These specific formations are influenced by unique interactions between atmospheric conditions 
and the presence of large water bodies or objects within them.

A adição de classificação semântica e perfis de pontuação afeta positivamente a resposta do LLM, promovendo resultados que atendem aos critérios de pontuação e são semanticamente relevantes.

Agora que você tem uma melhor compreensão do design de índice e consulta, vamos passar a otimizar para velocidade e concisão. Revisitamos a definição de esquema para implementar a redução de compartimentalização e armazenamento, mas o restante do pipeline e dos modelos permanecem intactos.

Próxima etapa