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

6. Metadane i identyfikacja źródeł

Metadane opisują pochodzenie i stan fragmentu. Dzięki nim można odszukać źródło, rozróżnić wersje, sprawdzić lokalizację oraz wyjaśnić decyzję o dopuszczeniu. Poprawny tekst bez metadanych utrudnia weryfikację, a kompletne metadane nie zamieniają błędnego tekstu w wiarygodną wiedzę.

1. Cztery pola rekordu końcowego

W materiałach M2 rekord końcowy ma pola vector_index, chunk_id, text i metadata. Nazwa vector_index przygotowuje spójny format na kolejne etapy kursu; w Module 2 nie oznacza jeszcze utworzonego wektora. To liczba porządkowa w zapisanym zbiorze.

Pole Znaczenie Czego z nim nie mylić
vector_index Kolejność w danym zbiorze, od 0 Trwały identyfikator źródła
chunk_id Jednoznaczny identyfikator fragmentu Pozycja po filtrowaniu
text Treść fragmentu do dalszej pracy Surowy dokument lub opis oceny
metadata Pochodzenie, lokalizacja, parametry i ocena Automatyczna gwarancja poprawności

document_id identyfikuje dokument w przyjętym rejestrze, a record_id rekord powstały przy odczycie, np. stronę PDF. chunk_index opisuje lokalną kolejność fragmentów według zastosowanego procesu. Dokładny sposób nadawania identyfikatorów trzeba stosować konsekwentnie i zapisywać. W naszym przykładzie aktualny i archiwalny regulamin mają różne identyfikatory dokumentu; nie łączymy ich po samym tytule.

2. Co opisuje dokument, a co fragment

Metadane dokumentu obejmują m.in. nazwę pliku (source), tytuł, typ, wersję, status i ścieżkę. Metadane fragmentu wskazują sekcję, stronę, zakres znaków i parametry podziału. Później dochodzi ocena jakości qa_status.

Wersja 1.4 oznacza tu wersję dokumentu, nie wersję modelu językowego. status: active mówi o obowiązywaniu dokumentu, a qa_status: accepted o przyjęciu konkretnego fragmentu po kontroli. Dokument aktywny może dać fragment odrzucony, np. złożony wyłącznie ze stopki. Oba pola odpowiadają na różne pytania.

3. Strony i zakresy znaków bez zgadywania

Dla PDF w naszym zestawie page_start i page_end są rzeczywistymi numerami stron. Jeżeli fragment pochodzi z jednej strony, oba mają tę samą wartość. Pole page_number pozostaje zgodne z page_start. Dla TXT, MD i HTML wszystkie te pola mają wartość null. Wersja drukowana strony internetowej nie uprawnia do przypisywania jej numeracji oryginalnemu HTML.

start_char i end_char odnoszą się do tekstu oczyszczonego danego rekordu, a nie do bajtów pliku PDF. Stosujemy przedział od początku włącznie do końca wyłącznie. Przykładowo tekst „Dyżur” ma pięć znaków, więc zajmuje zakres [0, 5) w rekordzie zawierającym tylko to słowo. Po zmianie czyszczenia stare zakresy mogą przestać wskazywać właściwą treść i trzeba je wyznaczyć ponownie.

Nieznane daty pozostają null. To poprawna, jawna informacja o braku danych, a nie zachęta do wpisania daty dzisiejszej. W Pythonie odpowiednikiem null jest None. Tekst "null" w cudzysłowie jest zwykłym napisem i nie oznacza braku wartości.

4. Przykład schematu

Poniższy skrócony rekord służy objaśnieniu pól. Pokazuje pięcioznakowy tekst „Dyżur”, więc sam nie jest dobrym fragmentem wiedzy i ma ocenę review. To przykład dydaktyczny, nie rekord skopiowany z gotowej bazy.

{
  "vector_index": 0,
  "chunk_id": "PRZYKLAD-REG-001",
  "text": "Dyżur",
  "metadata": {
    "document_id": "DOC-REG",
    "record_id": "PRZYKLAD-REG-REKORD",
    "source": "regulamin.md",
    "title": "Regulamin wsparcia DocAssist",
    "document_type": "regulamin",
    "version": "1.4",
    "status": "active",
    "updated_at": null,
    "valid_from": null,
    "valid_to": null,
    "access_level": "internal",
    "path": "dane/zrodla/regulamin.md",
    "section": "Dyżur operatora",
    "page_number": null,
    "page_start": null,
    "page_end": null,
    "chunk_index": 0,
    "start_char": 0,
    "end_char": 5,
    "chunking_strategy": "sections",
    "chunk_size": 900,
    "overlap": 150,
    "qa_status": "review"
  }
}

W zapisie końcowym używamy section. Jeżeli etap pośredni nazwał nagłówek section_title, należy go świadomie odwzorować do wspólnego schematu. Pozostawienie dwóch różnie wypełnionych pól rodzi niejasność, z którego powinny korzystać następne narzędzia.

5. Identyfikatory podczas filtrowania

Załóżmy, że zbiór zawiera fragmenty A, B i C o indeksach 0, 1 i 2. Fragment B zostaje odrzucony. W pliku dopuszczonym do dalszej pracy A ma indeks 0, a C indeks 1. Identyfikatory chunk_id A i C pozostają bez zmian. Dzięki temu raport oceny nadal wskazuje ten sam fragment, mimo zmiany jego miejsca w zbiorze.

To zasada dla filtrowania istniejących fragmentów. Po ponownym czyszczeniu lub podziale należy na nowo ustalić powiązania i przeprowadzić kontrolę; nie zakładaj, że stare identyfikatory, zakresy i oceny pasują do zmienionego tekstu.

6. Ćwiczenie 5 — napraw metadane

Rozważ celowo błędny opis: fragment pochodzi z regulamin.md 1.4, ale ma source: docassist.pdf, page_number: 7, page_start: null, version: 1.3, updated_at: dzisiaj i status: accepted. Tytuł sekcji zapisano tylko w section_title. Nie znamy daty aktualizacji.

  1. Popraw każde z tych pól. Nie wymyślaj danych, których nie podano.
  2. Wyjaśnij, gdzie powinna trafić ocena jakości i dlaczego nie można nadać jej wyłącznie na podstawie nazwy źródła.
  3. W zbiorze D, E, F indeksy wynoszą 0, 1, 2. Po odrzuceniu D wypisz identyfikatory i indeksy E oraz F w zbiorze gotowym.
  4. Wyjaśnij, co oznacza access_level: internal i czego samo to pole nie zapewnia.

Wynik: lista poprawek z uzasadnieniem i poprawna kolejność po filtrowaniu.

Sprawdź rozumienie

Czy active i accepted mogą opisywać różne aspekty tego samego rekordu? Co pozwala odnaleźć stronę źródła, a co pozycję w tekście oczyszczonym? Dlaczego wartość null bywa bardziej wiarygodna niż pozornie kompletna data?

Przejście do praktyki: R5 zapisuje fragments_with_metadata.json i kontrola_metadanych.json. R6 wykorzysta je do walidacji i ręcznej oceny.

Przygotowanie dokumentów i bazy wiedzy
ENHANCER+ · Politechnika Warszawska · materiał do samodzielnej nauki offline