Pobieranie informacji

Azure AI services
Azure AI Search
Azure OpenAI Service
Azure Machine Learning

Po wygenerowaniu osadzania dla fragmentów następnym krokiem jest wygenerowanie indeksu w bazie danych wektorów i eksperymentowanie w celu określenia optymalnych wyszukiwań do wykonania. Podczas eksperymentowania z pobieraniem informacji należy wziąć pod uwagę kilka obszarów, w tym opcje konfiguracji indeksu wyszukiwania, typy wyszukiwań, które należy wykonać, oraz strategię ponownego uruchamiania. W tym artykule opisano te trzy tematy.

Ten artykuł jest częścią serii. Przeczytaj wprowadzenie.

Indeks wyszukiwania

Uwaga

Azure AI Search to pierwsza usługa azure search. W tej sekcji wymieniono pewne szczegóły dotyczące wyszukiwania sztucznej inteligencji. Jeśli używasz innego magazynu, zapoznaj się z dokumentacją, aby znaleźć konfigurację klucza dla tej usługi.

Indeks wyszukiwania w magazynie zawiera kolumnę dla każdego pola w danych. Magazyny wyszukiwania zwykle obsługują typy danych innych niż wektory, takie jak ciąg, wartość logiczna, liczba całkowita, pojedyncza, podwójna, data/godzina i kolekcje, takie jak Collection(single) i wektorowe typy danych, takie jak Collection(single). Dla każdej kolumny należy skonfigurować informacje , takie jak typ danych, niezależnie od tego, czy pole można filtrować, pobierać i/lub wyszukiwać.

Poniżej przedstawiono niektóre kluczowe decyzje, które należy podjąć dla konfiguracji wyszukiwania wektorów, które są stosowane do pól wektorowych:

  • Algorytm wyszukiwania wektorowego — algorytm używany do wyszukiwania względnych dopasowań. Usługa Azure AI Search ma opcję algorytmu siłowego, która skanuje całą przestrzeń wektorową o nazwie wyczerpującą nazwę KNN i bardziej wydajną opcję algorytmu, która wykonuje przybliżone wyszukiwanie najbliższego sąsiada (ANN) o nazwie Hierarchical Navigable Small World (HNSW).
  • metric — ta konfiguracja to metryka podobieństwa używana do obliczania zbliżenia przez algorytm. Opcje w usłudze Azure AI Search to cosinus, dotProduct i Euclidean. Jeśli używasz modeli osadzania usługi Azure OpenAI, wybierz pozycję cosine.
  • efConstruction — parametr używany podczas konstruowania indeksu hierarchicznego nawigowalnego małego świata (HNSW), który określa liczbę najbliższych sąsiadów połączonych z wektorem podczas indeksowania. Większa wartość efConstruction powoduje, że indeks o lepszej jakości jest lepszy niż mniejsza liczba. Kompromis polega na tym, że większa wartość wymaga więcej czasu, magazynu i obliczeń. struktura efConstruction powinna być wyższa dla dużej liczby fragmentów i niższa w przypadku małej liczby fragmentów. Określenie optymalnej wartości wymaga eksperymentowania z danymi i oczekiwanymi zapytaniami.
  • efSearch — parametr używany w czasie wykonywania zapytania w celu ustawienia liczby najbliższych sąsiadów (czyli podobnych fragmentów) używanych podczas wyszukiwania.
  • m — liczba linków dwukierunkowych. Zakres wynosi od 4 do 10, a niższe liczby zwracają mniej szumu w wynikach.

W usłudze Azure AI Search konfiguracje wektorów są hermetyzowane w vectorSearch konfiguracji. Podczas konfigurowania kolumn wektorów należy odwołać się do odpowiedniej konfiguracji dla tej kolumny wektora i ustawić liczbę wymiarów. Atrybut wymiarów kolumny wektorowej reprezentuje liczbę wymiarów wygenerowanych przez wybrany model osadzania. Na przykład model zoptymalizowany text-embedding-3-small pod kątem magazynu generuje 1536 wymiarów.

