Podręcznik uczestnika z objaśnieniami, przykładami i ćwiczeniami do samodzielnej nauki do Modułu 3

Site: SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych
Course: Lokalne chatboty, agenci i systemy RAG z własną bazą wiedzy
Book: Podręcznik uczestnika z objaśnieniami, przykładami i ćwiczeniami do samodzielnej nauki do Modułu 3
Printed by: Gość
Date: Tuesday, 3 November 2026, 7:21 AM

1. Jak korzystać z podręcznika

Masz już przygotowane fragmenty dokumentów. Teraz chcesz odnaleźć te, które zawierają informacje potrzebne do odpowiedzi na pytanie. W Module 3 przejdziesz od tekstu przez embedding i podobieństwo wektorów do zapisanego indeksu oraz testów wyszukiwania.

O podręczniku

Autor kursu: mgr inż. Marcin Godziemba-Maliszewski. ENHANCER+, Politechnika Warszawska.

Do lektury i sześciu ćwiczeń w tej książce wystarczy zeszyt albo edytor tekstu; prosty kalkulator jest opcjonalny. Nie potrzebujesz Internetu, Pythona, prezentacji ani uruchomionego modelu. Dane potrzebne do rozwiązania zadań znajdują się w rozdziałach.

Co zrobisz w tym module

  • Wyjaśnisz, co reprezentuje embedding i czego nie można wywnioskować z pojedynczej liczby w wektorze.
  • Odróżnisz błąd przygotowania tekstu od problemu z modelem lub indeksem.
  • Obliczysz podobieństwo kosinusowe na małych wektorach i zinterpretujesz ranking.
  • Sprawdzisz powiązanie wektora z tekstem i dokumentem źródłowym.
  • Ocenisz trafienia Hit@1, Hit@3 i Hit@5 oraz osobno opiszesz pytania bez odpowiedzi.

Jak pracować offline

Czytaj rozdziały R1–R6 kolejno. Każdy zawiera objaśnienia, przykład i zadanie z pytaniem kontrolnym. Najpierw zapisz własne rozwiązanie, następnie zajrzyj do części „Odpowiedzi do ćwiczeń”. Ważniejsze od identycznych sformułowań jest uzasadnienie oparte na danych. Słownik na końcu pomaga wrócić do znaczenia terminów.

Wersję scaloną HTML lub PDF możesz wcześniej zapisać na komputerze. Książka w przeglądarce Moodle wymaga dostępu do platformy; samo określenie „offline” oznacza tutaj samowystarczalność treści i możliwość czytania pobranej wersji bez sieci.

Wspólny przykład: fikcyjny DocAssist

W książce analizujesz dokumentację fikcyjnej aplikacji DocAssist. Materiały z Modułu 2 opisują m.in. zmianę konfiguracji, dyżur operatora i parametr oczekiwania. Nazwy poleceń w cytowanych fragmentach są treścią do analizy, a nie instrukcją uruchamiania usługi na Twoim komputerze. Numer strony podręcznika nie jest numerem strony dokumentu źródłowego.

Rozdział 1 używa krótkich tekstów A–D. W rozdziale 4 poznasz sześć fragmentów D1–D6 z korpusu M3, wraz z rzeczywistymi identyfikatorami. Małe wektory i rankingi oznaczone jako dydaktyczne służą obliczeniom ręcznym. Nie są pomiarem modelu BGE-M3 ani wynikiem oceny całego systemu.

Książka i notebooki

Ścieżka Na czym pracujesz Co zachowujesz
Lektura offline Teksty, tabele i zadania z tej książki. Odpowiedzi do ćwiczeń 1–6 i własne uzasadnienia.
Notebooki M3 Pakiet Student: dane, kod, karty R1–R6 i skonfigurowane środowisko. Pliki wyników, indeks i raport testów.
Notebooki z checkpointem Zapisane wcześniej rzeczywiste embeddingi z pakietu Student. Nową próbę oznaczoną jako wykorzystującą checkpoint.

Wykonanie notebooków jest rozszerzeniem lektury. Instalacja środowiska i pobranie modelu mogą wymagać Internetu; należy je zakończyć przed pracą bez sieci. Sposób przygotowania opisuje M12_M3_instrukcja_moodle.html w pakiecie Student. Książka nie zastępuje tej instrukcji ani kart oddawanych do oceny.

Granica Modułu 3

Wyszukujesz i oceniasz fragmenty źródłowe. Nie uruchamiasz jeszcze modelu generującego odpowiedź. W Module 4 wynik wyszukiwania stanie się materiałem do budowania kontekstu.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

2. Od tekstu do reprezentacji wektorowej

Wyszukiwanie słów jest użyteczne, kiedy znasz nazwę pliku, symbol parametru lub kod błędu. Użytkownik często opisuje jednak tę samą czynność innymi słowami. Embedding pomaga porównywać teksty także wtedy, gdy nie mają identycznego brzmienia.

1. Od słów do reprezentacji liczbowej

„Uruchom ponownie usługę” i „wykonaj restart procesu” mogą opisywać podobną czynność. Proste sprawdzenie obecności słowa „restart” nie odnajdzie każdej parafrazy. Model embeddingowy przekształca tekst w uporządkowaną listę liczb, czyli wektor. Porównywanie takich wektorów pozwala szukać kandydatów podobnych do pytania.

tekst → model embeddingowy → wektor
pytanie → ten sam model → wektor pytania
wektor pytania + wektory fragmentów → ranking

Wektor nie jest streszczeniem, listą słów ani zapisem ich numerów. Poszczególne współrzędne wynikają z wyuczonych reprezentacji. Zwykle nie można powiedzieć, że konkretna współrzędna oznacza „konfigurację”, a inna „bezpieczeństwo”. Znaczenie ma cały układ wartości oraz sposób jego porównywania.

2. Jeden tekst, jeden punkt porównania

W kursie używamy modelu bge-m3:latest przez Ollama. W pakiecie M3 każdy embedding ma 1024 współrzędne. Taki wymiar nie oznacza 1024 słów ani 1024 fragmentów bazy. Długość tekstu i liczba wymiarów reprezentacji to różne wielkości. W rozdziale 3 zobaczysz wektory dwuwymiarowe wyłącznie po to, aby łatwo wykonać rachunek.

Model embeddingowy tworzy reprezentację tekstu. Model generujący tworzy kolejne tokeny odpowiedzi. Oba mogą należeć do szerszej rodziny modeli językowych, lecz pełnią inne zadania w aplikacji. Wynik embeddingu nie jest odpowiedzią dla użytkownika.

3. Podobny temat a przydatna informacja

Tekst Co może łączyć go z pytaniem Czego to nie dowodzi
Procedura restartu właściwej usługi Czynność i obiekt opisane w pytaniu. Że procedura nadal obowiązuje w używanej wersji.
Opis harmonogramu innej usługi Wspólne słowa „usługa” i „działa”. Że fragment odpowiada na pytanie o zmianę konfiguracji.
Zakaz wykonania określonej operacji Te same nazwy operacji i komponentów. Że można pominąć słowo „nie” albo warunek.

