Pobieranie rozszerzonej generacji (RAG) w usłudze Azure AI Search

Pobieranie rozszerzonej generacji (RAG) to architektura, która rozszerza możliwości modelu dużego języka, takiego jak ChatGPT, dodając system pobierania informacji, który zapewnia dane uziemione. Dodanie systemu pobierania informacji zapewnia kontrolę nad danymi uziemienia używanymi przez moduł LLM podczas formułowania odpowiedzi. W przypadku rozwiązania dla przedsiębiorstw architektura RAG oznacza, że możesz ograniczyć generowanie sztucznej inteligencji do zawartości przedsiębiorstwa pochodzącej z wektoryzowanych dokumentów i obrazów oraz innych formatów danych, jeśli osadzasz modele dla tej zawartości.

Decyzja o tym, który system pobierania informacji ma kluczowe znaczenie, ponieważ określa dane wejściowe w usłudze LLM. System pobierania informacji powinien podać następujące informacje:

  • Strategie indeksowania, które ładują się i odświeżają na dużą skalę dla całej zawartości, z wymaganą częstotliwością.

  • Możliwości zapytań i dostrajanie istotności. System powinien zwrócić odpowiednie wyniki w formatach krótkich formularzy niezbędnych do spełnienia wymagań dotyczących długości tokenu danych wejściowych LLM.

  • Bezpieczeństwo, globalny zasięg i niezawodność danych i operacji.

  • Integracja z modelami osadzania na potrzeby indeksowania oraz modeli czatów lub modeli interpretacji języka na potrzeby pobierania.

Usługa Azure AI Search to sprawdzone rozwiązanie do pobierania informacji w architekturze RAG. Zapewnia ona możliwości indeksowania i wykonywania zapytań z infrastrukturą i zabezpieczeniami chmury platformy Azure. Za pomocą kodu i innych składników można zaprojektować kompleksowe rozwiązanie RAG, które zawiera wszystkie elementy generowania sztucznej inteligencji w ramach własnej zawartości.

Uwaga

Nowe pojęcia dotyczące copilot i RAG? Obejrzyj wyszukiwanie wektorów i stan pobierania sztuki dla aplikacji generacyjnych sztucznej inteligencji.

Firma Microsoft ma kilka wbudowanych implementacji do korzystania z usługi Azure AI Search w rozwiązaniu RAG.

Wyselekcjonowane podejścia ułatwiają rozpoczęcie pracy, ale aby uzyskać większą kontrolę nad architekturą, potrzebujesz rozwiązania niestandardowego. Te szablony tworzą kompleksowe rozwiązania:

W pozostałej części tego artykułu opisano, jak usługa Azure AI Search pasuje do niestandardowego rozwiązania RAG.

Ogólne podsumowanie wzorca wygląda następująco:

  • Zacznij od pytania użytkownika lub żądania (monit).
  • Wyślij ją do usługi Azure AI Search, aby znaleźć odpowiednie informacje.
  • Wyślij najwyżej sklasyfikowane wyniki wyszukiwania do usługi LLM.
  • Użyj funkcji interpretacji języka naturalnego i rozumowania w usłudze LLM, aby wygenerować odpowiedź na początkowy monit.

Usługa Azure AI Search udostępnia dane wejściowe do monitu LLM, ale nie trenuje modelu. W architekturze RAG nie ma dodatkowych szkoleń. Usługa LLM jest wstępnie wytrenowana przy użyciu danych publicznych, ale generuje odpowiedzi rozszerzone przez informacje z modułu pobierania.

Wzorce RAG obejmujące usługę Azure AI Search zawierają elementy wskazane na poniższej ilustracji.

Diagram architektury pobierania informacji z wyszukiwaniem i funkcją ChatGPT.

  • Środowisko użytkownika aplikacji (aplikacja internetowa) dla środowiska użytkownika
  • Serwer aplikacji lub orkiestrator (warstwa integracji i koordynacji)
  • Azure AI Search (system pobierania informacji)
  • Azure OpenAI (LLM for generative AI)

Aplikacja internetowa zapewnia środowisko użytkownika, zapewniając prezentację, kontekst i interakcję użytkownika. Pytania lub monity od użytkownika zaczynają się tutaj. Dane wejściowe przechodzą przez warstwę integracji, przechodząc najpierw do pobierania informacji w celu uzyskania wyników wyszukiwania, ale także przejdź do usługi LLM, aby ustawić kontekst i intencję.

