Udostępnij za pośrednictwem


Samouczek: wyszukiwanie danych przy użyciu modelu czatu (RAG w usłudze Azure AI Search)

Definiująca charakterystykę rozwiązania RAG w usłudze Azure AI Search wysyła zapytania do dużego modelu językowego (LLM) w celu wyszukiwania konwersacyjnego na podstawie indeksowanej zawartości. Może to być zaskakująco łatwe, jeśli implementujesz tylko podstawy.

W tym samouczku zostały wykonane następujące czynności:

  • Konfigurowanie klientów
  • Pisanie instrukcji dotyczących usługi LLM
  • Podaj zapytanie przeznaczone dla danych wejściowych LLM
  • Przeglądanie wyników i eksplorowanie następnych kroków

Ten samouczek opiera się na poprzednich samouczkach. Przyjęto założenie, że masz indeks wyszukiwania utworzony przez potok indeksowania.

Wymagania wstępne

Pobierz przykład

Ten sam notes jest używany z poprzedniego samouczka potoku indeksowania. Skrypty do wykonywania zapytań w usłudze LLM są wykonywane zgodnie z krokami tworzenia potoku. Jeśli nie masz jeszcze notesu, pobierz go z usługi GitHub.

Konfigurowanie klientów na potrzeby wysyłania zapytań

Wzorzec RAG w usłudze Azure AI Search to zsynchronizowana seria połączeń z indeksem wyszukiwania w celu uzyskania danych uziemienia, a następnie połączenie z modułem LLM w celu sformułowania odpowiedzi na pytanie użytkownika. Ten sam ciąg zapytania jest używany przez obu klientów.

Konfigurujesz dwóch klientów, więc potrzebujesz punktów końcowych i uprawnień dla obu zasobów. W tym samouczku założono, że skonfigurowano przypisania ról dla autoryzowanych połączeń, ale należy podać punkty końcowe w przykładowym notesie:

# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"

Przykładowy skrypt monitu i zapytania

Oto skrypt języka Python, który tworzy wystąpienia klientów, definiuje monit i konfiguruje zapytanie. Ten skrypt można uruchomić w notesie, aby wygenerować odpowiedź na podstawie wdrożenia modelu czatu.

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
 )

