Compartir a través de


Tutorial: Maximizar la relevancia (RAG en Búsqueda de Azure AI)

En este tutorial, aprenderá a mejorar la relevancia de los resultados de búsqueda usados en las soluciones RAG. La optimización de relevancia puede ser un factor importante en la entrega de una solución RAG que satisfaga las expectativas del usuario. En Búsqueda de Azure AI, el ajuste de relevancia incluye perfiles de puntuación y clasificación semántica L2.

Para implementar estas funcionalidades, vuelva a consultar el esquema de índice para agregar configuraciones para perfiles de clasificación y puntuación semánticas. A continuación, vuelva a ejecutar las consultas mediante las nuevas construcciones.

En este tutorial, modificará el índice de búsqueda existente y las consultas que se usarán:

  • Clasificación semántica L2
  • Perfil de puntuación para la mejora de documentos

En este tutorial se actualiza el índice de búsqueda creado por la canalización de indexación. Las actualizaciones no afectan al contenido existente, por lo que no es necesario volver a generar y no es necesario volver a ejecutar el indexador.

Nota:

Hay más características de relevancia en la versión preliminar, incluida la ponderación de consultas vectoriales y la configuración de umbrales mínimos, pero se omiten de este tutorial porque están en versión preliminar.

Requisitos previos

Descarga del ejemplo

El cuaderno de ejemplo incluye un índice actualizado y una solicitud de consulta.

Ejecución de una consulta de línea base para la comparación

Comencemos con una nueva consulta: "¿Hay alguna formación en la nube específica de océanos y grandes cuerpos de agua?".

Para comparar los resultados después de agregar características de relevancia, ejecute la consulta en el esquema de índice existente antes de agregar una clasificación semántica o un perfil de puntuación.

Para la nube de Azure Government, modifique el punto de conexión de API en el proveedor de tokens a "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)

La salida de esta solicitud podría ser similar al ejemplo siguiente.

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

Actualización del índice para perfiles de clasificación y puntuación semánticas

En un tutorial anterior, diseñó un esquema de índice para cargas de trabajo RAG. Hemos omitido específicamente las mejoras de relevancia de ese esquema para que pueda centrarse en los aspectos básicos. Aplazar la relevancia de un ejercicio independiente proporciona una comparación anterior y posterior de la calidad de los resultados de búsqueda después de realizar las actualizaciones.

  1. Actualice las instrucciones de importación para incluir clases para perfiles de clasificación y puntuación semánticas.

     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. Agregue la siguiente configuración semántica al índice de búsqueda. Este ejemplo se puede encontrar en el paso de esquema de actualización del cuaderno.

    # 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])
    

    Una configuración semántica tiene un nombre y una lista prioritaria de campos para ayudar a optimizar las entradas para el clasificador semántico. Para obtener más información, vea Configurar la clasificación semántica.

  3. A continuación, agregue una definición de perfil de puntuación. Al igual que con la configuración semántica, se puede agregar un perfil de puntuación a un esquema de índice en cualquier momento. Este ejemplo también se encuentra en el paso de esquema de actualización del cuaderno, siguiendo la configuración 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",  
                    ),  
                ) 
            ]
        )
    ]
    

    Este perfil usa la función de etiqueta que aumenta las puntuaciones de los documentos en los que se encontró una coincidencia en el campo ubicaciones. Recuerde que el índice de búsqueda tiene un campo vectorial y varios campos novectores para título, fragmentos y ubicaciones. El campo ubicaciones es una colección de cadenas, y las colecciones de cadenas pueden potenciarse mediante la función etiquetas de un perfil de puntuación. Para obtener más información, consulte Agregar un perfil de puntuación y mejorar la relevancia de búsqueda con la mejora de documentos (entrada de blog).

  4. Actualice la definición de índice en el servicio de búsqueda.

    # 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")  
    

Actualización de consultas para perfiles de clasificación y puntuación semánticas

En un tutorial anterior, ejecutó consultas que se ejecutan en el motor de búsqueda, pasando la respuesta y otra información a un LLM para la finalización del chat.

En este ejemplo se modifica la solicitud de consulta para incluir la configuración semántica y el perfil de puntuación.

Para la nube de Azure Government, modifique el punto de conexión de API en el proveedor de tokens a "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)

La salida de una consulta semánticamente clasificada y potenciada podría tener un aspecto similar al del ejemplo siguiente.

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.

La adición de perfiles de puntuación y clasificación semántica afecta positivamente a la respuesta del LLM mediante la promoción de resultados que cumplen los criterios de puntuación y son semánticamente relevantes.

Ahora que tiene una mejor comprensión del diseño de índices y consultas, vamos a optimizar la velocidad y la concisión. Revisamos la definición de esquema para implementar la cuantificación y la reducción del almacenamiento, pero el resto de la canalización y los modelos permanecen intactos.

Paso siguiente