Jeśli chodzi o przetwarzanie języka naturalnego (NLP) i wyszukiwanie informacji, najważniejsza jest zdolność do wydajnego i dokładnego wyszukiwania odpowiednich informacji. W miarę ciągłego rozwoju tej dziedziny opracowywane są nowe techniki i metodologie mające na celu poprawę wydajności systemów wyszukiwania, szczególnie w kontekście Odzyskanie Augmented Generation (SZMATA). Jedna z takich technik, znana jako dwuetapowe wyszukiwanie za pomocą narzędzi do zmiany rankingu, okazała się potężnym rozwiązaniem pozwalającym przezwyciężyć nieodłączne ograniczenia tradycyjnych metod wyszukiwania.
W tym artykule omawiamy zawiłości dwuetapowego wyszukiwania i rerankerów, zgłębiając ich zasady, strategie implementacji oraz korzyści, jakie oferują w zakresie zwiększenia dokładności i wydajności systemów RAG. Przedstawimy również praktyczne przykłady i fragmenty kodu, aby zilustrować te koncepcje i ułatwić głębsze zrozumienie tej nowatorskiej techniki.
Zanim zagłębimy się w szczegóły dwuetapowego wyszukiwania i rerankerów, pokrótce przyjrzyjmy się koncepcji generacji rozszerzonej wyszukiwania (RAG). RAG to technika rozszerzająca wiedzę i możliwości dużych modeli językowych (LLM) poprzez zapewnienie im dostępu do zewnętrznych źródeł informacji, takich jak bazy danych czy zbiory dokumentów. Więcej informacji można znaleźć w artykule „Głębokie zanurzenie się w generowaniu rozszerzonym odzyskiwania w LLM".
Typowy proces RAG obejmuje następujące kroki:
Pytanie: użytkownik zadaje pytanie lub przekazuje systemowi instrukcję.
Wyszukiwanie:System wysyła zapytanie do bazy danych wektorowych lub zbioru dokumentów w celu znalezienia informacji odpowiadających zapytaniu użytkownika.
zwiększenie:Pobrane informacje są łączone z oryginalnym zapytaniem lub instrukcją użytkownika.
Pożądania: Model językowy przetwarza wzmocnione dane wejściowe i generuje odpowiedź, wykorzystując informacje zewnętrzne w celu zwiększenia dokładności i kompleksowości swoich wyników.
Chociaż RAG okazał się potężną techniką, nie jest ona pozbawiona wyzwań. Jednym z kluczowych problemów jest etap wyszukiwania, na którym tradycyjne metody wyszukiwania mogą nie identyfikować najbardziej odpowiednich dokumentów, co prowadzi do nieoptymalnych lub niedokładnych odpowiedzi na podstawie modelu językowego.
Potrzeba dwuetapowego wyszukiwania i zmiany rankingu
Tradycyjne metody wyszukiwania, takie jak te oparte na dopasowywaniu słów kluczowych lub modelach przestrzeni wektorowej, często mają trudności z uchwyceniem zróżnicowanych relacji semantycznych między zapytaniami i dokumentami. To ograniczenie może skutkować pobraniem dokumentów, które są jedynie powierzchownie istotne lub pominięciem kluczowych informacji, które mogłyby znacząco poprawić jakość generowanej odpowiedzi.
Aby stawić czoła temu wyzwaniu, badacze i praktycy przeszli na dwuetapowe wyszukiwanie za pomocą narzędzi do zmiany rankingu. Podejście to obejmuje proces dwuetapowy:
Wstępne pobieranie: Na pierwszym etapie pobierany jest stosunkowo duży zestaw potencjalnie istotnych dokumentów przy użyciu szybkiej i wydajnej metody wyszukiwania, takiej jak model przestrzeni wektorowej lub wyszukiwanie oparte na słowach kluczowych.
Zmiana rankingu: W drugim etapie stosowany jest bardziej wyrafinowany model zmiany rankingu, aby zmienić kolejność początkowo pobranych dokumentów na podstawie ich związku z zapytaniem, skutecznie umieszczając najbardziej odpowiednie dokumenty na górze listy.
Model rerankingu, często oparty na sieci neuronowej lub architekturze opartej na transformatorze, jest specjalnie przeszkolony w celu oceny istotności dokumentu dla danego zapytania. Wykorzystując zaawansowane możliwości rozumienia języka naturalnego, osoba dokonująca rerankingu może uchwycić niuanse semantyczne i relacje kontekstowe między zapytaniem a dokumentami, co skutkuje dokładniejszym i trafniejszym rankingiem.
Korzyści z dwuetapowego wyszukiwania i rerankingu
Przyjęcie dwuetapowego wyszukiwania za pomocą programów rerankingowych oferuje kilka znaczących korzyści w kontekście systemów RAG:
Poprawiona dokładność: Poprawiając ranking pierwotnie pobranych dokumentów i promując te najbardziej odpowiednie na górze, system może zapewnić dokładniejsze i bardziej precyzyjne informacje na temat modelu językowego, co prowadzi do uzyskania wyższej jakości generowanych odpowiedzi.
Złagodzone problemy poza domeną: Modele osadzania używane do tradycyjnego wyszukiwania są często trenowane na korpusach tekstowych ogólnego przeznaczenia, które mogą nie odzwierciedlać odpowiednio języka i semantyki specyficznej dla domeny. Z drugiej strony modele rerankingu można szkolić na danych specyficznych dla domeny, łagodząc problem „poza domeną” i poprawiając trafność odzyskanych dokumentów w wyspecjalizowanych domenach.
Skalowalność: Podejście dwuetapowe pozwala na efektywne skalowanie poprzez wykorzystanie szybkich i lekkich metod wyszukiwania na początkowym etapie, przy jednoczesnym zarezerwowaniu bardziej wymagającego obliczeniowo procesu zmiany rankingu dla mniejszego podzbioru dokumentów.
Elastyczność
: Modele rerankingu można wymieniać lub aktualizować niezależnie od początkowej metody wyszukiwania, zapewniając elastyczność i możliwość dostosowania do zmieniających się potrzeb systemu.
ColBERT: Wydajna i skuteczna późna interakcja
Jednym z wyróżniających się modeli w dziedzinie rerankingu jest ColBERT (Kontekstualna późna interakcja w BERT). ColBERT to model ponownej klasyfikacji dokumentów, który wykorzystuje możliwości głębokiego rozumienia języka BERT, wprowadzając jednocześnie nowatorski mechanizm interakcji znany jako „późna interakcja”.
ColBERT: Wydajne i skuteczne wyszukiwanie przejść poprzez kontekstową późną interakcję za pośrednictwem BERT
Mechanizm późnej interakcji w ColBERT pozwala na sprawne i precyzyjne wyszukiwanie poprzez osobne przetwarzanie zapytań i dokumentów aż do końcowych etapów procesu wyszukiwania. W szczególności ColBERT niezależnie koduje zapytanie i dokument za pomocą BERT, a następnie wykorzystuje lekki, ale potężny etap interakcji, który modeluje ich szczegółowe podobieństwo. Opóźniając, ale zachowując tę drobną interakcję, ColBERT może wykorzystać ekspresję głębokich modeli językowych, jednocześnie zyskując możliwość wstępnego obliczania reprezentacji dokumentów w trybie offline, co znacznie przyspiesza przetwarzanie zapytań.
Architektura późnej interakcji ColBERT oferuje szereg korzyści, w tym zwiększoną wydajność obliczeniową, skalowalność wraz z rozmiarem zbioru dokumentów oraz praktyczne zastosowanie w rzeczywistych scenariuszach. Ponadto ColBERT został dodatkowo ulepszony o techniki takie jak nadzór odszumiania i kompresja resztkowa (w ColBERTv2), które usprawniają proces trenowania i zmniejszają zajmowaną przez model przestrzeń, zachowując jednocześnie wysoką skuteczność wyszukiwania.
Ten fragment kodu demonstruje, jak skonfigurować i używać modelu jina-colbert-v1-en do indeksowania kolekcji dokumentów, wykorzystując jego zdolność do wydajnej obsługi długich kontekstów.
Implementacja dwuetapowego pobierania za pomocą narzędzi rerankingowych
Teraz, gdy rozumiemy zasady dwuetapowego wyszukiwania i rerankerów, przyjrzyjmy się ich praktycznej implementacji w kontekście systemu RAG. Wykorzystamy popularne biblioteki i frameworki, aby zademonstrować integrację tych technik.
Konfigurowanie środowiska
Zanim zagłębimy się w kod, skonfigurujmy środowisko programistyczne. Będziemy korzystać z Pythona i kilku popularnych bibliotek NLP, w tym Hugging Face Transformers, Sentence Transformers i LanceDB.
W celach demonstracyjnych wykorzystamy zbiór danych „ai-arxiv-chunked” z Hugging Face Datasets, który zawiera ponad 400 artykułów ArXiv na temat uczenia maszynowego, przetwarzania języka naturalnego i dużych modeli językowych.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Następnie wstępnie przetworzymy dane i podzielimy je na mniejsze fragmenty, aby ułatwić ich efektywne pobieranie i przetwarzanie.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Na początkowym etapie pobierania użyjemy modelu Sentence Transformer do zakodowania naszych dokumentów i zapytań w gęstych reprezentacjach wektorowych, a następnie przeprowadzimy przybliżone wyszukiwanie najbliższego sąsiada przy użyciu wektorowej bazy danych, takiej jak LanceDB.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
Dzięki indeksowaniu naszych dokumentów możemy przeprowadzić wstępne pobieranie, znajdując najbliższych sąsiadów danego wektora zapytania.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def chunk_text(text, chunk_size=512, overlap=64):
tokens = tokenizer.encode(text, return_tensors="pt", truncation=True)
chunks = tokens.split(chunk_size - overlap)
texts = [tokenizer.decode(chunk) for chunk in chunks]
return texts
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Zmiana rankingu
Po wstępnym wyszukaniu zastosujemy model rerankingu, aby uporządkować wyszukane dokumenty na podstawie ich istotności dla zapytania. W tym przykładzie wykorzystamy reranker ColBERT, szybki i dokładny model oparty na transformacjach, zaprojektowany specjalnie do rankingowania dokumentów.
reranked_docs lista zawiera teraz dokumenty uporządkowane w oparciu o ich znaczenie dla zapytania, określone przez narzędzie do zmiany rankingu ColBERT.
Zwiększanie i generowanie
Mając ponownie uporządkowane i istotne dokumenty w ręku, możemy przejść do etapów rozbudowy i generowania potoku RAG. Do wygenerowania ostatecznej odpowiedzi wykorzystamy model języka z biblioteki Hugging Face Transformers.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])
# Generate response from language model
input_ids = tokenizer.encode(augmented_query, return_tensors="pt")
output_ids = model.generate(input_ids, max_length=500)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
print(response)
W powyższym fragmencie kodu uzupełniamy oryginalne zapytanie o trzy dokumenty, które uzyskały najwyższą pozycję w rankingu, tworząc plik augmented_query. Następnie przekazujemy to rozszerzone zapytanie do modelu języka T5, który generuje odpowiedź na podstawie podanego kontekstu.
response zmienna będzie zawierać ostateczny wynik, wykorzystując informacje zewnętrzne z pobranych i zmienionych dokumentów, aby zapewnić dokładniejszą i wszechstronniejszą odpowiedź na pierwotne zapytanie.
Zaawansowane techniki i rozważania
Przedstawiona przez nas implementacja zapewnia solidne podstawy do zintegrowania dwuetapowego wyszukiwania i ponownego szeregowania w systemie RAG, jednak istnieje kilka zaawansowanych technik i zagadnień, które mogą dodatkowo zwiększyć wydajność i niezawodność tego podejścia.
Rozszerzenie zapytania: Aby usprawnić początkowy etap wyszukiwania, można zastosować techniki rozwijania zapytań, które polegają na rozszerzeniu pierwotnego zapytania o powiązane terminy lub frazy. Może to pomóc w wyszukaniu bardziej zróżnicowanego zestawu potencjalnie istotnych dokumentów.
Zmiana rankingu zespołu: Zamiast polegać na jednym modelu rerankingu, możesz połączyć wiele rerankingów w jeden zespół, wykorzystując mocne strony różnych modeli w celu poprawy ogólnej wydajności.
Dostosowywanie funkcji rerankingowych: Chociaż wstępnie wytrenowane modele rerankingu mogą być skuteczne, ich dostrojenie na podstawie danych specyficznych dla domeny może jeszcze bardziej zwiększyć ich zdolność do wychwytywania semantyki i sygnałów trafności specyficznych dla domeny.
Iteracyjne pobieranie i ponowne ocenianie: W niektórych przypadkach pojedyncza iteracja pobierania i zmiany rankingu może nie wystarczyć. Możesz eksplorować podejścia iteracyjne, w których dane wyjściowe modelu językowego są wykorzystywane do udoskonalenia procesu zapytań i wyszukiwania, co prowadzi do bardziej interaktywnego i dynamicznego systemu.
Równowaga między trafnością i różnorodnościąChociaż celem rerankerów jest promowanie najbardziej istotnych dokumentów, kluczowe jest zachowanie równowagi między trafnością a różnorodnością. Wdrożenie technik promujących różnorodność może pomóc zapobiec nadmiernemu zawężeniu lub stronniczości systemu w zakresie źródeł informacji.
Wskaźniki ocenyAby ocenić skuteczność dwuetapowego podejścia do wyszukiwania i rerankingu, należy zdefiniować odpowiednie metryki ewaluacyjne. Mogą one obejmować tradycyjne metryki wyszukiwania informacji, takie jak precyzja, rozpoznawalność i średni odwrotny ranking (MRR), a także metryki specyficzne dla danego zadania, dostosowane do konkretnego przypadku użycia.
Podsumowanie
Generowanie rozszerzone wyszukiwania (RAG) okazało się potężną techniką zwiększania możliwości dużych modeli językowych poprzez wykorzystanie zewnętrznych źródeł informacji. Jednak tradycyjne metody wyszukiwania często utrudniają identyfikację najbardziej odpowiednich dokumentów, co prowadzi do nieoptymalnej wydajności.
Dwuetapowe pobieranie za pomocą narzędzi do zmiany rankingu oferuje przekonujące rozwiązanie tego wyzwania. Łącząc początkowy etap szybkiego wyszukiwania z bardziej wyrafinowanym modelem zmiany rankingu, podejście to może znacznie poprawić dokładność i trafność odzyskiwanych dokumentów, ostatecznie prowadząc do wyższej jakości odpowiedzi generowanych na podstawie modelu językowego.
Ostatnie pięć lat spędziłem zanurzając się w fascynującym świecie uczenia maszynowego i głębokiego uczenia się. Moja pasja i wiedza sprawiły, że uczestniczyłem w ponad 50 różnorodnych projektach z zakresu inżynierii oprogramowania, ze szczególnym uwzględnieniem AI/ML. Moja ciągła ciekawość przyciągnęła mnie również w stronę przetwarzania języka naturalnego – dziedziny, którą chcę dalej zgłębiać.