Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds
Powrót do kolekcji
Przewodnik11 min czytania

Unstructured, dokumenty zamienione na dane

Unstructured dzieli dokumenty na elementy semantyczne przed indeksowaniem. Strategie analizy, cięcie, wersja otwarta a platforma, ceny i typowe pułapki.

Unstructured, warstwa między plikiem a wyszukiwaniem

Zanim dokument trafi do wyszukiwania, musi przestać być plikiem. Ta zamiana wygląda na czynność techniczną, a w praktyce decyduje o jakości całego systemu bardziej niż wybór bazy wektorowej czy modelu.

Unstructured zajmuje się właśnie tym etapem. Przyjmuje kilkadziesiąt formatów, rozpoznaje strukturę dokumentu i zwraca listę elementów opisanych typem: tytuł, akapit, tabela, punkt listy, nagłówek strony. Dopiero z tego składa się fragmenty do indeksowania.

Elementy zamiast tekstu

Kluczowa różnica wobec zwykłego wydobycia tekstu polega na tym, co wychodzi z narzędzia.

Code
Bash
pip install "unstructured[pdf]"
Code
Python
from unstructured.partition.auto import partition

elementy = partition(filename="umowa.pdf")

for e in elementy:
    print(type(e).__name__, e.text[:60])

Wynikiem nie jest ciąg znaków, tylko lista obiektów z typem i metadanymi. Wiesz, że dany fragment jest tytułem, a inny komórką tabeli, i znasz numer strony, z której pochodzi.

To otwiera możliwości, których przy płaskim tekście nie ma. Nagłówki i stopki da się odfiltrować, bo są rozpoznane jako takie. Tabele można potraktować osobno, zachowując ich strukturę. Cięcie może iść po tytułach, bo wiadomo, gdzie one są.

Filtrowanie po typie to najprostsza i najczęściej pomijana optymalizacja. Usunięcie nagłówków, stopek i numerów stron przed indeksowaniem zauważalnie poprawia trafność, bo te powtarzalne elementy zaśmiecają każdy fragment i rozmywają jego znaczenie.

Strategie analizy

Narzędzie oferuje kilka trybów o różnym koszcie i jakości, a wybór między nimi jest pierwszą decyzją.

Tryb szybki opiera się na wydobyciu tekstu z warstwy tekstowej pliku. Działa natychmiast i nic nie kosztuje, natomiast nie widzi układu, nie rozpoznaje tabel i jest bezużyteczny przy skanach.

Tryb dokładny analizuje układ strony modelem rozpoznającym elementy graficzne. Rozróżnia kolumny, wykrywa tabele i radzi sobie ze skanami, kosztem czasu i mocy obliczeniowej.

Tryb pośredni stosuje analizę dokładną tylko tam, gdzie jest potrzebna, czyli przy stronach bez warstwy tekstowej. To rozsądny domyślny wybór przy archiwum mieszanym, gdzie część plików to dokumenty cyfrowe, a część skany.

Code
Python
elementy = partition(
    filename="raport.pdf",
    strategy="hi_res",
    infer_table_structure=True,
    languages=["pol", "eng"],
)

Wskazanie języków ma znaczenie przy rozpoznawaniu tekstu na obrazie i jest najczęściej pomijane. Model domyślnie zakłada angielski, więc polskie znaki diakrytyczne z pominięciem tego parametru wychodzą przekręcone, a błąd rozkłada się po całym archiwum.

Cięcie na fragmenty

Drugi etap składa elementy w fragmenty gotowe do indeksowania, i tu narzędzie daje kilka strategii.

Cięcie po tytułach traktuje nagłówek jako granicę, więc fragment odpowiada sekcji dokumentu. To najsensowniejszy wybór przy dokumentacji, umowach i raportach, bo sekcja jest naturalną jednostką odpowiedzi.

Cięcie podstawowe łączy elementy do zadanego rozmiaru, niezależnie od struktury. Prostsze i gorsze, przydatne przy dokumentach bez wyraźnych nagłówków.

Code
Python
from unstructured.chunking.title import chunk_by_title

fragmenty = chunk_by_title(
    elementy,
    max_characters=1200,
    combine_text_under_n_chars=200,
)

Parametr łączący krótkie fragmenty jest tu ważniejszy, niż wygląda. Bez niego dokument z wieloma krótkimi sekcjami rozpada się na dziesiątki fragmentów po dwa zdania, z których żaden nie zawiera dość kontekstu, żeby na cokolwiek odpowiedzieć.

