Strona główna / Artykuły

Wybór fragmentów bez zapytania: wykorzystanie metody K-Means, gdy RAG nie ma żadnego pytania do zadania

Bez zapytania użytkownika RAG nie może wybrać kontekstu. Traktuj K jako liczbę wyników, zgrupuj embeddingi fragmentów za pomocą k-means, zachowaj fragmenty o środkowych wartościach oraz ich źródła.

Wydawca: REACTAPP.TOP13 min czytania3095 słów

Źródła: You Don’t Need RAG. You Need Semantic Compression.

Część problemów związanych z LLM nie ma nazwy, określonego frameworku ani obszernej literatury. Problem ten wygląda następująco: bardzo duża ilość tekstu, brak pytania użytkownika, a zadaniem jest wybranie tych fragmentów, które należy przekazać modelowi, aby każdy temat został poruszony, a każdy fragment mógł zostać prześledzony do swojego źródła.

To nie jest generowanie wzbogacone o wyszukiwanie, ponieważ nic nie jest wyszukiwane. To nie jest kompresja promptów ani streszczanie. Społeczność badawcza nie nadała temu jeszcze jasnej nazwy, a standardowe narzędzia go pomijają. Poniżej przedstawiono ten problem, wyjaśniono, dlaczego istniejące techniki są niewystarczające, oraz opisano prostą metodę rozwiązania, która zbiega się z koncepcjami akademickimi i wypełnia lukę pozostawioną przez te prace.

Gdy nie ma nic do wyszukiwania

Każdy, kto w ciągu ostatnich kilku lat pracował z modelami językowymi, zna pętlę RAG: użytkownik zadaje pytanie, zapytanie jest wzbudzane, z magazynu wektorowego przychodzą podobne fragmenty, które trafiają do promptu, a następnie generowana jest odpowiedź oparta na nich. Ten schemat jest elegancki, dobrze udokumentowany i wspierany przez wszystkie główne frameworki. Przy tym domyśla się on w tle istnienia zapytania.

Często takiego zapytania nie ma. Frameworky takie jak LangChain i LlamaIndex są zorganizowane wokół zapytań i ich wyszukiwania, a większość prac na temat kompresji kontekstu również wychodzi od zapytania. W poszukiwaniu sposobów na wybór najlepszych fragmentów dla modelu językowego każdy wynik zakłada istnienie pytania użytkownika, które ma kierować tym wyborem.

Rozważmy aplikację do nauki. Studenci przesyłają materiały kursowe: podręczniki, prezentacje, transkrypcje wideo, ręczne notatki – czasami setki stron. Nie wyszukują niczego. W istocie mówią: „Oto moje kursy, stwórz mi materiały do nauki”. System musi wtedy tworzyć ustrukturyzowane wyniki, takie jak karty testowe, karty memowe, streszczenia i mapy pojęciowe. Każdy z tych wyników powinien dotyczyć innego tematu i wskazywać źródło, przy czym całkowita objętość materiałów źródłowych znacznie przewyższa możliwości okna kontekstowego.

Trzy wymagania jednocześnie

Istniejące podejścia każde z nich łamią przynajmniej jedno z trzech ograniczeń narzuconych przez ten przypadek użycia.

  1. Brak sygnału zapytania. Nic z przesłanego przez użytkownika nie kieruje wyboru, więc system musi samodzielnie ocenić, co jest ważne, na podstawie samych danych.
  2. Gwarantowane tematyczne objęcie. Wynikiem jest zbiór materiałów, które łącznie obejmują całość tematu. Pominęcie całego zagadnienia to poważny błąd; test z biologii, który w ogóle nie dotyka genetyki, jest bezużyteczny.
  3. Śledzalność źródła. Każdy materiał musi odnosić się do konkretnej części oryginału, na przykład „na podstawie rozdziału 3, stron 12–14 podręcznika biochemii”. W edukacji nie jest to opcjonalne, ponieważ uczniowie muszą wiedzieć, gdzie dalej czytać.