Wysoka bliskość reprezentacji nie sprawdza prawdziwości, aktualności ani uprawnień do dokumentu. Negacja, liczba, wersja i kolejność czynności mogą zmienić odpowiedź mimo dużego podobieństwa tematycznego. Dlatego zawsze wracasz do tekstu i metadanych. Wyszukiwanie po słowach może uzupełniać semantyczne, szczególnie dla dokładnych identyfikatorów; w M3 skupiamy się na wariancie wektorowym.

4. Materiał do własnej oceny

Pytanie: Jak sprawdzić, czy usługa działa po zmianie konfiguracji?

Oznaczenie Tekst do analizy
A Po zapisaniu nowych ustawień wykonaj restart procesu docassist-api, a następnie potwierdź, że jego status ma wartość active.
B Usługa wykonywania kopii zapasowych działa codziennie po zmianie harmonogramu.
C Plik konfiguracji należy przechowywać przez 30 dni.
D Przed instalacją sprawdź wymagania dotyczące pamięci operacyjnej.

A–D są oznaczeniami krótkiego ćwiczenia z pakietu M3, nie identyfikatorami chunk_id. Tekst C nie ustala reguły przechowywania konfiguracji dla rzeczywistego systemu; oceniasz jego przydatność do zadanego pytania.

Ćwiczenie 1. Porównaj słowa i znaczenie

Praca samodzielna offline

Nie używaj modelu. Zapisz hipotezę przed poznaniem jakiegokolwiek rankingu liczbowego.

  1. Wskaż tekst najbardziej przydatny i przytocz informację, która pomaga odpowiedzieć.
  2. W B i C zaznacz słowa podobne do pytania. Wyjaśnij, dlaczego nie wystarczają.
  3. Wskaż dwie pary wyrażeń będących parafrazami pytania i tekstu A.
  4. Ułóż własny ranking A–D. Dla słabszych tekstów dopuszczalny jest uzasadniony remis.
  5. Oceń zdanie: „Najwyższy wynik podobieństwa dowodzi poprawności przyszłej odpowiedzi”.
Sprawdź rozumienie

Czy potrafisz uzasadnić wybór informacją potrzebną użytkownikowi, a nie samą liczbą wspólnych wyrazów?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R1 oraz notebook M12_M3_R1_intuicja_embeddingow_start.ipynb.

W notebooku zapisujesz hipotezy_podobienstwa.json oraz wnioski.md. Jest to analiza ręczna, oznaczona jako analiza_reczna. Nie dopisuj fikcyjnych wyników modelu.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

3. Tworzenie embeddingów lokalnie

Embedding jest użyteczny dopiero wtedy, gdy wiadomo, jaki tekst reprezentuje i jak go utworzono. W tym rozdziale śledzisz przetwarzanie fragmentów, sprawdzasz błędy i projektujesz zapis pozwalający odtworzyć kolejne etapy.

1. Co przychodzi z Modułu 2

Wejściem jest knowledge_base_ready.jsonl: plik JSON Lines, w którym każdy niepusty wiersz zawiera oddzielny rekord JSON. Rdzeń rekordu stanowią chunk_id, text i metadata. Pakiet referencyjny M3 zawiera 10 zaakceptowanych fragmentów z czterech plików: instrukcja.txt, regulamin.md, docassist.pdf i pomoc.html.

Nie tworzysz embeddingu z nazwy pliku zamiast treści. Nie usuwasz metadanych po obliczeniu wektora. Do kopii rekordu dopisujesz pole embedding, zachowując identyfikator, tekst oraz informacje o dokumencie. Obecne w danych vector_index wymaga ponownego sprawdzenia przy budowie macierzy, zwłaszcza gdy odfiltrowano rekordy.

2. Wspólna konfiguracja

W pliku konfiguracja.json zapisano model bge-m3:latest, wymiar 1024 i lokalny adres Ollama. Stała EMBEDDING_MODEL pozwala używać tej samej nazwy w kolejnych wywołaniach. Funkcja create_embedding(text, model_name=EMBEDDING_MODEL) zwraca pojedynczy wektor; pytanie i fragmenty muszą być kodowane w zgodnej konfiguracji.

Sam wspólny wymiar nie dowodzi zgodności. Dwa różne modele mogą zwracać po 1024 liczby, lecz reprezentować tekst w innych przestrzeniach. Tag latest też nie jest trwałym identyfikatorem zawartości. Dlatego pakiet zapisuje model_digest, czyli identyfikator konkretnego modelu zgłoszony przez Ollama. Po zmianie modelu lub sposobu przygotowania tekstu przelicz spójny zbiór i utwórz nowy indeks.

3. Kontrole przed i po wywołaniu

  1. Sprawdź, czy rekord ma unikatowy identyfikator, niepusty tekst i potrzebne metadane.
  2. Utwórz wektor i sprawdź, czy jest jednowymiarowy, liczbowy i ma 1024 elementy.
  3. Odrzuć NaN, nieskończoność i wektor zerowy; nie nadają się do dalszych porównań kosinusowych.
  4. Zachowaj przyczynę problemu i rozlicz każdy rekord wejściowy. Nie maskuj awarii modelu sztucznym wektorem.

Brak działającej usługi jest problemem środowiska, a pusty tekst problemem danych. Wymagają innych działań. W pakiecie ustawienie truncate=False wyraża żądanie, aby zbyt długi tekst nie był automatycznie skracany. Kontrola długości, obsługa błędu i ewentualny ponowny podział tekstu powinny być jawne. Parametry stanowiska opisane w fikcyjnej dokumentacji DocAssist nie są wymaganiami sprzętowymi BGE-M3.

4. Trzy pliki wyniku R2

Plik Co przechowuje
chunks_with_embeddings.jsonl Poprawne rekordy z pełnymi wektorami i zachowanymi metadanymi.
embedding_manifest.json Model, wymiar, pochodzenie danych, liczności, datę i sumy kontrolne.
embedding_errors.jsonl Rejestr pominięć i błędów z przyczynami; może być pusty, jeśli wszystkie rekordy przeszły poprawnie.

Manifest jest opisem przebiegu, a nie kolejnym zbiorem fragmentów. Sprawdź zależność: liczba rekordów wejściowych = liczba poprawnych + pominiętych + błędnych. Rozstrzygnięcia muszą być rozłączne. Sam plik wynikowy bez opisu nie pokazuje, czy utracono część danych. Podczas filtrowania zachowaj chunk_id; numer kolejnego wiersza nie zastępuje tożsamości fragmentu.

5. Lokalny model i checkpoint

W notebookach MODE="ollama" uruchamia rzeczywiste obliczenia. MODE="checkpoint" korzysta z wcześniej zapisanych prawdziwych wektorów. W R2 taki tryb odtwarza dostarczony wynik dla zgodnego pliku wejściowego; nie jest nowym pomiarem. Dla pytań dostępny jest cache dokładnych tekstów. Nowego pytania nie można zakodować bez modelu tylko dlatego, że jest parafrazą pytania już zapisanego.

SOURCE pełni inną rolę niż MODE: w R3–R5 wybiera pochodzenie wejściowego R2, a w R6 pochodzenie indeksu R5. Może wskazywać własny wynik albo checkpoint. Wybranie checkpointu jest świadomą decyzją; błąd usługi nie powoduje cichej zmiany trybu.