Serwer aplikacji lub koordynator to kod integracji, który koordynuje przekazywanie między pobieraniem informacji a usługą LLM. Jedną z opcji jest użycie narzędzia LangChain do koordynowania przepływu pracy. Aplikacja LangChain integruje się z usługą Azure AI Search, co ułatwia dołączanie usługi Azure AI Search jako elementu pobierającego do przepływu pracy. Semantyczne jądro jest inną opcją.

System pobierania informacji udostępnia indeks z możliwością wyszukiwania, logikę zapytań i ładunek (odpowiedź zapytania). Indeks wyszukiwania może zawierać wektory lub zawartość niewektorów. Chociaż większość przykładów i pokazów zawiera pola wektorów, nie jest to wymagane. Zapytanie jest wykonywane przy użyciu istniejącej wyszukiwarki w usłudze Azure AI Search, która może obsługiwać zapytania słów kluczowych (lub terminów) i wektorów. Indeks jest tworzony z wyprzedzeniem na podstawie zdefiniowanego schematu i ładowany z zawartością źródłową z plików, baz danych lub magazynu.

Usługa LLM otrzymuje oryginalny monit oraz wyniki z usługi Azure AI Search. LlM analizuje wyniki i formułuje odpowiedź. Jeśli llM jest ChatGPT, interakcja użytkownika może być konwersacją w tył i z powrotem. Jeśli używasz języka Davinci, monit może być w pełni skomponowaną odpowiedzią. Rozwiązanie platformy Azure najprawdopodobniej korzysta z usługi Azure OpenAI, ale nie ma twardej zależności od tej konkretnej usługi.

Usługa Azure AI Search nie zapewnia natywnej integracji z usługą LLM na potrzeby przepływów monitów ani zachowywania czatów, dlatego musisz napisać kod obsługujący aranżację i stan. Możesz zapoznać się ze źródłem demonstracyjnym (Azure-Samples/azure-search-openai-demo) pod kątem strategii tego, co wiąże się z pełnym rozwiązaniem. Zalecamy również usługę Azure AI Studio lub Azure OpenAI Studio w celu utworzenia opartych na systemie RAG rozwiązań azure AI Search, które integrują się z usługami LLM.

W usłudze Azure AI Search cała zawartość z możliwością wyszukiwania jest przechowywana w indeksie wyszukiwania hostowanym w usłudze wyszukiwania. Indeks wyszukiwania jest przeznaczony dla szybkich zapytań z milisekundowymi czasami odpowiedzi, więc jej wewnętrzne struktury danych istnieją w celu obsługi tego celu. W tym celu indeks wyszukiwania przechowuje indeksowaną zawartość, a nie całe pliki zawartości, takie jak całe pliki PDF lub obrazy. Wewnętrznie struktury danych obejmują odwrócone indeksy tokenizowanego tekstu, indeksy wektorów do osadzania i niezmierzone tekst w przypadkach, w których wymagane jest dopasowanie dosłowne (na przykład w filtrach, wyszukiwanie rozmyte, zapytania wyrażeń regularnych).

Podczas konfigurowania danych dla rozwiązania RAG użyjesz funkcji, które tworzą i ładują indeks w usłudze Azure AI Search. Indeks zawiera pola, które duplikują lub reprezentują zawartość źródłową. Pole indeksu może być prostym transferem (tytuł lub opis w dokumencie źródłowym staje się tytułem lub opisem w indeksie wyszukiwania), albo pole może zawierać dane wyjściowe procesu zewnętrznego, takie jak wektoryzacja lub przetwarzanie umiejętności, które generuje reprezentację lub opis tekstu obrazu.

Ponieważ prawdopodobnie wiesz, jakiego rodzaju zawartość chcesz przeszukiwać, rozważ funkcje indeksowania, które mają zastosowanie do każdego typu zawartości:

Typ zawartości Indeksowane jako Funkcje
text tokeny, tekst niezbrojony Indeksatory mogą ściągać zwykły tekst z innych zasobów platformy Azure, takich jak Azure Storage i Cosmos DB. Możesz również wypchnąć dowolną zawartość JSON do indeksu. Aby zmodyfikować tekst w locie, użyj analizatorów i normalizacji, aby dodać przetwarzanie leksykalne podczas indeksowania. Mapy synonimów są przydatne, jeśli brakuje terminologii źródłowej, która może być używana w zapytaniu.
text wektory 1 Tekst może być fragmentowany i wektoryzowany zewnętrznie, a następnie indeksowany jako pola wektorowe w indeksie.
obraz tokeny, tekst niezbrojony 2 Umiejętności dotyczące rozpoznawania znaków OCR i analizy obrazów mogą przetwarzać obrazy na potrzeby rozpoznawania tekstu lub cech obrazu. Informacje o obrazie są konwertowane na tekst z możliwością wyszukiwania i dodawane do indeksu. Umiejętności mają wymaganie indeksatora.
obraz wektory 1 Obrazy mogą być wektorowane zewnętrznie w celu matematycznej reprezentacji zawartości obrazu, a następnie indeksowane jako pola wektorowe w indeksie. Możesz użyć modelu open source, takiego jak OpenAI CLIP , aby wektoryzować tekst i obrazy w tym samym miejscu osadzania.

1 Ogólnie dostępna funkcja obsługi wektorów wymaga wywoływania innych bibliotek lub modeli na potrzeby fragmentowania i wektoryzacji danych. Jednak zintegrowana wektoryzacja (wersja zapoznawcza) osadza te kroki. Przykłady kodu przedstawiające oba podejścia można znaleźć w repozytorium azure-search-vectors.

2Umiejętności są wbudowaną obsługą wzbogacania sztucznej inteligencji. W przypadku funkcji OCR i Analizy obrazów potok indeksowania wykonuje wewnętrzne wywołanie interfejsów API usługi Azure AI Vision. Te umiejętności przekazują wyodrębniony obraz do usługi Azure AI na potrzeby przetwarzania i odbierają dane wyjściowe jako tekst indeksowany przez usługę Azure AI Search.

Wektory zapewniają najlepsze zakwaterowanie dla różnej zawartości (wiele formatów plików i języków), ponieważ zawartość jest wyrażana powszechnie w reprezentacjach matematycznych. Wektory obsługują również wyszukiwanie podobieństwa: dopasowywanie na współrzędnych, które są najbardziej podobne do zapytania wektorowego. W porównaniu z wyszukiwaniem słów kluczowych (lub wyszukiwaniem terminów), które pasuje do tokenizowanych terminów, wyszukiwanie podobieństwa jest bardziej zniuansowane. Jest to lepszy wybór, jeśli istnieje niejednoznaczność lub wymagania dotyczące interpretacji w zawartości lub w zapytaniach.

Gdy dane są w indeksie wyszukiwania, możesz pobrać zawartość za pomocą funkcji zapytań usługi Azure AI Search.

W przypadku wzorca innego niż RAG zapytania tworzą rundę od klienta wyszukiwania. Zapytanie jest przesyłane, wykonywane w wyszukiwarce, a odpowiedź zwrócona do aplikacji klienckiej. Odpowiedź lub wyniki wyszukiwania składają się wyłącznie z zawartości dosłownej znalezionej w indeksie.

We wzorcu RAG zapytania i odpowiedzi są koordynowane między wyszukiwarką a usługą LLM. Pytanie lub zapytanie użytkownika jest przekazywane zarówno do wyszukiwarki, jak i do usługi LLM jako monitu. Wyniki wyszukiwania pochodzą z wyszukiwarki i są przekierowywane do usługi LLM. Odpowiedź, która sprawia, że powrót do użytkownika to generowanie sztucznej inteligencji — sumowanie lub odpowiedź z usługi LLM.

W usłudze Azure AI Search nie ma typu zapytania — nawet wyszukiwania semantycznego ani wektorowego — które komponuje nowe odpowiedzi. Tylko usługa LLM zapewnia generowanie sztucznej inteligencji. Poniżej przedstawiono możliwości usługi Azure AI Search, które są używane do formułowania zapytań:

Funkcja kwerendy Purpose Dlaczego używać tej opcji
Prosta lub pełna składnia Lucene Wykonywanie zapytań względem zawartości tekstowej i niewektorowej Wyszukiwanie pełnotekstowe najlepiej sprawdza się pod kątem dokładnych dopasowań, a nie podobnych dopasowań. Zapytania wyszukiwania pełnotekstowego są klasyfikowane przy użyciu algorytmu BM25 i obsługują dostrajanie istotności za pośrednictwem profilów oceniania. Obsługuje również filtry i aspekty.
Filtry i aspekty Dotyczy tylko pól tekstowych lub liczbowych (niewektorów). Zmniejsza obszar powierzchni wyszukiwania na podstawie kryteriów dołączania lub wykluczania. Zwiększa precyzję zapytań.
Ranking semantyczny Ponownie plasuje zestaw wyników BM25 przy użyciu modeli semantycznych. Tworzy krótkie podpis i odpowiedzi, które są przydatne jako dane wejściowe LLM. Łatwiejsze niż ocenianie profilów i w zależności od zawartości bardziej niezawodna technika dostrajania istotności.
Wyszukiwanie wektorowe Wykonywanie zapytań w polach wektorów na potrzeby wyszukiwania podobieństwa, gdzie ciąg zapytania jest co najmniej jednym wektorem. Wektory mogą reprezentować wszystkie typy zawartości w dowolnym języku.
Wyszukiwanie hybrydowe Łączy dowolne lub wszystkie powyższe techniki zapytań. Zapytania wektorowe i niewektorowe są wykonywane równolegle i są zwracane w ujednoliconym zestawie wyników. Najbardziej znaczące zyski w precyzji i kompletności dotyczą zapytań hybrydowych.

Struktura odpowiedzi zapytania

Odpowiedź zapytania dostarcza dane wejściowe do usługi LLM, więc jakość wyników wyszukiwania ma kluczowe znaczenie dla powodzenia. Wyniki to tabelaryczny zestaw wierszy. Kompozycja lub struktura wyników zależy od:

  • Pola określające, które części indeksu są uwzględnione w odpowiedzi.
  • Wiersze reprezentujące dopasowanie z indeksu.

Pola są wyświetlane w wynikach wyszukiwania, gdy atrybut jest "możliwy do pobrania". Definicja pola w schemacie indeksu ma atrybuty, a te określają, czy pole jest używane w odpowiedzi. Tylko "możliwe do pobrania" pola są zwracane w wynikach zapytania pełnotekstowego lub wektorowego. Domyślnie zwracane są wszystkie pola "możliwe do pobrania", ale można użyć opcji "select", aby określić podzbiór. Poza "pobieraniem" nie ma żadnych ograniczeń dotyczących pola. Pola mogą mieć dowolną długość lub typ. Jeśli chodzi o długość, w usłudze Azure AI Search nie ma maksymalnego limitu długości pola, ale istnieją limity rozmiaru żądania interfejsu API.

Wiersze są zgodne z zapytaniem, sklasyfikowane według istotności, podobieństwa lub obu tych elementów. Domyślnie wyniki są ograniczone do 50 pierwszych dopasowań dla wyszukiwania pełnotekstowego lub k najbliższych sąsiadów do wyszukiwania wektorowego. Możesz zmienić wartości domyślne, aby zwiększyć lub zmniejszyć limit maksymalnie 1000 dokumentów. Możesz również użyć pierwszych i pomijanych parametrów stronicowania, aby pobrać wyniki jako serię stronicowanych wyników.

Ranga według istotności

Podczas pracy ze złożonymi procesami, dużą ilością danych i oczekiwaniami dotyczącymi odpowiedzi milisekund ważne jest, aby każdy krok zwiększał wartość i poprawia jakość wyniku końcowego. Po stronie pobierania informacji dostrajanie istotności jest działaniem, które poprawia jakość wyników wysyłanych do usługi LLM. W wynikach należy uwzględnić tylko najbardziej istotne lub najbardziej podobne pasujące dokumenty.

Istotność ma zastosowanie do wyszukiwania słów kluczowych (niewektorów) i do zapytań hybrydowych (w polach niewektorów). W usłudze Azure AI Search nie ma dostrajania istotności dla zapytań wyszukiwania podobieństwa i wektorów. Klasyfikacja BM25 to algorytm klasyfikacji wyszukiwania pełnotekstowego.

