Udostępnij za pośrednictwem


Samouczek: maksymalizowanie istotności (RAG w usłudze Azure AI Search)

Z tego samouczka dowiesz się, jak poprawić znaczenie wyników wyszukiwania używanych w rozwiązaniach RAG. Dostrajanie istotności może być ważnym czynnikiem w dostarczaniu rozwiązania RAG spełniającego oczekiwania użytkowników. W usłudze Azure AI Search dostrajanie istotności obejmuje profile klasyfikacji semantycznej L2 i oceniania.

Aby zaimplementować te możliwości, należy ponownie przejrzeć schemat indeksu, aby dodać konfiguracje dla profilów klasyfikacji semantycznej i oceniania. Następnie ponownie uruchamiasz zapytania przy użyciu nowych konstrukcji.

W tym samouczku zmodyfikujesz istniejący indeks wyszukiwania i zapytania do użycia:

  • Ranking semantyczny L2
  • Profil oceniania pod kątem zwiększania liczby dokumentów

Ten samouczek aktualizuje indeks wyszukiwania utworzony przez potok indeksowania. Aktualizacje nie wpływają na istniejącą zawartość, więc nie jest konieczne ponowne kompilowanie i nie trzeba ponownie uruchamiać indeksatora.

Uwaga

W wersji zapoznawczej jest dostępnych więcej funkcji istotności, w tym wagi zapytań wektorowych i ustawiania minimalnych progów, ale pomijamy je z tego samouczka, ponieważ są w wersji zapoznawczej.

Wymagania wstępne

Pobierz przykład

Przykładowy notes zawiera zaktualizowany indeks i żądanie zapytania.

Uruchamianie zapytania bazowego na potrzeby porównania

Zacznijmy od nowego zapytania: "Czy istnieją jakieś formacje chmur specyficzne dla oceanów i dużych zbiorników wody?".

Aby porównać wyniki po dodaniu funkcji istotności, uruchom zapytanie względem istniejącego schematu indeksu przed dodaniem klasyfikacji semantycznej lub profilu oceniania.

W przypadku chmury Azure Government zmodyfikuj punkt końcowy interfejsu API u dostawcy tokenu na "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)

Dane wyjściowe z tego żądania mogą wyglądać podobnie do poniższego przykładu.

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

Aktualizowanie indeksu dla profilów klasyfikacji semantycznej i oceniania

W poprzednim samouczku zaprojektowano schemat indeksu dla obciążeń RAG. Celowo pominięto ulepszenia istotności tego schematu, dzięki czemu można skupić się na podstawach. Odroczenie istotności dla oddzielnego ćwiczenia daje porównanie jakości wyników wyszukiwania przed i po ich wprowadzeniu.

  1. Zaktualizuj instrukcje importowania, aby uwzględnić klasy dla profilów klasyfikacji semantycznej i oceniania.

     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. Dodaj następującą konfigurację semantyczną do indeksu wyszukiwania. Ten przykład można znaleźć w kroku aktualizacji schematu w notesie.

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

    Konfiguracja semantyczna ma nazwę i priorytetową listę pól, które ułatwiają optymalizowanie danych wejściowych do semantycznego rankera. Aby uzyskać więcej informacji, zobacz Konfigurowanie klasyfikacji semantycznej.

  3. Następnie dodaj definicję profilu oceniania. Podobnie jak w przypadku konfiguracji semantycznej, profil oceniania można dodać do schematu indeksu w dowolnym momencie. Ten przykład znajduje się również w kroku aktualizacji schematu w notesie po konfiguracji semantycznej.

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

    Ten profil używa funkcji tagu, która zwiększa wyniki dokumentów, w których znaleziono dopasowanie w polu lokalizacji. Pamiętaj, że indeks wyszukiwania ma pole wektorowe i wiele pól niewektorów dla tytułów, fragmentów i lokalizacji. Pole lokalizacji jest kolekcją ciągów, a kolekcje ciągów można zwiększyć przy użyciu funkcji tags w profilu oceniania. Aby uzyskać więcej informacji, zobacz Dodawanie profilu oceniania i zwiększanie istotności wyszukiwania za pomocą funkcji Zwiększania dokumentu (wpis w blogu).

  4. Zaktualizuj definicję indeksu w usłudze wyszukiwania.

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

Aktualizowanie zapytań dotyczących profilów klasyfikacji semantycznej i oceniania

W poprzednim samouczku uruchomiono zapytania wykonywane w wyszukiwarce, przekazując odpowiedź i inne informacje do modułu LLM w celu ukończenia czatu.

Ten przykład modyfikuje żądanie zapytania, aby uwzględnić konfigurację semantyczną i profil oceniania.

W przypadku chmury Azure Government zmodyfikuj punkt końcowy interfejsu API u dostawcy tokenu na "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)

Dane wyjściowe z semantycznie sklasyfikowanego i wzmocnionego zapytania mogą wyglądać podobnie do poniższego przykładu.

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.

Dodanie profilów klasyfikacji semantycznej i oceniania pozytywnie wpływa na odpowiedź z usługi LLM przez promowanie wyników spełniających kryteria oceniania i są semantycznie istotne.

Teraz, gdy masz lepsze zrozumienie projektu indeksu i zapytań, przejdźmy do optymalizacji pod kątem szybkości i wstrząsów. Ponownie omówimy definicję schematu, aby zaimplementować kwantyzację i redukcję magazynu, ale pozostała część potoku i modeli pozostaje nienaruszona.

Następny krok