Zmagasz się z AI lub rozwojem full-stack? Nasi eksperci są tutaj, aby Cię poprowadzić: dostosowane porady, integracja techniczna i nie tylko. Skontaktuj się z nami pod adresem [email protected].

Tworzenie modelu wyszukiwania semantycznego z transformatorami zdań dla aplikacji RAG

Wdrożenie potoku Retrieval Augmented Generation (RAG) poprzez dopracowanie własnego modelu wyszukiwania semantycznego jest skutecznym podejściem do zwiększenia dokładności i trafności systemów odpowiadających na pytania.

Technika ta łączy w sobie mocne strony zarówno wyszukiwania semantycznego, jak i generatywnej sztucznej inteligencji, umożliwiając systemowi lepsze zrozumienie pytań użytkowników i generowanie dokładniejszych i kontekstowo istotnych odpowiedzi. Dostrajając model wyszukiwania semantycznego za pomocą transformatorów zdań, programiści mogą dostosować model do swojej domeny, poprawiając ogólną wydajność potoku RAG.

Wyszukiwanie semantyczne

Czym jest wyszukiwanie semantyczne?

Wyszukiwanie semantyczne to technika wyszukiwania danych, która wykracza poza tradycyjne metody wyszukiwania oparte na słowach kluczowych. Wykorzystuje algorytmy przetwarzania języka naturalnego i uczenia maszynowego w celu poprawy dokładności wyników wyszukiwania poprzez uwzględnienie intencji osoby wyszukującej i kontekstowego znaczenia terminów użytych w jej zapytaniu. Podejście to ma na celu zrozumienie podstawowego znaczenia zapytania i treści na stronach internetowych, a nie tylko dopasowanie słów kluczowych. W ten sposób wyszukiwanie semantyczne może zapewnić bardziej trafne wyniki, nawet jeśli nie zawierają one dokładnych słów użytych w pierwotnym zapytaniu.

Aby to osiągnąć, wyszukiwanie semantyczne wykorzystuje różne techniki, takie jak ujednoznacznienie znaczenia słów, ekstrakcja pojęć i rozszerzanie zapytań. Wykorzystuje również wyszukiwanie wektorowe i uczenie maszynowe, aby zwracać wyniki, które mają na celu dopasowanie do intencji i kontekstu użytkownika. Wyszukiwanie semantyczne jest szeroko stosowane w wyszukiwarkach internetowych, takich jak Google, i jest oparte na technologiach takich jak Graf Wiedzy, który przechowuje ustrukturyzowane dane o podmiotach i ich relacjach. Pozwala to wyszukiwarkom zrozumieć znaczenie zapytań i zapewnić dokładniejsze i bardziej znaczące wyniki.

Wyszukiwanie semantyczne jest bardzo przydatne dla firm, które chcą odpowiedzieć na pytania dotyczące ich własnej wiedzy domenowej, takiej jak dokumentacja techniczna, umowy, opisy produktów ...

Co to jest Retrieval Augmented Generation (RAG)?

Wyszukiwanie semantyczne

Retrieval Augmented Generation (RAG) to technika, która zwiększa dokładność i niezawodność generatywnych modeli sztucznej inteligencji, takich jak duże modele językowe (LLM), poprzez włączenie zewnętrznych źródeł danych w celu zapewnienia bardziej kontekstowo dokładnych i aktualnych informacji. Integruje ona komponent wyszukiwania z modelem generatywnym, umożliwiając systemowi wyszukiwanie i pobieranie odpowiednich informacji z bazy danych lub bazy wiedzy w celu uzupełnienia jego wewnętrznej wiedzy podczas generowania odpowiedzi.

Takie podejście zapewnia, że model AI może udzielać odpowiedzi w oparciu o najbardziej aktualne, wiarygodne fakty i umożliwia użytkownikom weryfikację źródeł informacji wykorzystywanych w odpowiedziach modelu. RAG pomaga oprzeć model AI na zewnętrznych źródłach wiedzy, poprawiając jakość jego wyników i zapewniając sposób na aktualizację modelu bez konieczności intensywnego przekwalifikowania.

RAG to świetna strategia łagodzenia potencjalnych halucynacji generatywnych modeli sztucznej inteligencji. RAG pomaga zbudować system odpowiadania na pytania, który ma to, co najlepsze z obu światów: dokładność faktów i ludzkie odpowiedzi generowane w języku naturalnym.

Czym jest biblioteka transformatorów zdań?

Transformatory zdań

Biblioteka Sentence Transformers to potężny framework Pythona zaprojektowany do najnowocześniejszego osadzania tekstu. Jest ona zbudowana w oparciu o transformujące sieci neuronowe, takie jak BERT, RoBERTa, XLM-R i inne, osiągając najwyższą wydajność w różnych zadaniach, w tym w wyszukiwaniu semantycznym, eksploracji parafraz, porównywaniu podobieństwa semantycznego, grupowaniu i innych. Biblioteka ta pozwala na łatwe dostrojenie metod osadzania zdań, umożliwiając tworzenie osadzeń zdań specyficznych dla zadania, dostosowanych do konkretnych potrzeb. Dowiedz się więcej na stronie Sentence Transformers

Biblioteka oferuje szeroki wybór wstępnie wytrenowanych modeli Sentence Transformers dla ponad 50 języków, dostępnych na platformie Hugging Face. Użytkownicy mogą również trenować lub dostrajać własne modele za pomocą biblioteki, zapewniając elastyczność tworzenia niestandardowych modeli dla unikalnych przypadków użycia. Zespół Sentence Transformers wydał niedawno nową wersję główną (v3), która znacznie poprawia możliwości tej biblioteki, zwłaszcza jej możliwości dostrajania.