Dostrajanie istotności jest obsługiwane za pomocą funkcji zwiększających klasyfikację BM25. Te podejścia obejmują:

  • Profile oceniania, które zwiększają wynik wyszukiwania, jeśli dopasowania znajdują się w określonym polu wyszukiwania lub w innych kryteriach.
  • Semantyczna klasyfikacja , która ponownie plasuje zestaw wyników BM25, używając semantycznych modeli z usługi Bing do zmiany kolejności wyników w celu lepszego dopasowania semantycznego do oryginalnego zapytania.

W porównaniach i testach porównawczych zapytania hybrydowe z polami tekstowymi i wektorowymi uzupełnione semantycznym rankingiem wyników BM25 generują najbardziej istotne wyniki.

Przykładowy kod zapytania usługi Azure AI Search dla scenariuszy RAG

Poniższy kod jest kopiowany z pliku retrievethenread.py z witryny demonstracyjnej. content Tworzy dla usługi LLM wyniki wyszukiwania zapytań hybrydowych. Możesz napisać prostsze zapytanie, ale ten przykład obejmuje wyszukiwanie wektorów i wyszukiwanie słów kluczowych z semantycznymi ponownego korbowania i sprawdzania pisowni. W pokazie to zapytanie służy do pobierania początkowej zawartości.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Kod integracji i moduły LLM

Rozwiązanie RAG, które obejmuje usługę Azure AI Search, wymaga innych składników i kodu w celu utworzenia kompletnego rozwiązania. Podczas gdy w poprzednich sekcjach opisano pobieranie informacji za pośrednictwem usługi Azure AI Search oraz funkcje używane do tworzenia zawartości z możliwością wyszukiwania i wykonywania zapytań, w tej sekcji przedstawiono integrację i interakcję z usługą LLM.

Notesy w repozytoriach demonstracyjnych są doskonałym punktem wyjścia, ponieważ pokazują wzorce przekazywania wyników wyszukiwania do usługi LLM. Większość kodu w rozwiązaniu RAG składa się z wywołań do usługi LLM, więc musisz opracować zrozumienie sposobu działania tych interfejsów API, które wykracza poza zakres tego artykułu.

Poniższy blok komórki w notesie chat-read-retrieve-read.ipynb przedstawia wywołania wyszukiwania w kontekście sesji czatu:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Pierwsze kroki

  • Tworzenie indeksu wyszukiwania za pomocą programu Azure AI Studio.

  • Użyj programu Azure OpenAI Studio i "przynieś własne dane" , aby poeksperymentować z monitami w istniejącym indeksie wyszukiwania na placu zabaw. Ten krok pomaga zdecydować, jakiego modelu użyć, i pokazuje, jak dobrze działa istniejący indeks w scenariuszu RAG.

  • Akcelerator rozwiązań "Czat z danymi" utworzony przez zespół usługi Azure AI Search ułatwia tworzenie własnego niestandardowego rozwiązania RAG.

  • Szablony aplikacji do czatów dla przedsiębiorstw wdrażają zasoby platformy Azure, kod i przykładowe dane uziemienia przy użyciu fikcyjnych dokumentów planu kondycji dla firm Contoso i Northwind. To kompleksowe rozwiązanie zapewnia aplikację czatu operacyjnego w ciągu zaledwie 15 minut. Kod dla tych szablonów to pokaz azure-search-openai-demo w kilku prezentacjach. Poniższe linki zawierają wersje specyficzne dla języka:

  • Zapoznaj się z pojęciami i strategiami indeksowania, aby określić sposób pozyskiwania i odświeżania danych. Zdecyduj, czy używać wyszukiwania wektorowego, wyszukiwania słów kluczowych lub wyszukiwania hybrydowego. Rodzaj zawartości, którą chcesz przeszukiwać, oraz typ zapytań, które chcesz uruchomić, określa projekt indeksu.

  • Przejrzyj tworzenie zapytań , aby dowiedzieć się więcej o składni i wymaganiach dotyczących żądań wyszukiwania.

Uwaga

Niektóre funkcje usługi Azure AI Search są przeznaczone do interakcji człowieka i nie są przydatne we wzorcu RAG. W szczególności możesz pominąć autouzupełnianie i sugestie. Inne funkcje, takie jak aspekty i kolejność, mogą być przydatne, ale byłyby rzadkie w scenariuszu RAG.

Zobacz też