Ćwiczenie 2. Rozlicz przetwarzanie

Praca samodzielna offline

Poniższy dziennik jest przykładem dydaktycznym. Przyjęty wymiar wynosi 1024.

  1. Rekord E1: poprawny tekst i 1024 skończone liczby, norma większa od zera. E2: tekst zawiera tylko spacje. E3: 768 liczb. E4: 1024 liczby, w tym NaN. E5: poprawny tekst i poprawny wektor. Nadaj każdemu jedno rozstrzygnięcie: poprawny, pominięty lub błędny.
  2. Oblicz liczności do manifestu i sprawdź ich sumę.
  3. Wyjaśnij, dlaczego uzupełnienie E3 zerami do 1024 elementów nie naprawia zgodności.
  4. Wskaż, które informacje musisz zachować, aby powtórzyć obliczenia.
  5. Zaproponuj osobne postępowanie dla E2 oraz dla przerwy w działaniu Ollama.
Sprawdź rozumienie

Czy każdy rekord ma jedno rozstrzygnięcie, a błędy pozostają widoczne?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R2 oraz notebook M12_M3_R2_embeddingi_start.ipynb.

Najpierw wykonaj notebook 00_sprawdzenie_srodowiska.ipynb. R2 zapisuje pliki w wyniki/R2/<proba_id>/. Identyfikator próby powstaje automatycznie; zachowaj także własny wniosek. Dane mogą być gotowe dla dalszych rozdziałów jeszcze przed zapisaniem analizy, ale nie oznacza to ukończenia całego zadania.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

4. Podobieństwo wektorów

Podobieństwo kosinusowe porównuje kierunki wektorów. Dzięki prostemu przykładowi zobaczysz, dlaczego sama długość wektora nie rozstrzyga rankingu i dlaczego wynik 0,82 nie jest prawdopodobieństwem poprawnej odpowiedzi.

1. Długość i kierunek

Wektor [3, 4] ma długość 5, ponieważ pierwiastek z 3² + 4² wynosi 5. Wektor [6, 8] jest dwa razy dłuższy, lecz wskazuje ten sam kierunek. Jeśli chcesz porównywać kierunki, musisz uwzględnić obie długości. Iloczyn skalarny mnoży odpowiadające sobie współrzędne i sumuje wyniki.

a · b = a_1 × b_1 + a_2 × b_2 + ... + a_D × b_D
||a|| = √(a_1² + a_2² + ... + a_D²)
cosine_similarity(a, b) = (a · b) / (||a|| × ||b||)

Wzór wymaga wektorów tego samego wymiaru oraz niezerowych norm. Dla wektora zerowego mianownik wynosi zero, więc miara nie jest określona. Nie traktuj takiego przypadku jako „braku podobieństwa”; to niepoprawne wejście, które trzeba wyjaśnić.

2. Rachunek na małych wektorach

Nie są to embeddingi tekstów ani wartości z BGE-M3. Przyjmij pytanie reprezentowane przez q = [1, 0] i cztery wektory kontrolne.

Wektor Iloczyn q · v Długość v Kosinus
A = [2, 0] 2 2 1
B = [1, 1] 1 √2 1/√2 ≈ 0,7071
C = [0, 3] 0 3 0
D = [-2, 0] -2 2 -1

Kierunki identyczne dają 1, prostopadłe 0, a przeciwne -1. Matematyczny zakres to od -1 do 1. W rzeczywistych reprezentacjach rozkład wartości zależy od modelu i danych. Nie odczytuj ujemnego wyniku jako logicznego zaprzeczenia zdania ani zera jako gwarancji braku związku między tekstami.

3. Co zmienia normalizacja L2

Normalizacja dzieli wszystkie współrzędne przez długość wektora. Z [3, 4] otrzymujesz [0.6, 0.8]; długość nowego wektora wynosi 1, a kierunek się nie zmienia. W kodzie kursu odpowiada za to normalize_vector().

v_norm = v / ||v||
Jeżeli ||a_norm|| = ||b_norm|| = 1,
to cosine_similarity(a_norm, b_norm) = a_norm · b_norm.

Pełny wzór kosinusowy już uwzględnia długości, dlatego osobna normalizacja nie jest konieczna przy każdym jego użyciu. Jest za to wygodna przed obliczaniem wielu podobieństw operacją macierzową. W rozdziale 5 znormalizujesz wiersze macierzy i wektor pytania. Nie normalizuj wektora zerowego i nie zastępuj błędu dopisaniem drobnej liczby bez wyjaśnienia.

4. Wynik liczbowy wymaga tekstu

cosine_similarity(vector_a, vector_b) zwraca jedną liczbę. Pozwala porównać pary w danej konfiguracji, ale nie wie, czy dokument jest aktualny ani czy zawiera dokładne polecenie. Score 0,82 nie oznacza 82% pewności, 82% prawdy ani 82% informacji potrzebnych do odpowiedzi.

Do interpretacji zapisz pytanie, chunk_id, tekst, metadane i wartość podobieństwa. Porównuj wynik z przewidywaniem zapisanym przed obliczeniami. Jeśli ranking jest zaskakujący, sprawdź warunki, negacje, nazwy obiektów oraz zgodność modelu. Zaokrąglaj wartości do wyświetlenia, zachowując pełną precyzję w pliku.

Ćwiczenie 3. Oblicz i zinterpretuj

Praca samodzielna offline

Użyj wyłącznie geometrii. W tej części nie musisz znać żadnego tekstu źródłowego.

  1. Dla q = [3, 4] oblicz kosinus z A = [6, 8], B = [4, -3] oraz C = [-3, -4]. Zapisz iloczyny skalarne i długości.
  2. Znormalizuj q. Wyjaśnij, czy pomnożenie A przez 10 zmieni podobieństwo kosinusowe.
  3. Oceń możliwość porównania q z [0, 0] oraz [3, 4, 0].
  4. Popraw zdanie: „Fragment o score 0,82 odpowiada poprawnie na 82% pytania”.
Sprawdź rozumienie

Czy potrafisz oddzielić błąd danych od poprawnie obliczonego, ale nieprzydatnego wyniku?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R3 oraz notebook M12_M3_R3_kosinus_start.ipynb.

Wybierz trzy rzeczywiste fragmenty i zapisz przewidywania przed porównaniem. Wyniki trafiają do podobienstwa.csv, a interpretacja do wnioski.md. Własne funkcje możesz porównać z implementacją w kod/m3_tools.py.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

5. Wyszukiwanie najbliższych fragmentów

Dla jednego pytania obliczasz podobieństwo do wszystkich fragmentów, sortujesz wyniki malejąco i wybierasz pierwsze k. Ten mechanizm zwraca kandydatów na kontekst. O ich przydatności rozstrzyga treść.

1. Miniaturowa baza do dalszych ćwiczeń

Poniżej znajduje się pełna treść sześciu wybranych fragmentów pakietu M3, wersja dokumentów 1.4. Na potrzeby książki nazywamy je D1–D6. To skróty do rachunków, nie nowe chunk_id i nie cały dziesięcioelementowy korpus. W ćwiczeniach książkowych oceniasz odpowiedzi względem tej miniaturowej bazy.