Żaden istniejący metod nie spełnia jednocześnie wszystkich trzech warunków. To właśnie jest luka.

Co oferuje literatura naukowa i gdzie się kończy

Dlaczego wysyłanie wszystkiego zawodzi

Naiwnym podejściem jest włożenie całego materiału do okna kontekstowego. Biorąc pod uwagę modele obsługujące od 128 tys. do 200 tys. tokenów, łatwo jest pomyśleć, że to zadziała. Tak jednak nie jest. Badanie „Lost in the Middle” pokazało krzywą wydajności w kształcie litery U: modele dobrze radzą sobie z początkiem i końcem kontekstu, ale regularnie pomijają treść znajdującą się pośrodku. Dokładność spadała o ponad 30%, gdy kluczowa treść przenosiła się z brzegów na środek, nawet w przypadku modeli zaprojektowanych do obsługi długich kontekstów.

Dlatego nawet gdy wszystko mieści się w ramach, duże fragmenty materiału są ignorowane. Test obejmowałby pierwsze i ostatnie rozdziały, pomijając resztę. Więcej kontekstu nie oznacza lepszego kontekstu.

Kompresja promptów odpowiada na inne pytanie

Coraz więcej badań polega na skracaniu danych poprzez usuwanie zbędnych tokenów, zanim dotrą one do modelu.

Selective Context wykorzystuje niewielki model językowy do obliczania informacji własnej jednostek leksykalnych – czy to tokenów, fraz rzeczownikowych, czy zdań – i odrzuca te, które zawierają mało informacji. Nie wymaga żadnego zapytania, co spełnia pierwszą z ograniczeń. Jednak filtrował on tekst już istniejący, tworząc skompresowaną kopię tego samego tekstu, a nie wybór reprezentatywnych treści z różnych tematów. Nie może zagwarantować pełnego objęcia tematu, a zmodyfikowany tekst traci bezpośredni związek z oryginalnymi fragmentami, więc drugie i trzecie ograniczenie nie są spełnione.

LLMLingua i LLMLingua-2 rozwijają tę koncepcję poprzez iteracyjną kompresję oraz wykorzystanie nauczonych klasyfikatorów tokenów, osiągając współczynniki kompresji do 20 razy. Mają to samo podstawowe ograniczenie: tekst jest kompresowany dla maszyny, a nie organizowany dla człowieka. Rezultatem jest prompt, który model może zinterpretować, a nie ustrukturyzowana kolekcja treści, którą można prześledzić.

RECOMP szkoli kompresory, które potrafią streszczać lub wydobywać informacje z odzyskanych dokumentów, zarówno w podejściu ekstraktywnym, jak i abstraktywnym. Jest najbardziej zaawansowany w tej grupie, ale wymaga wyraźnie zapytania, aby zdecydować, co zachować, więc nie spełnia pierwszego ograniczenia.

Krótko mówiąc, kompresja na podstawie promptu zmniejsza liczbę tokenów. Nie wybiera reprezentatywnego treści, nie gwarantuje objęcia całego tematu ani nie zachowuje struktury źródłowej.

Ranking grafowy jedynie przedstawia, ale nie organizuje

TextRank i LexRank tworzą graf podobieństwa pomiędzy zdaniami i stosują PageRank, aby znaleźć te najbardziej centralne, czyli takie, które najlepiej reprezentują cały dokument. Nie wymagają żadnego zapytania i od dwóch dekad stanowią standard w niezawodzonej sumaryzacji bez nadzoru. Ich znaczną słabością jest redundancja – podobne zdania uzyskują podobny stopień centralności, więc najlepiej wybrane zdania często powtarzają się w różnych sformułowaniach. Podsumowanie tekstu z podręcznika biologii przy użyciu TextRank mogłoby zawierać trzy zdania na temat replikacji DNA, a żadnego o syntezie białek, po prostu dlatego, że replikacja jest wspominana częściej.

