Skip to content

pjaskulski/gpt_historical_text

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GPT3/GPT4 - Large Language Model as a tool for extracting knowledge from text - tests on excerpts from historical publications

(GPT3/GPT4 - Large Language Model jako narzędzie do wydobywania wiedzy z tekstu - testy na fragmentach publikacji historycznych)

English version: link

Testy modeli GPT-3 i GPT-4 udostępnionych przez API OpenAI przeprowadzane na fragmentach publikacji i opracowań historycznych w celu automatycznej ekstrakcji informacji, wyciągania ustrukturyzowanych danych ze źródeł dostępnych w formie nieustrukturyzowanej. Testowany materiał to głównie fragmenty biografii postaci historycznych.

Notatki

Przykłady

Notatki

Wstępne informacje

Definicja GPT-3 (napisana przez ChatGPT): "GPT-3 (Generative Pretrained Transformer 3) jest trzecią wersją sztucznej inteligencji opracowaną przez OpenAI. Jest to jeden z największych modeli językowych na świecie, który został wytrenowany na ogromnych zbiorach danych tekstowych, aby rozumieć i generować język ludzki. GPT-3 jest używany do wielu zastosowań, takich jak generowanie tekstu, tłumaczenie, odpowiadanie na pytania i rozumienie tekstu. Model ten wykorzystuje architekturę Transformer i jest w stanie uczyć się zadanie z niewielką ilością danych, co czyni go bardzo efektywnym i elastycznym narzędziem dla różnych zastosowań."

Testy GPT-3 zostały przeprowadzone poprzez API udostępnione przez firmę OpenAI, wykorzystano głównie model text-davinci-003.

Istnieją ograniczenia podczas korzystania z API dotyczące liczby zapytań na minutę (3 tys.) i liczby przetworzonych tokenów na minutę (250 tys.).