D1 · instrukcja.txt

DOC-INSTR-dd6055d675-0002

Pochodzenie: sekcja „Ponowne uruchomienie usługi”, wersja 1.4.

## Ponowne uruchomienie usługi
Po zmianie pliku /etc/docassist/config.yaml wykonaj kolejno:
1. Uruchom ponownie usługę: sudo systemctl restart docassist-api
2. Sprawdź stan: systemctl is-active docassist-api
Prawidłowy wynik: active.
Uwaga: wykonaj ponowne uruchomienie tylko po zmianie konfiguracji.
D2 · instrukcja.txt

DOC-INSTR-dd6055d675-0003

Pochodzenie: sekcja „Kopia konfiguracji”, wersja 1.4.

## Kopia konfiguracji
Przed edycją zachowaj kopię pliku konfiguracyjnego w katalogu kopii.
Nie zapisuj w zgłoszeniu haseł ani kluczy. W razie nieudanego uruchomienia
przywróć zatwierdzoną kopię i zgłoś problem administratorowi.
D3 · regulamin.md

DOC-REG-6a742ef524-0002

Pochodzenie: sekcja „Dyżur operatora”, wersja 1.4.

## Dyżur operatora
Operator przyjmuje zgłoszenia w dni robocze od 08:00 do 16:00.
Poza tymi godzinami zgłoszenie czeka do następnego dyżuru.
Wyjątek: awarię uniemożliwiającą pracę całego zespołu zgłoś dyżurnemu
administratorowi zgodnie z wewnętrzną procedurą eskalacji.
D4 · regulamin.md

DOC-REG-6a742ef524-0003

Pochodzenie: sekcja „Treść zgłoszenia”, wersja 1.4.

## Treść zgłoszenia
Podaj wersję systemu, czas zdarzenia, komunikat błędu i wykonane kroki.
Nie dołączaj danych osobowych ani sekretów. Opisz oczekiwany wynik.
Nie podajemy w tym regulaminie gwarantowanego czasu rozwiązania zgłoszenia.
D5 · docassist.pdf

DOC-PDF-7bf28bc22b-0005

Pochodzenie: strona 2, sekcja „Parametr oczekiwania”, wersja 1.4.

## Parametr oczekiwania
Parametr: timeout_seconds. Wartość zalecana w tym przykładzie: 30 s.
Zwiększ wartość dopiero po ustaleniu, że operacja trwa dłużej.
Nie traktuj tego parametru jako gwarancji czasu odpowiedzi.
D6 · docassist.pdf

DOC-PDF-51aa0fc583-0003

Pochodzenie: strona 1, sekcja „Test po zmianie konfiguracji”, wersja 1.4.

## Test po zmianie konfiguracji
Po zmianie konfiguracji sprawdź uruchomienie usługi i zapisz wynik.
Nie usuwaj łącznika w nazwie docassist-api.

Fragmenty TXT i Markdown nie otrzymują wymyślonych numerów stron. Identyfikatory i metadane pozwalają odnaleźć dokument niezależnie od miejsca fragmentu w rankingu. Jeśli w dalszym zadaniu widzisz D1, odwołuje się ono dokładnie do tekstu powyżej.

2. Budowanie rankingu

  1. Zakoduj pytanie tym samym modelem i w zgodny sposób jak fragmenty.
  2. Dla każdego rekordu oblicz kosinus i zachowaj powiązanie z chunk_id, tekstem oraz metadanymi.
  3. Uporządkuj wyniki od największego score i wybierz top_k pierwszych.
  4. Przeczytaj wynik, sprawdź źródło i oceń, czy dostarcza potrzebnej informacji.

Funkcja search_similar_chunks(query_embedding, chunks, top_k=3) realizuje wersję z pętlą. Zwraca płaskie rekordy z polami chunk_id, text, metadata i score. top_k musi być dodatnią liczbą całkowitą. Gdy w zbiorze jest mniej fragmentów niż k, można zwrócić tylko dostępne rekordy. Remisy wymagają stałej, jawnej reguły; pakiet zachowuje kolejność wejściową.

3. Ile fragmentów wybrać

Załóżmy pytanie: „Jakim poleceniem sprawdzę stan usługi po zmianie konfiguracji?”. Poniższy ranking jest dydaktyczny, przygotowany do ćwiczenia. Liczby nie pochodzą z pomiaru BGE-M3.

Pozycja Fragment Score Co rzeczywiście zawiera
1 D6 0,86 Ogólne zalecenie sprawdzenia uruchomienia; bez komendy.
2 D1 0,82 Konkretne polecenie i oczekiwany wynik.
3 D2 0,64 Zasady wykonania kopii i działania po nieudanym uruchomieniu.

Przy k = 1 otrzymasz tylko ogólny tekst. Przy k = 2 odzyskasz dokładną informację potrzebną w tym pytaniu. Dodanie D2 zwiększa objętość przyszłego kontekstu, lecz nie jest niezbędne do podania komendy. W innym pytaniu, np. o przygotowanie do edycji, D2 może być najważniejsze. Wybór k oceniaj na zestawie pytań, nie na pojedynczym trafieniu.

Pierwsze miejsce nie jest dowodem obecności odpowiedzi

Dla pytania o numer telefonu administratora ta baza nie zawiera właściwej informacji. Top-k nadal może zwrócić fragmenty dotyczące administratora. Nie zastępuj brakującego numeru informacją ze „zwycięskiego” fragmentu.

Ćwiczenie 4. Sprawdź przydatność top-k

Praca samodzielna offline

Skorzystaj z bazy D1–D6 i powyższego rankingu.

  1. Wskaż wyniki dla k = 1, 2 i 3. Dla każdego wariantu oceń możliwość podania dokładnej komendy.
  2. Wyjaśnij, dlaczego D6 może być tematycznie trafny, ale niewystarczający.
  3. Dla pytania „W jakich godzinach przyjmowane są zgłoszenia?” ustal oczekiwany fragment na podstawie źródła, bez wymyślania score.
  4. Zapisz, czego brakuje do odpowiedzi na pytanie o telefon administratora.
  5. Wymień pola, które musisz pokazać obok score, aby inna osoba mogła sprawdzić wybór.
Sprawdź rozumienie

Czy sprawdzasz przydatność względem konkretnego pytania, a nie ocenę dokumentu jako całości?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R4 oraz notebook M12_M3_R4_ranking_top_k_start.ipynb.

Porównaj kilka pytań i różne wartości k. Zachowaj ranking_results.jsonl oraz własny wniosek. Wydruk w notebooku pokazuje score, identyfikator fragmentu, dokument, źródło, lokalizację i tekst.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

6. Od listy embeddingów do lokalnego indeksu

Lista wektorów wystarcza do pierwszego eksperymentu. Indeks pozwala uporządkować dane, zapisać je i ponownie wyszukać te same fragmenty po uruchomieniu nowej sesji. Jego najważniejszą cechą jest zachowanie zgodnego powiązania liczb z tekstami.

1. Embedding, macierz i indeks

