Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano sposób tworzenia potoku danych nieustrukturyzowanych dla aplikacji generatywnej sztucznej inteligencji. Potoki danych bez struktury są szczególnie przydatne w aplikacjach generowania Retrieval-Augmented (RAG).
Dowiedz się, jak konwertować zawartość bez struktury, na przykład pliki tekstowe i pliki PDF na indeks wektorowy, do którego mogą wykonywać zapytania agenci sztucznej inteligencji lub inne osoby pobierające. Dowiesz się również, jak eksperymentować i dostosowywać potok, aby zoptymalizować fragmentowanie, indeksowanie i analizowanie danych, co pozwala na rozwiązywanie problemów oraz dalsze eksperymentowanie z potokiem w celu uzyskania lepszych wyników.
Notatnik potoku danych niestrukturalnych
W poniższym notesie przedstawiono sposób implementowania informacji w tym artykule w celu utworzenia potoku danych bez struktury.
Niestrukturalizowany potok danych Databricks
Kluczowe składniki potoku danych
Podstawą każdej aplikacji RAG z danymi bez struktury jest potok danych. Ten pipeline jest odpowiedzialny za opracowywanie i przygotowywanie nieustrukturyzowanych danych w formacie, z którego aplikacja RAG może efektywnie korzystać.
Chociaż ten potok danych może stać się złożony w zależności od przypadku użycia, poniżej przedstawiono kluczowe składniki, o których należy pomyśleć podczas pierwszego kompilowania aplikacji RAG:
- Kompozycja i pozyskiwanie korpusu: Wybierz odpowiednie źródła danych i zawartość w oparciu o konkretny przypadek użycia.
-
przetwarzanie wstępne danych: przekształcanie danych pierwotnych w czysty, spójny format odpowiedni do osadzania i pobierania.
- Parsowanie: wyodrębnianie odpowiednich informacji z surowych danych przy użyciu odpowiednich technik parsowania.
-
Wzbogacanie: wzbogacanie danych o dodatkowe metadane i usuwanie szumu.
- wyodrębnianie metadanych: wyodrębnianie przydatnych metadanych w celu szybszego i bardziej wydajnego pobierania danych.
- Proces deduplikacji (): Przeanalizuj dokumenty, aby zidentyfikować i wyeliminować duplikaty lub niemal identyczne dokumenty.
- filtrowanie: eliminuj nieistotne lub niepożądane dokumenty z kolekcji.
- Fragmentowanie: Podziel przeanalizowane dane na mniejsze, zarządzalne fragmenty w celu wydajnego pobierania.
- Osadzanie: przekonwertuj fragmentowane dane tekstowe na reprezentację wektorów liczbowych, która przechwytuje znaczenie semantyczne.
- Indeksowanie i przechowywanie: Tworzenie wydajnych indeksów wektorów dla zoptymalizowanej wydajności wyszukiwania.
Kompozycja korpusu i wprowadzenie
Aplikacja RAG nie może pobrać informacji wymaganych do udzielenia odpowiedzi na zapytanie użytkownika bez odpowiedniego korpusu danych. Prawidłowe dane zależą całkowicie od konkretnych wymagań i celów aplikacji, co ma kluczowe znaczenie dla poświęcania czasu na zrozumienie niuansów dostępnych danych. Aby uzyskać więcej informacji, zobacz proces dewelopera aplikacji Generatywnej AI .
Na przykład podczas tworzenia bota pomocy technicznej klienta można rozważyć uwzględnienie następujących elementów:
- Dokumenty bazy wiedzy
- Często zadawane pytania (FAQ)
- Podręczniki i specyfikacje produktu
- Przewodniki rozwiązywania problemów
Skontaktuj się z ekspertami w dziedzinie i interesariuszami od początku dowolnego projektu, aby pomóc zidentyfikować i opracować odpowiednią zawartość, która może poprawić jakość i zakres Twojego korpusu danych. Mogą one udostępniać szczegółowe informacje na temat typów zapytań, które użytkownicy mogą przesyłać i ułatwiać określanie priorytetów najważniejszych informacji do uwzględnienia.
Databricks zaleca przyjmowanie danych w sposób skalowalny i przyrostowy. Usługa Azure Databricks oferuje różne metody pozyskiwania danych, w tym w pełni zarządzane łączniki dla aplikacji SaaS i integracji interfejsu API. Najlepszym rozwiązaniem jest pozyskiwanie i przechowywanie nieprzetworzonych danych źródłowych w tabeli docelowej. Takie podejście zapewnia zachowanie danych, możliwość śledzenia i inspekcję. Zobacz Łączniki standardowe w programie Lakeflow Connect.
przetwarzanie wstępne danych
Po zebraniu danych niezbędne jest wyczyszczenie i sformatowanie surowych danych w spójnym formacie odpowiednim do wdrażania i pobierania.
Analizowanie
Po zidentyfikowaniu odpowiednich źródeł danych dla aplikacji retriever następnym krokiem jest wyodrębnienie wymaganych informacji z danych pierwotnych. Ten proces, znany jako analizowanie, obejmuje przekształcenie danych bez struktury w format, którego aplikacja RAG może skutecznie używać.
Określone techniki analizowania i używane narzędzia zależą od typu danych, z którymi pracujesz. Na przykład:
- Dokumenty tekstowe (PDF, Dokumenty programu Word): gotowe biblioteki, takie jak bez struktury i PyPDF2 , mogą obsługiwać różne formaty plików i udostępniać opcje dostosowywania procesu analizowania.
- Dokumenty HTML: Biblioteki analizowania HTML, takie jak BeautifulSoup i lxml można użyć do wyodrębniania odpowiednich treści ze stron internetowych. Te biblioteki mogą pomóc w nawigowaniu po strukturze HTML, wybieraniu określonych elementów i wyodrębnieniu żądanego tekstu lub atrybutów.
- obrazy i zeskanowane dokumenty: techniki optycznego rozpoznawania znaków (OCR) są zwykle wymagane do wyodrębniania tekstu z obrazów. Popularne biblioteki OCR obejmują biblioteki typu open source, takie jak Tesseract lub wersje SaaS, takie jak Amazon Textract, Azure AI Vision OCRi Google Cloud Vision API.
Najlepsze rozwiązania dotyczące analizowania danych
Parsowanie zapewnia, że dane są czyste, ustrukturyzowane i gotowe do generowania osadzeń i wyszukiwania wektorowego. Podczas analizowania danych należy wziąć pod uwagę następujące najlepsze rozwiązania:
- Czyszczenie danych: przetwarza wyodrębniony tekst, aby usunąć nieistotne lub hałaśliwe informacje, takie jak nagłówki, stopki lub znaki specjalne. Zmniejsz ilość niepotrzebnych lub źle sformułowanych informacji, które musi przetworzyć łańcuch RAG.
- Obsługa błędów i wyjątków: zaimplementuj mechanizmy obsługi błędów i rejestrowania, aby zidentyfikować i rozwiązać wszelkie problemy napotkane podczas procesu analizowania. Ułatwia to szybkie identyfikowanie i rozwiązywanie problemów. Często wskazuje to na nadrzędne problemy z jakością danych źródłowych.
- Dostosowywanie logiki analizowania: w zależności od struktury i formatu danych może być konieczne dostosowanie logiki analizowania w celu wyodrębnienia najbardziej odpowiednich informacji. Chociaż może wymagać dodatkowego nakładu pracy z góry, zainwestuj czas, aby to zrobić w razie potrzeby, ponieważ często uniemożliwia wiele problemów z jakością podrzędną.
- Ocenianie jakości analizowania: Regularnie oceniaj jakość analizowanych danych, ręcznie przeglądając próbkę danych wyjściowych. Może to pomóc w zidentyfikowaniu wszelkich problemów lub obszarów poprawy w procesie analizowania.
Wzbogacanie
Wzbogacanie danych o dodatkowe metadane i usuwanie szumu. Mimo że wzbogacanie jest opcjonalne, może znacząco poprawić ogólną wydajność aplikacji.
Wyodrębnianie metadanych
Generowanie i wyodrębnianie metadanych, które przechwytują podstawowe informacje o zawartości, kontekście i strukturze dokumentu, mogą znacznie poprawić jakość i wydajność pobierania aplikacji RAG. Metadane udostępniają dodatkowe sygnały, które zwiększają istotność, umożliwiają zaawansowane filtrowanie i obsługują wymagania dotyczące wyszukiwania specyficzne dla domeny.
Biblioteki takie jak LangChain i LlamaIndex zapewniają wbudowane analizatory umożliwiające automatyczne wyodrębnianie skojarzonych standardowych metadanych, dlatego często warto uzupełnić je niestandardowymi metadanymi dostosowanymi do konkretnego przypadku użycia. Takie podejście zapewnia przechwycenie kluczowych informacji specyficznych dla domeny, poprawę pobierania podrzędnego i generowania. Możesz również użyć dużych modeli językowych (LLMs), aby zautomatyzować ulepszenia metadanych.
Typy metadanych to:
- metadane na poziomie dokumentu: nazwa pliku, adresy URL, informacje o autorze, sygnatury czasowe tworzenia i modyfikacji, współrzędne GPS i przechowywanie wersji dokumentów.
- metadane oparte na zawartości: wyodrębnione słowa kluczowe, podsumowania, tematy, nazwane jednostki i tagi specyficzne dla domeny (nazwy produktów i kategorie, takie jak dane osobowe lub HIPAA).
- metadane strukturalne: nagłówki sekcji, spis treści, numery stron i granice zawartości semantycznej (rozdziały lub podsekcje).
- metadane kontekstowe: system źródłowy, data pozyskiwania, poziom poufności danych, oryginalny język lub instrukcje ponadnarodowe.
Przechowywanie metadanych obok fragmentowanych dokumentów lub ich odpowiednich osadzania jest niezbędne w celu uzyskania optymalnej wydajności. Pomoże to również zawęzić pobrane informacje i poprawić dokładność i skalowalność aplikacji. Ponadto zintegrowanie metadanych z hybrydowymi potokami wyszukiwania, co oznacza połączenie wyszukiwania wektorów z filtrowaniem opartym na słowach kluczowych, może zwiększyć istotność, szczególnie w przypadku dużych zestawów danych lub określonych scenariuszy kryteriów wyszukiwania.
Deduplikacja
W zależności od źródeł, możesz otrzymać zduplikowane dokumenty lub niemal identyczne kopie. Na przykład w przypadku ściągania z co najmniej jednego dysku udostępnionego wiele kopii tego samego dokumentu może istnieć w wielu lokalizacjach. Niektóre z tych kopii mogą mieć subtelne modyfikacje. Podobnie baza wiedzy może mieć kopie dokumentacji produktu lub kopie wersji roboczych wpisów w blogu. Jeśli te duplikaty pozostaną w korpusie, może skończyć się na bardzo powtarzających się fragmentach w ostatecznym indeksie, które mogą zmniejszyć wydajność aplikacji.
Niektóre duplikaty można wyeliminować przy użyciu samych metadanych. Jeśli na przykład element ma ten sam tytuł i datę utworzenia, ale wiele wpisów z różnych źródeł lub lokalizacji, można je filtrować na podstawie metadanych.
Może to jednak nie wystarczyć. Aby ułatwić identyfikowanie i eliminowanie duplikatów na podstawie zawartości dokumentów, można użyć techniki znanej jako skróty zależne od lokalizacji. W szczególności w tym miejscu działa technika o nazwie MinHash, a implementacja platformy Spark jest już dostępna w Spark ML. Działa przez utworzenie skrótu dla dokumentu na podstawie zawartych w nim słów, a następnie może skutecznie identyfikować duplikaty lub prawie duplikaty przez łączenie na podstawie tych skrótów. Na bardzo wysokim poziomie jest to proces czteroetapowy:
- Utwórz wektor funkcji dla każdego dokumentu. W razie potrzeby rozważ zastosowanie technik, takich jak usuwanie stop słów, "stemming" i lematyzacja, aby poprawić wyniki, a następnie dokonaj tokenizacji na n-gramy.
- Utwórz model MinHash i zhashuj wektory przy użyciu MinHash dla odległości Jaccard.
- Uruchom sprzężenie podobieństwa, używając tych skrótów, aby utworzyć zestaw wyników dla każdego duplikatu lub niemal zduplikowanego dokumentu.
- Odfiltruj duplikaty, których nie chcesz zachować.
Podstawowy krok deduplikacji może wybrać dokumenty do zachowania w dowolny sposób (na przykład pierwszy z wyników każdego duplikatu lub losowy wybór spośród duplikatów). Potencjalnym ulepszeniem byłoby wybranie "najlepszej" wersji duplikatu przy użyciu innej logiki (np. ostatnio zaktualizowanej, stanu publikacji lub najbardziej autorytatywnego źródła). Należy również pamiętać, że może być konieczne eksperymentowanie z procesem tworzenia cech i liczbą tabel skrótów używanych w modelu MinHash, aby poprawić wyniki dopasowania.
Aby uzyskać więcej informacji, zobacz dokumentację Spark na temat haszowania wrażliwego na lokalność.
filtrowanie
Niektóre dokumenty pozyskiwane do korpusu mogą nie być przydatne dla agenta, ponieważ są nieistotne dla jego celu, zbyt stare lub niewiarygodne, albo zawierają problematyczne treści, takie jak obraźliwy język. Mimo to inne dokumenty mogą zawierać poufne informacje, których nie chcesz ujawniać za pośrednictwem agenta.
Dlatego rozważ uwzględnienie kroku w potoku, aby odfiltrować te dokumenty za pomocą metadanych, na przykład stosując klasyfikator toksyczności do dokumentu, aby uzyskać przewidywania, których można użyć jako filtru. Innym przykładem może być zastosowanie algorytmu wykrywania danych osobowych (PII) do dokumentów w celu filtrowania dokumentów.
Na koniec wszystkie źródła dokumentów wprowadzane do agenta są potencjalnymi wektorami ataków, które mogą być wykorzystane przez złe podmioty, w celu uruchomienia ataków zatrucia danych. Możesz również rozważyć dodanie mechanizmów wykrywania i filtrowania, aby ułatwić identyfikowanie i eliminowanie tych mechanizmów.
fragmentowanie
Po przeanalizowaniu nieprzetworzonych danych w bardziej ustrukturyzowanym formacie, usunięciu duplikatów i odfiltrowaniu niechcianych informacji następnym krokiem jest podzielenie ich na mniejsze, możliwe do zarządzania jednostki nazywane fragmentami. Segmentowanie dużych dokumentów na mniejsze, semantycznie skoncentrowane fragmenty zapewnia, że pobrane dane mieszczą się w kontekście LLM, jednocześnie minimalizując włączenie rozpraszających lub nieistotnych informacji. Wybory dotyczące fragmentowania będą mieć bezpośredni wpływ na pobierane dane udostępniane przez LLM, co stanowi jedną z pierwszych warstw optymalizacji w aplikacji RAG.
Podczas fragmentowania danych należy wziąć pod uwagę następujące czynniki:
- Strategia fragmentowania: metoda używana do dzielenia oryginalnego tekstu na fragmenty. Może to obejmować podstawowe techniki, takie jak dzielenie według zdań, akapitów, określonej liczby znaków/tokenów i bardziej zaawansowane strategie dzielenia specyficzne dla dokumentu.
- rozmiar fragmentu: Mniejsze fragmenty mogą skupić się na konkretnych szczegółach, ale tracą niektóre otaczające informacje kontekstowe. Większe fragmenty mogą przechwytywać więcej kontekstu, ale mogą zawierać nieistotne informacje lub być kosztowne w obliczeniach.
- Nakładanie się między fragmentami: aby upewnić się, że ważne informacje nie zostaną utracone podczas dzielenia danych na fragmenty, rozważ uwzględnienie niektórych nakładających się między sąsiadujących fragmentów. Nakładanie się może zapewnić ciągłość i zachowanie kontekstu we fragmentach oraz poprawić wyniki pobierania.
- spójność semantyczna: Jeśli to możliwe, należy utworzyć semantycznie spójne fragmenty zawierające powiązane informacje, ale mogą stać niezależnie jako znacząca jednostka tekstu. Można to osiągnąć, biorąc pod uwagę strukturę oryginalnych danych, takich jak akapity, sekcje lub granice tematów.
- Metadane:odpowiednie metadane, takie jak nazwa dokumentu źródłowego, nagłówek sekcji lub nazwy produktów, mogą poprawić wyszukiwanie. Te dodatkowe informacje mogą pomóc w dopasowaniu zapytań pobierania do fragmentów.
Strategie fragmentowania danych
Znalezienie właściwej metody fragmentowania jest zarówno iteracyjne, jak i zależne od kontekstu. Nie ma podejścia uniwersalnego. Optymalny rozmiar i metoda fragmentu zależą od konkretnego przypadku użycia i charakteru przetwarzanych danych. Ogólnie rzecz biorąc, strategie fragmentowania można postrzegać jako następujące:
- Fragmentowanie o stałym rozmiarze: podziel tekst na fragmenty wstępnie określonego rozmiaru, na przykład stałą liczbę znaków lub tokenów (na przykład LangChain CharacterTextSplitter). Podział według dowolnej liczby znaków lub tokenów można szybko i łatwo ustawić, ale zwykle nie prowadzi to do uzyskania spójnych pod względem semantyki fragmentów. Takie podejście rzadko działa w przypadku aplikacji klasy produkcyjnej.
- Fragmentowanie oparte na akapitach: użyj naturalnych granic akapitu w tekście, aby zdefiniować fragmenty. Ta metoda może pomóc w zachowaniu spójności semantycznej fragmentów, ponieważ akapity często zawierają powiązane informacje (na przykład LangChain RecursiveCharacterTextSplitter).
- fragmentowanie specyficzne dla formatu: Formaty, takie jak Markdown lub HTML, mają nieodłączną strukturę, która może definiować granice fragmentów (na przykład nagłówki markdown). Do tego celu można używać narzędzi takich jak MarkdownHeaderTextSplitter języka LangChain lub oparte na sekcjach nagłówków/HTML.
- fragmentowanie semantyczne: Techniki, takie jak modelowanie tematów, można zastosować do identyfikowania semantycznie spójnych sekcji w tekście. Te podejścia analizują zawartość lub strukturę każdego dokumentu, aby określić najbardziej odpowiednie granice fragmentów na podstawie przesunięć tematu. Chociaż bardziej skomplikowane niż podstawowe podejścia, fragmentowanie semantyczne może pomóc w tworzeniu fragmentów, które są bardziej dopasowane do naturalnych podziałów semantycznych w tekście (zobacz LangChain SemanticChunkerna przykład).
Przykład: podział na fragmenty o stałej wielkości
Przykład fragmentowania o stałym rozmiarze przy użyciu RecursiveCharacterTextSplitter LangChain z chunk_size=100 i chunk_overlap=20. ChunkViz umożliwia interaktywną wizualizację, w jaki sposób różne rozmiary fragmentów i wartości nakładania się fragmentów z użyciem podziałów znaków Langchain wpływają na końcowe fragmenty.
osadzanie
Po fragmentowaniu danych następnym krokiem jest przekonwertowanie fragmentów tekstu na reprezentację wektorową przy użyciu modelu osadzania. Model osadzania konwertuje każdy fragment tekstu na reprezentację wektorową, która przechwytuje jego znaczenie semantyczne. Reprezentując fragmenty jako gęste wektory, osadzenia umożliwiają szybkie i dokładne pobieranie najbardziej odpowiednich fragmentów na podstawie ich semantycznego podobieństwa do zapytania wyszukiwania. Zapytanie wyszukiwania zostanie przekształcone w momencie zapytania przy użyciu tego samego modelu osadzania, które było używane do implementacji fragmentów w potoku danych.
Podczas wybierania modelu osadzania należy wziąć pod uwagę następujące czynniki:
- wybór modelu: Każdy model osadzania ma niuanse, a dostępne testy porównawcze mogą nie przechwytywać określonych cech danych. Wybór modelu, który został wytrenowany na podobnych danych, ma kluczowe znaczenie. Przydatne może być również zapoznanie się z dostępnymi modelami osadzania przeznaczonymi dla określonych zadań. Poeksperymentuj z różnymi dostępnymi na rynku modelami osadzania, nawet z tymi, które mogą być niżej sklasyfikowane w standardowych rankingach, takich jak MTEB. Kilka przykładów, które należy wziąć pod uwagę:
- Maksymalne tokeny: Informacje o maksymalnym limicie tokenów dla wybranego modelu osadzania. Jeśli przekażesz fragmenty, które przekraczają ten limit, zostaną skrócone, potencjalnie tracąc ważne informacje. Na przykład bge-large-en-v1.5 ma maksymalny limit tokenu wynoszący 512.
- Rozmiar modelu: większe modele osadzania zwykle działają lepiej, ale wymagają większej ilości zasobów obliczeniowych. W zależności od konkretnego przypadku użycia i dostępnych zasobów należy zrównoważyć wydajność i efektywność.
- Dostrajanie: Jeśli twoja aplikacja RAG zajmuje się językiem specyficznym dla domeny (takim jak wewnętrzne akronimy firmy lub terminologia), rozważ dostosowanie modelu embeddingowego na danych specyficznych dla domeny. Może to pomóc modelowi lepiej uchwycić niuanse i terminologię danej domeny i często może prowadzić do poprawy wydajności pobierania.
indeksowanie i przechowywanie
Następnym krokiem w potoku jest tworzenie indeksów dla osadzeń i metadanych wygenerowanych w poprzednich krokach. Ten etap obejmuje organizowanie wielowymiarowych wektorów osadzeń w wydajnych strukturach danych, które umożliwiają szybkie i dokładne wyszukiwanie podobieństw.
Mosaic AI Vector Search używa nowoczesnych technik indeksowania przy wdrażaniu punktu końcowego wyszukiwania wektorowego oraz podczas tworzenia indeksu, aby zapewnić szybkie i wydajne przetwarzanie zapytań wyszukiwań wektorowych. Nie musisz martwić się o testowanie i wybieranie najlepszych technik indeksowania.
Po utworzeniu i wdrożeniu indeksu jest gotowy do przechowywania w systemie obsługującym skalowalne zapytania o małych opóźnieniach. W przypadku produkcyjnych potoków RAG z dużymi zestawami danych użyj wektorowej bazy danych lub skalowalnej usługi wyszukiwania, aby zapewnić małe opóźnienia i wysoką przepływność. Przechowuj dodatkowe metadane wraz z osadzaniami, aby umożliwić wydajne filtrowanie podczas pobierania.