To pogarsza zakres poruszanych tematów, nawet jeśli główne kwestie i tak się pojawiają, a ponieważ metody te działają na zdania, możliwość śledzenia informacji jest tylko częściowo spełniona.

Klastrowanie jest najbliższe rozwiązaniu

Sumaryzacja oparta na klastrach, wykorzystująca metody takie jak K-means, HDBSCAN lub podobne zastosowane do wektorów zdań, grupuje podobne zdania w klastery tematyczne i wybiera po jednym reprezentancie z każdego. Dzięki temu skutecznie eliminuje redundancję – każdy klaster dostarcza jedno zdanie, a różne klastry obejmują różne tematy.

Najlepsze najnowsze badania w tej dziedzinie, „Graphs in Clusters”, łączą metodę K-means z TextRankiem. Najpierw stosuje się klasterowanie w celu objęcia jak największej liczby tematów, a następnie rankowanie wewnątrz każdego klastra pod kątem jego znaczenia. Metoda ta dorównuje lub przewyższa czysto grafowe oraz czysto oparte na klastrach rozwiązania w testach na długich dokumentach, takich jak ArXiv i PubMed.

Jest to najbliższy krewny, ale różni się pod kilkoma istotnymi względami. Jego celem jest jedno spójne podsumowanie tekstowe, podczas gdy tutaj celem są N strukturyzowanych wyników. Dostosowuje wartość K za pomocą metody łokcia, natomiast tutaj K pochodzi z żądania użytkownika. Pracuje z zdaniami, podczas gdy tutaj potrzebna jest określona granularność fragmentów, aby zachować metadane źródłowe. Jego klastry stanowią niewidzialny krok pośredni, podczas gdy tutaj są one samymi wynikami końcowymi. Ponadto nie uwzględnia konieczności śledzenia źródła.

Porównanie obu podejść

W obliczu tych trzech ograniczeń pojawia się określony wzorzec. RAG zachowuje źródła, ale wymaga zapytania i nie może zagwarantować pełnego objęcia. Selective Context i LLMLingua nie wymagają zapytania, ale tracą strukturę źródła i nie mogą zapewnić pełnego objęcia. RECOMP wymaga zapytania. TextRank i LexRank działają bez niego, ale dostarczają zbędnych wyników oraz słabą możliwość śledzenia źródeł. Sumaryzacja poprzez klastrowanie spełnia pierwsze dwa ograniczenia – nie wymaga zapytania i gwarantuje pełne objęcie – ale działa na poziomie zdań, co przerywa łańcuch powrotu do źródła.

Nie istnieje ustalona metoda do wyboru fragmentów, która byłaby wolna od zapytań, gwarantowała pełne objęcie i umożliwiała śledzenie źródeł.

Zmiana podejścia w kierunku klastrowania

Rozwiązanie polega na odwróceniu sposobu, w jaki zwykle wykorzystuje się klasterowanie w NLP. W literaturze naukowej K jest hiperparametrem. Badacze sprawdzają wartości K=5, K=10, K=50, rysują wykresy ocen sylwetki lub krzywe inercji i wybierają „najlepszą” wartość. Klasterzy to obiekty matematyczne służące algorytmowi, a użytkownik nigdy ich nie widzi.

W tym podejściu K stanowi specyfikację produktu. Uczeń proszący o 10 kart quizowych ustala K na 10. Pięć stron podsumowujących oznacza K=5, a trzydzieści kart flash oznacza K=30. Każdy klaster odpowiada dokładnie jednemu wynikowi. Klaster nie jest abstrakcją pośrednią – to sam produkt końcowy. Quiz na temat mitozy istnieje, ponieważ w semantycznym przestrzeni załadowanego treści istnieje klaster fragmentów związanych z mitozą.

Istniejące metody wykorzystują klasterowanie do kompresowania tekstu dla maszyny. Ta metoda wykorzystuje klasterowanie do uporządkowania treści dla człowieka.