Token jest rozumiany trochę inaczej niż zwykle w NLP, tu dłuższe wyrazy są rozbijane na krótkie tokeny 3-4 znaki, oprócz tego tokenem są też znaki interpunkcyjne itp. Podawane jest że średnio token to 4 znaki w języku angielskim, na stronie OpenAI jest narzędzie w którym (https://beta.openai.com/tokenizer) można wkleić tekst i zobaczyć ile zawiera tokenów.

Przykładowo biografia Edwarda Józefa Sedlaczka (Polski Słownik Biograficzny t. XXXVI, 1995-6, s. 137-138) zawiera 4433 znaków co przekłada się na 2291 tokenów. W przypadku tekstów polskich sytuację pogarszają polskie znaki, wygląda na to że każdy dwubajtowy unicodowy znak jest traktowany jako osobny token.

Literatura

  • "Structured information extraction from complex scientific text with fine-tuned large language models" (Alexander Dunn, John Dagdelen, Nicholas Walker, Sanghoon Lee, Andrew S. Rosen, Gerbrand Ceder, Kristin Persson and Anubhav Jain) link

  • "Text Pattern Extraction: Comparing GPT-3 & Human-in-the-Loop Tool" (Maeda Hanafi) link

  • "Getting tabular data from unstructured text with GPT-3: an ongoing experiment" (ROBERTO ROCHA) link

  • "Advanced NER With GPT-3 and GPT-J" (Maxime Cupani) link

  • "Relationship Extraction with GPT-3. Accelerate knowledge graph construction with GPT-3" (Sixing Huang) link

  • "Language Models are Few-Shot Learners" (Tom B. Brown et al.) link

  • "Training language models to follow instructions with human feedback" (Long Ouyang et al., OpenAI) link

Porównanie dostępnych modeli GPT

Najlepszy model text-davinci-003 (to jednocześnie najdroższy model językowy w OpenAI) ma ograniczenie do 4000 tokenów, przy czym dotyczy to wejścia i wyjścia razem.

Modele słabsze np. text-curie-001 czy text-babbage-001 dają w przypadku wyciągania danych z przekazanego tekstu wyraźnie gorsze wyniki np.:

Funkcje/urzędy z biografii Edwarda Sedlaczka wg. text-davinci-003 (przy standardowych ustawieniach parametrów, np. temperature = 0.5):

  1. Kierownik literacki dwutygodnika lwowskiego „Przyjaciel Domowy” (1 VI 1882)
  2. Kancelista w konsulacie austriackim w Warszawie (1886)
  3. Konsulat austriacki w Kijowie (do 1895)
  4. Wicekonsulat w Batumi, Rosja (1896–7)
  5. Agencja konsularna w Nowosielicy, Rosja
  6. Agencja konsularna w Burgas, Bułgaria
  7. Wicekonsulat w Batumi, Rosja
  8. Wicekonsulat Burgas, Bułgaria
  9. Wicekonsulat Ploieşti, Rumunia
  10. Redaktor serii Wydawnictwa Towarzystwa imienia Piotra Skargi (ok 1910).

Funkcje/urzędy wg modelu text-curie-001 (parametry jak wyżej):

  • literat
  • urzędnik
  • kierownik literacki dwutygodnika lwowskiego „Przyjaciel Domowy”
  • posada kancelisty w konsulacie austriackim w Warszawie
  • kierował kolejno wicekonsulatem w Batumi (Rosja, 1896–7), a od r.n. – agencją konsularną w Nowosielicy (Rosja), agencją konsularną w Burgas (Bułgaria), wicekonsulatem w Batumi, wicekonsulatem w Burgas i wicekonsulatem w Ploieşti (Rumunia)

Te słabsze modele, mają też większe ograniczenia: do 2 tys. tokenów w jednym zapytaniu, są jednak znacznie tańsze.

Uwagi techniczne

Parametr temperature ma wartość 0.0 - 1.0, niższa wartość powoduje że odpowiedź jest bardziej konkretna, deterministyczna, mniej losowa i mniej kreatywna. Wyższa pozwala modelowi na więcej elastyczności. Alternatywnie można modyfikować domyślną wartość parametru top_p = 1.0, zmniejszając jego wartość - nie jest jednak zalecane jednoczesne modyfikowanie obu parametrów (zob. API reference).

Wielokrotne uruchamianie tego samego zapytania może dawać nieco inne wyniki, jeżeli wartość parametru temperature jest większa od zera.

Zapytania uruchamiane przez API nie znają kontekstu zapytań uruchamianych chwilę przed, inaczej niż w trakcie rozmowy z ChatGPT, należy za każdym razem podawać całą informację w zapytaniu.

Ogromne znaczenie ma konstrukcja zapytania (prompt), całkiem poprawnie działają pytania w języku angielskim dotyczące podanego polskiego tekstu, czasem dają nawet lepsze rezultaty. Zadanie zlecone modelowi powinno być napisane językiem prostym, konkretnym, ale nie musi być bardzo krótkie. Dobry wpływ na jakość odpowiedzi mają podane modelowi przykłady, czego i w jakiej formie się spodziewamy.

Odpowiedzi modelu davinci-003 zadawane przez API, często różnią się od wyników pytań zadanych podczas 'rozmowy' z ChatGPT.

Poprawność odpowiedzi

Model text-davinci-003 jest zoptymalizowany do generowania tekstów, sprawiających wrażenie że są przygotowane przez człowieka, lecz bez gwarancji że wszystkie informacje w nich są prawdziwe. Dotyczy to także sytuacji gdy nie zleca się modelowi wygenerowania tekstu na jakiś temat na podstawie jego wewnętrznej wiedzy, lecz model ma wyciągnąć informację z przekazanego mu tekstu. Szczególnie gdy parametr temperature ma wyższą wartość, model potrafi 'zaokrąglać' informacje - jest bardziej kreatywny, np. przy przetwarzaniu biografii Edwarda Sedlaczka z parametrem temperature = 1.0 model zapytany o funkcje i urzędy tej postaci generuje m.in. informację:

  1. Kierownik literacki prasy lwowskiej ("Dziennik dla Wszystkich”, „Dziennik Polski”, „Gazeta Lwowska”, „Gazeta Narodowa”, „Przyjaciel Domowy”) i warszawskiej („Biesiada Literacka”, „Echo”, „Kłosy”, „Kurier Codzienny”, „Kurier Warszawski”, „Niwa", "Słowo", "Tygodnik Ilustrowany", "Tygodni Mód i Powieści" , "Tygodnik Powszechny" i "Wiek").

Tymczasem w rzeczywistości bohater biografii był kierownikiem literackim tylko pisma "Przyjaciel Domowy".

Po obniżeniu wartości temperature do 0.0 zwracana jest już prawdziwa informacja:

  1. Kierownik literacki dwutygodnika lwowskiego „Przyjaciel Domowy” (1 VI 1882)

Wpływ ma jakość odpowiedzi mają także parametry frequency_penalty (standardowo wartość 0.8) i presence penalty: kontrolujący tendencję modelu do powtarzania generowanych słów oraz zachęcający model do generowania nowatorskich sformułowań. Manipulowanie nimi spowodowało na przykładowym biogramie Sedlaczka wygenerowanie fałszywego przybliżenia, zamiast:

  1. Kancelista w austriackim konsulacie w Kijowie (1895)

otrzymujemy:

  1. Konsul w Kijowie (1882-1895)

gdzie odpowiedni fragment biografii brzmi: "Później pełnił takąż funkcję w austriackim konsulacie w Kijowie (do r. 1895)". Ta skłonność do 'halucynacji' jest jednym z głównych problemów przy ekstrakcji informacji z tekstów historycznych, oczywiście dane wyciągane przez model musiałyby być weryfikowane przez ludzkiego eksperta, warto również przeprowadzić test na większej próbie testów i ocenić poprawność (i kompletność) zwracanych przez model danych.

Najbardziej przydatne wartości parametrów (w przypadku wyciągania informacji z tekstów):

  • temperature: 0
  • top p: 1.0
  • frequency penalty: 0.0
  • presence penalty: 0.0

Wiedza z kontekstu

To w czym model bywa zadziwiająco dobry, to umiejętność wyciągania informacji z kontekstu. Dłuższy fragment tej samej biografii Sedlaczka związany jego pracą kancelisty brzmi: "W r. 1886 S. otrzymał posadę kancelisty w konsulacie austriackim w Warszawie – zapewne za poparciem Władysława Łozińskiego, który opiekował się jego karierą także w l.n. Później pełnił takąż funkcję w austriackim konsulacie w Kijowie (do r. 1895)". z czego model (uruchomiony z właściwymi parametrami!) wyciąga informację:

  1. Kancelista w austriackim konsulacie w Kijowie (1895)

Co nie jest przecież (nazwa funkcji/urzędu) podane wprost.

Podobny przykład występuje w biografii Ludwika Mortęskiego (Polski Słownik Biograficzny t. XXII, 1977, s. 9-11), model wyszukał informację o urzędzie sprawowanym przez bohatera biografii:

  1. Kasztelan elbląski (1516–1539)

na podstawie wpisu "Jako kasztelan gdański brał M. udział w licznych komisjach powoływanych przez króla dla rozstrzygania spraw spornych na terenie Prus Królewskich. Dn. 4 III 1516 przeszedł M. na kasztelanię elbląską (po zmarłym Janie Wulkowskim) i trzymał ją do śmierci.".

Przykłady

Model: text-davinci-003
Text: biografia Ludwika Mortęskiego (zm. 1539), w języku polskim. (Polski Słownik Biograficzny t. XXII, 1977, s. 9-11)

Relacje rodzinne

Prompt: From this text extract information about parents, wife, children and grandchildren for the person Ludwik Mortęski

Result: Parents: Ludwik (possibly) and Anna

Wife: Elżbieta z Dąbrówki

Children: Katarzyna, Dorota, Gertruda, Elżbieta, Małgorzata, Ludwik and Melchior

Grandchildren: Magdalena Mortęskiej and Ludwik

Funkcje i urzędy głównej postaci

Prompt: From this text, extract information about the offices, functions and positions held by the person Ludwik Mortęski, present them in the form of a list

Result: Offices, Functions and Positions Held by Ludwik Mortęski:

  1. Kasztelan gdański (1512–1516)
  2. Kasztelan elbląski (1516–1539)
  3. Representative of Prussian States to King Kazimierz Jagiellończyk (1492)
  4. Member of the Delegation of Prussian States to the Election of a Polish King (1506)
  5. Podkomorzy chełmiński at the Malbork Assembly of Prussian States with Representatives of King Aleksander Jagiellończyk (1503)
  6. Representative of Prussian States to Bishop Hiob von Dobenecka (1507)
  7. Representative of Prussian States to King Zygmunt I at the Krakow Sejm and Malbork Assembly (1508, 1509, 1511)
  8. Defender of Nobility Rights in Discussions at Assemblies and Sejmik in Elbląg, Malbork, Grudziądz and Gdańsk (1507-1530).
  9. Opponent to Wojewodas Jan Dabrowski and Mikołaj Wulkowski in 1509
  10. Member on Commissions Appointed by the King for Resolving Disputes in Prussia Królewskich(after 1512).
  11. Starostwo pokrzywnickie(1505).
  12. Starostwo Pokrzywno with Villages Okonin, Nicwałd, Węgrowo Skarszewo Nowawieś i Wiewiórki as a Feudal Estate from Zygmunt Stary for Military Service(1521).

Lista instytucji

Prompt: From this text, extract information about institutions related to the the person Ludwik Mortęski, present them in the form of a list.

Result: Institutions related to Ludwik Mortęski:

  1. Stały Sejmik Prus Królewskich
  2. Kapituła Warmińska
  3. Rada Pruska
  4. Sejmik w Malborku (listopad 1530)
  5. Sejmik w Grudziądzu (12/1511)
  6. Sejm w Krakowie (1/18/1508)
  7. Sejm w Malborku (28/5-8/6/1508)
  8. Zamek Radzyń w ziemi chełmińskiej
  9. Zamek Pokrzywno
  10. Kasztelania Gdańska (4/3/1512)
  11. Kasztelania Elbląska (4/3/1516)

Wynik w formie tabeli

Prompt: From this text give the name, surname and date of death of the main character. Show the result in the form of a table.

{TEXT}

| Name | Surname | Date of death |

Result:

| ------ | ----------------------- | ---- |
| Ludwik | Mortęski (de Mortangen) | 1539 |
| ------ | ----------------------- | ---- |

Lista urzędów

Text: biografia Mikołaja z Woli (zm. 1346 lub 1347) - w języku polskim. (Polski Słownik Biograficzny t. XXI, 1976, s. 151)

Prompt: From this text, extract information about the offices, held by the person Mikołaj z Woli, present them in the form of a list

Result:

List of offices held by Mikołaj z Woli:

  • Kasztelan kruszwicki
  • Starosta kujawski
  • Podkomorzy brzeski
  • Asesor sądu ziemskiego w Inowrocławiu

Lista urzędów i funkcji w xml

Text: biografia Edwarda Józefa Sedlaczka (Polski Słownik Biograficzny t. XXXVI, 1995-6, s. 137-138)

Prompt: From this text, extract information about the offices, functions and positions held by the person Edward Józef Sedlaczek, present them in the form of xml: <xml><person><office>office, function or position</office><person></xml>

Result:

<xml>
  <person>
    <name>Edward Józef Sedlaczek</name>
    <office>Literat</office>
    <office>Kierownik literacki dwutygodnika lwowskiego „Przyjaciel Domowy”</office>
    <office>Kancelista w konsulacie austriackim w Warszawie</office>
    <office>Kierował wicekonsulatem w Batumi (Rosja, 1896–7)</office>
    <office>Agencją konsularną w Nowosielicy (Rosja)</office>
    <office>Agencją konsularną w Burgas (Bułgaria)</office >
    < office > Wicekonsulatem w Batumi </ office >
  	< office > Wicekonsulatem w Burgas </ office >
  	< office > Wicekonsulatem w Ploieşti (Rumunia) </ office >
  	< office > Redagował serię Wydawnictwa Tow. im. P. Skargi </ office >
  </person>
</xml

Relacje rodzinne nr 2

Text: biografia Andrzeja Rosickiego (1814-1904), (Polski Słownik Biograficzny t. XXXII, 1989-1991, s. 82)

Prompt: From this text extract information about parents, wife, siblings, children and grandchildren for the main character

Result:

Parents: Walenty and Marianna z Idzikowskich

Wife: Anna z Robowskich

Siblings: Unknown

Children: Józefa Konstancja (born 1859), Antonina Wiktoria (born 1863) and Piotr Michał (born 1862)

Grandchildren: Unknown

TEI XML output

Text: Fragment Bullarium Poloniae.

Prompt: Tag text and convert to TEI XML format.

Result:

<tei xmlns="http://www.tei-c.org/ns/1.0">
  <teiHeader>
    <fileDesc>
      <titleStmt>
        <title>Francisco Cruswicz magistro in theologia</title>
      </titleStmt>
    </fileDesc>
  </teiHeader>

  <text xml:lang="lat">
    <p><persName ref="#Cruswicz">Francisco Cruswicz</persName>, magistro in theologia [in civitate Constantiensi commoranti]: Eidem decano eccl. s. Floriani extra muros Crac. (<amt type="currency" quantity="15" unit="argentum polonorum">15 m. arg.</amt> p.), canonica-tus in eccl. s. Michaelis in castro Crac.(<amt type="currency" quantity="12" unit="argentum polonorum">12 m.</amt>. arg p.), per obitum apud SA ea vacante Nicolai Falkemberg vacans, confertur.;s. m scholastico et cantori ac custodi Crac.<num value="11">XI</num>,<num value = "13">XIII</num>. </p>
  </text>
</tei>

Analiza NER fragmentu publikacji

Text: Fragment publikacji Stanisława Bodniaka "Polska a Bałtyk za ostatniego z Jagiellona" (1946):

Było to w roku 1552. Już od czerwca bawił król Zygmunt August w pomorskiej ziemi, lipiec i sierpień spędził w Gdańsku, we wrześniu po kilkudniowym pobycie w Malborgu w czasie sejmiku podążył do Królewca na zaproszenie ks. Albrechta. Towarzyszyli mu w podróży hetman Jan Tarnowski, marszałek koronny Piotr Kmita, bp. Stanisław Hozjusz, kanclerz Jan Ocieski, podkanclerzy Jan Przerębski i inni przedniejsi senatorowie i dostojnicy polscy obok przedstawicieli świata umysłowego w osobach Marcina Kromera, Szymona Maricjusa-Czystochlebskiego i Łukasza Górnickiego. Orszak dworzan i rycerstwa przenosił 5 tysięcy osób. Najokazalej podejmował swego władcę Gdańsk, cały roztaczając przed nim przepych, na jaki pozwalało miastu u ujścia Wisły rosnące pod polskim panowaniem bogactwo. Stawił się tam z Zachodniego Pomorza ks. Barnim XI w 300 koni i ze znaczną liczbą pomorskiej szlachty, ażeby spotkać się ze swym dostojnym krewniakiem i suwerenem z tytułu lenna na Lęborgu i Bytowie. W programie gdańskim przyjęcia, obfitującym w uczty, zabawy i gry rycerskie, nie zapomniano o morzu. W dniu 13 lipca zwiedził król w towarzystwie ks. Barnima statek na stoczni w Gdańsku i przyglądał się jego spuszczeniu na wodę. W tydzień później (20 VII) wybrał się barką, wybitą czerwonym suknem i przybraną chorągiewkami, na obejrzenie warowni, nazywanej wówczas „Latarnią” albo „wieżą”,* położonej u ujścia Wisły. Gdy tam wchodził, grzmiały na jego cześć działa warowni i okrętu „Żelazny Henryk", naprzeciw niej umieszczonego , miotając na morze ogniste kule, Po posiłku w warowni powrócił na swą barkę i popłynął dalej — na Bałtyk, wtedy spokojny. Wielu także panów polskich z otoczenia zapuściło się daleko na fale, korzystając z pogody.

Prompt: W podanym tekście wyszukaj informacje o osobach, znalezione osoby wypisz w formie listy, jeżeli są znane funkcje lub urzędy osób umieść te informacje w nawiasach obok osób:

Wynik:

  • Zygmunt August (król)
  • Jan Tarnowski (hetman)
  • Piotr Kmita (marszałek koronny)
  • Stanisław Hozjusz (bp)
  • Jan Ocieski (kanclerz)
  • Jan Przerębski (podkanclerzy)
  • Marcin Kromer
  • Szymon Maricjus-Czystochlebski
  • Łukasz Górnicki
  • Barnim XI (książę)

Inne przykłady

Skrypty do tych i pozostałych przykładów w folderze src, wyniki w folderze output.

Analiza relacji rodzinnych na serii biografii

(zob. też w dalszej części tekstu analogiczną analizę wykonaną z użyciem GPT-4)

Jak model GPT-3 ('davinci-003') radzi sobie z rozpoznawaniem relacji rodzinnych można spróbować ocenić na większej próbce 50 biogramów wybranych losowo z tomów 1-51 Polskiego Słownika Biograficznego. Biogramy mają różną długość, od mniej więcej 1 tys. znaków do kilkudziesięciu tys. Ograniczeniem jest liczba tokenów, które 'davinci' jest w stanie przetworzyć w jednym zapytaniu - 4000 wliczając wygenerowaną odpowiedź. W przypadku dłuższych biogramów zostały one wstępnie 'streszczone': uwzględniono 5 pierwszych i pięć ostatnich zdań (pomijając najpierw część bibliograficzną biogramu) oraz wszystkie zdania pomiędzy nimi jeżeli zawierały treść wskazującą na informacje o rodzinie i krewnych (biogram został podzielony na zdania za pomocą spaCy, w zdaniach analizowano formy podstawowe tokenów i porównywano z przygotowanym słownikiem pojęć związanych z pokrewieństwem). Skracanie biogramów może oczywiście wpłynąć negatywnie na wyniki (zdania są wyrwane z kontekstu, niekiedy użyty model spaCy 'pl_core_news_lg' niepoprawnie dzielił tekst na zdania). W teście skupiono się na pokrewieństwie w stosunku do głównego bohatera/bohaterki biogramu.

Teksty biogramów przetwarzane były promptem o treści:

Na podstawie podanego tekstu wyszukaj
wszystkich krewnych lub powinowatych głównego bohatera tekstu.
Możliwe rodzaje pokrewieństwa: ojciec, matka, syn, córka, brat, siostra, żona, mąż,
teść, teściowa, dziadek, babcia, wnuk, wnuczka, szwagier, szwagierka, siostrzeniec,
siostrzenica, bratanek, bratanica, kuzyn, kuzynka, zięć, synowa, teść bratanicy.
Wynik wypisz w formie listy nienumerowanej, w formie:
główny bohater -> rodzaj pokrewieństwa -> osoba
Każda pozycja w osobnej linii. Na przykład:
- główny bohater -> brat -> Jan Kowalski
- główny bohater -> siostra -> Anna
Pomiń rodzaj pokrewieństwa jeżeli nie występuje w tekście.
Jeżeli w tekście nie ma żadnych informacji o pokrewieństwach głównego bohatera
napisz: brak danych.

(kod skryptu w pliku psb_relacje_rodzinne.py)

Dla 36 z 50 biogramów model znalazł jakieś relacje - w sumie 182 przypadki pokrewieństwa głównego bohatera z inną osobą. Po szczegółowym przeanalizowaniu, 38 z nich było błędne (20.9%), 144 oceniono jako prawdziwe (79.1%).

Szczegółowa lista znalezionych relacji:

Postać -> rodzaj pokrewieństwa/relacja -> osoba spokrewniona Prawidłowa?
Aloe Franciszek Eljasz
główny bohater -> ojciec -> Jan Baptysty d'Aloy True
główny bohater -> matka -> Henryka Rakocy True
główny bohater -> brat -> Emanuel True
główny bohater -> siostry-> piękne siostry False
Bezprym
główny bohater -> ojciec -> Bolesław Chrobry True
główny bohater -> matka -> nieznana Węgierka True
główny bohater -> brat -> Mieszko II True
główny bohater -> brat -> Otto True
główny bohater-> teść bratanicy-> cesarz Konrad II False
Dąbrowska_Pelagia
główny bohater -> żona -> Dąbrowska Pelagia False
główny bohater -> synowie -> brak danych False
Daszyński Ignacy
główny bohater -> ojciec -> Ferdynand True
główny bohater -> matka -> Kamila z Mierzeńskich True
główny bohater -> brat -> Feliks True
główny bohater-> żona (pierwsza)-> Maria z Paszkowskich True
główny bohater-> żona (druga)-> Cecylia Kempnerówna True
Dzierżek_Natalia
Główny bohater -> matka -> Maria z Piątkowskich Nieczuja-Dzierżków True
Główny bohater -> ojciec -> Henryk True
Główny bohater -> siostra rodzona-> Henryka Piątkowskiego False
Główny bohater -> teść bratanicy-> Tadeusz Gałecki False
Główny bohater -> synowa teścia bratanicy-> Teresa z Wołowskich Prażmowska False
Eufrozyna
Główny bohater -> ojciec -> Kazimierz True
Główny bohater -> matka -> Eufrozyna False
Główny bohater -> syn -> Władysław Łokietek True
Główny bohater -> syn -> Kazimierz True
Główny bohater-> syn-> Ziemowit True
Główny bohater-> mąż-> Mszczuja II True
Ewild al. Eywild
Główny bohater -> ojciec -> Stanisław Brzeski False
główny bohater -> brat -> Eynur True
główny bohater -> dziadek -> Jawilt False
główny bohater -> wnukowie-> Dowgird i Daszko Eywiltowicze False
Fuzorius Bartłomiej
Główny bohater -> ojciec -> Stanisław Lwowczyk True
Gliński Iwan
główny bohater -> ojciec -> Lew Borysowicz True
główny bohater -> brat rodzony -> Michał Mamaj False
główny bohater -> bratanica -> Helena True
Hincza z Rogowa
główny bohater -> ojciec -> Hinczka z Rogowa True
główny bohater -> brat -> Jakub True
główny bohater -> siostra -> Małgorzata True
główny bohater -> żona-> Dorota z Koziegłowskich h. Lis True
główny bohater-> teść bratanicy-> Bartłomiej Gruszczyński False
Jadwiga Jagiellonka
główny bohater -> ojciec -> Kazimierz Jagiellończyk True
główny bohater -> matka -> Elżbieta Rakuszanka True
główny bohater -> brat -> Aleksander Jagiellończyk True
główny bohater -> siostra-> Sonka Jagiellonka False
główny bohater-> żona-> Jerzy Bawarski False
główny bohater-> córka-> Elżbieta Bawarska True
główny bohater-> córka-> Małgorzata Bawarska True
główny bohater-> teść bratanicy -> Ludwik Bawarski False
Kakowski Aleksander
główny bohater -> ojciec -> Franciszek True
główny bohater -> matka -> Paulina z Ossowskich True
Krumhausen Gabriel
główny bohater -> ojciec -> Joachim True
główny bohater -> matka -> Gertruda True
główny bohater -> brat -> Joachim True
główny bohater -> żona-> Konstancja Falcke True
Łańcucki Wojciech
główny bohater -> ojciec -> Stanisław True
Leymiter Stanisław
główny bohater -> ojciec -> Mikołaj True
główny bohater -> matka -> Benigna True
główny bohater -> żona -> Zofia True
główny bohater -> syn -> Jan True
główny bohater -> syn-> Stanisław True
główny bohater-> córka-> Barbara True
główny bohater-> córka-> Benigna True
główny bohater-> teść-> Jan Tesznar True
główny bohater-> brat teściowej-> Mikołaj Kreidler False
główny bohater-> siostra teściowa-> Agnieszka Tesznarowa False
główny bohater-> siostra teściowa-> Katarzyna Tesznarowa False
Mierzeński Aleksander
główny bohater -> brat -> Jan Mierzeński True
główny bohater -> brat -> Samuel Mierzeński True
główny bohater -> syn brata -> Jan Mierzeński True
główny bohater -> synowa syna brata-> Mariana z Kawcenich False
Mostowska z Bujwidów
główny bohater -> ojciec -> Odo Bujwid True
główny bohater -> matka -> Kazimiera z Klimontowiczów True
główny bohater -> siostra -> Kazimiera Rouppertowa True
główny bohater -> siostra-> Jadwiga Demelowa True
główny bohater-> siostra-> Helena Jurgielewiczowa True
główny bohater-> mąż-> Włodzimierz Mostowski True
główny bohater-> syn-> Jerzy Mostowski True
główny bohater-> syn-> Czesław Mostowski True
Patruus
główny bohater -> ojciec -> Jan Patruus z Koła False
główny bohater -> syn -> Jan True
Pichgiel
główny bohater -> ojciec -> Matthias Pichel False
główny bohater -> matka -> Barbara z domu Biettin True
główny bohater -> syn -> Christian Pichgiel młodszy True
główny bohater -> syn -> Johan Pichgiel True
główny bohater -> syn-> Daniel Pichgiel True
główny bohater-> syn-> Emanuel Pichgiel True
główny bohater-> kuzyn-> Matthias Pichgiel młodszy True
Pion Maurice
główny bohater -> ojciec -> Antoine Claude True
główny bohater -> matka -> Anna z domu Pauli True
główny bohater -> żona -> Aleksandra Antonina z Budzyńskich True
główny bohater -> synowie-> Adolf Stanisław, Władysław Stanisław True
główny bohater-> córki-> Adela, Kornelia True
główny bohater-> młodsza siostra-> Eugenia True
Piotrowiczowa z Rogolińskich
główny bohater -> ojciec -> Zygmunt Rogoliński True
główny bohater -> matka -> Ansberty z Badeńskich True
główny bohater -> mąż -> Konstantego Piotrowicza True
główny bohater -> teść bratanicy-> Józef Dworzaczek False
Renard Benedykt
główny bohater -> ojciec -> Andrzej True
główny bohater -> brat -> Jan Baptysta True
główny bohater -> siostra -> Anna Orzelska False
główny bohater -> siostra-> Anna Katarzyna True
Rossi Piotr
główny bohater -> ojciec -> Andrzej True
główny bohater -> żona -> Małgorzata True
główny bohater -> syn -> Andrzej True
główny bohater -> syn -> Kornel True
główny bohater-> syn-> Klemens True
główny bohater-> córka-> Izabella True
główny bohater-> córka-> Feliksa True
Sapieha_Jan_Fryderyk
główny bohater -> ojciec -> Fryderyk True
główny bohater -> matka -> Ewa ze Skaszewskich True
główny bohater -> brat -> Tomasz Kazimierz True
główny bohater -> brat stryjeczny-> Jan Ferdynand True
główny bohater-> kuzyn-> Kazimierz Leon Sapieha True
główny bohater-> hetman P. J. Sapieha (stryjeczny wujek) False
główny bohater-> syn-> Mikołaj Leon True
główny bohater-> syn-> Kazimierz Władysław True
głowny bohater-> syn-> Paweł Franciszek True
Śląska Aleksandra
główny bohater -> ojciec -> Edmund Wąsik True
główny bohater -> matka -> Helena z Masłowskich True
główny bohater -> siostra przyrodnia-> Bożena Jewasińska True
główny bohater -> brat-> Olgierd Edmund Wąsik True
główny bohater -> mąż pierwszy-> Czesław Michał Górski True
główny bohater -> syn-> Szczęsny Tadeusz Górski True
główny bohater -> mąż drugi-> Stanisław Śląski False
Słowicki Józef
główny bohater -> ojciec -> Józef True
Śniadecka Kornelia Ludwika
główny bohater -> ojciec -> Jędrzej Śniadecki True
główny bohater -> matka -> Konstancja z Mikułowskich True
główny bohater -> siostra -> Zofia Balińska True
główny bohater -> brat-> Józef Konstanty Śniadecki True
główny bohater-> teść bratanicy-> Kazimierz Sulistrowski False
główny bohater-> stryj-> Jan Śniadecki True
główny bohater-> siostrzenica-> Antonina Śniadecka False
główny bohater-> stryjenka-> Salomea Bécu False
główny bohater-> wujek (brat ojca) -> Ignacy Abramowicz False
główny bohater-> wujek (brat ojca) -> Mikołaj Abramowicz False
Spektor Mordechaj
główny bohater -> żona -> Izabela z Frydbergów True
Stańczakowa ze Strancmanów
główny bohater -> ojciec -> Adolf Strancman True
główny bohater -> matka -> Maria Weinfeld True
główny bohater -> brat -> Jan Strancman True
główny bohater -> mąż-> Zdzisław Stańczak True
główny bohater-> córka-> Anna Stańczak True
główny bohater-> zięć-> Tadeusz Sobolewski True
Stanisław_Cielątko
główny bohater -> ojciec -> Jan True
główny bohater -> brat -> Jan Cielątki z Liszyna i Prusiecka True
główny bohater -> brat -> Mikołaj True
główny bohater-> siostrzenica-> Małgorzata Marta False
główny bohater-> teść bratanicy-> Piotr Cikowski z Mikluszowic True
Strzelecki Wiesław Marian
główny bohater -> ojciec -> Felicjan True
główny bohater -> matka -> Stefania z Łękawskich True
główny bohater -> syn -> Krzysztof True
główny bohater-> żona-> Barbara z Krzemińskich True
Świrski Jerzy Włodzimierz
główny bohater -> ojciec -> Włodzimierz True
główny bohater -> matka -> Celina z Wasiłowskich True
główny bohater -> brat -> Małgorzata False
główny bohater -> siostrzenica-> Maria Konopnicka False
Szapira Majer
główny bohater -> ojciec -> Jakub Szamszon True
główny bohater -> matka -> Margula Szor True
główny bohater -> brat -> Abraham True
główny bohater-> dziadek-> Samuel Izaak Szor True
główny bohater-> żona-> Małka Towa True
główny bohater-> teść bratanicy-> Salomon Moskowicz False
Szapocznikow_Alina
główny bohater -> ojciec -> Jakub True
główny bohater -> matka -> Regina True
główny bohater -> brat -> Mirosław True
główny bohater-> syn-> Piotr Stanisławski True
Szczubioł_Andrzej
główny bohater -> ojciec -> Stefan z Jasieńca i Ciechomic True
główny bohater -> matka -> Sędka True
główny bohater -> brat -> Mikołaj z Ciechomic True
główny bohater -> brat-> Jan z Dłotowa True
główny bohater-> żona-> Anna True
główny bohater-> syn-> Maciej True
główny bohater-> syn-> Szymon zwany Gostyńskim z Ciechomic True
główny bohater-> syn-> Andrzej True
główny bohater-> teść bratanicy -> Ścibor z Sąchocina h. Rogala False
Szumski Boksa
główny bohater -> ojciec -> Krzesław z Szumska True
główny bohater -> brat -> Jan (Jaszek) Rej z Nagłowic True
główny bohater -> żona -> Stachna h. Poraj True
główny bohater -> syn-> Jan Rey True
główny bohater-> teść-> Chociemir Garnka (Garnysza) z Pojałowic i Suchcic False
główny bohater-> teściowa-> Świątka, żona Mikołaja z Barczkowic, następnie Wisława z Kościelca False
główny bohater-> bratanek-> Jan Rey (zm. 1468) True
główny bohater-> bratanek-> Stogniew, żonaty z Małgorzatą True

Ważne jest oczywiście także to czego model nie znajduje. Dla 14 biogramów model ocenił, że nie ma danych dotyczących relacji rodzinnych dla głównego bohatera. W 5 z tych przypadków jest to prawdopodobnie błąd (15 brakujących relacji).

Postać Wynik
Bartoszewski Jan True
Ezra_ben_Nisan True (w biogramie jest tylko niejasna wzmianka, że miał jakieś córki)
Falęta True
Fiorentini Władysław False (jest informacja o ojcu, dziadku i żonie)
Gołaski Jan True
Grzegorzewski Jan False (jest informacja o ojcu i matce)
Guicciardini Galeazzo True (występuje tylko niesjasna wzmianka o jego bracie, niewymienionym z imienia)
Hirschenfeld-Mielecki Józef True
Langfort Teodor Henryk True
Popiel True
Siemowit False (w biogramie wymieniony ojciec, matka, syn, wnuk i prawnuk)
Spycigniew z Dąbrowy False (w biogramie występuje inf. o prawdopodobnym synu i wnuku, być może problemem jest skrót S-a na oznaczenie głównego bohatera)
Swach False (jest inf. o ojcu, matce i bracie)
Sztaffel Izrael True

W biogramach w których model odnalazł krewnych głównego bohatera/bohaterki zdarzało się, że była to tylko część informacji na temat relacji rodzinnych - teki problem wystąpił w 12 na 36 biogramów (pominiętych 26 relacji rodzinnych). Szczegółowy wykaz poniżej.

Postać Czy uwzgl. wszystkie ralacje, ew. jakich brakuje
Aloe Franciszek Eljasz True
Bezprym True
Dąbrowska Pelagia False, pominięta matka Pelagia i ojciec Michał, ciotki Waleria i Ignacja, mąż Jarosław. Może to wynikać ze specyficzneg stylu podania tych informacji i stosowania skrótów: "Ur. 10 IX w Dubience (w Lubelskiem) z Pelagii z Piotrowskich i Michała Zgliczyńskiego, wcześnie osierocona, wychowywała się u ciotek Walerii i Ignacji Piotrowskich."
Daszyński Ignacy True
Dzierżek Natalia True
Eufrozyna False, pominięta informacja o pierwszym mężu - Kazimierzu
Ewild al. Eywild True
Fuzorius Bartłomiej True
Gliński Iwan False, pominięta informacja o bracie Wasylu
Hincza z Rogowa True (jest wzmianka o małoletnich dzieciach ale bez konkretów)
Jadwiga Jagiellonka True (część informacji jest pomylona - Jerzy Bawarski nie jest żoną bohaterki tylko mężem, ale inf. została znaleziona...)
Kakowski Aleksander True
Krumhausen Gabriel False, pominięta informacja o 'dziadku po kądzieli'
Łańcucki Wojciech True
Leymiter Stanisław False, pominięta inf. o szwagrze i 2 szwagierkach, bracie oraz o zięciach (z tym że córki wyszły za mąż po śmierci bohatera), biogram napisany dość zawile, jeżeli chodzi o opis rodziny bohatera.
Mierzeński Aleksander False, pominięta informacja o ojcu i matce.
Mostowska z Bujwidów True
Patruus True (są tylko wzmianki o nieznanych z imienia synach i córkach)
Pichgiel False, pominięta inf. o stryju i o żonie bohatera biogramu
Pion Maurice True
Piotrowiczowa z Rogolińskich True
Renard Benedykt True
Rossi Piotr False, pominięta informacja o teściu
Sapieha Jan Fryderyk False, brak informacji o dziadku i o zięciu
Śląska Aleksandra True (brak tylko inf. o 'dalekiej krewnej' Eugenii Deutsch)
Słowicki Józef True
Śniadecka Kornelia Ludwika False, brak informacji o szwagrze (mężu siostry), fragment o krewnych dość zawiły.
Spektor Mordechaj - True (krewni są wzmiankowani, ale bez konkretów)
Stańczakowa ze Strancmanów True
Stanisław_Cielątko True (pominięty mąż bratanicy ale czy to w sumie pokrewieństwo?)
Strzelecki Wiesław Marian True
Świrski Jerzy Włodzimierz True (ale część ze znalezionych relacji jest niepoprawnego typu, siostrzenica zamiast ciotka, brat zamiast siostra)
Szapira Majer True
Szapocznikow Alina False, pominięta informacja o 2 mężach
Szczubioł Andrzej True
Szumski Boksa False, pominięta informacja o przodku - dziad lub pradziad Jakub

Jeśli przeanalizuje się wspólnie dane z powyższych trzech tabel w biogramach znajdują się 223 relacje, model wymienił 182, z tego 38 błędnie, co oznacza 64.5% dokładności (144 prawidłowe). Zupełnie innym pytaniem pozostaje czy i jak uzyskane dane można wykorzystać np. do budowania baz wiedzy.

Analiza relacji rodzinnych na serii biografii - model GPT4

Poprzednie testy dotyczyły działania modelu GPT-3 ('davinci-003'), nie mam jeszcze dostępu do API z GPT4, ale jakie wyniki mógłby osiągnąć najnowszy model można spróbować ocenić poprzez działanie ChatGPT Plus z włączonym modelem GPT-4. Jeden z problematycznych biogramów: 'Natalii Dzierżek (1861-1931)' dla którego wyszukane zostało 5 relacji z tego 3 błędnie, tym razem został przetworzony całkowicie poprawnie:

  • główna bohaterka -> ojciec -> Henryk Dzierżek
  • główna bohaterka -> matka -> Maria z Piątkowskich Nieczuja-Dzierżków
  • główna bohaterka -> wujek (brat matki) -> Henryk Piątkowski

Podobnie poprawił się wynik przetwarzania dla Pelagii Dąbrowskiej (1843-1909), gdzie poprzednio model GPT-3 znalazł tylko dwie i to błędne relacje, obecnie GPT-4 zwraca poprawną listę:

  • Główna bohaterka -> ojciec -> Michał Zgliczyński
  • Główna bohaterka -> matka -> Pelagia z Piotrowskich
  • Główna bohaterka -> mąż -> Jarosław Dąbrowski
  • Główna bohaterka -> syn -> trzech synów
  • Główna bohaterka -> ciotka -> Waleria Piotrowska
  • Główna bohaterka -> ciotka -> Ignacja Piotrowska
  • Główna bohaterka -> wuj -> Piotr Falkenhagen-Zaleski.

Niewielkim modyfikacjom uległ użyty prompt:

Na podstawie podanego tekstu wyszukaj wszystkich krewnych lub powinowatych głównej bohaterki/bohatera tekstu: {name}. Możliwe rodzaje pokrewieństwa: ojciec, matka, syn, córka, brat, siostra, żona, mąż, teść, teściowa, dziadek, babcia, wnuk, wnuczka, szwagier, szwagierka, siostrzeniec, siostrzenica, bratanek, bratanica, kuzyn, kuzynka, zięć, synowa.
Wynik wypisz jako listę nienumerowaną w formie: główna bohaterka -> rodzaj pokrewieństwa (kim osoba była dla niej) -> osoba.
Każda pozycja w osobnej linii. Na przykład:
- główna bohaterka -> brat -> Jan Kowalski
- główna bohaterka -> siostra -> Anna
Wypisz tylko rodzaje pokrewieństwa, które występują w tekście.
Jeżeli w tekście nie ma żadnych informacji o pokrewieństwach głównego bohatera/bohaterki napisz: brak danych.

Jak wyglądają wyniki dla całej serii 50 biogramów?

Postać -> rodzaj pokrewieństwa/relacja -> osoba spokrewniona Prawidłowa?
Aloe Franciszek Eljasz
główny bohater -> ojciec -> Jan Baptysta d'Aloy True
główny bohater -> matka -> Henryka Rakocy True
główny bohater -> brat -> Emanuel d'Aloy True
główny bohater -> siostry -> piękne siostry Aloe (imię niepodane) True
Bartoszewski Jan
brak danych True
Bezprym
główny bohater -> ojciec -> Bolesław Chrobry True
główny bohater -> matka -> nieznana z imienia Węgierka (być może córka księcia Gejzy) True
główny bohater -> brat -> Mieszko II True
główny bohater -> brat -> Otton True
Dąbrowska_Pelagia
główna bohaterka -> ojciec -> Michał Zgliczyński True
główna bohaterka -> matka -> Pelagia z Piotrowskich True
główna bohaterka -> mąż -> Jarosław Dąbrowski True
główna bohaterka -> ciotka -> Waleria Piotrowska True
główna bohaterka -> ciotka -> Ignacja Piotrowska True
główna bohaterka -> wuj -> Piotr Falkenhagen-Zaleski True
główna bohaterka -> syn -> (trzej synowie, imiona nie podane) True
Daszyński Ignacy
główny bohater -> ojciec -> Ferdynand Daszyński True
główny bohater -> matka -> Kamila Daszyńska z Mierzeńskich True
główny bohater -> brat -> Feliks Daszyński True
główny bohater -> żona (pierwsza) -> Maria Daszyńska z Paszkowskich True
główny bohater -> żona (druga) -> Cecylia Daszyńska z domu Kempnerówna True
Dzierżek_Natalia
główna bohaterka -> ojciec -> Henryk Dzierżek True
główna bohaterka -> matka -> Maria z Piątkowskich Nieczuja-Dzierżków True
główna bohaterka -> wujek (brat matki) -> Henryk Piątkowski True
Eufrozyna
główna bohaterka -> ojciec -> Kazimierz, ks. opolski True
główna bohaterka -> mąż (pierwszy) -> Kazimierz, ks. kujawski True
główna bohaterka -> syn -> Władysław Łokietek True
główna bohaterka -> syn -> Kazimierz True
główna bohaterka -> syn -> Ziemowit True
główna bohaterka -> mąż (drugi) -> Mszczuj II, ks. pomorski True
Ewild al. Eywild
główny bohater -> brat -> Eynurem True
Ezra ben Nisan
główny bohater -> ojciec -> Nisan True
główny bohater -> córka -> córka Jana Kazimierza (niepodane imię) False
Falęta
brak danych True
Fiorentini Władysław
główny bohater -> ojciec -> Antoni True
główny bohater -> dziadek -> Franciszek True
główny bohater -> żona -> Anna True
główny bohater -> teść -> Bazyle Popow True
główny bohater -> teściowa -> Bogumiła z Gizbertów True
Fuzorius Bartłomiej
główny bohater -> ojciec -> Stanisław Lwowczyk True
Gliński Iwan
główny bohater -> ojciec -> Lew Borysowicz True
główny bohater -> brat -> Michał True
główny bohater -> brat -> Wasyl True
główny bohater -> bratanica -> Helena True
Gołaski Jan
brak danych True
Grzegorzewski Jan
główny bohater -> ojciec -> Jakub Grzegorzewski True
główny bohater -> matka -> Anna Grzegorzewska z domu Zaleska True
Guicciardini Galeazzo
główny bohater -> brat -> nieznane imię True
Hincza z Rogowa
główny bohater -> ojciec -> Hinczka z Rogowa True
główny bohater -> brat -> Jakub True
główny bohater -> brat -> Henryk True
główny bohater -> żona -> Dorota z Koziegłowskich True
główny bohater -> siostra -> Małgorzata True
Hirschenfeld-Mielecki Józef
brak danych True
Jadwiga Jagiellonka
główna bohaterka -> ojciec -> Kazimierz Jagiellończyk True
główna bohaterka -> matka -> Elżbieta Rakuszanka True
główna bohaterka -> mąż -> Jerzy Bawarski True
główna bohaterka -> brat -> Władysław Jagiellończyk True
główna bohaterka -> brat -> Aleksander Jagiellończyk True
główna bohaterka -> brat -> Zygmunt I Jagiellończyk True
główna bohaterka -> córka -> Elżbieta True
główna bohaterka -> córka -> Małgorzata True
główna bohaterka -> wnuk -> Ruprecht hr. Palatynatu False
brak -> syn -> Ludwik False
brak -> syn -> Ruprecht False
brak -> wnuk -> (niewymieniony z imienia) False
Kakowski Aleksander
łówny bohater -> ojciec -> Franciszek Kakowski True
główny bohater -> matka -> Paulina Kakowska z domu Ossowska True
Krumhausen Gabriel
główny bohater -> ojciec -> Joachim Krumhausen True
główny bohater -> matka -> Gertruda Krumhausen z domu Schumann True
główny bohater -> żona -> Konstancja Krumhausen z domu Falcke True
główny bohater -> dziadek (po kądzieli) -> Stanisław Bornbach True
główny bohater -> brat -> Joachim Krumhausen True
Łańcucki Wojciech
główny bohater -> ojciec -> Stanisław True
Langfort Teodor Henryk
brak danych True
Leymiter Stanisław
główny bohater -> ojciec -> Mikołaj True
główny bohater -> matka -> Benigna True
główny bohater -> żona -> Zofia True
główny bohater -> teść -> Jan Tesznar True
główny bohater -> syn -> Jan True
główny bohater -> syn -> Stanisław True
główny bohater -> córka -> Barbara True
główny bohater -> córka -> Benigna True
główny bohater -> szwagier -> Jan Wierzyniek True
główny bohater -> szwagier -> Mikołaj Kreidler True
brak -> szwagierka -> Agnieszka False
brak -> szwagierka -> Katarzynę False
brak -> szwagierka -> Jan Tesznar False
brak -> brat -> Mikołaj Leymiter False
brak -> zięć -> Wincenty Beck False
brak -> zięć -> Jan Tretkop False
Mierzeński Aleksander
główny bohater -> ojciec -> Abraham True
główny bohater -> matka -> Elżbieta Morsztynówna True
główny bohater -> brat -> Jan Mierzeński True
główny bohater -> brat -> Samuel Mierzeński True
główny bohater -> brat -> Krzysztof Mierzeński True
główny bohater -> brat -> Daniel Mierzeński True
Mostowska z Bujwidów
Mostowska z Bujwidów Zofia -> ojciec -> Odo Bujwida True
Mostowska z Bujwidów Zofia -> matka -> Kazimiera z Klimontowiczów True
Mostowska z Bujwidów Zofia -> siostra -> Kazimiera Rouppertowa True
Mostowska z Bujwidów Zofia -> siostra -> Jadwiga Demelowa True
Mostowska z Bujwidów Zofia -> siostra -> Helena Jurgielewiczowa True
Mostowska z Bujwidów Zofia -> mąż -> Włodzimierz Mostowski True
Mostowska z Bujwidów Zofia -> syn -> Jerzy Mostowski True
Mostowska z Bujwidów Zofia -> syn -> Czesław Mostowski True
Patruus
główny bohater -> ojciec -> Jan «ojciec» (zm. 1538) False
główny bohater -> syn -> Jan True
główny bohater -> żona -> nieznana True
Pichgiel
główny bohater -> stryj -> Matthias Pichel True
główny bohater -> kuzyn -> Matthias Pichgiel młodszy True
główny bohater -> syn -> Christian Pichgiel młodszy True
główny bohater -> żona -> Barbara z domu Biettin True
główny bohater -> syn -> Christian True (dublet)
główny bohater -> syn -> Johan True
główny bohater -> syn -> Daniel True
główny bohater -> syn -> Emanuel True
Pion Maurice
główny bohater -> ojciec -> Antoine Claude True
główny bohater -> matka -> Anne z domu Pauli True
główny bohater -> żona -> Aleksandra Antonina z Budzyńskich True
główny bohater -> córka -> Adela True
główny bohater -> syn -> Adolf Stanisław True
główny bohater -> syn -> Władysław Stanisław True
główny bohater -> córka -> Kornelia, zamężna Quattrini True
główny bohater -> siostra -> Eugenia, zamężna Koss True
Piotrowiczowa z Rogolińskich
główna bohaterka -> ojciec -> Zygmunt Rogoliński True
główna bohaterka -> matka -> Ansberty z Badeńskich True
główna bohaterka -> mąż -> Konstanty Piotrowicz True
Popiel
główny bohater -> syn -> dwóch synów (ich imion nie podano) True
Renard Benedykt
główny bohater -> ojciec -> Andrzej True
główny bohater -> brat -> Jan Baptysta True
główny bohater -> siostra -> Anna Katarzyna (Anna Orzelska) True ?
Rossi Piotr
główny bohater -> ojciec -> Andrzej True
główny bohater -> żona -> Małgorzata (córka Józefa Baltazary) True
główny bohater -> syn -> Andrzej (ur. 1790) True
główny bohater -> syn -> Kornel (ur. 1791) True
główny bohater -> syn -> Klemens (ur. 1794) True
główny bohater -> córka -> Izabella (ur. 1792) True
główny bohater -> córka -> Feliksa (ur. 1793) True
brak -> teść -> Józef Baltazary False
Sapieha_Jan_Fryderyk
główny bohater -> dziadek -> Mikołaj (wojewoda witebski) True
główny bohater -> ojciec -> Fryderyk (podkomorzy włodzimierski) True
główny bohater -> matka -> Ewa ze Skaszewskich True
główny bohater -> brat -> Tomasz Kazimierz (oboźny litewski) True
główny bohater -> brat -> Aleksander Kazimierz (biskup wileński) True
główny bohater -> brat -> Krzysztof Franciszek (krajczy litewski) True
główny bohater -> kuzyn -> Kazimierz Leon Sapieha True
główny bohater -> żona -> Konstancja True
główny bohater -> córka -> Ludwika Konstancja (żona ks. Konstantego Szujskiego, pisarza wielkiego litewskiego) True
główny bohater -> syn -> Mikołaj Leon (wojewoda bracławski) True
główny bohater -> syn -> Kazimierz Władysław (wojewoda trocki) True
główny bohater -> syn -> Paweł Franciszek (biskup żmudzki) True
brak -> brata stryjecznego -> Jana Ferdynanda False
Siemowit
Siemowit -> ojciec -> Piast True
Siemowit -> matka -> Rzepicha (Rzepka) True
Siemowit -> syn -> Lestik (Lestek) True
Siemowit -> wnuk -> Siemomysł True
Siemowit -> prawnuk -> Mieszko I True
Śląska Aleksandra
Aleksandra Śląska -> ojciec -> Edmund Wąsik True
Aleksandra Śląska -> matka -> Helena Wąsik (z domu Masłowska) True
Aleksandra Śląska -> siostra przyrodnia -> Bożena Jewasińska (Naturska) True
Aleksandra Śląska -> brat -> Olgierd Edmund Wąsik True
Aleksandra Śląska -> krewne -> Eugenia Deutsch (z domu Taczanowska) True
Aleksandra Śląska -> mąż (1) -> Czesław Michał Górski True
Aleksandra Śląska -> syn -> Szczęsny Tadeusz Górski True
Aleksandra Śląska -> mąż (2) -> Janusz Warmiński True
Słowicki Józef
Słowicki Józef -> ojciec -> Józef Słowicki True
Śniadecka Kornelia Ludwika
główna bohaterka -> ojciec -> Jędrzej Śniadecki True
główna bohaterka -> matka -> Konstancja z Mikułowskich True
główna bohaterka -> siostra -> Zofia Balińska True
główna bohaterka -> brat -> Józef Konstanty Śniadecki True
główna bohaterka -> szwagier -> Michał Baliński True
główna bohaterka -> bratanek -> Jan Śniadecki False
główna bohaterka -> szwagierka -> Antonina Śniadecka True
główna bohaterka -> teść -> Kazimierz Sulistrowski False
główna bohaterka -> siostrzeniec -> Ignacy Abramowicz False
główna bohaterka -> siostrzeniec -> Mikołaj Abramowicz False
główna bohaterka -> szwagier -> Aleksander Skirmunt False
główna bohaterka -> mąż -> Michał Czajkowski (Mehmed Sadyk) True
Spektor Mordechaj
główny bohater -> ojciec -> kramarz, chasyd True
główny bohater -> matka (niewymieniona z imienia) True
główny bohater -> brat (niewymieniony z imienia) True
główny bohater -> żona -> Izabela z Frydbergów True
główny bohater -> syn False
główny bohater -> córka False
Spycigniew_z_Dąbrowy
główny bohater -> syn -> Zawisza True
główny bohater -> wnuk -> Spycigniew True
Stańczakowa ze Strancmanów
główna bohaterka -> ojciec -> Adolf Strancman (Franciszek Kotarbiński) True
główna bohaterka -> matka -> Maria Weinfeld (Helena z Koprowskich Kotarbińska) True
główna bohaterka -> brat -> Jan True
główna bohaterka -> mąż -> Zdzisław Stańczak True
główna bohaterka -> córka -> Anna True
główna bohaterka -> zięć -> Tadeusz Sobolewski True
Stanisław_Cielątko
główny bohater -> ojciec -> Jan True
główny bohater -> brat -> Jan Cielątki z Liszyna i Prusiecka True
główny bohater -> brat -> Mikołaj True
główny bohater -> szwagierka -> Anna z Oględowa True
główny bohater -> siostrzenica -> Małgorzata Marta False
główny bohater -> zięć (Małgorzaty Marty) -> Mikołaj Cikowski False
główny bohater -> teść (Małgorzaty Marty) -> Piotr Cikowski z Mikluszowic False ?
Strzelecki Wiesław Marian
główny bohater -> ojciec -> Felicjan True
główny bohater -> matka -> Stefania z Łękawskich True
główny bohater -> żona -> Barbara z Krzemińskich True
główny bohater -> syn -> Krzysztof True
Swach Jerzy
główny bohater -> ojciec -> Udalryk (Oldrzych) True
główny bohater -> matka -> Katarzyna True
główny bohater -> brat -> Karol Antoni True
Świrski Jerzy Włodzimierz
główny bohater -> ojciec -> Włodzimierz True
główny bohater -> matka -> Celina z Wasiłowskich True
główny bohater -> siostra -> Małgorzata (1. v. Kucharska, 2. v. Łyszkowska) True
główny bohater -> siostrzeniec -> Maria Konopnicka False
główny bohater -> żona -> pierwsza żona (imię nieznane) True
główny bohater -> żona -> Maria Wiercińska True
Szapira Majer
główny bohater -> ojciec -> Jakub Szamszon True
główny bohater -> matka -> Margula Szor True
główny bohater -> dziadek -> Samuel Izaak Szor True
główny bohater -> brat -> Abraham True
główny bohater -> żona -> Małka Towa True
Szapocznikow_Alina
główna bohaterka -> ojciec -> Jakub True
główna bohaterka -> matka -> Regina (Ryfka) z Auerbachów True
główna bohaterka -> brat -> Mirosław True
główna bohaterka -> mąż (1) -> Ryszard Stanisławski True
główna bohaterka -> mąż (2) -> Roman Cieślewicz True
główna bohaterka -> syn -> Piotr Stanisławski (adoptowany) True
Szczubioł_Andrzej
główny bohater -> ojciec -> Stefan (Szczepan) z Jasieńca i Ciechomic True
główny bohater -> matka -> Sędka (imię nieznane) True
główny bohater -> brat -> Mikołaj z Ciechomic True
główny bohater -> brat -> Jan z Dłotowa (Dłutowo) True
główny bohater -> żona (1) -> nieznana True
główny bohater -> syn (z 1. małżeństwa) -> Maciej True
główny bohater -> syn (z 1. małżeństwa) -> Szymon zwany Gostyńskim z Ciechomic True
główny bohater -> żona (2) -> Anna True
główny bohater -> syn (z 2. małżeństwa) -> Andrzej True
główny bohater -> synowa -> Anna, córka Ścibora z Sąchocina False
Sztaffel Izrael
brak danych True
Szumski Boksa
główny bohater -> dziadek lub pradziadek -> Jakub True
główny bohater -> prawdopodobny ojciec -> Krzesław z Szumska True
główny bohater -> brat -> Jan (Jaszek) Rej z Nagłowic True
główny bohater -> żona -> Stachna h. Poraj True
główny bohater -> syn -> Jan Rey True
główny bohater -> bratanek -> Jan Rey True
główny bohater -> bratanek -> Stogniew True
brak -> dziad -> Jakub False
brak -> synowa -> Prakseda False
brak -> szwgier -> Chociemir Garnek (Garnysz) z Pojałowic i Suchcic False
brak -> szwagierka -> Świątka False

W analizowanych biogramach znajdują się w sumie 245 relacje lub braki relacji (gdy w treści biogramu nie ma informacji o krewnych i powinowatych, w poprzedniej analizie z uzyciem GPT-3 nie zauważyłem kilku relacji), z tego model GPT-4 215 określił poprawnie - czyli osiągnął 88% poprawności. Przyjmując bardziej typowe miary, liczba poprawnie odnalezionch relacji to 208, wszystkich znalezionych relacji 229, wszystkich rzeczywiście występujących w biogramach relacji - 235, co dawałoby wartość precision = 0.9, recall = 0.88 i f1 = 0.889.

To wyraźnie lepszy wynik niż poprzedni osiągnięty przez GPT3 (model 'davinci-003'), ale też zgodny z oczekiwaniem, skoro wg raportu technicznego OpenAI na temat GPT4 (https://arxiv.org/abs/2303.08774), nowy model jest o 29% lepszy w unikaniu 'closed domain hallucinations' czyli wymyślania nieprawdziwych informacji, mimo instrukcji że informacje mają pochodzić tylko z podanego kontekstu, np. analizowanego artykułu.

Dla niektórych biogramów np. 'Śniadecka Kornelia Ludwika' , 'Leymiter Stanisław' czy 'Stanisław Cielątko' błędy są liczne, być może wynika to z długości i zawiłości zdań. Być może ma na to wpływ konstrukcja zadania - oczekiwane są informacje o relacjach rodzinnych głównego bohatera, jeżeli są one podane nie wprost, np. 'Siostrą żony Jana Kowalskiego była Amelia...' wymaga to przekształcenia podanej informacji do wymaganej formy -> 'szwagierka'.

Nadal pewnym problemem jest niedeterministyczny charakter dużych modeli językowych, ten sam prompt uruchamiany wielokrotnie może dawać nieco inne wyniki, nawet o tej samej poprawności, lecz nieco inaczej sformułowane. Mimo zaleconego wprost formatu odpowiedzi w powyższej analizie (główny bohater/ka -> relacja -> osoba) zdarzało się, że model zwracał albo sformułowanie "główny bohater/ka" albo podawał w tym miejscu rzeczywiste imie i nazwisko głównego bohatera. Zdarzało się także, że zwracane były relacje rodzinne innych osób występujących w tekście. Wynik nie jest więc zawsze gotowym do dalszych analiz produktem, wymaga przetworzenia i uspójnienia.

Przetwarzanie hasła SHG do formatu XML - GPT4

Test automatycznego przetwarzania fragmentu Słownika Historyczno-Geograficznego (hasło Balice, część punktu 3) za pomocą modelu GPT4 (przez API, parametr temperature = 0) do formatu XML. Użyty prompt:

Przetwórz proszę poniższy tekst zawierający regesty na plik XML. Regest zaczyna się
od daty np. 1245 lub zakresu dat 1245-56 lub daty przybliżonej np. a. 1456, po
której następuje treść regestu, a po niej - w nawiasie - źródło informacji. Po
nawiasie pojawia się średnik oddzielający regesty. Jeżeli nie ma daty na początku,
oznacza to, że data jest taka sama jak w poprzednim regeście. W treści regestu
oznacz występujące w niej osoby tagiem <persName>, miejsca tagiem <placeName>,
nazwy geograficzne tagiem <geogName> zaś nazwy urzędów zawodów lub funkcji
tagiem <occupation>. Pamiętaj, że jednoliterowe skróty, takie jak 'B.', oznaczają
miejscowość, której dotyczą regesty. Osoby pojawiające się w treści regestu to
postacie średniowieczne, które nie miały nazwisk za to dopisywały do imienia
miejscowość z której pochodzą np. Jan z Grzędowa, w takich przypadkach oznacz
osobę tagiem <persName> z miejscowością włącznie.

Przykład regestu:
a. 1396 kaszt. wiśl. Jaśko za zasługi przy chrystianizacji Litwy dostał od
Władysława Jag. m. Wojsław [nie zid.] i kilka wsi w ziemi krak. w tym wieś Grzędy
w pow. sand., którą sprzedał Krzesławowi z Wolicy. Synem Jaśka był Jan z B.
(J. Ossoliński, Pamiętnik 1595-1621, Wr. 1952, s. 4);

Przykład wyniku:
<s type="regest">
<date>a. 1396</date>
<content><occupation>kaszt. wiśl.</occupation> <persName>Jaśko</persName>
za zasługi przy chrystianizacji <geogName>Litwy</geogName> dostał od
<persName>Władysława Jag.</persName> m. <placeName>Wojsław</placeName>
[nie zid.] i kilka wsi w ziemi krak. w tym wieś <placeNme>Grzędy</PlaceName>
w pow. sand., którą sprzedał <persName>Krzesławowi z Wolicy</persName>. Synem
<persName>Jaśka</persName> był <persName>Jan z B.</persName></content>
<biblio>(J. Ossoliński, Pamiętnik 1595-1621, Wr. 1952, s. 4)</biblio>;
</s>

Przykład regestu:
1467 Albert kmieć z B. (KRK 3 s. 23);

Przykład wyniku:
<s type="regest">
<date>1467</date>
<content><persName>Albert</persName> <occupation>kmieć</occupation> z
<placeName>B.</placeName></content>
</s>

Oto tekst do przetworzenia:
1229 papież Grzegorz IX potwierdza kl. tyn. posiadanie m. in. B. (Tyn. 11b - bulla
interpol. w XV w., por. J. Wyrozumski, Państwowa gospodarka solna w Polsce do schyłku
XIV w., Kr. 1968, s. 25); a. 1286 komes Grzegorz zw. Żegocic dz. B., zabraniał kl.
dominikanów w Krakowie przeprowadzić wodę z rz. Rudawy przez Krowodrzę, → też p. 6
(KK 1, 86); 1304-6 komes Andrzej z B. (KK 2, 242; 1, 114 przy tym dok. wisiała jego
pieczęć); 1321, 1351-2, 1363 Grzegorz z B. (AS 2, 7; Mp. 3, 761; Wp. 3, 1495; ZDM 1,
63; KMK 1, 27); 1366 Jan z B. (ZDM 1, 117); 1367 Betico kmieć z B. (KRK 2 s. 13);
1387-96 Jan, Jaśko z Goźlic [pow. sand.], B. i Ossolina [pow. sand.], kaszt. wiśl.
1388-96, wg Długosza zabity przez Grota ze Słupczy [pow. sand.] w sporze o granice
wsi Dwikozy [pow. sand.] (AGZ 5, 16; AS 2, 61; KK 2, 392, 401; Mp. 4, 1022; ZDM 6,
1540, 1548, 1584; KUJ 1, 8; AKP 8, 63; Proch. 12; DH 3 s. 552 na s. 372 i 466
wiadomości odnoszą się do kaszt. wiśl. Mikołaja z Bogorii [pow. sand.], a nie
z Ossolina; MH 10 s. 148-9; Bon. 1 s. 86); a. 1396 kaszt. wiśl. Jaśko za zasługi
przy chrystianizacji Litwy dostał od Władysława Jag. m. Wojsław [nie zid.] i
kilka wsi w ziemi krak. (J. Ossoliński, Pamiętnik 1595-1621, Wr. 1952, s. 4);

Wynik w formie XML:

<regests>
    <s type="regest">
        <date>1229</date>
        <content><persName>papież Grzegorz IX</persName> potwierdza <placeName>kl. tyn.</placeName>
        posiadanie m. in. <placeName>B.</placeName></content>
        <biblio>(Tyn. 11b - bulla interpol. w XV w., por. J. Wyrozumski, Państwowa gospodarka solna w Polsce do schyłku XIV w., Kr. 1968, s. 25)</biblio>;
    </s>
    <s type="regest">
        <date>a. 1286</date>
        <content><occupation>kom</occupation> <persName>Grzegorz zw. Żegocic</persName> dz.
        <placeName>B.</placeName>, zabraniał <placeName>kl. dominikanów</placeName> w
        <placeName>Krakowie</placeName> przeprowadzić wodę z rz. <geogName>Rudawy</geogName> przez
        <placeName>Krowodrzę</placeName>, → też p. 6</content>
        <biblio>(KK 1, 86)</biblio>;
    </s>
    <s type="regest">
        <date>1304-6</date>
        <content><occupation>kom</occupation> <persName>Andrzej z B.</persName></content>
        <biblio>(KK 2, 242; 1, 114 przy tym dok. wisiała jego pieczęć)</biblio>;
    </s>
    <s type="regest">
        <date>1321</date>
        <content><persName>Grzegorz z B.</persName></content>
        <biblio>(AS 2, 7; Mp. 3, 761; Wp. 3, 1495; ZDM 1, 63; KMK 1, 27)</biblio>;
    </s>
    <s type="regest">
        <date>1351-2</date>
        <content><persName>Grzegorz z B.</persName></content>
    </s>
    <s type="regest">
        <date>1363</date>
        <content><persName>Grzegorz z B.</persName></content>
    </s>
    <s type="regest">
        <date>1366</date>
        <content><persName>Jan z B.</persName></content>
        <biblio>(ZDM 1, 117)</biblio>;
    </s>
    <s type="regest">
        <date>1367</date>
        <content><persName>Betico</persName> <occupation>kmieć</occupation> z <placeName>B.</placeName>
        </content>
        <biblio>(KRK 2 s. 13)</biblio>;
    </s>
    <s type="regest">
        <date>1387-96</date>
        <content><persName>Jan</persName>, <persName>Jaśko z Goźlic</persName> [pow. sand.],
        <placeName>B.</placeName> i <placeName>Ossolina</placeName> [pow. sand.],
        <occupation>kaszt. wiśl.</occupation> 1388-96, wg <persName>Długosza</persName> zabity
        przez <persName>Grota ze Słupczy</persName> [pow. sand.] w sporze o granice wsi
        <placeName>Dwikozy</placeName> [pow. sand.]</content>
        <biblio>(AGZ 5, 16; AS 2, 61; KK 2, 392, 401; Mp. 4, 1022; ZDM 6, 1540, 1548, 1584; KUJ 1, 8; AKP 8, 63; Proch. 12; DH 3 s. 552 na s. 372 i 466 wiadomości odnoszą się do kaszt. wiśl. Mikołaja z Bogorii [pow. sand.], a nie z Ossolina; MH 10 s. 148-9; Bon. 1 s. 86)</biblio>;
    </s>
    <s type="regest">
        <date>a. 1396</date>
        <content><occupation>kaszt. wiśl.</occupation> <persName>Jaśko</persName> za zasługi
        przy chrystianizacji <geogName>Litwy</geogName> dostał od <persName>Władysława Jag.</persName>
        m. <placeName>Wojsław</placeName> [nie zid.] i kilka wsi w ziemi krak.</content>
        <biblio>(J. Ossoliński, Pamiętnik 1595-1621, Wr. 1952, s. 4)</biblio>;
    </s>
</regests>

Trzeba jednak pamiętać, że kontekst który modele GPT są w stanie przetwarzać jest ograniczony a korzystanie z API kosztuje, można więc rozważyć rozwiązanie hybrydowe. Podzielić na przykład tekst wejściowy ze słownika SHG przy użyciu bardziej konwencjonalnych metod (Python, spaCy, regex itp.) na punkty, podpunkty i regesty, a następnie użyć modelu LLM do otagowania treści samego regestu (bez bibliografii, którą też można obsłużyć prostszymi metodami), dodatkowo model mógłby również określać temat regestu.

Formatowanie wyników - JSON

W przykładach ekstrakcji informacji z biogramów postaci historycznych wynik prezentowany był w formie listy, wygodniejszą opcją do dalszego przetwarzania byłby jednak wynik w formacie JSON. Model GPT jest oczywiście w stanie to zrobić. Modyfikacja promptu polega na zastąpieniu fragmentu opisującego format wyniku w formie listy przez tekst:

Wynik przedstaw w formie listy obiektów JSON zawierających pola:
relacja: rodzaj pokrewieństwa (kim osoba była dla bohatera/bohaterki )
osoba: nazwa (imię i nazwisko osoby związanej relacją z bohaterem)

a także podaniu nowego przykładowego wyniku:

Przykład: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Jego bratanicą była Małgorzata Anna, żona
Winfrida de Loeve. S. ożenił się z Joanną, córką burgrabiego
krakowskiego Adama Kurozwęckiego."
Wynik:
[{"relacja":"ojciec", "osoba":"Niccola"},
 {"relacja":"matka", "osoba":"Annalena Ricasoli"},
 {"relacja":"brat", "osoba":"Bernard"},
 {"relacja":"bratanica", "osoba":"Małgorzata Anna"},
 {"relacja":"żona", "osoba":"Joanna"},
 {"relacja":"teść", "osoba":"Adam Kurozwęcki"}
]

skrypt przetwarza biogram, np. Jadwigi Jagiellonki, zwracając wynik w formacie JSON, ułatwiając późniejsze automatyczne przetwarzanie, porównywanie wyniku z oczekiwanym itp.

[{"relacja":"ojciec", "osoba":"Kazimierz Jagiellończyk"},
 {"relacja":"matka", "osoba":"Elżbieta Rakuszanka"},
 {"relacja":"mąż", "osoba":"Jerzy Bawarski"},
 {"relacja":"syn", "osoba":"Ludwik"},
 {"relacja":"syn", "osoba":"Ruprecht"},
 {"relacja":"córka", "osoba":"Elżbieta"},
 {"relacja":"córka", "osoba":"Małgorzata"},
 {"relacja":"brat", "osoba":"Władysław Jagiellończyk"},
 {"relacja":"brat", "osoba":"Aleksander"},
 {"relacja":"brat", "osoba":"Zygmunt I"},
 {"relacja":"teść", "osoba":"Ludwik Bogaty"},
 {"relacja":"zięć", "osoba":"Ruprecht hr. Palatynatu"}
]

A przy okazji, jaki jest koszt przetworzenia biogramu Jadwigi Jagiellonki? Tekst biogramu ma niecałe 5000 znaków (2504 tokeny), zaś odpowiedź to 264 tokeny, cena użycia moelu GPT-4 przez API to 0.03$ za dane wejściowe, 0.06$ za wygenerowaną odpowiedź (ceny za 1 tys. tokenów). W przypadku omawianego biogramu przekłada się to obecnie na 0.09$ (czerwiec 2023). Nie jest to więc tani proces.

Indeterminizm i halucynacje

Ekstracja informacji z opracowań i źródeł historycznych wymaga dokładności i poprawności wyników. Model językowy mimo swoich ogromnych możliwości w dziedzinie przetwarzania tekstu będzie przygotowywał także błędne odpowiedzi ('halucynacje'), będzie też 'zmieniał zdanie'. Ustawienie parametru uruchomienia modelu 'temperature' na wartość 0 zmniejsza jego twórcze skłonności, co jest efektem pożądanym w przypadku wydobywania wiedzy z tekstu, jednak wynik zapytań do API zwracany przez model GPT-4 nadal może i będzie się nieco różnić przy każdym wywołaniu. LLM są z natury niedeterministyczne (zob. https://platform.openai.com/docs/guides/gpt/faq - punkt: "Why are model outputs inconsistent?"). Można ten efekt zaobserwować uruchamiając wielokrotnie to samo zapytanie dotyczące relacji rodzinnych Jadwigi Jagiellonki, które przetwarza ten sam tekst biogramu (link do skryptu). Zapytanie (prompt) zostało wzbogacone o przykład danych do przetworzenia i przykład wyniku (few-shot learning). Około 80-90% odpowiedzi pozostaje niezmienna (i poprawna), jednak pozostała część wyniku zmienia się, czasem są to odpowiedzi poprawne, czasem całkowicie błędne. Wydaje się, na podstawie prostej obserwacji, że zmienność dotyczy trudniejszych do wyodrębnienia realacji typu 'zięć', 'teść', 'wnuk', zaś realcje typu 'ojciec', 'matka', 'mąż', 'córka', 'syn', 'brat' wyszukiwane są konwekwentnie i poprawnie. Być może znaczenie ma sposób formułowania treści w analizowanym biogramie. Im bardziej zawiły, 'literacki' sposób opisu tym większa szansa, że model będzie niepoprawnie interpretował informacje.

Wykonano 10 testów na biogramie Jadwigi Jagiellonki, pozyskane informacje były praktycznie za każdym razem inne - przy tej samej zawartości promptu i tekstu wejściowego. Z tego 10 relacji powtarzało się dla każdego testu:

 {"relacja":"ojciec", "osoba":"Kazimierz Jagiellończyk"},
 {"relacja":"matka", "osoba":"Elżbieta Rakuszanka"},
 {"relacja":"mąż", "osoba":"Jerzy Bawarski"},
 {"relacja":"syn", "osoba":"Ludwik"},
 {"relacja":"syn", "osoba":"Ruprecht"},
 {"relacja":"córka", "osoba":"Elżbieta"},
 {"relacja":"córka", "osoba":"Małgorzata"},
 {"relacja":"brat", "osoba":"Władysław Jagiellończyk"},
 {"relacja":"brat", "osoba":"Aleksander"},
 {"relacja":"brat", "osoba":"Zygmunt I"},

Zaś dodatkowo mogły pojawiać się inne relacje, od 1 do 4. W dwóch testach dodatkowych relacji nie było.

test 1:
 {"relacja":"teść", "osoba":"Ludwik Bogaty"} = OK
 {"relacja":"zięć", "osoba":"Ruprecht hr. Palatynatu"} = OK
test 2:
 {"relacja":"teściowa", "osoba":"Dorota Koniecpolska"} = BŁĄÐ
 {"relacja":"zięć", "osoba":"Ruprecht hr. Palatynatu"} = OK
 {"relacja":"wnuczka", "osoba":"Małgorzata"} = BŁĄÐ
test 3:
 {"relacja":"wnuk", "osoba":"Ruprecht hr. Palatynatu"} = BŁĄÐ
test 4:
 {"relacja":"siostrzeniec", "osoba":"Ruprecht hr. Palatynatu"} = BŁĄÐ
 {"relacja":"wnuk", "osoba":"wnuk Jadwigi Jagiellonki"} = OK
test 5:
 brak dodatkowych relacji (a są trzy, takie jak w teście nr 1 oraz anonimowy wnuk bohaterki biogramu)
test 6:
 {"relacja":"zięć", "osoba":"Ruprecht hr. Palatynatu"} = OK
 {"relacja":"wnuk", "osoba":"wnuk Jadwigi Jagiellonki"} = OK
test 7:
 {"relacja":"wnuk", "osoba":"Ruprecht hr. Palatynatu"} = BŁĄÐ
test 8
 brak dodatkowych relacji (jw)
test 9
 {"relacja":"teściowa", "osoba":"Dorota Koniecpolska"} = BŁĄÐ
 {"relacja":"zięć", "osoba":"Ruprecht hr. Palatynatu"} = OK
 {"relacja":"wnuczka", "osoba":"Małgorzata"} = BŁĄÐ
test 10:
 {"relacja":"wnuk", "osoba":"Ruprecht hr. Palatynatu"} = BŁĄÐ
 {"relacja":"siostrzeniec", "osoba":"Ruprecht hr. Palatynatu"} = BŁĄÐ
 {"relacja":"szwagierka", "osoba":"Anna, księżna wdowa cieszyńska"} = BŁĄÐ
 {"relacja":"siostrzenica", "osoba":"Małgorzata, ksieni benedyktynek w Neuburg"} = BŁĄÐ

Jak widać w 6 na 10 testów pojawiają się relacje nieprawdziwe, nie da się ich w żaden sposób uzasadnić zawartością tekstu biogramu, mniej szkodliwy wydaje się kompletny brak odnalezienia istniejących relacji co zdarzyło się w 2 testach.

Ponieważ w przypadku ekstrakcji informacji z tekstów zajmujemy się informacjami, których jeszcze nie znamy (nie mamy bazy danych czy grafu wiedzy), trudno byłoby przeprowadzić werfikację faktów inaczej niż manualnie porównując tekst z pozyskanymi przez model danymi. Taki proces jest jednak czasochłonny i zniwelowałby cały zysk z automatyzacji przetwarzania dużej ilości tekstu. Czy rozwiązaniem było by powtarzanie każdego zapytania np. 3 razy i uznawanie powtarzających się odpowiedzi za wiarygodne zaś pozostałych za wymagające weryfikacji - trudno powiedzieć, ale jest przecież możliwe, że konsekwetnie w każdym teście pojawiać będą się informację błędne a więc niewiarygodne. Manualna weryfikacja danych pozyskanych dzięki dużym modelom językowym wydaje się, na dziś, nieunikniona. Może być jednak wspomagana dodatkowymi narzędziami, weryfikującymi strukturę wyników zwróconych przez LLM, czy prawdopodobieństwo pozyskanych faktów (np. wiek osoby powinien mieścić się w zakresie 0-110), nazwy relacji rodzinnych powinny pochodzić z określonego zbioru itp.

Test modelu Nous-Hermes-13b

Wyniki testów modelu Nous-Hermes-13b uruchamianego lokalnie (tylko CPU) na tej samej próbce 50 biogramów, na których testowane były modele GPT-3 i GPT-4 w zakresie ekstrakcji informacji dotyczących relacjach rodzinnych. Badany model (https://huggingface.co/NousResearch/Nous-Hermes-13b) jest dotrenowaną wersją Llama-13b. Ze względu na to, że jest mniejszy od modeli GPT i uruchamiany był lokalnie (co jest dosyć czasochłonne na komputerze bez GPU), przetwarzanie biogramów zostało uproszczone do jednego pytania - o ojca bohatera/bohaterki tekstu.

Użyty prompt:

Na podstawie wyłącznie informacji z podanego tekstu napisz kto był ojcem <person>.
Wynik zapisz w formacie JSON.
Na przykład:
Tekst: "Łukasz Kowalski (1901-1987) ur. w Bogatce z ojca Hieronima i matki Heleny z Kruszyńskich."
Wynik: {"ojciec": "Hieronim Kowalski"}
Tekst: "Marcin Wielopolski (1700-1776), szlachcic pomorski, ur. w Ustce. Ojcem W. był Antoni, herbu Trójnóg."
Wynik: {"ojciec": "Antoni Wielopolski"}
Tekst: "Eustachy Wikozy (zm. 1233), pochodzenie nienane, klucznik gnieźnieński."
Wynik: {"ojciec":"brak danych"}

Tekst: <data>
Wynik:

Gdzie w miejscu <person> wstawiane było imię i nazwisko bohatera, zaś w miejsce <data> uproszczony tekst biogramu. W porównaniu z GPT-4 model Nous-Hermes-13b może przetworzyć dużo mniejszy rozmiar kontekstu (2048 tokenów), dlatego zarówno treść pytania, przykłady, jak i sam biogram musiały zostać ograniczone. Biogramy w przypadku gdy przekraczały 1700 tokenów były ograniczane do 3 początkowych i 2 końcowych zdań, oraz tych zdań gdzie występowały słowa kluczowe związane z pokrewieństwem, co mogło niestey wpłynąć na efekty działania modelu.

Results:

Postać / Rezultat Prawidłowo?
Aloe Franciszek Eljasz
{"ojciec": "Jan Baptysta d’Aloy i Henryka Rakocy"} True?
Bartoszewski Jan
"The father of Jan Bartoszewski is not mentioned in the given text." True
Bezprym
{"ojciec": "Bolesław Chrobry"} True
Dąbrowska_Pelagia
{"ojciec": "Michał Zgliczyński"} True
Daszyński Ignacy
...Ignacy Daszyński miał ojca Ferdynanda. True
Dzierżek_Natalia
{"ojciec": "Henryk Dzierżek"} True
Eufrozyna
{"ojciec": "Kazimierz, ks. opolski"} True
Ewild al. Eywild
{"ojciec": "Eywild al. Eywild Jan"} False
Ezra ben Nisan
{"ojciec": "Ezra ben Nisan z Trok, inaczej Ezra Nisanowicz (ok. 1596–1666)"} False
Falęta
{"ojciec": "brak danych"} True
Fiorentini Władysław
{"ojciec": "Antoni Fiorentini"} True
Fuzorius Bartłomiej
{"ojciec": "Stanisław Lwowczyk"} True
Gliński Iwan
{"ojciec": "Lew Borysowicz"} True
Gołaski Jan
{"ojciec": "Jan Gołaski"} False
Grzegorzewski Jan
{"ojciec": "Jakub"} True
Guicciardini Galeazzo
{"ojciec": "Guicciardini Galeazzo"} False
Hincza z Rogowa
{"ojciec": "Hinczka z Rogowa (zm. przed 1415)"} True
Hirschenfeld-Mielecki Józef
{"ojciec": "brak danych"} True
Jadwiga Jagiellonka
{"ojciec": "Kazimierz Jagiellończyk"} True
Kakowski Aleksander
{"ojciec": "Franciszek Kakowski"} True
Krumhausen Gabriel
{"ojciec": "Joachim Krumhausen"} True
Łańcucki Wojciech
{"ojciec": "Stanisław Łańcucki"} True
Langfort Teodor Henryk
{"ojciec": "brak danych"} True
Leymiter Stanisław
{"ojciec": "Mikołaj Leymiter"} True
Mierzeński Aleksander
{"ojciec": "Abraham Mierzeński"} True
Mostowska z Bujwidów
{"ojciec": "Odo Bujwid, prof. bakteriologii UJ"} True
Patruus
{"ojciec": "Jan Patruus"} False
Pichgiel
{"ojciec": "Christian Pichgiel młodszy"} False
Pion Maurice
{"ojciec": "Antoine Claude Pion"} True
Piotrowiczowa z Rogolińskich
{"ojciec": "Zygmunt Rogoliński"} True
Popiel
{"ojciec": "Popiel"} False
Renard Benedykt
{"ojciec": ""} True
Rossi Piotr
{"ojciec": "Andrzej Rossi"} True
Sapieha_Jan_Fryderyk
...ojcem Jan Fryderyk Sapieha był Fryderyk True
Siemowit
The prompt asks to determine who was the father of Siemowit.. False
Śląska Aleksandra
{"ojciec": "Edmund Wąsik"} True
Słowicki Józef
{"ojciec": "Józef Słowicki"} True
Śniadecka Kornelia Ludwika
{"ojciec": "Jędrzej Śniadecki"} True
Spektor Mordechaj
{"ojciec": "Mordechaj Spektor"} False
Spycigniew_z_Dąbrowy
{"ojciec": "brak danych"} True
Stańczakowa ze Strancmanów
{"ojciec": "Adolf Strancman"} True
Stanisław_Cielątko
{"ojciec": "Jan Cielątko"} True
Strzelecki Wiesław Marian
{"ojciec": "Felicjan Strzelecki"} True
Swach Jerzy
{"ojciec": "Udalryk (Oldrzycha) Swach"} True
Świrski Jerzy Włodzimierz
{"ojciec": "Włodzimierz Świrski"} True
Szapira Majer
{"ojciec": "Jakub Szamszon (1861–1948)"} True
Szapocznikow_Alina
The father of Alina Szapocznikow is Jakub Szapocznik (1896-1938) True
Szczubioł_Andrzej
{"ojciec": "Stefan Szczubioł z Jasieńca i Ciechomic"} True
Sztaffel Izrael
{"ojciec": "Izrael Abraham Sztaffel"} False
Szumski Boksa
{"ojciec": "brak danych"} True?

W 2 wątpliwych przypadkach do wyniku True/False dodano znak zapytania (raz model zwrócił i ojca i matkę, za drugim razem brak danych, tymczasem biogram wspomina o prawdopodobnym ojcu). Efekt pracy modelu to 40/50 poprawnych odpowiedzi czyli 80% dokładności, co wydaje się bardzo dobrym wynikiem. Porównując go jednak z osiągnięciami GPT-4, jeżeli spojrzeć tylko na wyniki dotyczące kategorii 'ojciec' to najlepszy obecnie model językowy popełnił tylko 1 błąd (98%) a sama relacja 'bohater->ojciec' wydaje się jedną z najprostszych do uzyskania. Mimo wszystko jednak, Nous-Hermes-13b jest wielokrotnie mniejszym i prostszym modelem, jest dostępny za darmo do użytku niekomercyjnego, można go uruchomić na zwykłym laptopie bez GPU (ale z 16GB RAM i będzie to działać bardzo powoli), lecz co najważniejsze przetwarzane są teksty w języku polskim!

Inne uwagi:

  • model ma niekiedy problem ze zwracaniem wyniku w oczekiwanym formacie,
  • czas oczekiwania na wynik, mimo skrócenia biogramów to 2-7 minut na biogram,
  • jest bardzo wrażliwy na kształt i treść promptu, niewielka zmiana potrafiła znacznie pogorszyć wynik

Weryfikacja wyników zwracanych przez LLM - guardrails

Wyniki zwracane przez LLM są zmienne, nie zawsze we właściwym oczekiwanym formacie, nie zawsze prawdziwe, nawet w przypadku przekazania wysokiej jakości treści do kontekstu zapytania. Wymagają więc weryfikacji przed dalszym użyciem, na przykład zapisaniem w bazie wiedzy. Aby ułatwić tą procedurę można skorzystać z guardrails - gotowej biblioteki języka Python, która ułatwia weryfikację zarówno struktury odpowiedzi, jak i w pewnym stopniu weryfikację faktów.

Biblioteka guardrails posługuje się specyfikacjami zapisanymi w formie plików xml w standardzie RAIL (Reliable AI markup Language), w którym opisana jest struktura oczekiwanego wyniku, format pól wyniku, opcjonalne walidacje, prompt.

Przykładowy plik RAIL dla zapytania zwracającego podstawowe dane bohatera/bohaterki biogramu wygląda następująco:

<rail version="0.1">

<output>
    <object name="person_info">
        <string name="place_of_birth" description="Miejsce urodzenia bohatera/bohaterki biogramu" />
        <string name="place_of_death" description="Miejsce śmierci bohatera/bohaterki biogramu" />
        <string name="place_of_burial" description="Miejsce pochówku bohatera/bohaterki biogramu " />
        <date name="date_of_birth" description="Data urodzenia bohatera/bohaterki biogramu" date_format='%Y-%m-%d'/>
        <date name="date_of_death" description="Data śmierci bohatera/bohaterki biogramu" date_format='%Y-%m-%d'/>
        <date name="date_of_burial" description="Data pochówku bohatera/bohaterki biogramu" date_format='%Y-%m-%d'/>
    </object>
</output>

<prompt>
Na podstawie podanego tekstu biografii wyszukaj miejsce urodzenia, miejsce śmierci i miejsce pochówku głównego bohatera/bohaterki.
Podaj także datę urodzenia i datę śmierci oraz datę pochówku.

Tekst: {{document}}

@xml_prefix_prompt

{output_schema}

@json_suffix_prompt
</prompt>
</rail>

Poniżej prosty program korzystający z biblioteki guardrails i specyfikacji RAIL zapisanej w pliku person_basic.xml:

""" guardrails - podstawowe informacje o postaci z biogramu  """
import os
from pathlib import Path
import guardrails as gd
import openai
from dotenv import load_dotenv


# api key
env_path = Path(".") / ".env"
load_dotenv(dotenv_path=env_path)

OPENAI_ORG_ID = os.environ.get('OPENAI_ORG_ID')
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')

openai.api_key = OPENAI_API_KEY

# biogram
file_path = Path(".") / 'Szpręga Teodor.txt'
with open(file_path, 'r',encoding='utf-8') as f:
    content = f.read()

# create a Guard object
rail_spec_path = Path(".") / 'person_basic.xml'
guard = gd.Guard.from_rail(rail_spec_path)

raw_llm_output, validated_output = guard(
    openai.ChatCompletion.create,
    prompt_params={"document": content},
    max_tokens=800,
    model="gpt-3.5-turbo-16k",
    temperature=0
)

# result
print(validated_output)

Wynik działania skryptu:

{
  "person_info": {
    "place_of_birth": "Czersk",
    "place_of_death": "Osieczna",
    "place_of_burial": "Osieczna",
    "date_of_birth": "1833-11-01",
    "date_of_death": "1911-07-26",
    "date_of_burial": null
  }
}

Przykład ekstrakcji informacji z biogramu PSB

Analizowany biogram Teodora Szpręgi pochodzi z 49 tomu PSB wydanego w 2013 roku. Za pomocą modelu GPT-4 spróbowano wydobyć z tekstu biogramu wszystkie informacje niezbędne do przygotowania danych do wprowadzenia do instancji wikibase. W szczególności:

  • dane podstawowe: data i miejsce urodzenia, data i miejsce śmierci, data i miejsce pochówku postaci
  • dane o funkcjach, urzędach pełnionych przez postać
  • dane o relacjach rodzinnych
  • dane o instytucjach, z którymi był związany bohater biogramu
  • dane o miejscowościach, z którymi był związany bohater biogramu
  • dane o ważnych dla bohatera biogramu osobach (poza krewnymi) a także jednozdaniowe streszczenie biogramu, które można wykorzystać jako opis elementu w wikibase
  • pseudonimy, warianty nazwisk i imion bohatera biogramu.

Poniżej lista promptów wraz z wynikami, w przykładach użyto danych fikcyjnej postaci.

Prompt dla podstawowych danych:

Na podstawie podanego tekstu biografii wyszukaj miejsce urodzenia, miejsce śmierci i miejsce pochówku głównego bohatera/bohaterki.
Podaj także datę urodzenia i datę śmierci.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
place_of_birth: miejsce urodzenia bohatera/bohaterki
place_of_death: miejsce śmierci bohatera/bohaterki
place_of_burial: miejsce pochówku bohatera/bohaterki
date_of_birth: data urodzenia bohatera/bohaterki
date_of_death: data śmierci bohatera/bohaterki
date_of_burial: data pochówku bohatera/bohaterki
Jeżeli jakiejś informacji brak w podanym tekście napisz: 'brak danych'

Przykład 1.
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Ur. się 1 czerwca, we wsi Andalewo koło Wyszeborga. Jego bratanicą była Małgorzata Anna, żona
Winfrida de Loeve. S. ożenił się z Joanną, córką burgrabiego
krakowskiego Adama Kurozwęckiego. Zmarł w Hurczynianach, pochowano go na miejscowym cmentarzu parafialnym."
Wynik:
[{"place_of_birth":"Andalewo"},
 {"place_of_death":"Hurczyniany"},
 {"place_of_burial":"cmentarz parafialny w Hurczynianach"},
 {"date_of_birth":"1557-06-01"},
 {"date_of_death":"1591"},
 {"date_of_burial":"brak danych"}
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"place_of_birth":"Czersk"},
  {"place_of_death":"Osieczna"},
  {"place_of_burial":"plac przed kościołem w Osiecznej"},
  {"date_of_birth":"1833-11-01"},
  {"date_of_death":"1911-07-26"},
  {"date_of_burial":"brak danych"}
]

Uwaga: w przypadku tego promptu identyczne wyniki zwracał także model gpt-3.5-turbo (znacznie tańszy niż GPT-4), jednak dla pozostałych zapytań jakość odpowiedzi modelu gpt-4 była wyraźnie lepsza.

Prompt dla funkcji i urzędów:

Na podstawie podanego tekstu biografii wyszukaj wszystkie urzędy i funkcje pełnione przez głównego bohatera/bohaterkę.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
function: funkcja, urząd pełnione przez bohatera/bohaterkę

Przykład 1.
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Jego bratanicą była Małgorzata Anna, żona
Winfrida de Loeve. S. ożenił się z Joanną, córką burgrabiego
krakowskiego Adama Kurozwęckiego."
Wynik:
[{"function":"kupiec"},
 {"function":"bankier"}
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"role_or_office":"reformat"},
  {"role_or_office":"misjonarz"},
  {"role_or_office":"komisarz generalny w Poznańskiem"},
  {"role_or_office":"uczeń w gimnazjum katolickim w Chojnicach"},
  {"role_or_office":"zakonnik Zakonu Braci Mniejszych w Prow. Reformatów Niepokalanego Poczęcia NMP"},
  {"role_or_office":"student filozofii i teologii w klasztorze w Łąkach"},
  {"role_or_office":"kapłan"},
  {"role_or_office":"student teologii w Prow. Rekolektów Krzyża Świętego w Westfalii"},
  {"role_or_office":"wykładowca historii Kościoła w studium seminaryjnym w Miejskiej Górce"},
  {"role_or_office":"wicemagister nowicjatu w Wejherowie"},
  {"role_or_office":"kaznodzieja w Wejherowie"},
  {"role_or_office":"dyrektor Trzeciego Zakonu w Wejherowie"},
  {"role_or_office":"gwardian w Wejherowie"},
  {"role_or_office":"gwardian i dyrektor domu księży demerytów w Osiecznej"},
  {"role_or_office":"kaznodzieja w Zamartem i Miejskiej Górce"},
  {"role_or_office":"misjonarz apostolski"},
  {"role_or_office":"kapelan sióstr franciszkanek i ambasady austro-węgierskiej w Stambule"},
  {"role_or_office":"wikariusz w Kurzętniku"},
  {"role_or_office":"wikariusz w Zblewie"},
  {"role_or_office":"wikariusz parafii w Miejskiej Górce"},
  {"role_or_office":"duszpasterz w kościele zakonnym na Goruszkach"},
  {"role_or_office":"wikariusz parafii w Dubinie"},
  {"role_or_office":"zastępca prowincjała"},
  {"role_or_office":"komisarz generalny"},
  {"role_or_office":"dyrektor domu księży demerytów w Osiecznej"},
  {"role_or_office":"zastępca proboszcza parafii w Drzeczkowie"}
]

Uwaga: wszystkie przygotowane przez model informacje są prawdziwe, raczej nie pominięto żadnej funkcji/urzędu, można zauważyć ewentualne drobne niezręczności - jeżeli bohater zastępował proboszcza to (chyba) nie pełnił funkcji zastępcy proboszcza, tylko tymczasowo był proboszczem.

Prompt dla relacji rodzinnych:

Na podstawie podanego tekstu wyszukaj wszystkich krewnych lub powinowatych głównego bohatera tekstu: {name}. Możliwe rodzaje pokrewieństwa: ojciec, matka, syn, córka, brat, siostra, żona, mąż, teść, teściowa, dziadek, babcia, wnuk, wnuczka, szwagier, szwagierka, siostrzeniec, siostrzenica, bratanek, bratanica, kuzyn, kuzynka, zięć, synowa.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
family relation: rodzaj pokrewieństwa (kim osoba była dla bohatera/bohaterki )
person: nazwa (imię i nazwisko osoby związanej relacją z bohaterem)
Wypisz tylko rodzaje pokrewieństwa, które występują w tekście.
Jeżeli w tekście nie ma żadnych informacji o pokrewieństwach głównego bohatera napisz: "brak danych".

Przykład 1
Tekst: "Soderini Carlo (ok. 1537–1581), kupiec i bankier. Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym bratem Bernarda (zob.).
Jego bratanicą była Małgorzata Anna, żona Winfrida de Loeve. S. ożenił się z Joanną, córką burgrabiego krakowskiego Adama Kurozwęckiego."
Wynik:
[{"family_relation":"ojciec", "person":"Niccola Ricasoli"},
 {"family_relation":"matka": "person":"Annalena Ricasoli"},
 {"family_relation":"brat": "person":"Bernard"},
 {"family_relation":"bratanica": "person":"Małgorzata Anna"},
 {"family_relation":"żona": "person":"Joanna"},
 {"family_relation":"teść": "person":"Adam Kurozwęcki"}
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"family_relation":"ojciec", "person":"Ignacy"},
  {"family_relation":"matka", "person":"Katarzyna Sabiniarz"}
]

Uwaga: to poprawny wynik, wymienione zostały wszystkie relacje rodzinne głównego bohatera biogramu.

Prompt zwracający instytucje, z którymi był związany bohater biogramu:

Na podstawie podanego tekstu biografii wyszukaj instytucje związane z głównym bohaterem/bohaterką.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
institution: nazwa instytucji związanej z bohaterem/bohaterką
place_of_institution: miejscowość w której położona jest instytucja związana z bohaterem/bohaterką
Miejscowość podaj w mianowniku.
Jeżeli jakiejś informacji brak w podanym tekście napisz: 'brak danych'

Przykład 1.
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Ur. się 1 czerwca, we wsi Andalewo koło Wyszeborga.
Pracował w Banku Czeskim we Wrocławiu, później zaś praktykował w Izbie Celnej miasta Gdańska.
Zmarł w Hurczynianach, pochowano go na miejscowym cmentarzu parafialnym."
Wynik:
[{"institution":"Bank Czeski", "place_of_institution":"Wrocław"},
 {"institution":"Izba Celna", "place_of_institution":"Gdańsk"}
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"institution":"Gimnazjum katolickie", "place_of_institution":"Chojnice"},
  {"institution":"Zakon Braci Mniejszych", "place_of_institution":"Wejherowo"},
  {"institution":"Klasztor w Łąkach", "place_of_institution":"Łąki"},
  {"institution":"Prowincja Rekolektów Krzyża Świętego", "place_of_institution":"Westfalia"},
  {"institution":"Studium seminaryjne", "place_of_institution":"Miejska Górka"},
  {"institution":"Dom księży demerytów", "place_of_institution":"Osieczna"},
  {"institution":"Klasztor przy kościele NMP (zwanej Draperis)", "place_of_institution":"Stambuł"},
  {"institution":"Kaplica ambasady austro-węgierskiej", "place_of_institution":"Stambuł"},
  {"institution":"Parafia w Kurzętniku", "place_of_institution":"Kurzętnik"},
  {"institution":"Parafia w Zblewie", "place_of_institution":"Zblewo"},
  {"institution":"Parafia w Miejskiej Górce", "place_of_institution":"Miejska Górka"},
  {"institution":"Kościół zakonny na Goruszkach", "place_of_institution":"Miejska Górka"},
  {"institution":"Parafia w Dubinie", "place_of_institution":"Dubin"},
  {"institution":"Parafia w Drzeczkowie", "place_of_institution":"Drzeczkowo"}
]