Wyszukiwanie

Podczas wykonywania zapytań z koordynatora monitów w magazynie wyszukiwania istnieje wiele opcji, które należy wziąć pod uwagę. Musisz określić:

  • Jakiego typu wyszukiwanie ma być wykonywane: wektor lub słowo kluczowe lub hybrydowe
  • Niezależnie od tego, czy zamierzasz wykonywać zapytania względem co najmniej jednej kolumny
  • Czy zamierzasz ręcznie uruchomić wiele zapytań, takich jak zapytanie kluczowe i wyszukiwanie wektorów
  • Czy zapytanie musi zostać podzielone na podzapytania
  • Czy filtrowanie powinno być używane w zapytaniach

Orkiestrator monitów może przyjąć podejście statyczne lub dynamiczne mieszanie podejść na podstawie wskazówek kontekstowych z monitu. W poniższych sekcjach opisano te opcje ułatwiające eksperymentowanie w celu znalezienia odpowiedniego podejścia do obciążenia.

Typy wyszukiwania

Platformy wyszukiwania zazwyczaj obsługują wyszukiwanie pełnotekstowe i wektorowe. Niektóre platformy, takie jak Usługa Azure AI Search, obsługują wyszukiwanie hybrydowe. Aby wyświetlić możliwości różnych ofert wyszukiwania wektorów, zobacz Wybieranie usługi platformy Azure do wyszukiwania wektorów.

Wyszukiwanie wektorowe jest zgodne z podobieństwem między wektoryzowanym zapytaniem (wierszem) i polami wektorów.

Ważne

Przed osadzeniem zapytania należy wykonać te same operacje czyszczenia wykonywane na fragmentach. Na przykład jeśli małe litery każdego wyrazu w osadzonym fragmentu powinny zawierać małe litery każdego słowa w zapytaniu przed osadzeniem.

Uwaga

Wyszukiwanie wektorów można wykonać względem wielu pól wektorów w tym samym zapytaniu. W usłudze Azure AI Search to technicznie wyszukiwanie hybrydowe. Aby uzyskać więcej informacji, zobacz sekcję.

embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)

vector = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)

results = client.search(
    search_text=None,
    vector_queries=[vector],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

Przykładowy kod wykonuje wyszukiwanie wektorów względem contentVector pola. Należy pamiętać, że kod, który osadza zapytanie wstępnie przetwarza zapytanie jako pierwsze. Ten proces wstępnie powinien być tym samym kodem, który wstępnie przetwarza fragmenty przed osadzeniem. Model osadzania musi być tym samym modelem osadzania, który osadził fragmenty.

Wyszukiwanie pełnotekstowe pasuje do zwykłego tekstu przechowywanego w indeksie. Typowym rozwiązaniem jest wyodrębnianie słów kluczowych z zapytania i używanie tych wyodrębnionych słów kluczowych w wyszukiwaniu pełnotekstowym względem co najmniej jednej indeksowanej kolumny. Wyszukiwania pełnotekstowe można skonfigurować tak, aby zwracały dopasowania, w których pasują dowolne terminy lub wszystkie terminy.

Musisz poeksperymentować, aby określić, które pola są skuteczne do uruchamiania wyszukiwań pełnotekstowych. Jak opisano w fazie wzbogacania, słowa kluczowego i metadanych jednostki, są dobrymi kandydatami do rozważenia w przypadku wyszukiwania pełnotekstowego w scenariuszach, w których zawartość ma podobne znaczenie semantyczne, ale jednostki lub słowa kluczowe różnią się. Inne typowe pola do rozważenia podczas wyszukiwania pełnotekstowego to tytuł, podsumowanie i tekst fragmentu.

formatted_search_results = []

results = client.search(
    search_text=query,
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

formatted_search_results = format_results(results)

Przykładowy kod wykonuje wyszukiwanie pełnotekstowe względem pól tytułu, zawartości i podsumowania.

Usługa Azure AI Search obsługuje zapytania hybrydowe, w których zapytanie może zawierać jedno lub więcej wyszukiwań tekstowych i co najmniej jedno wyszukiwanie wektorowe. Platforma wykonuje każde zapytanie, pobiera wyniki pośrednie, ponownie korbuje wyniki przy użyciu funkcji RRF (Reciprocal Rank Fusion) i zwraca pierwsze N wyników.

 embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)
vector2 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="questionVector",
    vector=embedding,
)