Pojęcie Rola w M3
Embedding Wektor jednego tekstu. Sam nie zawiera nazwy źródła.
Macierz Wektory wielu fragmentów ułożone w wierszach. Kształt N × D: N fragmentów, D współrzędnych.
Indeks lokalny Macierz wraz z rekordami fragmentów, metadanymi i manifestem opisującym całość.

Dla 10 fragmentów i 1024 wymiarów macierz ma kształt (10, 1024). Po normalizacji każdego wiersza i pytania podobieństwa można policzyć przez embedding_matrix @ query_norm. Otrzymujesz po jednej liczbie dla każdego wiersza. Sortowanie tych wartości dopiero wyznacza kolejność wyniku.

Obliczenie w NumPy eliminuje część narzutu pętli Pythona, lecz nadal porównuje pytanie ze wszystkimi fragmentami. Jest to wyszukiwanie dokładne. Sam zapis do pliku NPY nie tworzy struktury przybliżonego wyszukiwania ANN i nie dowodzi przyspieszenia w każdym przypadku. M3 wybiera prosty indeks ze względu na czytelność i możliwość weryfikacji.

2. Zasada mapowania

Wiersz i musi oznaczać ten sam fragment

Wiersz i w macierzy odpowiada rekordowi na pozycji i w chunks.jsonl. Ten rekord ma vector_index = i. Zgodność samej liczby wierszy nie wystarcza, jeśli wektory i teksty zostały przemieszane.

Po odrzuceniu rekordu albo zmianie kolejności odtwórz ciąg indeksów od zera. Zachowaj oryginalne chunk_id i pełne metadane. Nie sortuj samej macierzy lub samego pliku rekordów. Ranking wyników jest osobną listą odwołań i nie wymaga przestawiania bazy.

3. Trzy pliki jednego indeksu

semantic_index/
    embeddings.npy
    chunks.jsonl
    index_metadata.json
Plik Zawartość i kontrola
embeddings.npy Znormalizowana macierz float32. Kształt, skończone wartości i normy wierszy muszą zgadzać się z założeniami.
chunks.jsonl Teksty, pełne metadane i vector_index. Wektorów nie powiela się w każdym rekordzie tego pliku.
index_metadata.json Manifest: wersja schematu, index_id, model, backend, wymiar, miara, normalizacja, liczba fragmentów, typ danych, nazwy plików, pochodzenie i data.

W manifestach pakietu schema_version jest tekstem "1.0", dimension liczbą 1024, metric ma wartość "cosine", normalized to logiczne true, a data_type to "float32". chunk_count opisuje liczbę wierszy. Tekst "true" nie zastępuje logicznego true; format pliku ma znaczenie dla walidacji.

Dodatkowo zachowano model_digest i sumy SHA-256 danych. Suma kontrolna pozwala wykryć zmianę zawartości od momentu zapisu, ale nie dowodzi poprawności tekstu ani prawidłowego mapowania. embedding_manifest.json opisuje etap R2; index_metadata.json opisuje gotowy indeks R5. Nie zastępują się wzajemnie.

4. Odczyt i test po restarcie

  1. Wczytaj manifest i sprawdź wymagane pola oraz zgodność konfiguracji.
  2. Odczytaj pliki wskazane w manifeście; sprawdź sumy, kształt macierzy, typ i liczbę rekordów.
  3. Zweryfikuj unikatowość chunk_id, ciąg vector_index i powiązanie z wektorami R2.
  4. W nowym procesie wczytaj zapisany indeks i odtwórz ranking dla zapisanego wektora kontrolnego.
  5. Porównaj identyfikatory i score przed oraz po zapisie. Drobne różnice zmiennoprzecinkowe oceniaj z określoną tolerancją.

search_local_index(query_embedding, embedding_matrix, chunk_records, top_k=3) zwraca elementy score i chunk. To inny kształt niż płaski wynik search_similar_chunks() z R4. Funkcja normalize_search_results() ujednolica strukturę wyników; nie normalizuje długości wektorów. Sprawdź tę różnicę, zanim napiszesz kod odczytujący chunk_id.

Ćwiczenie 5. Wykryj uszkodzone mapowanie

Praca samodzielna offline

Dydaktyczna macierz dwuwymiarowa ma dwa wiersze: wiersz 0 = [1, 0] dla tekstu D1, wiersz 1 = [0, 1] dla D2. Dla q = [1, 0] score wynoszą 1 i 0.

  1. Po omyłkowym sortowaniu plik rekordów ma kolejność: vector_index 0 → D2, vector_index 1 → D1. Jaki tekst zostanie zwrócony jako pierwszy?
  2. Wyjaśnij, dlaczego zgodna liczba rekordów i poprawne normy nie wykryły tego błędu.
  3. Zaproponuj naprawę, korzystając z oryginalnych par tekst–wektor.
  4. W drugim przypadku manifest podaje 10 fragmentów, macierz ma 9 wierszy, a chunks.jsonl 10 rekordów. Czy można kontynuować wyszukiwanie?
  5. Opisz test po restarcie, który nie korzysta z macierzy pozostającej w pamięci poprzedniej sesji.
Sprawdź rozumienie

Czy potrafisz wykazać, że wynik wskazuje właściwy tekst, a nie tylko poprawny numerycznie wiersz?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R5 oraz notebook M12_M3_R5_zapis_indeksu_start.ipynb.

Notebook tworzy semantic_index, zapisuje kontrola_restartu.json i sprawdza odczyt w osobnym procesie. Następnie wykonaj 07_sprawdzenie_indeksu_po_restarcie.ipynb w nowym kernelu. Kontrola z zapisanym wektorem pytania nie wymaga ponownego wywołania modelu.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

7. Testowanie jakości wyszukiwania semantycznego

Ocena wyszukiwania zaczyna się od ustalenia, jaka informacja znajduje się w bazie. Oczekiwane trafienie wynika ze źródeł, a nie z wyniku modelu. Dopiero po zapisaniu tego oczekiwania uruchamiasz pomiar.

1. Przygotuj klucz przed rankingiem

Przypadek testowy opisuje pytanie oraz oczekiwane fragmenty. W plikach pakietu M3 identyfikator nazywa się question_id, a lista dopuszczalnych trafień expected_chunk_ids. question_type opisuje formę, np. direct, paraphrase lub ambiguous. case_type opisuje obecność odpowiedzi i zakres zadania.

case_type Znaczenie Ocena w M3
answerable Baza zawiera potrzebną informację. Hit@k oraz analiza treści.
missing_in_sources Pytanie mieści się w zakresie, lecz informacji nie ma w bazie. Ocena opisowa; Hit@k = null.
out_of_scope Pytanie wykracza poza zakres asystenta. Ocena opisowa; Hit@k = null.

Pytanie wieloznaczne może mieć odpowiedź przy ustalonej interpretacji. Zapisz tę interpretację w uzasadnieniu albo doprecyzuj pytanie przed pomiarem. Lista kilku expected_chunk_ids w przyjętej mierze oznacza, że wystarczy dowolny z nich. Jeżeli odpowiedź wymaga łącznie dwóch fragmentów, zwykłe Hit@k nie mierzy kompletności tego zestawu; potrzebujesz dodatkowej oceny pokrycia.