Uwagi: Trudno powiedzieć skąd model wziął "kaplicę ambasady", to raczej przykład halucynacji - w tekście jest tylko mowa o tym, że bohater biogramu był kapelanem ambasady austro-węgierskiej.

Prompt dla miejscowości, związanych z bohaterem/bohaterką biogramu:

Na podstawie podanego tekstu biografii wyszukaj miejscowości związane z głównym bohaterem/bohaterką.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
place: nazwa miejscowości związanej z bohaterem/bohaterką
date: data, kiedy bohater/bohaterka przebywał w danej miejscowości
Miejscowość podaj w mianowniku.
Jeżeli jakiejś informacji brak w podanym tekście napisz: 'brak danych'

Przykład 1.
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Ur. się 1 czerwca, we wsi Andalewo koło Wyszeborga.
Pracował w Banku Czeskim we Wrocławiu w latach 1577-78, później zaś, od 1579 roku praktykował w Izbie Celnej miasta Gdańska.
Pod koniec życia zamieszkał w Elblągu w pobliżu portu.
Zmarł w Hurczynianach, pochowano go na miejscowym cmentarzu parafialnym."
Wynik:
[{"place":"Andalewo", "date":"1557-06-01"},
 {"place":"Wrocław", "date":"1577-1578"},
 {"place":"Gdańsk", "date":"1579"},
 {"place":"Elbląg", "date":"brak danych"},
 {"place":"Hurczyniany", "date":"1591"}
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"place":"Czersk", "date":"1833-11-01"},
  {"place":"Chojnice", "date":"brak danych"},
  {"place":"Wejherowo", "date":"1856-05-05"},
  {"place":"Łąki", "date":"1857-05-06"},
  {"place":"Westfalia", "date":"brak danych"},
  {"place":"Miejska Górka", "date":"1861-09-02"},
  {"place":"Osieczna", "date":"1865-07"},
  {"place":"Zamarte", "date":"1870"},
  {"place":"Stambuł", "date":"1872-05"},
  {"place":"Adampol", "date":"brak danych"},
  {"place":"Rzym", "date":"1881-07-05"},
  {"place":"Kurzętnik", "date":"1884"},
  {"place":"Zblewo", "date":"1885-01"},
  {"place":"Goruszki", "date":"1887-07"},
  {"place":"Dubinie", "date":"1887-09-05"},
  {"place":"Poznań", "date":"brak danych"},
  {"place":"Asyż", "date":"1895-05-16"},
  {"place":"Drzeczkowo", "date":"1900-10-09"}
]