Warto obejrzeć wynik cięcia przed zbudowaniem czegokolwiek dalej. Piętnaście minut przeglądania fragmentów pokazuje zwykle, że parametry wymagają korekty, a to zmienia jakość odpowiedzi bardziej niż jakiekolwiek strojenie promptu.

Wersja otwarta a platforma

To rozróżnienie warto zrozumieć, bo materiały producenta mówią o nim mniej wyraźnie, niż powinny.

Biblioteka otwarta obsługuje kilkadziesiąt formatów i daje podstawowe strategie analizy. Producent wskazuje jednak, że nie jest przeznaczona do zastosowań produkcyjnych i ma wyraźnie słabsze wyniki przy wydobywaniu treści z dokumentów i tabel.

Platforma płatna dokłada lepsze modele rozpoznawania układu i tekstu, wzbogacanie treści modelami widzenia, dodatkowe strategie cięcia oraz złącza do źródeł danych. Rozliczenie idzie za stronę: plan darmowy obejmuje 15 000 stron miesięcznie bez podawania karty, a powyżej tego progu obowiązuje 0,03 USD za stronę. Pula zeruje się co miesiąc, więc niewykorzystane strony nie przechodzą na kolejny okres. Rachunek zatrzymuje się natomiast na 3000 USD miesięcznie i po przekroczeniu tej kwoty każda kolejna strona jest darmowa aż do miliona stron miesięcznie.

Praktyczny wniosek jest taki, żeby sprawdzić wersję otwartą na swoich najtrudniejszych dokumentach, zanim podejmiesz decyzję. Jeśli Twoje pliki to czysty tekst albo prosta dokumentacja, wersja otwarta wystarczy i nic nie kosztuje. Jeśli to skany i tabele, różnica bywa na tyle duża, że rozstrzyga.

Warto policzyć koszt przez liczbę stron, a nie dokumentów. Archiwum tysiąca raportów po sto stron to sto tysięcy stron, czyli zupełnie inny rachunek niż tysiąc jednostronicowych pism. Przy plikach bez podziału na strony, takich jak wiadomości czy arkusze, dostawca liczy stronę jako 100 kB danych wejściowych, więc rachunek zależy tam od rozmiaru, a nie od liczby rekordów.

Złącza do źródeł

Osobną częścią oferty są złącza pobierające dokumenty z miejsc, w których one żyją, i odkładające wynik tam, gdzie ma trafić.

To rozwiązuje problem, który przy wdrożeniach jest częstszy niż jakość analizy: archiwum aktualizowane ręcznie przestaje być aktualizowane. Złącze pobierające pliki przyrostowo z magazynu dokumentów sprawia, że nowy plik trafia do indeksu bez czyjejkolwiek pamięci.

Po stronie wyjścia dostępne są magazyny wektorów, w tym rozwiązania opisane w tekstach o Qdrancie i Chromie. To znaczy, że cały przepływ od pliku do zaindeksowanego fragmentu da się zbudować z gotowych elementów.

Warto natomiast pamiętać, że złącze rozwiązuje pobieranie, a nie usuwanie. Dokument wycofany ze źródła musi zniknąć również z indeksu, a to trzeba obsłużyć świadomie, bo inaczej odpowiedzi opierają się na treści, której już nie ma.

Unstructured kontra alternatywy

RozwiązanieMocna stronaSłabośćKiedy wybrać
UnstructuredWiele formatów, elementy z typami, złączaWersja otwarta słabsza od płatnejArchiwum mieszanych formatów
RAGFlowAnaliza układu plus gotowy interfejsCięższe wdrożenie, cała aplikacjaWdrożenie u siebie z interfejsem
Biblioteki do plików PDFDarmowe, pełna kontrolaAnaliza układu po Twojej stronieDokumenty jednorodne i proste
Model widzenia wprostRadzi sobie z układem bez regułKoszt przy każdej stronieMałe zbiory, trudne dokumenty

Ostatni wiersz to podejście, które w ostatnich latach stało się realną alternatywą. Wysłanie strony jako obrazu do modelu rozumiejącego obraz i tekst daje wynik dobry przy skomplikowanym układzie, bez konfigurowania czegokolwiek. Cena to koszt za każdą stronę, więc przy archiwum na sto tysięcy stron to rozwiązanie odpada, a przy dwustu stronach bywa najprostsze.