# Provide instructions to the model
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}
"""

# Provide the search query. 
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    select=["title", "chunk", "locations"],
    top=5,
)

# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct. 
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
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)

Przegląd wyników

W tej odpowiedzi odpowiedź jest oparta na pięciu danych wejściowych (top=5) składających się z fragmentów określonych przez wyszukiwarkę jako najbardziej istotne. Instrukcje w wierszu polecenia informują llM, aby używać tylko informacji w sourcespliku lub sformatowanych wyników wyszukiwania.

Wyniki z pierwszego zapytania "What's the NASA earth book about?" powinny wyglądać podobnie do poniższego przykładu.

The NASA Earth book is about the intricate and captivating science of our planet, studied 
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex 
system, observed through various cycles and processes such as the water cycle and ocean 
circulation. The book combines stunning satellite images with detailed scientific insights, 
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and 
air seen from above. It aims to inspire and demonstrate that the truth of our planet is 
as compelling as any fiction.

Source: page-8.pdf

Oczekuje się, że maszyny LLM będą zwracać różne odpowiedzi, nawet jeśli monit i zapytania są niezmienione. Wynik może wyglądać zupełnie inaczej niż w przykładzie. Aby uzyskać więcej informacji, zobacz Dowiedz się, jak używać odtwarzalnych danych wyjściowych.

Uwaga

Podczas testowania tego samouczka zobaczyliśmy różne odpowiedzi, niektóre bardziej istotne niż inne. Kilka razy powtórzenie tego samego żądania spowodowało pogorszenie odpowiedzi, najprawdopodobniej z powodu nieporozumień w historii czatu, być może z modelem rejestrującym powtarzające się żądania jako niezadowolenie z wygenerowanej odpowiedzi. Zarządzanie historią czatów jest poza zakresem tego samouczka, ale uwzględnienie go w kodzie aplikacji powinno wyeliminować lub nawet wyeliminować to zachowanie.

Dodaj filtr

Pamiętaj, że pole zostało utworzone przy użyciu zastosowanej locations sztucznej inteligencji, wypełnione miejscami rozpoznanymi przez umiejętności rozpoznawania jednostek. Definicja pola dla lokalizacji zawiera filterable atrybut . Powtórzmy poprzednie żądanie, ale tym razem dodamy filtr, który wybiera termin ice w polu locations (lokalizacje).

Filtr wprowadza kryteria dołączania lub wykluczania. Wyszukiwarka nadal wykonuje wyszukiwanie wektorów w obiekcie "What's the NASA earth book about?", ale obecnie wyklucza dopasowania, które nie zawierają lodu. Aby uzyskać więcej informacji na temat filtrowania kolekcji ciągów i zapytań wektorowych, zobacz podstawy filtrowania tekstu, Opis filtrów kolekcji i Dodawanie filtrów do zapytania wektorowego.

Zastąp definicję search_results następującym przykładem, który zawiera filtr:

query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    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])

Wyniki filtrowanego zapytania powinny teraz wyglądać podobnie do poniższej odpowiedzi. Zwróć uwagę na nacisk na pokrywę lodowa.

The NASA Earth book showcases various geographic and environmental features of Earth through 
satellite imagery, highlighting remarkable landscapes and natural phenomena. 

- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by 
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements 
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through 
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and 
- heat absorption ([source](page-153.pdf)).
  
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems 
and natural changes.

Zmienianie danych wejściowych

Zwiększenie lub zmniejszenie liczby danych wejściowych w usłudze LLM może mieć duży wpływ na odpowiedź. Spróbuj ponownie uruchomić to samo zapytanie po ustawieniu .top=8 Podczas zwiększania danych wejściowych model zwraca różne wyniki za każdym razem, nawet jeśli zapytanie nie ulegnie zmianie.

Oto jeden przykład tego, co model zwraca po zwiększeniu danych wejściowych do 8.

The NASA Earth book features a range of satellite images capturing various natural phenomena 
across the globe. These include:

- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic 
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes 
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from 
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various 
locations recorded by different Landsat missions (Source: page-168.pdf).

Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic 
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.

Ponieważ model jest powiązany z danymi uziemienia, odpowiedź staje się bardziej ekspansywna w miarę zwiększania rozmiaru danych wejściowych. Możesz użyć dostrajania istotności, aby potencjalnie wygenerować bardziej ukierunkowane odpowiedzi.

Zmienianie monitu

Możesz również zmienić monit, aby kontrolować format danych wyjściowych, ton i czy model ma uzupełniać odpowiedź własnymi danymi treningowymi, zmieniając monit.

Oto kolejny przykład danych wyjściowych LLM, jeśli ponownie ustawimy monit dotyczący identyfikowania lokalizacji do badania naukowego.

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
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.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""

Dane wyjściowe z zmiany tylko monitu, w przeciwnym razie zachowując wszystkie aspekty poprzedniego zapytania, mogą wyglądać podobnie do tego przykładu.

The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery, 
highlighting natural phenomena and geographic features. For instance, the book includes:

- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.

(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)

Napiwek

Jeśli kontynuujesz korzystanie z samouczka, pamiętaj, aby przywrócić monit do poprzedniej wartości (You are an AI assistant that helps users learn from the information found in the source material).

Zmiana parametrów i monitów wpływa na odpowiedź z usługi LLM. Podczas samodzielnego eksplorowania należy pamiętać o następujących wskazówkach:

  • top Podniesienie wartości może wyczerpać dostępny limit przydziału w modelu. Jeśli nie ma limitu przydziału, zostanie zwrócony komunikat o błędzie lub model może zwrócić komunikat "Nie wiem".

  • top Podniesienie wartości nie musi poprawić wyniku. Podczas testowania z góry czasami zauważamy, że odpowiedzi nie są znacznie lepsze.

  • Co więc może pomóc? Zazwyczaj odpowiedzią jest dostrajanie istotności. Poprawa istotności wyników wyszukiwania z usługi Azure AI Search jest zwykle najbardziej efektywnym podejściem do maksymalizacji narzędzia usługi LLM.

W następnej serii samouczków fokus zmienia się, aby zmaksymalizować istotność i zoptymalizować wydajność zapytań pod kątem szybkości i wstrząsów. Ponownie omówimy definicję schematu i logikę zapytań, aby zaimplementować funkcje istotności, ale reszta potoku i modeli pozostaje nienaruszona.

Następny krok