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.
- Popraw każde z tych pól. Nie wymyślaj danych, których nie podano.
- Wyjaśnij, gdzie powinna trafić ocena jakości i dlaczego nie można nadać jej wyłącznie na podstawie nazwy źródła.
- W zbiorze D, E, F indeksy wynoszą 0, 1, 2. Po odrzuceniu D wypisz identyfikatory i indeksy E oraz F w zbiorze gotowym.
- Wyjaśnij, co oznacza
access_level: internali 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