#9: Algebra liniowa, trygonometria i wektory w SEO
O konsumpcji informacji i kształcie indeksowania treści we wyszukiwarkach słów kilka
Cześć,
30 listopada minęło dwa lata od premiery ChatGPT — flagowej aplikacji OpenAI zmieniającej sposób interakcji z urządzeniami informatycznymi. Uruchomiło to cały szereg procesów ekonomicznych i zwiększyło uwagę inwestorów oraz nakłady finansowe na rozwój AI. Od tego czasu powstał bardzo duży rynek wokół AI obejmujący produkty szkoleniowe, serwisy informacyjne (w tym zamknięte społeczności) etc., gdzie prawdopodobnie powiedziano już wszystko, co możliwe o sztucznej inteligencji. Przy premierze GPT-3 od OpenAI zapadł mnie szczególnie w pamięć post na LinkedIn (skąd inąd to cudownie siedlisko corpo cracku lub copium — w zależności od preferowanej definicji) mówiący o tym, że w przeciągu pięciu lat znajdziemy lek na raka i osiągniemy nieśmiertelność…
No cóż, na chwilę obecną biznesowe ruchy big techów nie świadczą o tym, że jesteśmy blisko cywilizacyjnego przełomu (sam rozwój, mimo iż imponujący, zwolnił i niekoniecznie pokrywa się z tym, co jest pierwotnie mówione); koniunktura w branży IT wraca (acz prognozowanie to zawsze zajęcie proste i trudne, więc podchodzę z rezerwą); obecny cykl AI hype powoli sięga szczytu, a żyć trzeba dopóki AGI nie przejmie nad nami władzy. Czasu z kolei upłynęło już tyle, że można mieć pierwsze wiarygodne wnioski odnośnie preferencji konsumentów dotyczące korzystania z dobrodziejstw technologii. Sam krajobraz biznesowy pod tym kątem prezentuje się dość ciekawie.
Na rynku pojawiły się takie produkty jak SearchGPT, Perplexity (z którego sam korzystam, załączam więc link polecający). Integracje z modelami językowymi posiada Bing, a Google po pierwszej nieudanej próbie dopracowuje działanie swoich systemów, gdzie ciekawe efekty konwergencji widać w ich najnowszym modelu Gemini 2 Flash. Mimo jeszcze znikomego udziału w rynku wyszukiwarek to modele językowe niewątpliwie zmienią sposób tego, w jaki sposób korzystamy ze zbiorów informacji. Warto więc na to się przygotować i zrozumieć jakie mechanizmy stoją za modelami językowymi.
Zmierzając do sedna: dzisiaj zajawię w dużym uproszczeniu na praktycznym przykładzie to, w jaki sposób LLMy interpretują informacje, przetwarzają dane, a następnie pokążę co można zrobić w celu prawdopodobnej poprawy indeksowania treści, a co za tym idzie, zwiększenia skuteczności indeksowania witryny w systemach wyszukiwania. Wybrałem branżę SEO z tego powodu, że jest bardzo wdzięczna i można w niej bardzo sprawnie iterować zmiany i uzyskiwać informację zwrotną na temat skuteczności prowadzonych działań w czasie rzeczywistym.
Tutaj też zaznaczę, że sama tematyka pozycjonowania w Internecie to jest znacznie szerszy temat niż omawiana poniżej wektoryzacja i transformatory. Sam model biznesowy dostawców wyszukiwarek, kryteria rankingowe i pokrewne elementy stanowią tajemnice przedsiębiorstwa i nie są znane w pełni wszystkie rozwiązania. W istocie jeśli rozmawiamy o tej gałęzi marketingu cyfrowego to należy zrozumieć, że rekomendacje opierają się w ramach prawdopodobieństwa i oceny ryzyka. To, że wdrożysz moje rady, nie gwarantuje Ci niczego, a jeśli ktoś zapewnia Cię i daje gwarancje efektów przy pozycjonowaniu, to radzę być bardzo powściągliwym.
Jak model językowy rozumie tekst?
Modele językowe przetwarzają tekst zupełnie inaczej niż ludzie. Zamiast prawdziwego rozumienia, mamy do czynienia z zaawansowaną analizą statystyczną bazującą na ogromnych zbiorach danych tekstowych. Model w trakcie treningu przetwarza miliardy tekstów, z których uczy się wzorców i zależności między słowami. Każde słowo zostaje przekształcone w ciąg liczb (wektor), który określa jego znaczenie i relacje z innymi słowami. Te wektory tworzą wielowymiarową przestrzeń matematyczną, gdzie słowa o podobnym znaczeniu znajdują się blisko siebie.
Proces przetwarzania tekstu przez model językowy to w zasadzie rozpoznawanie i odtwarzanie wzorców. Model nie magazynuje konkretnych fragmentów tekstu jak baza danych, zamiast tego uczy się ogólnych reguł i zależności - trochę jak system przewidywania tekstu w telefonie, tylko znacznie bardziej zaawansowany. Kiedy model otrzymuje tekst, przetwarza go przez szereg warstw matematycznych, które analizują zarówno pojedyncze słowa, jak i szersze konteksty. Na każdym etapie model wykorzystuje wyuczone wcześniej wzorce, żeby przewidzieć, które słowa i frazy są najbardziej prawdopodobne w danym kontekście.
Warto zrozumieć, że model nie ma dostępu do rzeczywistego świata - nie widzi, nie słyszy i nie doświadcza tego, o czym czyta. Jego wiedza opiera się wyłącznie na wzorcach znalezionych w tekstach treningowych. To dlatego model może czasem generować odpowiedzi, które są gramatycznie poprawne i na pierwszy rzut oka sensowne, ale zawierają błędy merytoryczne lub logiczne. Model potrafi również rozpoznawać złożone elementy języka, jak sarkazm czy metafory, ale robi to wyłącznie na podstawie analizy kontekstu i charakterystycznych wzorców językowych, a nie przez rzeczywiste zrozumienie ich znaczenia. Z kolei w ujęciu komercyjnym, jeśli faktycznie wykazuje pewne znacznie szersze zrozumienie, to jest to najczęściej integracja różnych architektur do rozpoznawania wsadu i procesowania danych.
Wyobraź sobie sztucznie uproszczoną sytuację, w której masz trzy słowa: kot, pies i samochód. Chcesz je przedstawić jako punkty w przestrzeni, aby móc ocenić, jak są do siebie podobne. Zamiast pojedynczej liczby, każde słowo opisujemy wcześniej wspomnianym wektorem, czyli zestawem liczb. Dlaczego zestawem? Ponieważ pojedyncza liczba (np. wartość 5) nie wystarczy do opisania złożoności słowa. Potrzebujemy wielu wymiarów (np. 300 liczb) — każdy z nich uchwyci inną, trudno definiowalną cechę semantyczną słowa. Można to porównać do współrzędnych geograficznych: jedna liczba to za mało, aby wskazać, gdzie leży miasto, ale mając szerokość i długość geograficzną, możemy już je precyzyjnie umiejscowić. W przypadku słów często mówimy o setkach czy tysiącach takich współrzędnych.
Powiedzmy, że po treningu model nadaje słowom takie reprezentacje (przykładowo w 3 wymiarach, by było łatwiej sobie to wyobrazić):
kot to [0.8, 1.0, 0.3]
pies to [0.7, 0.9, 0.4]
samochód to [0.5, 0.1, 0.2]
Dlaczego takie liczby? Wynikają z procesu uczenia się modelu na ogromnych zbiorach tekstu. Algorytm odkrywa wzorce i zależności między słowami, automatycznie przypisując im takie wektory, by słowa o podobnym znaczeniu leżały blisko siebie. Kot i pies to zwierzęta domowe, dlatego mają zbliżone wektory, zaś samochód jest zupełnie innym konceptem i trafił w odległe miejsce w przestrzeni.
Teraz, aby sprawdzić, które słowa są do siebie podobne, stosujemy miary podobieństwa. Jedną z powszechnie używanych jest tzw. cosine similarity, bazująca na funkcji cosinus. Cosinus pozwala nam obliczyć kąt pomiędzy dwoma wektorami:
Jeśli wektory są prawie równoległe (czyli opisujące słowa o podobnym znaczeniu), kąt między nimi będzie mały, a cosinus tego kąta bliski 1.
Jeśli zaś wektory są skierowane w inne strony (czyli słowa są mało podobne), kąt będzie większy, a cosinus bliższy 0.
W ten sposób, dzięki podstawowym narzędziom algebry liniowej i trygonometrii (takim jak sin, cos, tangens), możemy dokonywać obliczeń na wielowymiarowych liczbach. Zamieniamy abstrakcyjne pojęcia w punkty w przestrzeni i korzystając z matematyki — mierzymy ich odległości, kąty i podobieństwa. Wszystko po to, aby model językowy mógł precyzyjnie określać, które słowa lub frazy są do siebie semantycznie zbliżone, a które nie.
GPT i BERT i inne architektury transformerowe
Pojawienie się architektur opartych o mechanizm tzw. transformerów było przełomowym wydarzeniem w rozwoju nowoczesnych modeli językowych. Kluczowym elementem transformerów jest koncepcja self-attention, która pozwala modelowi dynamicznie skupiać się na różnych fragmentach tekstu w zależności od bieżącego kontekstu. W przeciwieństwie do wcześniejszych podejść, takich jak rekurencyjne sieci neuronowe (RNN) czy modele LSTM, transformatory nie bazują na przetwarzaniu sekwencyjnym krok po kroku. Zamiast tego, cały tekst analizowany jest niejako równolegle, a mechanizm uwagi (attention) pozwala modelowi efektywnie przeglądać dane wejściowe i odnajdywać kluczowe zależności między słowami, nawet jeśli są one od siebie oddalone w tekście.
Dlaczego transformatory stały się tak ważne? Głównie ze względu na ich zdolność do skalowania i efektywnego wykorzystania mocy obliczeniowej. Umożliwiają trenowanie gigantycznych modeli na niewyobrażalnie dużych zbiorach danych, co przekłada się na ich niezwykłą wszechstronność i skuteczność w rozwiązywaniu różnorodnych zadań językowych, takich jak tłumaczenia, streszczanie tekstu, analiza sentymentu, odpowiadanie na pytania czy generowanie treści. Architektura transformerowa wyeliminowała w dużej mierze problemy z długotrwałym przechowywaniem kontekstu, które trapiły wcześniejsze modele RNN, i znacząco poprawiła zdolność zapamiętywania informacji zawartych w obszernej sekwencji danych.
Najbardziej znane architektury transformerowe
BERT (Bidirectional Encoder Representations from Transformers)
BERT to jeden z pierwszych modeli, który pokazał prawdziwy potencjał transformerów w kontekście zadań związanych ze zrozumieniem języka. Jego cechą wyróżniającą jest dwukierunkowe przetwarzanie tekstu – model czyta zdanie zarówno od lewej do prawej, jak i od prawej do lewej, jednocześnie wyłapując kontekst.
Plusy:
Doskonałe wyniki w zadaniach typu „tekst na wejściu – odpowiedź na wyjściu” (np. pytania i odpowiedzi, analiza sentymentu).
Dwukierunkowe rozumienie kontekstu pozwala lepiej uchwycić powiązania semantyczne między słowami.
Uniwersalność i szerokie zastosowanie: BERT stał się punktem wyjścia dla wielu specjalistycznych modeli dostosowanych do konkretnych problemów.
Minusy:
BERT sam w sobie nie jest generatorem tekstu – to model typu encoder, który świetnie rozumie kontekst, ale nie potrafi płynnie tworzyć nowego tekstu na podstawie promptu (tzw. tekst w oparciu o wprowadzone polecenie).
Konieczność dodatkowego „fine-tuningu” dla konkretnych zadań, choć to w praktyce jest często zaletą, bo model można dostosować do konkretnych potrzeb.
GPT (Generative Pre-trained Transformer)
GPT to architektura skupiająca się głównie na generowaniu tekstu. W przeciwieństwie do BERT, który jest dwukierunkowy, GPT działa głównie lewostronnie (unidirectional), co oznacza, że model przewiduje kolejne słowa na podstawie sekwencji, która pojawiła się wcześniej. Dzięki temu GPT świetnie sprawdza się w zadaniach kreatywnych, takich jak pisanie opowiadań, tworzenie opisów produktów czy generowanie kodu w oparciu o polecenia tekstowe.
Plusy:
Świetne zdolności generacyjne: model potrafi tworzyć sensowne, płynne i często bardzo przekonujące teksty.
GPT jest niezwykle elastyczny, nie tylko w sferze języka naturalnego, ale też w innych dziedzinach (np. generowanie kodu, czy nawet prostych obrazków w późniejszych wariantach).
Nie wymaga tak intensywnego „fine-tuningu” pod zadania zrozumienia kontekstu, ponieważ duże modele GPT często radzą sobie przyzwoicie w wielu zastosowaniach już po samym pre-treningu.
Minusy:
Ze względu na jednostronny charakter przetwarzania (od lewej do prawej), model nie zawsze tak precyzyjnie rozumie kontekst całego zdania jak BERT.
Modele GPT mogą być podatne na „halucynacje” – generowanie informacji brzmiących wiarygodnie, ale nieprawdziwych. Wynika to z faktu, że GPT skupia się na prawdopodobieństwie wystąpienia słów, nie zaś na weryfikacji faktycznej poprawności generowanych treści.
Inne, przykładowe architektury i wariacje powiązane z tematem artykułu:
DistilBERT, RoBERTa, ALBERT: to zmodyfikowane wersje BERT, często lżejsze, szybsze lub dokładniejsze w określonych zastosowaniach.
T5 (Text-to-Text Transfer Transformer): model, który traktuje każde zadanie jako zadanie konwersji tekstu w tekst. Może tłumaczyć, podsumowywać, odpowiadać na pytania, wszystko w tym samym formacie wejścia i wyjścia.
mBERT, XLM-R: modele wielojęzyczne, które integrują dane z wielu języków, dzięki czemu są przydatne w projektach o globalnym zasięgu i wielojęzycznej treści.
Jak zastosować w praktyce transformery do SEO? Ocena trafności treści do przykładowego zapytania
W poprzednich wydaniach była prośba o załączanie kodu źródłowego w postaci repozytorium, zatem załączam. Na przykładzie modelu BERT wytrenowanego na zestawie danych SQuAD 2.0 napisałem program oceniający jakościowo tematykę tekstu do zadawanego pytania, a następnie podaje najbardziej trafny fragment z danych syntetycznych (uprzednio zwalidowanych czy aby na pewno nie występuje zbyt duże podobieństwo z zbiorze treningowym).
deepset/bert-base-cased-squad2 został wybrany ze względu na jego zoptymalizowanie pod kątem zadań question-answering. Model ten wykazuje szczególną skuteczność w ekstrakcji kontekstowych odpowiedzi z tekstu i rozumieniu złożonych zapytań, co jest kluczowe dla analizy dokumentów technicznych i biznesowych. Może również posłużyć do oceny trafności zapytania. Poniżej krótkie omówienie z czego zbudowany jest program i jego wynik.
Struktura i inicjalizacja systemu
Podstawowym elementem systemu jest klasa DocumentAnalyzer, której konstrukcja rozpoczyna się od inicjalizacji trzech kluczowych komponentów. Przyjrzyjmy się tej konstrukcji:
class DocumentAnalyzer:
def __init__(self) -> None:
self.logger = self._setup_logger()
self.logger.info("Inicjalizacja DocumentAnalyzer")
model_name = "deepset/bert-base-cased-squad2"
self.logger.info(f"Ładowanie modelu: {model_name}")
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForQuestionAnswering.from_pretrained(model_name)
System logowania
Implementacja zawiera rozbudowany system logowania, który jest kluczowy dla monitorowania działania aplikacji. Konstrukcja systemu logowania prezentuje się następująco:
def _setup_logger(self) -> logging.Logger:
logger = logging.getLogger('DocumentAnalyzer')
logger.setLevel(logging.INFO)
log_dir = Path('logs')
log_dir.mkdir(exist_ok=True)
log_file = log_dir / f'analysis_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log'
fh = logging.FileHandler(log_file)
fh.setLevel(logging.INFO)
Mechanizm analizy dokumentów
Rdzeń systemu stanowi mechanizm analizy dokumentów, który wykorzystuje zaawansowane możliwości modelu BERT. Główna funkcjonalność została zaimplementowana w następujący sposób:
def calculate_document_probability(self, document: str, questions: List[str]) -> Dict[str, float]:
if not document or not questions:
raise ValueError("Dokument i pytania nie mogą być puste")
self.logger.debug(f"Analiza dokumentu o długości {len(document)} znaków")
results_per_question = {}
for question in questions:
self.logger.debug(f"Przetwarzanie pytania: {question}")
inputs = self.tokenizer(
question,
document,
return_tensors="pt",
max_length=512,
truncation=True,
padding=True
)
Analiza fragmentów tekstu
System implementuje zaawansowany mechanizm analizy fragmentów tekstu, który pozwala na szczegółową ocenę poszczególnych części dokumentu:
def find_relevant_fragments(self, document: str, window_size: int = 100, threshold: float = 0.5) -> List[Tuple[str, float, Dict[str, float]]]:
if not document:
raise ValueError("Dokument nie może być pusty")
self.logger.info("Rozpoczęcie analizy fragmentów")
words = document.split()
fragments = []
Mechanizm porównywania dokumentów
Funkcjonalność porównywania dokumentów została zaimplementowana w sposób umożliwiający szczegółową analizę porównawczą:
def analyze_documents(self, doc1: str, doc2: str, questions: List[str]) -> Dict:
self.logger.info("Rozpoczęcie analizy porównawczej dokumentów")
self.logger.info("Analiza dokumentu technicznego")
doc1_results = self.calculate_document_probability(doc1, questions)
self.logger.info("Analiza dokumentu biznesowego")
doc2_results = self.calculate_document_probability(doc2, questions)
Funkcja główna systemu
Implementacja zawiera funkcję główną demonstrującą praktyczne zastosowanie systemu:
def main() -> None:
analyzer = DocumentAnalyzer()
try:
analyzer.logger.info("ROZPOCZĘCIE ANALIZY DOKUMENTÓW")
results = analyzer.analyze_documents(document1, document2, questions)
Optymalizacja wydajności
W implementacji zastosowano szereg optymalizacji, w tym wykorzystanie context managera torch.no_grad() dla zwiększenia efektywności obliczeniowej, buforowanie wyników tokenizacji oraz efektywne przetwarzanie nakładających się fragmentów tekstu.
Wynik
Przykładowy rezultat prezentuje się następująco:
2024-12-15 05:48:00,894 - INFO - SZCZEGÓŁOWA ANALIZA DOKUMENTU
2024-12-15 05:48:00,894 - INFO - Rozpoczęcie analizy fragmentów
2024-12-15 05:48:01,405 - INFO - Znaleziono 1 istotnych fragmentów (próg: 0.6)
2024-12-15 05:48:01,405 - INFO - Fragment 1:
2024-12-15 05:48:01,405 - INFO - Tekst: Transformacja Cyfrowa w Sektorze Finansowym Sektor finansowy przechodzi fundamentalną transformację cyfrową. Banki i instytucje finansowe wdrażają zaawansowane rozwiązania AI do automatyzacji procesów i poprawy obsługi klienta. Kluczowe Obszary: 1. Analiza Ryzyka - Automatyczna ocena zdolności kredytowej - Wykrywanie fraudów - Prognozowanie ryzyka rynkowego 2. Obsługa Klienta - Chatboty 24/7 - Personalizacja ofert - Automatyzacja procesów 3. Optymalizacja Operacji - Redukcja kosztów o 25% - Przyspieszenie procesów o 40% - Poprawa dokładności o 60% Inwestycje w technologie AI zwracają się średnio w ciągu 18 miesięcy.
2024-12-15 05:48:01,405 - INFO - Ocena całkowita: 85.14%
2024-12-15 05:48:01,405 - INFO - Pytanie: O czym jest ten fragment? - Wynik: 95.66%
2024-12-15 05:48:01,405 - INFO - Pytanie: Jakie są główne informacje w tym fragmencie? - Wynik: 89.25%
2024-12-15 05:48:01,405 - INFO - Pytanie: Co jest najważniejsze w tym fragmencie? - Wynik: 70.52%
2024-12-15 05:48:01,405 - INFO - PODSUMOWANIE:
2024-12-15 05:48:01,405 - INFO - • Dokument biznesowy został oceniony jako bardziej odpowiedni
2024-12-15 05:48:01,405 - INFO - • Różnica w jakości dokumentów: 7.33%
2024-12-15 05:48:01,405 - INFO - • Znaleziono 1 istotnych fragmentów
2024-12-15 05:48:01,405 - INFO - • Najwyższy wynik fragmentu: 85.14%
2024-12-15 05:48:01,405 - INFO - Analiza zakończona pomyślnie
Posłowie
W taki sposób można wykorzystać modele językowe bazujące na transformerach do oceny trafności treści do zadawanego pytania. Z pewnością jest to przydatna technika (acz nie jedyna, tak samo jak nie stanowi to wyłącznego czynnika rankingowego) w celu optymalizacji witryny pod SEO, zwłaszcza gdzie we wyszukiwanie, streszczanie i ocenianie zaangażowane są modele językowe. Warto tworzyć treści promocyjne w sposób bardziej świadomy, gdyż bardzo znikomym kosztem może to przełożyć się na niewspółmierne korzyści.
To wszystko
Będę wdzięczny za informację zwrotną o tym, czy taka formuła newslettera podoba się. W razie pytań odpisz na tego mejla — chętnie odpowiem i pomogę.
Do przeczytania
Kacper