2. Hit@1, Hit@3 i Hit@5

Dla pojedynczego przypadku z odpowiedzią Hit@k wynosi 1, jeśli co najmniej jeden oczekiwany identyfikator znajduje się w pierwszych k wynikach. W przeciwnym razie wynosi 0. Pozycje rankingu liczysz od 1. Oczekiwany fragment na pozycji 2 daje Hit@1 = 0, a Hit@3 i Hit@5 = 1.

Hit@k pytania = 1, gdy top-k zawiera dopuszczalny chunk_id;
                0, gdy go nie zawiera.

Średni Hit@k = suma trafień / liczba pytań answerable.

Pytania bez odpowiedzi nie są automatycznie nieudanymi trafieniami i nie wchodzą do tego mianownika. Zapis null oznacza „nie dotyczy”, nie zero. Gdy cały zestaw nie ma przypadków answerable, średnia jest nieokreślona, a nie równa 0 lub 100%. Dla tego samego rankingu i klucza Hit@1 ≤ Hit@3 ≤ Hit@5.

3. Zestaw do ćwiczenia

Wróć do miniaturowej bazy D1–D6 z rozdziału 4. Każde poniższe pytanie oceniaj wyłącznie względem tej bazy. Najpierw ustal typ przypadku i oczekiwany fragment, następnie skorzystaj z tabeli pozycji.

ID Pytanie i ewentualna interpretacja Forma
B01 Jakim poleceniem sprawdzę stan usługi po zmianie konfiguracji? direct
B02 Zmieniłem ustawienia. Jak potwierdzić, że proces działa? paraphrase
B03 Co zachować przed edycją pliku konfiguracyjnego? direct
B04 Kiedy w dzień roboczy mogę liczyć na przyjęcie zgłoszenia? paraphrase
B05 Co zapisać? Przyjęta interpretacja: jakie informacje podać w zgłoszeniu problemu. ambiguous
B06 Jak nazywa się parametr oczekiwania i jaka jest zalecana wartość w przykładzie? direct
B07 Jaki jest numer telefonu administratora DocAssist? direct
B08 Jak upiec chleb na zakwasie? direct
Dydaktyczne wyniki do obliczeń

Dla pytań B01–B06 pozycje fragmentów zawierających odpowiedź wynoszą odpowiednio 2, 1, 4, 6, 3, 1. Dla B07 i B08 wyszukiwarka również zwróciła sześć sąsiadów, ale żaden nie zawiera odpowiedzi. To przygotowany scenariusz, nie wyniki pilotażu Ollama.

4. Diagnoza przed zmianą modelu

  • Czy informacja w ogóle występuje w źródle? Jeżeli nie, większe k jej nie stworzy.
  • Czy po odczycie i podziale tekst zachował warunek, komendę i wynik? W razie braku wróć do przygotowania danych.
  • Czy indeks odpowiada aktualnym fragmentom i zgodnemu modelowi? Sprawdź manifest oraz mapowanie.
  • Czy właściwy fragment istnieje, lecz znajduje się za nisko? Przeanalizuj pytanie, sąsiednie wyniki i ustawienie k.

Większe k może poprawić Hit@k i jednocześnie dodać niepotrzebny tekst. Wysoka wartość tej miary nie gwarantuje poprawnej przyszłej odpowiedzi. Stały próg score również wymaga oceny na danych, szczególnie na pytaniach bez odpowiedzi. Nie ma uniwersalnej wartości, od której fragment staje się prawdziwy.

Ćwiczenie 6. Oblicz wyniki i zaplanuj poprawę

Praca samodzielna offline

Utwórz tabelę B01–B08 z typem przypadku, oczekiwanym fragmentem, pozycją oraz Hit@1, Hit@3 i Hit@5.

  1. Ustal oczekiwania na podstawie D1–D6. Wskaż założenie wymagane przy B05.
  2. Policz metryki dla każdego pytania i średnie dla właściwej grupy.
  3. Wyjaśnij, dlaczego B07 i B08 wymagają dwóch różnych oznaczeń, mimo że oba nie mają odpowiedzi.
  4. Wskaż pytanie, dla którego zmiana k z 3 na 5 pomaga, oraz takie, dla którego nadal nie wystarcza.
  5. Zaproponuj jedną kontrolowaną zmianę i sposób jej sprawdzenia na tym samym zestawie. Nie dopasowuj klucza do rankingu.
Sprawdź rozumienie

Czy w raporcie podajesz liczność grupy, ograniczenia testu i konkretne obserwacje, zamiast samego procentu?

Przejście do pakietu ćwiczeniowego

Jeżeli pracujesz również na komputerze, wykorzystaj kartę R6 oraz notebook M12_M3_R6_test_retrieval_start.ipynb.

Właściwe ćwiczenie komputerowe używa dane/test_cases_szablon.jsonl: minimum ośmiu pytań, w tym dwóch parafraz, pytania niejednoznacznego i obu typów braku odpowiedzi. Zapisujesz test_cases.jsonl, retrieval_baseline.jsonl, metryki.json i raport_testow.md. Zadania B01–B08 w tej książce są osobnym zestawem do nauki; nie stanowią klucza do notebooka.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

8. Podsumowanie Modułu 3

Rezultatem Modułu 3 jest wyszukiwanie, którego działanie można sprawdzić i odtworzyć. Poprawna macierz to początek kontroli. Potrzebujesz jeszcze zgodnych źródeł, rankingu, niezależnego klucza i raportu pokazującego ograniczenia.

Mapa procesu

  1. R1: przewidujesz przydatność tekstów i rozpoznajesz parafrazy.
  2. R2: tworzysz embeddingi, zachowujesz pochodzenie i rozliczasz błędy.
  3. R3: porównujesz wektory, sprawdzasz geometrię i interpretujesz score.
  4. R4: tworzysz ranking top-k oraz wracasz do treści źródeł.
  5. R5: zapisujesz macierz, rekordy i manifest jako jeden spójny indeks.
  6. R6: testujesz wyszukiwanie i planujesz poprawę na podstawie konkretnych przypadków.

Nazwy, które łączą rozdziały

Element Znaczenie
create_embedding() Reprezentacja tekstu w zgodnym modelu.
cosine_similarity() Podobieństwo dwóch niezerowych wektorów tego samego wymiaru.
search_similar_chunks() Ranking na liście rekordów z embeddingami.
search_local_index() Ranking z macierzy i powiązanych rekordów.
normalize_search_results() Ujednolicenie kształtu obu wyników; bez zmiany znaczenia score.
knowledge_base_ready.jsonl Wejście z M2: teksty i metadane.
chunks_with_embeddings.jsonl Wynik R2: te same dane rozszerzone o embeddingi.
semantic_index/ Trzy pliki wyniku R5, przekazywane razem.
retrieval_baseline.jsonl Zapis pierwszego pomiaru retrieval do późniejszych porównań.

Co zachować po pracy w książce

Zachowaj uzasadnienie rankingu A–D, dziennik rozstrzygnięć E1–E5, obliczenia kosinusa, ocenę top-k, diagnozę mapowania i tabelę B01–B08. Te notatki pokazują, czy potrafisz sprawdzić mechanizm bez polegania na gotowym wyniku programu.