W dalszej kolejności to zmienia wszystko. Tradycyjnie wartość K jest dostosowywana matematycznie, dzięki czemu klastry pozostają niewidoczne, a po procesie klasterowania powstaje zwykłe podsumowanie. Tutaj wartość K pochodzi z żądania użytkownika – każdy klasterek staje się czymś, co otrzymuje użytkownik, a każdy z nich uruchamia jedną próbę wywołania LLM, co daje jeden wynik z odniesieniem do źródła.

Proces w pięciu krokach

1. Dzielenie na fragmenty. Dokumenty są dzielone za pomocą standardowych narzędzi z LlamaIndex lub LangChain, albo według własnych zasad. Każdy fragment zachowuje swój tekst, plik źródłowy, numer strony, pozycję oraz wszelkie inne metadane. Typowa wielkość to od 500 do 1000 tokenów, przy 10–20% nakładaniu się sąsiednich fragmentów – to kompromis pomiędzy zachowaniem całościowych idei a drobnym podziałem klastrów. Fragmenty mogą być opcjonalnie wzbogacane o podsumowania, słowa kluczowe lub tagi entytetów, co ułatwia klasterowanie, ale nie jest konieczne.

2. Wbudowywanie. Każdy fragment staje się gęstym wektorem. Model zależy od wybranej metody: Sentence-Transformers to szybka, bezpłatna baza porównawcza, text-embedding-3-small od OpenAI radzi sobie dobrze w różnych językach, natomiast Mistral Embed lub Cohere Embed to konkurencyjne opcje. Ważne jest to, że fragmenty o zbliżonej semantyce dają wektory o podobnych wartościach, niezależnie od słownictwa.

3. K-means. To jest kluczowy krok. Metoda K-means dzieli przestrzeń wektorową na dokładnie K grup, przy czym liczba K jest ustalana według liczby wyników, których oczekuje użytkownik:

from sklearn.cluster import KMeans
n_outputs = 10  # User wants 10 quiz sheets
kmeans = KMeans(n_clusters=n_outputs, random_state=42, n_init=10)
kmeans.fit(embeddings)

Trzy właściwości wynikają bezpośrednio i odpowiadają na trzy ograniczenia. Nie jest potrzebne żadne zapytanie, ponieważ K-means grupuje według podobieństwa między fragmentami, a nie według ich powiązania z zewnętrznym sygnałem. Gwarantowana jest kompletność tematyczna, ponieważ każdy fragment trafia dokładnie do jednego klastra, a każdy temat w danych jest reprezentowany. Redundancja znika, ponieważ fragmenty mówiące to samo mają podobne reprezentacje wektorowe, trafiają razem i dostarczają jeden reprezentatywny przykład.

4. Wybór reprezentanta. Dla każdego klastra wybierz fragment najbliższy środkowi, który najlepiej oddaje temat danego klastra:

import numpy as np
selected = []
for i in range(n_outputs):
    cluster_indices = np.where(kmeans.labels_ == i)[0]
    centroid = kmeans.cluster_centers_[i]
    distances = np.linalg.norm(
        embeddings[cluster_indices] - centroid, axis=1
    )
    best_local_idx = np.argmin(distances)
    best_global_idx = cluster_indices[best_local_idx]
    selected.append(chunks[best_global_idx])  # Full chunk with metadata

Wybrany fragment zachowuje wszystkie swoje oryginalne metadane, więc nic nie jest tracione i wszystko można zacytować. Aby uzyskać bogatsze wyniki, zamiast jednego fragmentu można użyć trzech najbliższych fragmentów dla danego środka masy; zasada pozostaje ta sama.

5. Generowanie. Wybrane fragmenty z każdego klastra są przekazywane do modelu LLM wraz z promptem dostosowanym do rodzaju wyniku, a metadane źródłowe są przesyłane razem, aby model mógł je zacytować. Klaster 1 generuje Test 1, cytując strony 12 do 14 pierwszego pliku PDF. Klaster 2 generuje Test 2, cytując transkrypcję wideo o godzinie 14:30. Ten wzorzec powtarza się aż do klastra K.