Biblioteka Sentence Transformers jest szybka, wszechstronna i dobrze utrzymana, dlatego używamy jej w tym samouczku.

Tworzenie własnego modelu wyszukiwania semantycznego

Stworzenie własnego modelu wyszukiwania semantycznego to świetny sposób na uzyskanie dokładnych wyników przy jednoczesnym zapewnieniu bardzo niskiego opóźnienia. Jest to jeszcze bardziej prawdziwe w przypadku wdrożenia własnego modelu wyszukiwania semantycznego na GPU.

Najpierw utwórzmy mały zbiór danych zawierający nasze dane. Utwórz 1-kolumnowy plik CSV (o nazwie "dataset.csv") zawierający następującą dokumentację techniczną dotyczącą drukarek HP (w prawdziwym scenariuszu będziesz chciał oczywiście dołączyć znacznie więcej przykładów):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Każdy wiersz może zawierać do 512 tokenów (co w przybliżeniu odpowiada 400 słowom), a w celu zmaksymalizowania dokładności zaleca się pozostawanie poniżej 128 tokenów (co w przybliżeniu odpowiada 100 słowom). Teraz, gdy mamy już nasze 3 fragmenty dokumentacji w naszym zbiorze danych, możemy zakodować dane przy użyciu naszego modelu z Transformatorami Zdań. Utwórz skrypt Pythona z następującymi poleceniami (upewnij się, że PyTorch i Sentence Transformers są zainstalowane).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Ten skrypt pobiera i używa paraphrase-multilingual-mpnet-base-v2 jako modelu bazowego i używa go do kodowania naszych danych. Możesz wybrać spośród wielu dostępnych wstępnie wytrenowanych modeli, w zależności od wymagań (rozmiar modelu, przypadek użycia, obsługiwane języki, ...). W zależności od posiadanego sprzętu należy dostosować parametr "batch_size" w celu przyspieszenia procesu kodowania.

Po utworzeniu modelu można użyć go do wnioskowania za pomocą następującego skryptu Python:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

Powyższy skrypt wnioskowania zwraca następujące wyniki:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

W naszym skrypcie wnioskowania parametr "top_k" określa, ile wyników chcemy zwrócić. W wyniku pokazujemy pasujący tekst ze zbioru danych wraz z wynikiem zaufania. Ten wynik jest ważny, ponieważ pomaga nam zdecydować, czy chcemy zaakceptować odpowiedź, czy nie.

Generowanie odpowiedzi w języku naturalnym za pomocą generatywnej sztucznej inteligencji

Jak widać, głównym ograniczeniem wyszukiwania semantycznego jest to, że model zwraca nieprzetworzony tekst ze zbioru danych bez bezpośredniej odpowiedzi na pytanie. Chcemy więc teraz przekazać to generatywnemu modelowi sztucznej inteligencji jako kontekst, aby odpowiedzieć na początkowe pytanie w języku naturalnym.

Możemy to łatwo osiągnąć, wykorzystując zaawansowany LLM, taki jak GPT-4 w OpenAI lub LLaMA 3 i ChatDolphin w NLP Cloud. Możesz zdecydować się na zachowanie najlepszego wyniku z modelu wyszukiwania semantycznego i przekazać go jako kontekst do LLM lub zachować kilka wyników. Oto przykład podpowiedzi wykorzystujący tylko najlepszy wynik:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

To żądanie zwraca coś takiego:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Model wyszukiwania semantycznego z zakodowanymi danymi VS przechowywanie osadzonych danych w wektorowej bazie danych

W systemie Retrieval-Augmented Generation (RAG) tworzenie semantycznego modelu wyszukiwania z lokalnymi zakodowanymi danymi lub korzystanie z wektorowej bazy danych to dwie interesujące opcje.

Podczas kodowania naszych własnych danych, konwertujemy je na tensory, a następnie mamy możliwość załadowania danych na GPU. Z drugiej strony, wektorowa baza danych jest wyspecjalizowaną bazą danych zaprojektowaną do efektywnego przechowywania, indeksowania i wyszukiwania tych wielowymiarowych wektorów.

W przypadku firm, które chcą osiągnąć bardzo niskie opóźnienia, zaleca się kodowanie własnych danych i ładowanie ich na GPU w celu skrócenia czasu obliczeń. Odbywa się to jednak kosztem elastyczności, ponieważ dane muszą być ponownie kodowane za każdym razem, gdy zestaw danych ulegnie zmianie. Jeśli dane bazowe zmieniają się bardzo często, prostszym rozwiązaniem może być wyodrębnienie osadzeń i przyrostowe przechowywanie ich w wektorowej bazie danych (np. PG Vector).

Wnioski

Retrieval Augmented Generation ma kluczowe znaczenie dla firm, które chcą odpowiadać na pytania dotyczące konkretnych danych, takich jak dokumentacja techniczna, umowy itp. RAG jest na przykład kluczowym elementem chatbota wsparcia.

Sentence Transformers to świetna biblioteka, którą można wykorzystać do stworzenia własnego modelu wyszukiwania semantycznego w oparciu o własne dane. Po wdrożeniu na GPU i połączeniu z zaawansowanym generatywnym modelem sztucznej inteligencji, taki model okazuje się niezwykle potężny.

Jeśli nie jesteś zainteresowany samodzielnym tworzeniem i wdrażaniem własnego modelu wyszukiwania semantycznego opartego na transformatorach zdań, możesz to łatwo zrobić jednym kliknięciem w NLP Cloud. Wypróbuj wyszukiwanie semantyczne w NLP Cloud już teraz!

Jeśli masz pytania dotyczące RAG, wyszukiwania semantycznego i Transformatorów Zdań, nie wahaj się nas zapytać, zawsze chętnie doradzimy!

Julien
CTO w NLP Cloud