Co zachować po pracy w notebookach

Zachowaj uzupełnione notebooki i wskazane foldery prób. Nowa próba ma oddzielny <proba_id>, więc porównania nie wymagają nadpisywania poprzednich wyników. wybrane_proby.json wskazuje ostatnio opublikowane wyniki używane jako wejście następnych etapów. Jeśli chcesz wrócić do konkretnej wcześniejszej próby, wybierz ją świadomie zgodnie z instrukcją pakietu.

  • Do M4 przekaż cały semantic_index wybranej próby R5 oraz raport i wyniki R6.
  • Wskaż model, jego digest, wersję danych, źródło checkpointu lub własnego pomiaru oraz datę.
  • Nie zastępuj index_metadata.json manifestem embeddingów. Nie przekazuj samego pliku embeddings.npy.
  • Nie przedstawiaj trybu checkpoint jako nowego wywołania modelu ani rankingu dydaktycznego jako pomiaru.

Lista kontrolna przed kolejnym modułem

  • Każdy wektor ma jednoznaczne powiązanie z tekstem i metadanymi.
  • Indeks wczytuje się w nowej sesji i odtwarza ranking kontrolny.
  • Oczekiwania do testu pochodzą ze źródeł i zostały zapisane przed pomiarem.
  • Pytania bez odpowiedzi mają osobną ocenę, a mianownik Hit@k jest jawny.
  • Raport wskazuje konkretne błędy, ograniczenia i kolejną zmianę do sprawdzenia.
Gotowość do M4

Nie przyjmuj automatycznego progu zaliczenia tylko dlatego, że przykład osiąga określony procent. Kryteria ustal przed testem dla swojego zadania. Wysokie Hit@k na małym zestawie nie gwarantuje dobrych odpowiedzi na nowe pytania.

Podstawa treści i lektury uzupełniające

Podręcznik odpowiada zakresowi M12-M3-v4.pptx oraz nazwom w gotowym pakiecie ćwiczeniowym M3 z 19.09.2026. Baza D1–D6 jest wyborem z knowledge_base_ready.jsonl. Wszystkie przykłady liczbowe przygotowane do obliczeń ręcznych są oznaczone jako dydaktyczne. Pochodzenie rzeczywistych checkpointów opisują manifesty pakietu.

Poniższe źródła są opcjonalne; do wykonania ćwiczeń nie musisz ich otwierać.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

9. Odpowiedzi do ćwiczeń

Porównaj tok rozumowania i dane, nie tylko końcową liczbę. Jeżeli Twój wniosek jest inny, wróć do fragmentu, który ma go uzasadniać. Odpowiedzi dotyczą sześciu zadań w tej książce, a nie pełnego klucza do notebooków.

Ćwiczenie 1. Słowa i znaczenie

Najbardziej przydatny jest A: wiąże zmianę ustawień z restartem właściwego procesu i potwierdzeniem statusu active. „Nowe ustawienia” odpowiadają zmianie konfiguracji, „potwierdź status active” odpowiada sprawdzeniu, czy usługa działa. „Restart” jest parafrazą ponownego uruchomienia.

B ma wspólne słowa „usługa”, „działa” i „zmiana”, lecz dotyczy harmonogramu kopii. C wspomina konfigurację, ale mówi o przechowywaniu pliku. D dotyczy etapu instalacji. A powinno być pierwsze; kolejność słabszych B, C i D nie jest jednoznacznym pomiarem semantycznym. Możesz np. uznać B i C za podobnie nieprzydatne. Nie twórz pozornej precyzji przez przypisywanie im wymyślonych score.

Najwyższy wynik podobieństwa oznacza pierwsze miejsce w danym rankingu. Nie dowodzi prawdziwości dokumentu ani poprawności przyszłej odpowiedzi. W przykładzie A jest uzasadnionym wyborem na podstawie treści, a nie dlatego, że model nadał mu liczbę.

Ćwiczenie 2. Przetwarzanie i błędy

Rekord Rozstrzygnięcie Uzasadnienie
E1 Poprawny Prawidłowy wymiar, skończone wartości i niezerowa norma.
E2 Pominięty Brak treści po usunięciu odstępów; trzeba sprawdzić źródło i odczyt.
E3 Błędny Niezgodny wymiar. Dopisanie zer nie odtwarza brakujących cech modelu.
E4 Błędny NaN uniemożliwia poprawne porównania.
E5 Poprawny Przechodzi wymagane kontrole.

Liczności: 5 = 2 poprawne + 1 pominięty + 2 błędne. Zachowaj tekst i chunk_id, metadane, model i digest, wymiar, datę, pochodzenie wejścia i jego sumę kontrolną oraz opis problemów. E2 wymaga korekty danych; awaria Ollama wymaga sprawdzenia środowiska i wznowienia nowej próby. Nie usuwaj jej śladu ani nie twórz losowego wektora.

Ten dziennik jest zadaniem o klasyfikacji. W działającym pakiecie błędy systemowe mogą przerwać przebieg zamiast pozwolić kontynuować zapis. Jest to właściwe zachowanie: nie należy ogłaszać kompletnego wyniku, jeśli usługa przestała działać.

Ćwiczenie 3. Rachunek kosinusa

Para Iloczyn skalarny Normy Kosinus
q, A 3×6 + 4×8 = 50 5 i 10 1
q, B 3×4 + 4×(-3) = 0 5 i 5 0
q, C 3×(-3) + 4×(-4) = -25 5 i 5 -1

Znormalizowane q to [0.6, 0.8]. Pomnożenie A przez dodatnie 10 zmienia długość, lecz nie kierunek, więc kosinus pozostaje 1. Z wektorem [0, 0] miara nie jest określona. [3, 4, 0] ma inny wymiar, więc porównanie również wymaga odrzucenia wejścia, a nie zgadywania.

Poprawne zdanie: „Dla tej pary i tej konfiguracji podobieństwo kosinusowe wynosi 0,82; o przydatności fragmentu rozstrzygamy po przeczytaniu treści”. Nie ma tutaj interpretacji procentowej dotyczącej prawdziwości.

Ćwiczenie 4. Ranking i treść

Dla k = 1 dostajesz D6, dla k = 2 D6 i D1, a dla k = 3 również D2. Dokładna komenda systemctl is-active docassist-api znajduje się w D1, więc dopiero warianty k = 2 i k = 3 obejmują potrzebny fragment. D6 mówi o sprawdzeniu uruchomienia, ale nie podaje polecenia. D2 dotyczy kopii i nie uzupełnia komendy sprawdzającej.

Dla godzin przyjmowania zgłoszeń wybierasz D3: dni robocze 08:00–16:00, wraz z opisem działania poza godzinami i wyjątkiem. Telefonu administratora w D1–D6 nie ma. Wynik dotyczący administratora nie daje prawa do wymyślenia numeru.

Obok score pokaż chunk_id, tekst i metadane, co najmniej nazwę pliku, identyfikator dokumentu, wersję oraz stronę albo sekcję, jeżeli występuje. Miejsce w rankingu nie zastępuje identyfikatora fragmentu.

