Python : jak zbudować wielomodalny potok RAG dla obrazów i dokumentów

Python : jak zbudować wielomodalny potok RAG dla obrazów i dokumentów
3 min de lecture

Samouczek szczegółowo opisuje budowę, w Pythonie, wielomodalnego potoku generowania wspomaganego pobieraniem (RAG), zdolnego do wyszukiwania i wnioskowania zarówno na podstawie tekstu, jak i obrazów wyodrębnionych ze złożonych dokumentów. Zasada ta jest skierowana do plików PDF mieszających prozę, tabele i wykresy, czyli formatów, w których klasyczny RAG oparty wyłącznie na tekście ma trudności.

  • Samouczek pokazuje, jak w Pythonie zbudować RAG obsługujący tekst i obrazy z plików PDF.
  • GPT-4o opisuje każdy obraz, a opisy trafiają do bazy wektorowej Chroma.
  • MultiVectorRetriever łączy znalezione opisy z oryginalnym tekstem i plikami obrazów.
  • GPT-4o generuje odpowiedź na podstawie tekstu i obrazów, a autor proponuje re-ranking i ColPali.

RAG polega na odnajdywaniu fragmentów dokumentu i przekazywaniu ich do modelu językowego przed sformułowaniem odpowiedzi. Stosowany do samego tekstu, proces ten daje dobre rezultaty. Jednak podział oparty wyłącznie na tekście niszczy formatowanie tabel i pomija obrazy, przez co system odpowiada na podstawie niepełnego widoku dokumentu. Opisywany potok traktuje natomiast obrazy jako obiekty możliwe do zapytania na równi z tekstem.

Realizacja opiera się na LangChain, bibliotece unstructured i API OpenAI. Samouczek opisuje cztery kroki: analizę dokumentu, podsumowanie obrazów, przechowywanie całości i zadawanie pytań systemowi. Pakiet poppler-utils, zależność systemowa, jest niezbędny dla unstructured do wyodrębniania obrazów z plików PDF.

Rozdzielanie tekstu i obrazów

Funkcja partition_pdf() z unstructured odczytuje dokument i klasyfikuje każdy element według typu: akapity, tabele i osadzone obrazy. Obrazy są zapisywane w dedykowanym folderze, podczas gdy bloki tekstu są grupowane w fragmenty o maksymalnie 4000 znaków, zgodnie z nagłówkami. Pętla następnie oddziela fragmenty tekstowe od ścieżek dostępu do obrazów.

Klasyczna baza wektorowa nie potrafi bezpośrednio indeksować obrazu. Każdy obraz jest więc przekazywany do GPT-4o z instrukcją „Opisz ten obraz szczegółowo do użycia w systemie wyszukiwania », aby uzyskać szczegółowy opis służący jako możliwy do zapytania substytut. Samouczek wskazuje na koszt tego etapu: każdy obraz wywołuje zapytanie do API. W przypadku dokumentów zawierających wiele logo lub ikon sugeruje się odfiltrowanie najmniejszych obrazów przed tym przetwarzaniem.

Dwupoziomowe przechowywanie

Architektura opiera się na MultiVectorRetriever, który zarządza dwoma przestrzeniami przechowywania. Pierwsza, baza wektorowa Chroma, zawiera fragmenty tekstu i opisy obrazów, przekształcone w wektory za pomocą modelu osadzania text-embedding-3-small. Druga, przechowalnia dokumentów w pamięci, zachowuje surową zawartość. Każdy wpis jest powiązany ze swoim odpowiednikiem za pomocą unikalnego identyfikatora. Po wykonaniu wyszukiwania na opisach, system odnajduje więc oryginalny fragment tekstu lub plik obrazu.

Podczas zapytania, pytanie samo jest wektoryzowane i porównywane z zaindeksowanymi elementami. Fragmenty tekstu są przekazywane w niezmienionej formie, podczas gdy odnalezione obrazy są otwierane, a następnie kodowane w base64 – formacie tekstowym, który pozwala na dołączenie ich do zapytania. Całość jest wysyłana do GPT-4o, który generuje odpowiedź opartą na obu typach treści. Samouczek ilustruje podejście na przykładzie pytania „What does the revenue chart show for Q3? », które może być użyte jako przykład.

Kierunki rozwoju

Autor wspomina o kilku możliwych rozszerzeniach: dodaniu etapu ponownego szeregowania (re-ranking) w celu poprawy precyzji wyszukiwania, zapisaniu bazy Chroma na dysku do użycia w środowisku produkcyjnym lub eksploracji modeli wizyjno-językowych takich jak ColPali, które bezpośrednio integrują strony dokumentów jako obrazy, omijając tym samym etap analizy.