results = client.search(
    search_text=query,
    vector_queries=[vector1, vector2],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

Przykładowy kod wykonuje wyszukiwanie pełnotekstowe względem pól tytułu, zawartości i podsumowania oraz wyszukiwania wektorów w polach contentVector i QuestionVector. Platforma Azure AI Search uruchamia wszystkie zapytania równolegle, ponownie korbuje wyniki i zwraca najważniejsze dokumenty retrieve_num_of_documents.

Wielokrotny ręczny

Oczywiście można uruchamiać wiele zapytań, takich jak wyszukiwanie wektorowe i wyszukiwanie pełnotekstowe słowa kluczowego, ręcznie. Wyniki są agregowane i ponownie korektowane ręcznie i zwracane są najlepsze wyniki. Poniżej przedstawiono przypadki użycia dla wielu ręcznych:

  • Używasz platformy wyszukiwania, która nie obsługuje wyszukiwań hybrydowych. Użyjesz tej opcji, aby przeprowadzić własne wyszukiwanie hybrydowe.
  • Chcesz uruchomić wyszukiwanie pełnotekstowe względem różnych zapytań. Możesz na przykład wyodrębnić słowa kluczowe z zapytania i uruchomić wyszukiwanie pełnotekstowe względem pola metadanych słów kluczowych. Następnie możesz wyodrębnić jednostki i uruchomić zapytanie względem pola metadanych jednostek.
  • Chcesz samodzielnie kontrolować proces ponownego generowania.
  • Zapytanie wymaga uruchomienia wielu podzapytania w celu pobrania danych z wielu źródeł.

Wiele podzapytania

Niektóre monity są złożone i wymagają więcej niż jednej kolekcji danych do uziemienia modelu. Na przykład zapytanie "Jak działają samochody elektryczne i jak je porównać z pojazdami ICE?" prawdopodobnie wymaga uziemienia danych z wielu źródeł.

Dobrym rozwiązaniem jest ustalenie, czy zapytanie wymaga wielu wyszukiwań przed uruchomieniem wyszukiwania. Jeśli uważasz, że wymagane jest wiele podzapytania, możesz uruchomić ręczne wiele zapytań dla wszystkich zapytań . Użyj dużego modelu językowego, aby określić, czy wymagane jest wiele podzapytania. Poniższy monit jest pobierany z repozytorium GitHub akceleratora eksperymentów RAG, które służy do kategoryzowania zapytania jako prostego lub złożonego, ze złożonymi wymaganiami wielu zapytań:

Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
  a. The question is asking for a straightforward fact or piece of information
  b. The answer could likely be found stated directly in a single passage of a relevant document
  c. Breaking the question down further is unlikely to be beneficial
  Examples: "What year did World War 2 end?", "What is the capital of France?, "What is the features of productX?"
2. Complex, multi-part question
  a. The question has multiple distinct components or is asking for information about several related topics
  b. Different parts of the question would likely need to be answered by separate passages or documents
  c. Breaking the question down into sub-questions for each component would allow for better results
  d. The question is open-ended and likely to have a complex or nuanced answer
  e. Answering it may require synthesizing information from multiple sources
  f. The question may not have a single definitive answer and could warrant analysis from multiple angles
  Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"

Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.

Example output:
{
  "category": "simple"
}

Za pomocą dużego modelu językowego można również wyodrębnić podzapytania ze złożonego zapytania. Poniższy monit jest pobierany z repozytorium GitHub akceleratora eksperymentów RAG, które konwertuje złożone zapytanie na wiele podzapytań.

Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.

Example input question:
What are the main causes of deforestation, and how can it be mitigated?

Example output:
{
  "questions": [
    "What are the primary human activities that contribute to deforestation?",
    "How does agriculture play a role in deforestation?",
    "What is the impact of logging and timber harvesting on deforestation?",
    "How do urbanization and infrastructure development contribute to deforestation?",
    "What are the environmental consequences of deforestation?",
    "What are some effective strategies for reducing deforestation?",
    "How can reforestation and afforestation help mitigate the effects of deforestation?",
    "What role can governments and policies play in preventing deforestation?",
    "How can individuals and communities contribute to reducing deforestation?"
  ]
}

Przekazywanie obrazów w zapytaniach

Niektóre modele wielomodalne, takie jak GPT-4V i GPT-4o, mogą interpretować obrazy. Jeśli używasz tych modeli, możesz wybrać, czy chcesz uniknąć fragmentowania obrazów i przekazać obraz w ramach monitu do modelu wielomodalnego. Należy poeksperymentować, aby określić, jak to podejście działa w porównaniu do fragmentowania obrazów z elementami i bez przekazywania dodatkowego kontekstu. Należy również porównać różnicę kosztów między metodami i przeprowadzić analizę kosztów i korzyści.

Filtrowanie

Pola w magazynie wyszukiwania, które są skonfigurowane jako filtrowalne, mogą służyć do filtrowania zapytań. Rozważ filtrowanie słów kluczowych i jednostek dla zapytań, które używają tych pól, aby ułatwić zawężenie wyniku. Filtrowanie umożliwia pobranie tylko danych, które spełniają określone warunki z indeksu, eliminując nieistotne dane. Poprawia to ogólną wydajność zapytania z bardziej odpowiednimi wynikami. Podobnie jak w przypadku każdej decyzji, ważne jest, aby eksperymentować i testować. Zapytania mogą nie zawierać słów kluczowych ani nieprawidłowych słów kluczowych, skrótów ani akronimów. Należy wziąć pod uwagę te przypadki.

Ponowne korektowanie

Ponowne korbowanie umożliwia uruchamianie co najmniej jednego zapytania, agregowanie wyników i klasyfikację tych wyników. Rozważ następujące powody, aby ponownie korektować wyniki wyszukiwania:

  • Wykonano ręczne wyszukiwanie wielu i chcesz zagregować wyniki i sklasyfikować je.
  • Wyszukiwanie wektorów i słów kluczowych nie zawsze jest dokładne. Możesz zwiększyć liczbę dokumentów zwracanych z wyszukiwania, potencjalnie w tym kilka prawidłowych wyników, które w przeciwnym razie byłyby ignorowane, i użyć ponownego korbowania, aby ocenić wyniki.

Do przeprowadzania ponownego korbowania można użyć dużego modelu językowego lub kodera krzyżowego. Niektóre platformy, takie jak usługa Azure AI Search, mają zastrzeżone metody ponownego korbowania wyników. Możesz ocenić te opcje dla danych, aby określić, co działa najlepiej w danym scenariuszu. Poniższe sekcje zawierają szczegółowe informacje na temat tych metod.

Ponowne generowanie dużego modelu językowego

Poniżej przedstawiono przykładowy monit dużego modelu językowego z akceleratora eksperymentu RAG, który ponownie korekuje wyniki.

A list of documents is shown below. Each document has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any last comma from the nested json elements if it's present.
Don't include any documents that are not relevant to the question. There should exactly be one documents element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user defined question

schema:
{
    "documents": {
        "document_1": "Relevance",
        "document_2": "Relevance"
    }
}

Ponowne korektowanie między koderami

Poniższy przykład z repozytorium GitHub akceleratora eksperymentów RAG używa crossEncoder dostarczonego przez funkcję Hugging Face w celu załadowania modelu Roberta. Następnie wykonuje iterację poszczególnych fragmentów i używa modelu do obliczenia podobieństwa, dając im wartość. Sortujemy wyniki i zwracamy górną N.

from sentence_transformers import CrossEncoder
...

model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)