Ćwiczenie 5. Spójność indeksu

Najwyższy score wskazuje wiersz 0, ale po błędnym sortowaniu rekord 0 opisuje D2. System zwróci więc niewłaściwy tekst z poprawnie obliczoną liczbą 1. Liczności, typ macierzy i normy mogą być prawidłowe mimo zerwania powiązania.

Naprawa polega na odbudowaniu par z oryginalnego R2: wektor D1 z rekordem D1 i wektor D2 z rekordem D2. Dopiero potem nadaj vector_index zgodny z kolejnością wierszy. Samo przepisanie indeksów na 0 i 1 bez sprawdzenia par nie naprawia błędu. Jeżeli oryginalnego powiązania nie da się wiarygodnie odtworzyć, przelicz indeks ze znanych danych.

Przy 9 wierszach macierzy i 10 rekordach zatrzymaj odczyt: nie wybieraj arbitralnie, który rekord pominąć. Test restartu uruchom w nowym procesie lub kernelu. Wczytaj trzy pliki, zweryfikuj je i użyj zapisanego wektora pytania kontrolnego. Porównaj identyfikatory oraz wartości score z wynikiem przed zapisem. Takie sprawdzenie bada odtwarzalność zapisu; samo nie dowodzi merytorycznej trafności indeksu.

Ćwiczenie 6. Klucz i metryki

ID Typ i oczekiwany fragment Pozycja Hit@1 Hit@3 Hit@5
B01 answerable; D1 2 0 1 1
B02 answerable; D1 1 1 1 1
B03 answerable; D2 4 0 0 1
B04 answerable; D3 6 0 0 0
B05 answerable; D4, po przyjęciu opisanej interpretacji 3 0 1 1
B06 answerable; D5 1 1 1 1
B07 missing_in_sources; brak — null null null
B08 out_of_scope; brak — null null null

Średnie dla sześciu przypadków answerable: Hit@1 = 2/6 ≈ 33,3%; Hit@3 = 4/6 ≈ 66,7%; Hit@5 = 5/6 ≈ 83,3%. B07 jest pytaniem z zakresu obsługi DocAssist, lecz brakuje danych kontaktowych. B08 dotyczy zupełnie innej dziedziny. Obu nie dodajesz do mianownika i nie zamieniasz null na 0.

B05 bez doprecyzowania mogłoby odnosić się do kopii pliku, wyniku testu albo zgłoszenia. Przyjęta interpretacja ustala D4 jako oczekiwany fragment; nie zmieniaj jej po zobaczeniu rankingu. B03 zyskuje przy przejściu z k = 3 do 5. B04 nadal nie mieści się w top-5, mimo obecności właściwej informacji w bazie.

Przykładowy plan: zbadać, dlaczego D3 jest dopiero szósty dla B04. Najpierw sprawdzić treść i mapowanie, potem porównać jedną zmianę reprezentacji lub przygotowania fragmentu na niezmienionym zestawie. Zachować pierwszy raport. Samo podniesienie k do 6 w tej miniaturze obejmuje całą bazę i podnosi trafienia, ale znosi selekcję; nie jest automatycznie dobrym rozwiązaniem dla przyszłego kontekstu.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline

10. Słownik pojęć

Pojęcia w znaczeniu przyjętym w Module 3. Przy analizie wyniku zawsze ustal, czy mówisz o treści, reprezentacji liczbowej, pliku czy ocenie jakości.

Tekst i reprezentacja

Pojęcie Znaczenie
Fragment / chunk Jednostka tekstu wybierana podczas wyszukiwania; zachowuje identyfikator i metadane.
Embedding Liczbowa reprezentacja tekstu utworzona przez model embeddingowy.
Wektor Uporządkowana lista współrzędnych. W pakiecie BGE-M3 ma ich 1024.
Wymiar D Liczba współrzędnych wektora; nie liczba słów ani dokumentów.
Model embeddingowy Model przekształcający tekst w reprezentację do porównań.
Model generujący Model tworzący tekst odpowiedzi. Nie jest uruchamiany w ćwiczeniach M3.
Digest modelu Identyfikator konkretnej zawartości modelu; dokładniejszy ślad niż sam zmienny tag.
Parafraza Inne sformułowanie zachowujące istotne znaczenie wypowiedzi.

Porównanie i wyszukiwanie

Pojęcie Znaczenie
Norma L2 Długość wektora: pierwiastek z sumy kwadratów współrzędnych.
Iloczyn skalarny Suma iloczynów odpowiadających sobie współrzędnych.
Podobieństwo kosinusowe Iloczyn skalarny podzielony przez iloczyn długości niezerowych wektorów.
Normalizacja wektora Przeskalowanie do długości 1, bez zmiany kierunku.
Score Wartość miary podobieństwa dla konkretnej pary; nie procent pewności odpowiedzi.
Ranking Lista wyników uporządkowana według miary i przyjętej reguły remisów.
Top-k / top_k Pierwsze k pozycji rankingu / nazwa parametru w kodzie.
Retrieval Wyszukiwanie fragmentów przydatnych do odpowiedzi; etap odrębny od generowania.
Wyszukiwanie dokładne Porównanie pytania ze wszystkimi wektorami i wybór najlepszych według ustalonej miary.
ANN Przybliżone wyszukiwanie sąsiadów. Nie jest tym samym co obliczenie pełnego rankingu w macierzy NumPy.

Zapis i odtwarzalność

Pojęcie Znaczenie
Macierz N × D Wiersze reprezentują N fragmentów, kolumny D współrzędnych.
Indeks lokalny Macierz, rekordy źródłowe i opis ich konfiguracji zapisane jako spójny zestaw.
chunk_id Identyfikator fragmentu niezależny od bieżącej pozycji w rankingu.
vector_index Numer wiersza macierzy odpowiadający danemu rekordowi; w M3 liczony od 0.
Manifest Plik opisujący zawartość, konfigurację, pochodzenie i kontrolę spójności wyniku.
JSONL Format, w którym każdy niepusty wiersz jest osobnym obiektem JSON.
float32 32-bitowy typ zmiennoprzecinkowy używany do zapisu macierzy indeksu M3.
Checkpoint Zapisany stan umożliwiający kontynuację lub odtworzenie etapu. Nie oznacza nowego pomiaru.
SHA-256 Skrót zawartości używany do wykrywania zmian; nie jest oceną prawdziwości danych.
Baseline Pierwszy zachowany pomiar stanowiący punkt odniesienia dla zmian.

Ocena jakości

Pojęcie Znaczenie
question_type Forma pytania: np. bezpośrednie, parafraza lub niejednoznaczne.
case_type Rodzaj przypadku: answerable, missing_in_sources albo out_of_scope.
expected_chunk_ids Dopuszczalne trafienia ustalone przed pomiarem na podstawie źródeł.
Hit@k Informacja, czy dowolny oczekiwany fragment jest w top-k; średnia w M3 obejmuje tylko answerable.
null Brak wartości lub „nie dotyczy” w JSON; nie to samo co liczba zero.
Przydatność fragmentu Obecność informacji rzeczywiście potrzebnej do odpowiedzi na konkretne pytanie.
ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej nauki offline