Gdy nie podano liczby

Nie każdy użytkownik prosi o dziesięć testów; niektórzy chcą po prostu „jednego testu” lub „streszczenia”. Wystarczą trzy alternatywy. Budżet tokenów dzieli efektywny kontekst modelu przez średni rozmiar fragmentów: dla modelu o pojemności 16 tysięcy tokenów i fragmentach po 800 tokenów wartość K wynosi około 20. Metoda łokcia sprawdza kilka wartości K i wybiera punkt, w którym bezwładność przestaje spadać w znaczący sposób. Działa również przybliżona zasada jednego klastra na 5 do 10 stron tekstu źródłowego. W praktyce budżet tokenów jest najbardziej niezawodny, ponieważ bezpośrednio odzwierciedla to, z czym model może sobie poradzić.

Co gwarantuje ta metoda

Są to właściwości matematyczne algorytmu K-means, a nie obserwacje empiryczne.

  • Zakres. Każdy punkt jest przypisywany do klastra, więc żaden fragment nie pozostaje bez opieki. Jeśli dany temat istnieje, należy on do klastra posiadającego jego reprezentanta. W przeciwieństwie do tego, metoda wyszukiwania typu Top-K może zwrócić K fragmentów dotyczących jednego popularnego tematu, całkowicie pomijając inne.
  • Brak redundancji. Podobne fragmenty grupują się razem, a każda grupa ma tylko jednego reprezentanta. Dwa fragmenty mówiące to samo, ale innymi słowami, dzielą ten sam klasterek, przy czym przetrwa tylko jeden z nich.
  • Dostosowalna drobność. Niskie wartości K dają szerokie klasterki obejmujące szerokie tematy, natomiast wysokie wartości K dają wąskie klasterki dotyczące konkretnych pojęć; użytkownik może to regulować poprzez swoje żądanie.
  • Zachowanie źródła. Praca z fragmentami, a nie z tokenami czy zdaniami, pozwala zachować pełny łańcuch metadanych w każdym wybranym elemencie. Kompresja na poziomie tokenów z natury nie może tego zapewnić.
  • Szybkość. Metoda K-means na 500 wektorach embeddingowych o wymiarze 384 zajmuje mniej niż sekundę. Podczas selekcji nie odbywa się żadne wywołanie modelu językowego, jedynie podczas końcowej generacji, więc dodatkowy opóźnienie jest zaniedbywalne.
  • Gdzie ma ograniczenia

    Założenia sferyczne. Metoda K-means zakłada mniej więcej okrągłe klastry, a przestrzenie embeddingowe nie zawsze są tak uporządkowane. Temat o złożonym, niewypukłym kształcie może zostać rozdzielony między różne klastry. HDBSCAN lub modele mieszane Gaussa mogłyby pomóc, choć nie gwarantują dokładnie K klastrów.

    Typowy, niekoniecznie informatywny. Fragment najbliżej środka ciężkości jest najbardziej typowy. Uruchomienie algorytmu TextRank wewnątrz każdego klastra, tak jak to robi rozwiązanie Graphs in Clusters, pozwoliłoby na bardziej precyzyjny wybór i stanowi obiecującą poprawę.

    Mniejsze tematy są ściśnięte. Jeśli materiał składa się w 95% z biologii i w 5% z chemii, chemia prawdopodobnie otrzyma jeden klastr, podczas gdy biologia – od K do 1. Klastr chemii istnieje, ale jest proporcjonalnie skompresowany. Rozwiązaniem mogłaby być metoda ważona lub stratyfikowana.

    Jakość podziału na fragmenty decyduje o wszystkim. Jeśli podział na fragmenty dzieli koncepcję na pół lub łączy niespowiązane tematy, klasterowanie odziedzicza te problemy. Dobry podział na fragmenty, obejmujący semantyczne dzielenie, nakładanie się treści oraz wzbogacanie metadanymi, nie jest opcjonalny.

    Porównanie w jednej rundzie

    RAG jest szybki i zachowuje źródła, ale wymaga zapytania i może zwrócić K fragmentów na jeden temat. Selective Context i LLMLingua są szybkie i nie wymagają zapytań, jednak eliminują strukturę źródła i nie mogą zagwarantować pełnego pokrycia. RECOMP jest potężny, ale zależy od zapytania. TextRank i LexRank są szybkie i nie wymagają zapytań, jednak pokrycie jest częściowe ze względu na redundancję, a śledzenie kończy się na zdaniu. Graphs in Clusters nie wymaga zapytań i zapewnia dobre pokrycie, ale działa na zdaniach i usuwa metadane źródła. Sumaryzacja metodą MapReduce również nie wymaga zapytania, chociaż pokrycie jest częściowe, linki do źródeł znikają podczas kroków sumaryzacji, a sama metoda jest powolna, ponieważ wymaga kilku przetworzeń za pomocą modeli językowych.

    Opisany tutaj sposób selekcji fragmentów za pomocą K-means to jedyna opcja, która działa bez zadawania zapytania, gwarantuje tematyczną kompletność z samej natury, zapewnia pełną śledzalność na poziomie fragmentów, kończy się w mniej niż sekundę i nie wymaga ani dostosowanych modeli, ani bazy danych wektorowych.

    Nazwanie problemu

    To, co utrudnia jego rozwiązanie, to nie tyle brak technicznej głębi, co brak odpowiedniego nazewnictwa. Jeśli poszukamy RAG, pojawiają się tysiące wyników. Jeśli poszukamy kompresji promptów, wychodzi LLMLingua. Jeśli poszukamy sumaryzacji ekstraktywnej, pojawiają się metody oparte na TextRank, LexRank i BERT. Jeśli natomiast zapytamy, jak wybrać najlepsze fragmenty z dużego korpusu bez zadawania zapytania, aby maksymalizować tematyczną kompletność przy jednoczesnym zachowaniu śledzalności źródła, prawie nic nie wychodzi.

    Odpowiednią nazwą jest semantyczna kompresja bez zapytań. Nie jest to wyszukiwanie, ponieważ nie ma żadnego zapytania. Nie jest to streszczanie, ponieważ na tym etapie nie tworzy się nowego tekstu. Nie jest to kompresja podpowiedzi, ponieważ z istniejącego tekstu nie usuwa się żadnych tokenów. Jest to selekcja z gwarantowanym zakresem: wybór najmniejszego zestawu fragmentów, które reprezentują najszerszy zakres materiału, przy jednoczesnym zachowaniu powiązania z dokumentami.

    Problem pojawia się tam, gdzie system przekształca duże treści dostarczone przez użytkowników w strukturyzowane wyniki bez wyraźnego zamiaru wyszukiwania. Przykładami są materiały dydaktyczne z treści kursowych, raporty z dużych zbiorów dokumentów, streszczenia spotkań na podstawie godzinnych transkrypcji, podsumowania recenzji z dużych wniosków o zmianę oraz analizy prawne, gdzie ważniejszy jest zakres obejmowania poszczególnych klauzul niż odpowiedź na jedno pytanie.

    Podejście K-means to jedno z rozwiązań, być może najprostsze. Hybrydy łączące klasterowanie z rankingiem opartym na grafach, oceną gęstości informacji lub szybkim przetworzeniem za pomocą LLM w celu wykrywania tematów mogą osiągnąć lepsze wyniki, a ta dziedzina jest w pełni otwarta na rozwój.

    Wszystko w kodzie

    Cały proces selekcji mieści się w mniej niż 50 liniach kodu:

    from sentence_transformers import SentenceTransformer
    from sklearn.cluster import KMeans
    import numpy as np
    def select_representative_chunks(chunks, n_outputs, model_name='all-MiniLM-L6-v2'):
        """
        Select the most representative chunks from a large corpus
        using K-means clustering. One cluster = one output.
    
        Args:
            chunks: list of dicts with 'text', 'source', 'page', etc.
            n_outputs: number of outputs the user wants (= K)
            model_name: embedding model to use
    
        Returns:
            list of selected chunks with cluster metadata
        """
        # Embed
        model = SentenceTransformer(model_name)
        embeddings = model.encode([c['text'] for c in chunks], show_progress_bar=True)
    
        # Cluster
        kmeans = KMeans(n_clusters=n_outputs, random_state=42, n_init=10)
        kmeans.fit(embeddings)
    
        # Select representatives
        selected = []
        for i in range(n_outputs):
            cluster_indices = np.where(kmeans.labels_ == i)[0]
            centroid = kmeans.cluster_centers_[i]
            distances = np.linalg.norm(embeddings[cluster_indices] - centroid, axis=1)
            best_local_idx = np.argmin(distances)
            best_global_idx = cluster_indices[best_local_idx]
    
            selected.append({
                'cluster': i,
                'chunk': chunks[best_global_idx],
                'distance_to_centroid': float(distances[best_local_idx]),
                'cluster_size': len(cluster_indices),
            })
    
        return selected
    

    W kroku selekcji nie ma bazy danych wektorowych, żadnego procesu wyszukiwania, żadnego dostosowanego modelu ani żadnego wywołania LLM. Wystarczają embeddy, klasterowanie oraz wybór środka ciężkości.

    Gdzie zostało to wykorzystane w praktyce

    Proces ten został stworzony i przetestowany w aplikacji edukacyjnej, która generuje interaktywne materiały naukowe, takie jak quizy, karty memowe, streszczenia i mapy pojęciowe, na podstawie tego, co student załadowuje: notatki z wykładów, podręczniki, transkrypcje wideo oraz slajdy. Aplikacja zawiera również narzędzia dostosowane dla osób z dysleksją, ADHD lub innymi trudnościami poznawczymi, a także elementy gamifikacji. Projekt jest nadal w fazie intensywnych badań i rozwoju, obecnie dostępny w języku francuskim, z planowaną wersją w języku angielskim.

    W takim ustawieniu warstwa K-means zajmuje się selekcją treści. Skupienie 500 fragmentów zajmuje mniej niż sekundę, dobrze skaluje się i zapewnia tematyczną kompletność w bardzo różnych źródłach, od obszernych podręczników biologii po rozproszone nagrania wykładów.

    Dlaczego pomysł jest celowo prosty

    Wybór reprezentatywnych fragmentów z dużego korpusu, bez żadnego zapytania, z zachowaniem tematycznej kompletności i możliwością śledzenia źródeł, to potrzeba częstsza, niż sugeruje literatura. Każdy, kto tworzy narzędzia oparte na LLM do celów edukacyjnych, generowania raportów, analizy spotkań lub przeglądu prawnego, prawdopodobnie spotkał się z jakąś wersją tego problemu.

    Podejście jest celowo proste. K-means istnieje od dziesięcioleci, a embeddingi zdań to standardowe narzędzia. Zasługą tego rozwiązania jest sposób formułowania zadania: traktowanie intencji użytkownika jako wartości K, każdego klastra jako wyniku końcowego oraz zachowanie ciągłości łączącej fragmenty z ich źródłami w całym procesie.

    Nadal istnieje miejsce na ulepszenia. Klasterowanie można połączyć z rankingiem opartym na grafach, oceną gęstości informacji lub lekkimi procesami LLM do wykrywania tematów. Wybór środka ciężkości może zostać zastąpiony czymś bardziej subtelnym, takim jak ranking wewnątrz klastrów, selekcja uwzględniająca różnorodność lub krótkie wezwanie LLM w celu wybrania najbardziej informacyjnego fragmentu. Chodzi o to, aby tę koncepcję przejąć, dostosować i udoskonalić.