Uwagi: Nie została uwzględniona miejscowość, w której zmarł bohater biogramu, być może dlatego że wystąpiła też wcześniej, a w zapytaniu nie było jasno określone, że miejscowości mogą wystąpić wielokrotnie z różnymi datami.

Jedna z miejscowości na liście pojawia się w odmienionej formie (Dubinie) mimo wyraźnej wskazówki w prompcie, by nazwy miejscowości wymienione zostały w mianowniku.

Informacja dotycząca Poznania mówi tylko o wydaniu reguł zakonnych przez bohatera, nie musi to oznaczać, że przebywał on w tym mieście, ten wynik można więc uznać za wątpliwy.

Pominięte zostały Wiedeń i Triest przez które bohater podróżował w 1872 roku.

Prompt zwracający listę ważnych osób dla głównej postaci biogramu:

Na podstawie podanego tekstu biografii wyszukaj osoby związane z głównym bohaterem/bohaterką, lecz pomiń krewnych i powinowatych.
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
name: imię i nazwisko osoby związanej z bohaterem/bohaterką
date: data, kiedy bohater/bohaterka spotkał/zetknał się z daną osobą
info: dodatkowe informacje o osobie np. funkcja, zawód
Jeżeli jakiejś informacji brak w podanym tekście napisz: 'brak danych'