Wybór między pierwszymi dwoma wierszami zależy od tego, czy chcesz bibliotekę, czy aplikację. Pierwsza wpina się do własnego przepływu i zostawia Ci resztę. Druga daje komplet z interfejsem, kosztem cięższego wdrożenia.

Formaty poza plikami PDF

Dokumenty w formacie PDF przyciągają całą uwagę, a w praktyce archiwum firmowe składa się z kilkunastu innych rzeczy, i tam narzędzie bywa bardziej przydatne.

Pliki tekstowe procesora tekstu mają jawną strukturę zapisaną wprost w formacie, więc rozpoznanie nagłówków i tabel jest tu pewne, nie odgadywane z układu. To najlepszy możliwy przypadek: wynik jest dokładny, a analiza szybka i darmowa.

Prezentacje rozpadają się na slajdy, a każdy slajd na tytuł i punkty. Warto natomiast wiedzieć, że notatki prelegenta bywają cenniejsze niż same slajdy, bo to w nich siedzą pełne zdania, podczas gdy slajd zawiera hasła.

Poczta elektroniczna wymaga osobnej decyzji. Wiadomość z cytowaną historią wątku zawiera ten sam tekst wielokrotnie, a zaindeksowanie wszystkiego oznacza, że jedna wypowiedź trafia do indeksu w dziesięciu kopiach. Odcięcie cytowanej części przed indeksowaniem to często największa pojedyncza poprawa jakości przy archiwum poczty.

Strony internetowe zapisane lokalnie dają się przetworzyć, choć menu, stopki i banery zgody trafiają do wyniku razem z treścią. Filtrowanie po typie elementu pomaga, ale przy stronach nie działa równie pewnie jak przy dokumentach, bo nagłówek nawigacyjny bywa rozpoznany jako zwykły tytuł.

Arkusze kalkulacyjne to przypadek graniczny. Formalnie się przetwarzają, w praktyce tabela zamieniona na tekst rzadko odpowiada na cokolwiek sensownie. Jeśli dane liczbowe są istotne, lepszym rozwiązaniem jest odczytanie arkusza wprost i zapytanie o niego bazy, zamiast wsadzania go do wyszukiwania semantycznego.

Metadane, które warto zachować

Każdy element niesie ze sobą opis pochodzenia i to właśnie ta część bywa najbardziej niedoceniana przy budowaniu wyszukiwania.

Numer strony pozwala pokazać użytkownikowi, skąd pochodzi odpowiedź. To wygląda jak drobiazg, a decyduje o zaufaniu do systemu bardziej niż jakość samego modelu. Odpowiedź z odnośnikiem do konkretnej strony da się zweryfikować, odpowiedź bez niego trzeba przyjąć na wiarę.

Nazwa pliku i ścieżka źródłowa umożliwiają filtrowanie wyszukiwania po katalogu albo po typie dokumentu. Przy archiwum obejmującym umowy, raporty i korespondencję to często jedyny sposób, żeby zapytanie o warunki umowy nie wyciągało wzmianek z korespondencji.

Data również zasługuje na uwagę, bo dokumenty się dezaktualizują. Regulamin sprzed trzech lat i jego bieżąca wersja wyglądają dla wyszukiwania niemal identycznie, a różnią się tym, co dla użytkownika najważniejsze.

Warto przenieść te pola do bazy wektorowej razem z treścią fragmentu. Odzyskanie ich później, po zaindeksowaniu samego tekstu, wymaga przetworzenia archiwum od nowa.

Wydajność przy dużym archiwum

Przetwarzanie kilkuset dokumentów to kwestia minut, przetwarzanie kilkuset tysięcy wymaga planu.

Tryb dokładny jest wolny, bo dla każdej strony uruchamia model rozpoznający układ. Przy dużym zbiorze wąskim gardłem staje się dostępna moc obliczeniowa, a nie sieć czy dysk, więc zrównoleglenie na wielu procesach daje realny zysk.

Wyniki warto zapisywać na dysk po analizie, przed cięciem. Cięcie jest tanie i będziesz je powtarzać przy strojeniu parametrów, natomiast analiza jest droga i nie ma powodu, żeby ją powtarzać za każdym razem. Ten jeden nawyk oszczędza godziny pracy przy dostrajaniu.