cross_scores_ques = model.predict(
    [[user_prompt, item] for item in documents],
    apply_softmax=True,
    convert_to_numpy=True,
)

top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
    sub_context.append(documents[idx])

Ranking semantyczny

Usługa Azure AI Search ma zastrzeżoną funkcję o nazwie klasyfikacja semantyczna. Ta funkcja korzysta z modeli uczenia głębokiego, które zostały dostosowane przez usługę Microsoft Bing, które promują najbardziej istotne wyniki. Zapoznaj się z poniższymi tematami, aby zobaczyć , jak działa semantyczny ranger.

Wskazówki dotyczące wyszukiwania

Podczas implementowania rozwiązania wyszukiwania należy wziąć pod uwagę następujące ogólne wskazówki:

  • Tytuł, podsumowanie, źródło i nieprzetworzona zawartość (niesprzątana) to dobre pola do zwrócenia z wyszukiwania.
  • Ustal, czy zapytanie musi zostać podzielone na podzapytania.
  • Ogólnie rzecz biorąc, dobrym rozwiązaniem jest uruchamianie zapytań dotyczących wielu pól, zarówno wektorów, jak i zapytań tekstowych. Gdy otrzymujesz zapytanie, nie wiesz, czy wyszukiwanie wektorowe czy wyszukiwanie tekstu jest lepsze. Ponadto nie wiesz, jakie pola najlepiej wyszukiwać wektorów ani wyszukiwać słów kluczowych. Możesz wyszukiwać wiele pól, potencjalnie z wieloma zapytaniami, ponownie korbować wyniki i zwracać wyniki z najwyższymi wynikami.
  • Pola słów kluczowych i jednostek są dobrymi kandydatami do rozważenia filtrowania.
  • Dobrym rozwiązaniem jest użycie słów kluczowych wraz z wyszukiwaniami wektorów. Słowa kluczowe filtrować wyniki do mniejszego podzestawu. Magazyn wektorów działa względem tego podzestawu, aby znaleźć najlepsze dopasowania.