Przykład 1.
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Ur. się 1 czerwca, we wsi Andalewo koło Wyszeborga. Od 1567 roku uczył się w szkole wiejskiej
prowadzonej przez księdza Jana Tokalskiego z Krakowa. Następnie wstąpił na uniwersystet w Królewcu, gdzie zaprzyjaźnił się
ze Zdenkiem Kovacem, synem właściciela banku w Pradze, oraz z Czesławem Dąbkiem.
Pracował w Banku Czeskim we Wrocławiu w latach 1577-78, później zaś, od 1579 roku praktykował w Izbie Celnej miasta Gdańska.
Pod koniec życia zamieszkał w Elblągu w pobliżu portu, gdzie jeszcze w 1590 r. prowadził interesy handlowe z Morycem Wachowskim,
kupcem zbożowym.
Zmarł w Hurczynianach, pochowano go na miejscowym cmentarzu parafialnym."
Wynik:
[{"name":"Jan Tokalski", "date":"1567", "info":"ksiądz"},
 {"name":"Zdenek Kovac", "date":"brak danych","info":"syn właściciela banku"},
 {"name":"Czesław Dąbek", "date":"brak danych","info":"brak danych"},
 {"name":"Moryc Wachowski", "date":"1590", "info":"kupiec zbożowy"},
]