Przetwarzanie przyrostowe ma znaczenie od samego początku. Zapisanie skrótu treści każdego pliku pozwala pominąć te, które się nie zmieniły, a to zamienia nocne przetwarzanie całego archiwum w kilkuminutowe uzupełnienie różnicy.

Przy archiwum rosnącym codziennie przetwarzanie przestaje być skryptem, a staje się potokiem z harmonogramem, ponawianiem i zależnościami między krokami. Airflow opisuje to jako graf zadań i pilnuje, co się wykonało, co zawiodło i co czeka, a przy przebiegu przerwanym w połowie ta wiedza jest cenniejsza niż samo uruchomienie o właściwej godzinie. Trzecia wersja dołożyła wyzwalanie zdarzeniem, więc nowy plik w źródle uruchamia przetwarzanie od razu, zamiast czekać na nocny przebieg.

Osobno warto zaplanować obsługę plików, które się nie przetworzą. Przy dużym zbiorze zawsze trafią się dokumenty uszkodzone, zabezpieczone hasłem albo zapisane w wariancie formatu, którego biblioteka nie obsługuje. Zapisanie ich na listę do ręcznego przejrzenia jest lepsze niż przerwanie całego przebiegu na jednym pliku albo ciche pominięcie go bez śladu.

Typowe błędy

Pierwszy to pominięcie parametru języka przy rozpoznawaniu tekstu z obrazu. Polskie znaki wychodzą wtedy przekręcone, a błąd rozkłada się po całym archiwum i wychodzi dopiero przy wyszukiwaniu.

Drugi to tryb szybki przy dokumentach ze skanami. Zwraca pusty tekst albo szczątki, a ponieważ nie zgłasza błędu, brak treści zauważa się dopiero wtedy, gdy wyszukiwanie nic nie znajduje.

Trzeci to indeksowanie wszystkich elementów, w tym nagłówków i stopek. Powtarzalny tekst w każdym fragmencie rozmywa jego znaczenie i obniża trafność.

Czwarty to brak łączenia krótkich fragmentów. Dokument z wieloma sekcjami rozpada się na dziesiątki dwuzdaniowych kawałków, z których żaden nie zawiera dość kontekstu.

Piąty to szacowanie kosztu po liczbie dokumentów zamiast stron. Przy raportach ta różnica bywa stukrotna.

Szósty to pominięcie przeglądu wyniku. Sprawdzenie dwudziestu wygenerowanych fragmentów zajmuje kwadrans i pokazuje więcej niż jakikolwiek opis parametrów.

FAQ

Do czego służy Unstructured?

Do zamiany dokumentów na dane gotowe do indeksowania. Rozpoznaje strukturę pliku i zwraca listę elementów z typami, zamiast płaskiego tekstu, dzięki czemu można filtrować nagłówki, zachować tabele i ciąć dokument po sekcjach.

Czy wersja otwarta wystarczy?

Przy dokumentach prostych i cyfrowych zwykle tak. Producent wskazuje jednak, że nie jest przeznaczona do zastosowań produkcyjnych i słabiej radzi sobie z tabelami oraz skanami, więc przy trudnym archiwum warto porównać oba warianty na własnych plikach.

Ile kosztuje platforma?

Rozliczenie idzie za przetworzoną stronę: 15 000 stron miesięcznie jest darmowe, powyżej progu stawka wynosi 0,03 USD za stronę, a rachunek zatrzymuje się na 3000 USD miesięcznie. Niewykorzystane darmowe strony nie przechodzą na kolejny miesiąc. Przy szacowaniu licz strony, nie dokumenty, bo przy raportach różnica jest wielokrotna.

Czym różni się od RAGFlow?

To biblioteka i platforma do przetwarzania dokumentów, którą wpinasz we własny przepływ. RAGFlow to kompletna aplikacja z własnym interfejsem, magazynem i wyszukiwaniem, uruchamiana we własnej infrastrukturze. Pierwsze daje więcej swobody, drugie mniej pracy.

Jak sprawdzić, czy analiza działa poprawnie?

Przejrzyj wygenerowane fragmenty dla dziesięciu najtrudniejszych dokumentów. Jeśli tabele zachowały strukturę, kolumny się nie przeplatają, a nagłówki nie pojawiają się w środku zdań, konfiguracja jest w porządku. To jedyny sposób, który daje pewność.

Dokumentacja stoi na stronie projektu, a kod wersji otwartej w repozytorium na GitHubie.