Ocena wyszukiwania

W fazie przygotowania należy zebrać zapytania testowe wraz z informacjami o dokumencie testowym. Aby ocenić wyniki wyszukiwania, możesz użyć następujących informacji zebranych w tej fazie:

  • Zapytanie — przykładowe zapytanie
  • Kontekst — kolekcja całego tekstu w dokumentach testowych, które dotyczą przykładowego zapytania

Poniżej przedstawiono trzy dobrze ugruntowane metody oceny pobierania, których można użyć do oceny rozwiązania wyszukiwania:

  • Precyzja w K — procent poprawnie zidentyfikowanych odpowiednich elementów z łącznych wyników wyszukiwania. Ta metryka koncentruje się na dokładności wyników wyszukiwania.
  • Przypomnij sobie w K - Kompletność w K mierzy procent odpowiednich elementów w górnej części K z całkowitej możliwej liczby elementów względnych. Ta metryka koncentruje się na pokrycie wyników wyszukiwania.
  • Średnia ranga obustronna (MRR) — mrR mierzy średnią wzajemnej rangi pierwszej odpowiedniej odpowiedzi w sklasyfikowanych wynikach wyszukiwania. Ta metryka koncentruje się na tym, gdzie pierwszy odpowiedni wynik występuje w wynikach wyszukiwania.

Należy przetestować zarówno pozytywne, jak i negatywne przykłady. W przypadku pozytywnych przykładów chcesz, aby metryki powinny być jak najbardziej zbliżone do 1. W przypadku negatywnych przykładów, w których dane nie powinny być w stanie rozwiązać problemów z zapytaniami, chcesz, aby metryki mogły być jak najwięcej zbliżone do 0. Należy przetestować wszystkie zapytania testowe i średnią wyniki dodatnich zapytań oraz wyniki negatywnych zapytań, aby zrozumieć, jak wyniki wyszukiwania są wykonywane w agregacji.

Następne kroki