Tekst: [TEKST_BIOGRAMU]

Wynik:

[
  {"name":"Jerzy Jeschke", "date":"1858", "info":"chełmiński biskup pomocniczy"},
  {"name":"Pacyfik Bydłowski", "date":"1881","info":"były prowincjał i definitór generalny zakonu"},
  {"name":"Bernardyn Dal Vago", "date":"brak danych","info":"generał reformatów"},
  {"name":"Roger Binkowski", "date":"1889", "info":"prowincjał"},
  {"name":"Alojzy Canali", "date":"1890", "info":"generał reformatów"},
  {"name":"Florian Stablewski", "date":"1900", "info":"arcybiskup gnieźnieński i poznański"},
  {"name":"Euzebiusz Stateczny", "date":"1904", "info":"brak danych"},
  {"name":"Dionizy Schuler", "date":"1906", "info":"generał zakonu"}
]

Uwagi: pominięty ks. Michał Ławrynowicz, którego relację bohater spisywał - co chyba oznacza że go spotkał (?).

Prompt tworzący jednozdaniowe streszczenie biogramu:

Na podstawie podanego tekstu napisz jednozdaniowy opis głównego bohatera/bohaterki, który będzie opisem itemu w bazie wiedzy na temat tej postaci.

Przykład 1
Tekst: "Soderini Carlos (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Ur. się 1 czerwca, we wsi Andalewo koło Wyszeborga. Od 1567 roku uczył się w szkole wiejskiej
prowadzonej przez księdza Jana Tokalskiego z Krakowa. Następnie wstąpił na uniwersystet w Królewcu, gdzie zaprzyjaźnił się
ze Zdenkiem Kovacem, synem właściciela banku w Pradze.
Pracował w Banku Czeskim we Wrocławiu w latach 1577-78, później zaś, od 1579 roku praktykował jako młodszy asystent celny w Izbie Celnej miasta Gdańska.
Pod koniec życia zamieszkał w Elblągu w pobliżu portu, gdzie prowadził interesy handlowe z Morycem Wachowskim.
Zmarł w Hurczynianach, pochowano go na miejscowym cmentarzu parafialnym."
Wynik:
"Soderini Carlos (ok. 1557–1591), kupiec, bankier i asystent celny, studiował na Uniwersytecie w Królewcu."

Tekst: [TEKST_BIOGRAMU]

Wynik:

"Szpręga Teodor (1833–1911), reformat, misjonarz i komisarz generalny, prowadził
nauczanie w szkole seminaryjnej, służył jako kapelan w Stambule i pracował na
odbudowę zakonu w Polsce."

Wynik z parametrem temperature = 0.0:

"Teodor Szpręga (1833-1911), reformat, misjonarz i komisarz generalny
w Poznańskiem, był wykładowcą historii Kościoła, kaznodzieją, kapelanem
sióstr franciszkanek i ambasady austro-węgierskiej w Stambule oraz dyrektorem
domu księży demerytów w Osiecznej."

Wynik przygotowany przez model gpt-3.5-turbo (również z parametrem temperature = 0.0):

Szpręga Teodor, w zakonie Anastazy (1833—1911), reformat, misjonarz i komisarz
generalny w Poznańskiem, autor przetłumaczonej na język polski "Reguły Trzeciego
Zakonu S. O. Franciszka".

Prompt wyszukujący warianty imienia i nazwiska postaci, oraz jej pesudonimy/kryptonimy:

Na podstawie podanego tekstu biografii wyszukaj wszystkie warianty nazwiska (także błędne),
imienia (także błędne) i pesudonimy lub kryptonimy
głównego bohatera/bohaterki (pomiń pseudonimy innych osób występujących w tekście).
Wynik przedstaw w formie listy obiektów JSON zawierających pola:
name_variant: wariant nazwiska bohatera/bohaterki
forname_variant: wariant imienia bohatera/bohaterki
nickname: pseudonim lub kryptonim bohatera/bohaterki

Przykład 1.
Tekst: "Soderini (Sodderini, Sodero) Carlos, pseud.: Carlito, Jan Będowski (ok. 1557–1591), kupiec i bankier.
Był jednym z pięciu synów Niccola i Annaleny Ricasoli, młodszym
bratem Bernarda (zob.). Jego bratanicą była Małgorzata Anna, żona
Winfrida de Loeve znanego też pod psed. Ikarus. S. ożenił się z Joanną, córką burgrabiego
krakowskiego Adama Kurozwęckiego."
Wynik:
[{"name_variant":"Sodderini"},
 {"name_variant":"Sodero"},
 {"forname_variant":"Karl"},
 {"nickname":"Carlito"},
 {"nickname":"Jan Będowski"},
]

Tekst: [TEKST_BIOGRAMU]

Wynik (dla innego biogramu - Władysława Szpilmana, gdyż w odróżnieniu od biogramu Teodora Szpręgi występują w nim i warianty nazwiska/imienia i pseudonimy):

[
  {"name_variant":"Spielman"},
  {"forname_variant":"Wolf"},
  {"nickname":"Al Legro"},
  {"nickname":"Wiktor Karwiński"}
]

W biograme występuje też pseudonim innej osoby, jednak zgodnie z promptem i przykładem jest pomijany.

Ten sam prompt uruchomiony przez model 'gpt-3.5-turbo' (temperature = 0.0) zwraca gorszy wynik:

[
  {"name_variant":"Spielman"},
  {"forname_variant":"Władysław"},
  {"nickname":"Al Legro"},
  {"nickname":"Wiktor Karwiński"},
]

GPT i biogramy PSB - uwagi i wnioski

  • GPT-4 daje dużo lepsze wyniki niż GPT-3 lub GPT-3.5-turbo, dzieje się tak nawet w przypadku najprostszych pytań o podstawowe fakty, jeżeli biogram jest napisany prostym językiem i dane są podane wprost, wynik gpt-3.5 i gpt-4 jest podobny, ale w trudniejszych przypadkach widać przewagę gpt-4.
  • Koszt korzystania z gpt-4 jest 10x większy niż z gpt-3.5, koszt gpt-3 jest niższy niż gpt-4, ale biorąc pod uwagę jakość wyników korzystanie z niego do wyciągania informacji z biogramów ma mniejszy sens.
  • Gpt-4 z odpowiednio skonstruowanym promptem jest w stanie wydobyć z tekstu wszystkie oczekiwane informacje, konstrukcja zapytania, odpowiedni przykład w prompcie ma jednak ogromne znaczenie.
  • Gpt-4 jest w stanie zwrócić informacje od razu w formie ustrukturyzowanej np. w formie obiektu JSON, praktycznie bezbłędnie, można jednak dodatkowo posłużyć się bibliotekami w rodzaju guardrails w celu weryfikacji i walidacji formatu (a nawet wyników).
  • Lepsze wyniki dają zapytania o wybrane konkretne informacje niż o wiele informacji na raz. Pytanie ograniczone do informacji podstawowych, lub tylko do relacji rodzinnych daje bardzo dobre rezultaty, ale już stworzenie jednego dużego zapytania próbującego wyciągnąć z tekstu wszystkie te dane jednocześnie może powodować pogorszenie wyników (a także zużycie przestrzeni kontekstu, przez co tekst biogramu wymaga wiekszego skracania), model np. nie odnajduje miejsca pochówku postaci, co dla konkretnego zapytania robił bezbłędnie. To niestety zwiększa koszt przetwarzania tekstów, ponieważ dla każdego biogramu należy zadać np. 6 pytań za każdym razem przekazując tekst biogramu. Koszt przetworzenia 1 biogramu modelem gpt-4 zbliża się wówczas do kilkudziesięciu centów.
  • Problemem jest długość biogramów, standardowy model gpt-4 ma długość kontekstu równą 8 tys. tokenów (dla języka polskiego to ok. 4 tys wyrazów), model 32k z czterokrotnie większymi możliwościami nie jest jeszcze powszechne dostępny, ale nawet w jego przypadku sporo z biogramów PSB zawiera dłuższy tekst, powstaje więc konieczność skracania tekstu biogramu, lub przetwarzania w częściach. Na przykład najdłuższy biogram PSB, Stanisława Augusta Poniatowskiego liczy 78076 tokenów (bez części bibliograficznej). Zależnie od tematyki pytania znając sposób konstruowania biogramów można stosować różne metody skracania. Dla informacji podstawowych, które są zwykle umieszczone w kilku początkowych i kilku końcowych zdaniach można biogram ograniczyć właśnie w ten sposób. Informacje o relacjach rodzinnych kryją się w zdaniach zawierających określone słowa kluczowe, związane z pokrewieństwem i powinowactwem, to również jest prosty sposób na ograniczenie biogramu np. do kilku początkowych zdań oraz zdań zawierających te słowa. W innym przypadku można skorzystać z możliwości przetworzenia tekstu na liczby, poprzez podział tekstu na fragmenty (np. zdania. akapity) utworzenie dla nich osadzeń (embeddings) i zapisanie w bazach wektorowych, następnie wyszukiwanie i sklejanie najbardziej podobnych zdań/fragmentów do tematyki zapytania, aż do osiągnięcia maksymalnej dostępnej wielkości kontekstu dla modelu. Niesie to jednak ryzyko pominięcia istotnych informacji, jeżeli są one rozrzucone równomiernie w całej treści biogramu, np. ważne postacie dla bohatera biogramu będa pojawiać się przez cały okres jego życia, a więc także przez większą część biografii. W takim przypadku być może lepszym rozwiązaniem będzie przetwarzanie całego biogramu, lecz podzielonego na części.
  • Próba wykorzystania tańszego modelu gpt-3.5-turbo do wstępnego przetworzenia biogramu, streszczenia go do treści niezbędnych do odpowiedzi na pytanie np. o podstawowe dane, miejscowości związane z postacią historyczną, nie podwiodła się. Model wykonywał w miarę poprawne streszczenie, ale gubił część informacji, mimo umieszczenia w konstrukcji propmptu odpowiednich wskazówek. Utworzony w ten sposób skrót biogramu był więc bezużyteczny dla modelu gpt-4, który poszukiwanych informacji nie mógłby w nim znaleźć.
  • Można testować zapytania korzytając z interfejsu ChatGPT Pro, który pozwala na używanie modelu gpt-4, ale wyniki mogą być inne niż w przypadku bezpośredniego odpytywania modelu przez API, ponieważ korzystając z API mamy wpływ na parametry działania modelu, w ChatGPT nie. W szczególności podczas ekstrakcji informacji z biogramów należy zmniejszyć wartość parametru temperature do zera.
  • Dane pozyskane automatycznie z biografii wymagają oczywiście dalszej obróbki przed wprowadzeniem ich do bazy danych/bazy wiedzy. Konieczna jest identyfikacja osób, miejsc i instytucji.
  • Ważne jest także uspójnienie wyników - model nie zawsze trzyma się sztywno wytycznych, np. w przypadku braku danych zwykle w wynikach pojawia się odpowiedź 'brak danych', ale czasem 'nieznany', 'nieznana'.
  • Osobną kwestią specyficzną dla biogramów jest kwestia uwspółcześnienia pisowni przedwojennej, Polski Słownik Biograficzny zaczął być wydawany w 1935 roku, pojawiają się w nim imiona w formie Marjan (współczesna pisownia: Marian), Apolonja (Apolonia).

Przykład większej analizy: próbka 250 biogramów z Polskiego Słownika Biograficznego: GPT_PSB

Automatyczne tworzenie grafów wiedzy

Wszystkie powyższe przykłady wyciągania wiedzy z tekstów związane były ze z góry określonymi rodzajami informacji, które należało pozyskać. Co w przypadku gdy nie wiadomo jakie informacje zawarte są w przetwarzanym opracowaniu historycznym i chcemy po prostu (!) pobrać wszelkie fakty z tekstu? Biblioteka LangChain ma ciekawy komponent nazwany GraphIndexCreator, który służy właśnie do tego celu.

Przykład skryptu, przetwarzającego fragment (początek) biogramu Adama Wacława, księcia z dynastii Piastów śląskich. Obecnie GraphIndexCreator sprawdza się lepiej dla krótszych tekstów, wyniki zwraca w języku angielskim, mimo to efekt jest ciekawy.

import os
from langchain.llms import OpenAI
from langchain.indexes import GraphIndexCreator
from pathlib import Path
from dotenv import load_dotenv


# api key
env_path = Path(".") / ".env"
load_dotenv(dotenv_path=env_path)
OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY')

text = """Adam Wacław (1574–1617) z rodu Piastów, książę cieszyński, tytułujący się także
księciem górnogłogowskim, choć tego księstwa już nie posiadał,
był synem Wacława Adama i drugiej jego żony, Katarzyny Sydonji, księżniczki saskiej.
Urodził się 12 XII 1574 r. Miał 5 lat, gdy umarł mu ojciec."""

index_creator = GraphIndexCreator(llm=OpenAI(temperature=0, openai_api_key=OPENAI_API_KEY))
graph = index_creator.from_text(text)
result = graph.get_triples()

for item in result:
    print(item)

Po uruchomieniu otrzymujemy serię trójek (subject, object, predicate):

('Adam Wacław', 'member of the Piast dynasty', 'is a')
('Adam Wacław', 'prince of Cieszyn', 'is a')
('Adam Wacław', 'prince of Górnogłogów', 'is a')
('Adam Wacław', 'Wacław Adam', 'is the son of')
('Adam Wacław', 'Katarzyna Sydonji', 'is the son of')
('Adam Wacław', '12 December 1574', 'was born on')
('Adam Wacław', 'his father died', 'was 5 years old when')

A to efekt przetworzenia jednego z dalszych zdań biogramu ("Dla poprawienia swego położenia wstąpił A. W. do służby w wojsku cesarskiem i jako dowódca oddziału, złożonego z jazdy, a więc na stanowisku podrzędnem, walczył z Turkami na Węgrzech..."):

('Adam Wacław', 'Imperial Army', 'joined the')
('Adam Wacław', 'a cavalry unit', 'was a commander of')
('Adam Wacław', 'the Turks', 'fought against')

Test fine-tunigu modelu gpt-3.5-turbo

Model douczany był 10 przykładami (plik jsonl w repozytorium: link, skrypt: fine_tuning_gpt35_test.py), które miały nauczyć go ekstrakcji podstawowych informacji o postaci historycznej i zwrócenia wyniku w formacie JSON.

Przeprowadzono test na modelu standardowym i modelu po fine-tuningu wykorzystując zapytanie:

Na podstawie podanego tekstu biografii wyszukaj miejsce urodzenia,
miejsce śmierci, miejsce pochówku, datę urodzenia, datę śmierci
i datę pochówku głównego bohatera/bohaterki. Jeżeli w tekście brak danych
na ten temat, zapisz: brak danych. Wynik przedstaw w formie listy obiektów
JSON.

Tekst: Adam Wacław (1574–1617) z rodu Piastów, książę cieszyński,
tytułujący się także księciem górnogłogowskim, choć tego księstwa
już nie posiadał, był synem Wacława Adama i drugiej jego żony, Katarzyny
Sydonji, księżniczki saskiej. Urodził się 12 XII 1574 r. Miał 5 lat,
gdy umarł mu ojciec. W czasie jego małoletności rządziła księstwem
matka wraz z dodanymi jej przez cesarza opiekunami księcia. Przyjeżdżała
ona w tym celu od czasu do czasu do Cieszyna, po powtórnem wyjściu zamąż
– z wiedzą króla Stefana Batorego – za Emeryka Forgacha, żupana trenczyńskiego,
A.-W. wychowywał się przez 8 lat na dworze elektora saskiego, w r. 1595 objął
rządy w księstwie i w tym samym roku ożenił się z Elżbietą, córką ks. kurlandzkiego,
Kettlera. A.-W. umarł w Cieszynie na Brandysie 13 VII 1617; ciało jego złożono
najpierw na zamku i dopiero 4 IV następnego roku pochowano w kościele dominikanów
cieszyńskich, gdzie spoczywały zwłoki wszystkich jego poprzedników. Zostawił
5 dzieci, z których Fryderyk Wilhelm, ostatni cieszyński Piast męski, i Elżbieta
Lukrecja, ostatnia Piastówna, rządzili kolejno Księstwem.

Wynik dla standardowego modelu: gpt-3.5-turbo

[
    {
      "imię": "Adam",
      "nazwisko": "Wacław",
      "miejsce_urodzenia": "brak danych",
      "miejsce_śmierci": "Cieszyn, Brandys",
      "miejsce_pochówku": "kościół dominikanów cieszyńskich",
      "data_urodzenia": "12 XII 1574",
      "data_śmierci": "13 VII 1617",
      "data_pochówku": "4 IV następnego roku"
    }
]

Wynik dla modelu gpt_3.5-turbo po fine-tuningu:

{
  "place_of_birth": { "place": "brak danych" },
  "place_of_death": { "place": "Cieszyn" },
  "place_of_burial": {
    "place": "Cieszyn",
    "note": "kościół dominikanów cieszyńskich"
  },
  "date_of_birth": { "date": "1574-12-12" },
  "date_of_death": { "date": "1617-07-13" },
  "date_of_burial": { "date": "1618-04-04" }
}

Koszt fine-tunigu: ok 0.30$, czas trwania - ok 10 minut.

Można jeszcze porównać wynik standardowego modelu gpt-3.5-turbo z dłuższym promptem, stosowanym podczas testu gpt-4 (link do pliku z tekstem promptu):

[
  {
    "place_of_birth": {
      "place": "brak danych"
    },
    "place_of_death": {
      "place": "Cieszyn, Brandys"
    },
    "place_of_burial": {
      "place": "kościół dominikanów cieszyńskich"
    },
    "date_of_birth": {
      "date": "1574-12-12"
    },
    "date_of_death": {
      "date": "1617-07-13"
    },
    "date_of_burial": {
      "date": "1618-04-04"
    }
  }
]

Trzeba przyznać, że wynik otrzymany dzięki modelowi po fine-tuningu jest jednak najlepszy, porównywalny z GPT-4.

Przetwarzanie 250 biogramów modelem gpt-3.5-turbo po fine-tuningu

Wyniki modelu po fine-tunigu należałoby jednak sprawdzić na większej próbie np. tej samej serii 250 biogramów, które w odrębnym projekcie były przetwarzane przez model GPT-4. Poniżej efekty takiego testu.

Ogólna poprawność wyników modelu 3.5-turbo (fine-tuning) w zakresie ekstrakcji danych podstawowych (miejsce i data urodzenia, miejsce i data śmierci, miejsce i data pochówku) z biogramów postaci PSB (próbka 250 biogramów, ogólna poprawność uwzględnia i znalezione dane i zwrócone przez model braki danych):

Rodzaj informacji Poprawne Niepoprawne
Miejsce urodzenia 182 (72.8%) 68 (27.2%)
Miejsce śmierci 222 (88.8%) 28 (11.2%)
Miejsce pochówku 233 (93.2%) 17 (6.8%)
Data urodzenia 226 (90.4%) 24 (9.6%)
Data śmierci 226 (90.4%) 24 (9.6%)
Data pochówku 235 (94.0%) 15 (6%)
Ogółem 1315 (87.5%) 185 (12.5%)

Braki danych (1500 potencjalnych iformacji: 250 biogramów, 6 rodzajów informacji):

RodZaj informacji Brak danych
Miejsce urodzenia 45
Miejsce śmierci 90
Miejsce pochówku 137
Data urodzenia 53
Data śmierci 23
Data pochówku 220
Ogółem 568

Najrzadziej znajdowane są miejsca i data pochówku, faktycznie takie informacje często nie pojawiają się w biogramach.

Jeżeli brać pod uwagę tylko te informacje, które udało się znaleźć (czyli pomijając braki danych), skuteczność modelu gpt-35-turbo po fine-tuningu wygląda następująco (analizowano 250 biogramów, dla porównania podane także wyniki GPT-4):

Rodzaj informacji Znaleziono Poprawnie Znaleziono (GPT-4) Poprawnie (GPT-4)
Miejsce urodzenia 205 137 (66.83%) 154 137 (88.96%)
Miejsce śmierci 160 137 (85.62%) 160 141 (88.12%)
Miejsce pochówku 113 99 (87.61%) 111 101 (90.99%)
Data urodzenia 197 174 (88.32%) 180 177 (98.33%)
Data śmierci 227 210 (92.51%) 230 229 (99.57%)
Data pochówku 30 19 (63.33%) 26 23 (88.46%)
Ogółem 932 776 (83.26%) 861 808 (93.84%)

Badając tylko przypadki braku danych, poprawność wyników zwracanych przez model, jest większa, choć zwraca uwagę wyraźnie słabszy wynik w przypadku daty śmierci, w blisko 1/3 biogramów model nie znalazł informacji, która w była w biogramie:

Rodzaj danych Brak danych dla Poprawnie
Miejsce urodzenia 45 45 (100.00%)
Miejsce śmierci 90 85 (94.44%)
Miejsce pochówku 137 134 (97.81%)
Data urodzenia 53 52 (98.11%)
Data śmierci 23 16 (69.57%)
Data pochówku 220 216 (98.18%)
Ogółem 568 548 (96.48%)

Wyniki dla całej serii biogramów pokazują, że model 3.5-turbo po fine-tuningu jest jednak istotnie słabszy niż model gpt-4 - zob. wyniki dla gpt-4 To czego nie widać w samych liczbach, to częste wyszukiwanie poprawnych lecz niedokładnych dat (np. roczne, gdy w biogramie można znaleźć dzienne - 53 przypadki dla daty śmierci postaci!), lub częste błędy w odmianie nazw geograficznych - takie dane były zaliczane jako poprawne, jednak z odpowiednią notatką wskazującą że odpowiedź modelu nie była idealna. Uwzględnienie tego rodzaju danych jako niepoprawnych znacznie pogorszyłoby wynik modelu, np. dla daty śmierci procent poprawnie wydobytych infromacji spadłby z 92 do 69!. Szczegółowe rezultaty dla każdego biogramu dostępne są w repozytorium

Rozwijanie skrótów w hasłach SHG

W Słowniku Historyczno-Geograficznym zastosowano wiele zapisów skrótowych, które dla przeciętnego użytkownika czynią teksty haseł mało czytelnymi. Czy gpt-4 mógłby poprawnie rozwinąć skróty na podstawie dostarczonej listy można przetestować na przykładzie fragmentu hasła Babice ze słownika ziemii warszawskiej, a dokładnie punktu 3 tego hasła dotyczącego spraw własności, podatków itp. Oprócz listy skrótów rzeczowych w zapytaniu zawarto dodatkowe wskazówki:

"Na podstawie przedstawiongo katalogu skrótów rozwniń skróty w podanym tekście.
Katalog skrótów (skrót = rozwinięcie, kolejne sktóry oddzielone znakiem średnika):
a. = ante (przed); abp = arcybiskup ...

Dodatkowo w tekście może wystąpić skrót od nazwy opisywanej miejscowości - jest to
zwykle pierwsza duża litera nazwy miejscowości, w tym tekście miejscowość to Babice,
a skrót od niej = B. Pamiętaj aby rozwinięte ze skrótów słowa zostały użyte we
właściwej odmianie (przypadku) np. 'Piotr z B. śwd. na dok. ks. Siemowita II' =
'Piotr z Babic świadek na dokumencie księcia Siemowita II'.

Tekst: {tu tekst hasła}"

Tekst oryginalny można zobaczyć w wersji online słownika (link powyżej), zaś efekt rozwijania skrótów poniżej:

"Własność szlachecka. 1313 Piotr z Babic świadek na dokumencie księcia
Siemowita II (NKDMaz. 2 nr 135); 1365-91 Marcin Babka z Babic → punkt 6; 1399
Marcin z Babic świadek na dokumencie księcia Janusza I (MK 89, 217v-219v);
1400-17 Marcin z Babic, syn Marcina → punkt 6; 1401 książę Janusz I dał niegdyś
Marcinowi Babce wojewodzie mazowieckiemu dobra Żarnowo z lasem Niemiczyn w ziemi
ciechanowskiej oraz dąbrowę zwaną Bratkowy Kąty z jeziorem Rybno nad rzeką Pisą
koło Nowogrodu; po zgonie wojewody jego synowie Marcin podkomorzy warszawski
i Piotr oraz Stanisław syn Jaśka jako spadkobiercy odsprzedają księciu dąbrowę
z jeziorem, a książę potwierdza wyżej wymienione nadanie Marcinowi z Babic
podkomorzy warszawski, któremu przypadła wieś [Żarnowo] z lasem (MK 6, 103v-104);
[1417] rycerz pasowany Marcin z Babic podkomorzy warszawski kwituje brata Piotra
z Latchorzewa z zadośćuczynienia za Babice i Trupienie oraz z wypłaty 100 kop
groszy praskich Janowi Fortunie ze Szczytna i 30 kop groszy praskich Marcinowi
z Goźlina; Marcin z Babic podkomorzy i jego żona Imisława zatrzymują dożywotnio
użytkowanie tych wsi; jeżeli podkomorzy będzie miał syna, to zwróciwszy 130 kop
groszy odbierze te wsie, a jeżeli córki, to każda otrzyma w posagu 30 kop groszy
od Piotra z Latchorzewa; żona podkomorzego będzie miała dożywotnio Babice, a Piotr
z Latchorzewa Trupienie (MK 3, 61v); 1421 Imka wdowa po Marcinie z Babic podkomorzy
warszawski pozywa braci Pawła i Urbana z Latchorzewa o posag zapisany jej na Babice
i Trupieniu, ale dokument posażny zostaje uznany za falsyfikat (Warszawa. 1, 3v);
[1422] Paweł i Urban z Latchorzewa synowie Piotra dzielą się dobrami ojczystymi;
Paweł dostaje Latchorzewo i Trupienie, a Urban Babice, Zbarz i Korzkiewki; Paweł
będzie mógł otrzymać Służewiec i Jemielino bez przeszkód ze strony Urbana
(MK 3, 87v88); 1424 Marcin z Goźlina zięć pani Babickiej (Warszawa. 1, 134);
1424 Marcin z Babic (Warszawa. 1, 151v); 1425 pani Babicka uzyskuje prawo zagradzania
drogi, którą dziedzice z Wierzuchowa dawniej chodzili do kościoła [w Babicach]
(Warszawa. 1, 176); 1426 Jan Wircioch mieszczanin Nowej Warszawy zobowiązuje się
zapłacić 42 grosze Maciejowi z Babic (ŁawWN nr 77); 1426 Marcin z Babic
(Warszawa. 1, 229v); 1428 szlachetny Hincza z Babic (Warszawa. 2, 10); 1434 pani
Imka z Babic (Warszawa. 2, 254); 1438 Urban z Babic dostaje Młodynin na Zawkrzu
od Anny wdowy po Klemensie z Kraśniewa i od jej syna Włodzimierza, przypadły im
w spadku po bracie Anny Marcinie (MK 335, 27v); 1446 Urban z Babic zabezpiecza
sobie wierzytelność 100 kop groszy na domu zmarłego pana „Slycz” w Starej Warszawie
(PP 3 nr 959); 1451 Urban z Babic odwołuje sprzedaż Kiełpina i Gromadzyna dokonaną
w 1449 przez Jana Sąchockiego z Zaborowa [ziemia wyszogrodzka] na rzecz Jana z
Węgrzynowa wojewody mazowieckiego za 450 kop groszy w półgroszku (MK 4, 153v-154);
1458-59 Urban z Babic → punkt 6; 1467 Jan Babicki syn [zmarłego] Urbana stolnika
warszawskiego (Warszawa. 4, 88); 1477 Jan z Babic ma proces w sądzie kościelnym
z Marcinem Latochorzewskim (AE II 498); 1479 Jan Babicki (ZR nr 1473); 1484 Jan
Babicki z Babic sprzedaje z prawem odkupu czynsz roczny 4 grzywien groszy w
półgroszku ze Zbarza za 40 kop groszy w półgroszku Marcinowi z Zalesia kanonik
płocki i pleban z Przybyszewa na ołtarz w kolegiacie warszawskiej i zaręcza spokój
ze strony żony Barbary (MK 9, 161v); 1484 książę Bolesław V daje Janowi z Babic
prawo nieodpowiednie i zwolnienie od kar sądowych (MK 9, 166v; MK 60, 265; MS 4 nr 6444);
1484 kowal Maciej Babicki mieszczanin Nowej Warszawy (ŁawWN nr 1018); 1490
[Jan] Babicki uczestnik najazdu szlachty na dobra tarczyńskie prepozyta kapituły
warszawskiej (AC 2 nr 1872); 1494 Jan syn zmarłego Łazarza z Sosnkowa lub z Bliznego
sprzedaje dział w Bliznem Janowi z Babic (MK 18, 248v); 1502 → punkt 6; 1506
transakcja z 1496 zostaje potwierdzona Urbanowi synowi Jana z Babic (MK 18, 248v);
1509 Barbara wdowa po zmarłym Janie z Babic (Warszawa. 10, 5); 1511 szlachetny
Urban z Babic (Warszawa. 10, 896); 1518 Urban z Babic i Jerzy z Parzniewa sprzedają
z prawem odkupu czynsz roczny z Babic i Parzniewa Grzegorzowi z Cedrowic
wikariuszowi wiecznemu katedry włocławskiej (MK 32, 18); 1526 w Babicach 9 włók
osiadłych (ASK I 27, 451); 1527 → punkt 5; 1530 Anna żona Urbana Babickiego, córka
Jana Duckiego otrzymuje wraz z siostrami zapis ojca na jego dobrach w Dudzie, Otwocku,
Dąbrówce, Woli i innych (Bon. 5, 71); 1539 wypis dokumentu z 1484 na prośbę Urbana
Babickiego (MS 4 nr 6444); 1580 pobór od 5 włók osiadłych (ŹD 263); 1584 Babiccy
herbu Dołęga, jednej dzielnicy ze Służowieckimi (Papr. 403); XIX wiek. Babice wieś
ma 428 morg [ok. 14 włók], folwark 1598 morg [53 włóki] (Małc. 192).

Wydaje się, że większość skrótów została rozwinięta poprawnie i w poprawnej formie, ale model miał problem np. z odmianą słowa podkomorzy: 'Imka wdowa po Marcinie z Babic podkomorzy warszawski pozywa braci Pawła i Urbana'.

SHG jako źródło wiedzy dla LLM

Tak poprawiony tekst jest lepszym źródłem do dalszych analiz, można na przykład zapytać gpt by opierając się na tak zmodyfikowanym haśle z SHG wyszukał informacje na temat jakiejś postaci. GPT nie jest oczywiście historykiem a źródłowy tekst nie jest prosty, potrzebne są więc dodatkowe wskazówki w treści zapytania (promptu):

"Na podstawie podanego tekstu, napisz proszę co wiadomo na temat Urbana z Babic?
Podaj tylko informacje znajdujące się w przekazanym tekście.
Zwróć uwagę, że w tekście mogą występować tak samo nazywające się lecz różne
osoby, np. 'Jan z Warki syn Piotra' i 'Jan z Warki syn Władysława' to różne postacie.

Tekst: {tekst}"

Odpowiedź jest w zasadzie poprawna, być może modelowi należałoby udzielić dodatkowych wskazówek związanych ze specyfiką tekstu:

Urban z Babic był synem Piotra. W 1422 roku, wraz ze swoim bratem Pawłem, podzielił
się dobrami ojczystymi. Urban otrzymał Babice, Zbarz i Korzkiewki. W 1438 roku
otrzymał Młodynin na Zawkrzu od Anny, wdowy po Klemensie z Kraśniewa i od jej syna
Włodzimierza. W 1446 roku zabezpieczył sobie wierzytelność 100 kop groszy na domu
zmarłego pana „Slycz” w Starej Warszawie. W 1451 roku odwołał sprzedaż Kiełpina
i Gromadzyna dokonaną w 1449 przez Jana Sąchockiego z Zaborowa na rzecz Jana z
Węgrzynowa wojewody mazowieckiego za 450 kop groszy w półgroszku. W 1506 roku
potwierdzono transakcję z 1496 roku Urbanowi, synowi Jana z Babic. W 1511 roku
Urban z Babic był określany jako szlachetny. W 1518 roku Urban z Babic i Jerzy
z Parzniewa sprzedali z prawem odkupu czynsz roczny z Babic i Parzniewa Grzegorzowi
z Cedrowic wikariuszowi wiecznemu katedry włocławskiej. W 1530 roku Anna, żona
Urbana Babickiego, córka Jana Duckiego otrzymała wraz z siostrami zapis ojca na
jego dobrach w Dudzie, Otwocku, Dąbrówce, Woli i innych. W 1539 roku na prośbę
Urbana Babickiego wypisano dokument z 1484 roku.

Czy model językowy wraz z bazą wektorową, w której zapisano by hasła Słownika Historyczno-Geograficznego mógłby posłużyć jako wygodny mechanizm semantycznego wyszukiwania, w którym użytkownik zadawałby zapytania w języku naturalnym? Nie zamiast obecnych mechanizmów wyszukiwania w słowniku online, ale jako jego uzupełnienie. Zapewne tak, ale materiał (treść słownika) jest na tyle trudny, że wymagało by to wielu testów i przygotowań, samo 'wrzucenie' tekstu słownika to za mało by taki mechanizm był skuteczny i zwracał wiarygodną wiedzę. Należałoby się m.in. zastanowić nad podziałem haseł na fragmenty, wprowadzeniem metadanych opisujących hasła i części haseł, pytania zadawane takiemu mechanizmowi mogłyby przecież dotyczyć wielu haseł, wielkość kontekstu które model jest w stanie jednorazowo uwzględnić jest jednak ograniczona. Samo zapytanie użytkownika również musiałoby być wstępnie przetworzone przez model językowy, otrzymane zaś wyniki należałoby powiązać ze źródłowymi fragmentami, tak by było możliwe wskazanie na jakiej podstawie model napisał odpowiedź.

SHG - podział na regesty z określeniem tematyki regestu

W jednym z wcześniejszych testów weryfikowana była możliwość podziału haseł SHG na regesty i model gpt-4 radził sobie z takim zadaniem całkiem poprawnie. Tym razem oprócz podziału na regesty (treść regestów po rozwinięciu skrótów) test dotyczył także określenia tematyki regestu. Analizowany modelem gpt-4 był p. 3 hasła Babice. Prompt zawierał instrukcję:

Podziel poniższy tekst na regesty. Tekst rozpoczyna się zwykle krótką informacją
na temat rodzaju własności, po nim następują regesty. Regest zaczyna się od daty
np. 1245 lub zakresu dat 1245-56 lub daty przybliżonej np. a. 1456, po której następuje
treść regestu, a po niej - w nawiasie - źródło informacji. Po nawiasie pojawia się
średnik oddzielający regesty. Jeżeli nie ma daty na początku, oznacza to, że data
jest taka sama jak w poprzednim regeście. Określ temat treści regestu w formie
krótkiego określenia np, 'podatki', 'sprawy sądowe', 'informacja o właścielu lub inne',
'sprzedaż' itp. Wynik przedstaw w formie pliku csv z kolumnami: data, treść,
źródło informacji, temat i znakiem @ jako separatorem kolumn.

oraz parę przykładów. Podana jako przykład tematyka regestów może oczywiście zostać  lepiej dobrana i sprecyzowana, co wpłynie na poprawę jakości wyników. Obecne efekty działania modelu w poniższej tabeli:

Data Treść Źródła Temat
1313 Piotr z Babic świadek na dokumencie księcia Siemowita II NKDMaz. 2 nr 135 informacje o właścicielu lub inne
1365-91 Marcin Babka z Babic → punkt 6 brak źródła informacje o właścicielu lub inne
1399 Marcin z Babic świadek na dokumencie księcia Janusza I MK 89, 217v-219v informacje o właścicielu lub inne
1400-17 Marcin z Babic, syn Marcina → punkt 6 brak źródła informacje o właścicielu lub inne
1401 książę Janusz I dał niegdyś Marcinowi Babce wojewodzie mazowieckiemu dobra Żarnowo z lasem Niemiczyn w ziemi ciechanowskiej oraz dąbrowę zwaną Bratkowy Kąty z jeziorem Rybno nad rzeką Pisą koło Nowogrodu; po zgonie wojewody jego synowie Marcin podkomorzy warszawski i Piotr oraz Stanisław syn Jaśka jako spadkobiercy odsprzedają księciu dąbrowę z jeziorem, a książę potwierdza wyżej wymienione nadanie Marcinowi z Babic podkomorzy warszawski, któremu przypadła wieś [Żarnowo] z lasem MK 6, 103v-104 sprzedaż
[1417] rycerz pasowany Marcin z Babic podkomorzy warszawski kwituje brata Piotra z Latchorzewa z zadośćuczynienia za Babice i Trupienie oraz z wypłaty 100 kop groszy praskich Janowi Fortunie ze Szczytna i 30 kop groszy praskich Marcinowi z Goźlina; Marcin z Babic podkomorzy i jego żona Imisława zatrzymują dożywotnio użytkowanie tych wsi; jeżeli podkomorzy będzie miał syna, to zwróciwszy 130 kop groszy odbierze te wsie, a jeżeli córki, to każda otrzyma w posagu 30 kop groszy od Piotra z Latchorzewa; żona podkomorzego będzie miała dożywotnio Babice, a Piotr z Latchorzewa Trupienie MK 3, 61v sprawy spadkowe
1421 Imka wdowa po Marcinie z Babic podkomorzy warszawski pozywa braci Pawła i Urbana z Latchorzewa o posag zapisany jej na Babice i Trupieniu, ale dokument posażny zostaje uznany za falsyfikat Warszawa. 1, 3v sprawy sądowe
[1422] Paweł i Urban z Latchorzewa synowie Piotra dzielą się dobrami ojczystymi; Paweł dostaje Latchorzewo i Trupienie, a Urban Babice, Zbarz i Korzkiewki; Paweł będzie mógł otrzymać Służewiec i Jemielino bez przeszkód ze strony Urbana MK 3, 87v88 podział majątku
1424 Marcin z Goźlina zięć pani Babickiej Warszawa. 1, 134 informacje o właścicielu lub inne
1424 Marcin z Babic Warszawa. 1, 151v informacje o właścicielu lub inne
1425 pani Babicka uzyskuje prawo zagradzania drogi, którą dziedzice z Wierzuchowa dawniej chodzili do kościoła [w Babicach] Warszawa. 1, 176 przywilej
1426 Jan Wircioch mieszczanin Nowej Warszawy zobowiązuje się zapłacić 42 grosze Maciejowi z Babic ŁawWN nr 77 sprawy finansowe
1426 Marcin z Babic Warszawa. 1, 229v informacje o właścicielu lub inne
1428 szlachetny Hincza z Babic Warszawa. 2, 10 informacje o właścicielu lub inne
1434 pani Imka z Babic Warszawa. 2, 254 informacje o właścicielu lub inne
1438 Urban z Babic dostaje Młodynin na Zawkrzu od Anny wdowy po Klemensie z Kraśniewa i od jej syna Włodzimierza, przypadły im w spadku po bracie Anny Marcinie MK 335, 27v sprawy spadkowe
1446 Urban z Babic zabezpiecza sobie wierzytelność 100 kop groszy na domu zmarłego pana „Slycz” w Starej Warszawie PP 3 nr 959 sprawy finansowe
1451 Urban z Babic odwołuje sprzedaż Kiełpina i Gromadzyna dokonaną w 1449 przez Jana Sąchockiego z Zaborowa [ziemia wyszogrodzka] na rzecz Jana z Węgrzynowa wojewody mazowieckiego za 450 kop groszy w półgroszku MK 4, 153v-154 sprzedaż
1458-59 Urban z Babic → punkt 6 brak źródła informacje o właścicielu lub inne
1467 Jan Babicki syn [zmarłego] Urbana stolnika warszawskiego Warszawa. 4, 88 informacje o właścicielu lub inne
1477 Jan z Babic ma proces w sądzie kościelnym z Marcinem Latochorzewskim AE II 498 sprawy sądowe
1479 Jan Babicki ZR nr 1473 informacje o właścicielu lub inne
1484 Jan Babicki z Babic sprzedaje z prawem odkupu czynsz roczny 4 grzywien groszy w półgroszku ze Zbarza za 40 kop groszy w półgroszku Marcinowi z Zalesia kanonik płocki i pleban z Przybyszewa na ołtarz w kolegiacie warszawskiej i zaręcza spokój ze strony żony Barbary MK 9, 161v sprzedaż
1484 książę Bolesław V daje Janowi z Babic prawo nieodpowiednie i zwolnienie od kar sądowych MK 9, 166v; MK 60, 265; MS 4 nr 6444 przywilej
1484 kowal Maciej Babicki mieszczanin Nowej Warszawy ŁawWN nr 1018 informacje o właścicielu lub inne
1490 [Jan] Babicki uczestnik najazdu szlachty na dobra tarczyńskie prepozyta kapituły warszawskiej AC 2 nr 1872 sprawy sądowe
1494 Jan syn zmarłego Łazarza z Sosnkowa lub z Bliznego sprzedaje dział w Bliznem Janowi z Babic MK 18, 248v sprzedaż
1502 → punkt 6 brak źródła brak tematu
1506 transakcja z 1496 zostaje potwierdzona Urbanowi synowi Jana z Babic MK 18, 248v sprawy finansowe
1509 Barbara wdowa po zmarłym Janie z Babic Warszawa. 10, 5 informacje o właścicielu lub inne
1511 szlachetny Urban z Babic Warszawa. 10, 896 informacje o właścicielu lub inne
1518 Urban z Babic i Jerzy z Parzniewa sprzedają z prawem odkupu czynsz roczny z Babic i Parzniewa Grzegorzowi z Cedrowic wikariuszowi wiecznemu katedry włocławskiej MK 32, 18 sprzedaż
1526 w Babicach 9 włók osiadłych ASK I 27, 451 informacje o właścicielu lub inne
1527 → punkt 5 brak źródła brak tematu
1530 Anna żona Urbana Babickiego, córka Jana Duckiego otrzymuje wraz z siostrami zapis ojca na jego dobrach w Dudzie, Otwocku, Dąbrówce, Woli i innych Bon. 5, 71 sprawy spadkowe
1539 wypis dokumentu z 1484 na prośbę Urbana Babickiego MS 4 nr 6444 sprawy sądowe
1580 pobór od 5 włók osiadłych ŹD 263 podatki
1584 Babiccy herbu Dołęga, jednej dzielnicy ze Służowieckimi Papr. 403 informacje o właścicielu lub inne
XIX wiek. Babice wieś ma 428 morg [ok. 14 włók], folwark 1598 morg [53 włóki] Małc. 192 informacje o właścicielu lub inne

Releases

No releases published

Packages

No packages published

Languages