Ekspertyza · Bazy wiedzy i wyszukiwanie semantyczne
Budujemy korpus, z którego asystent ma prawo odpowiadać, z regułami dotyczącymi tego, co wchodzi, jak się dzieli, jak się wyszukuje i co się dzieje, gdy źródło się zmienia.
Asystent, który odpowiada klientom, jest dokładnie tak dobry, jak korpus, z którego czyta. Zajmujemy się korpusem: wyodrębnianiem z dokumentów i strony, dzieleniem na fragmenty, indeksowaniem, wyszukiwaniem, bramą zatwierdzenia przez człowieka i odświeżaniem. Obejmuje to odpowiedź na pytanie, kiedy NIE warto stosować wyszukiwania semantycznego.
Już zbudowaneIstnieją własne implementacje dla każdego etapu, ale ich stan się różni i trzeba to powiedzieć wprost. Co działa z własnymi wektorami: pamięć wewnętrznego boardu używanego codziennie, z kolumną `vector(1536)`, indeksem `ivfflat` dla odległości kosinusowej, progiem podobieństwa 0,35 i pętlą, która co 30 minut reindeksuje tylko to, co się zmieniło. Co działa z wektorami u dostawcy: baza wiedzy agentów głosowych, synchronizowana do silnika wyszukiwania dostawcy z fragmentami po 500 i nakładką 100. Co działa w produkcji **bez** wektorów: baza wiedzy platformy asystentów tekstowych — ekstrakcja, dzielenie, konfiguracja per asystent i wyszukiwanie hybrydowe są napisane i działają, ale ścieżka indeksowania zapisuje kolumnę wektorową jako `null`, więc wynik hybrydowy degraduje do leksykalnego, a kod sam to nazywa etykietą `keyword-only`. Co jest napisane i jeszcze nie uruchomione w produkcji: własny pipeline na `pgvector` platformy głosowej, którego migracja ma w nagłówku wzmiankę „LOCAL ONLY — do not push to prod”. Usługa sprzedaje się z taką mapą na stole, nie bez niej.
Asystent, który rozmawia z klientami, niczego nie „wie”. Przy każdym pytaniu ktoś wcześniej wyszukuje kilka fragmentów tekstu i podaje je przed nim, a on formułuje odpowiedź z nich. Jakość odpowiedzi rozstrzyga się niemal w całości na tym etapie wyszukiwania, nie przy wyborze modelu. Dlatego ta usługa dotyczy korpusu i wyszukiwania, a nie modelu.
Praca ma cztery części, które psują się niezależnie od siebie. Ekstrakcja: z jakich plików i z jakich stron wyciągamy tekst użyteczny oraz co robimy, gdy nie możemy. Dzielenie: jak duże są fragmenty, jak bardzo się nakładają, gdzie tnie się zdanie. Wyszukiwanie: jak dobiera się fragmenty do konkretnego pytania, ile ich jest i według jakiego kryterium. Odświeżanie: co się dzieje, gdy dokument źródłowy się zmienia. System może być nienaganny w trzech z nich i bezużyteczny przez czwartą.
Jest jeszcze jeden etap, który wiele osób pomija, a który całkowicie zmienia wynik: bramka akceptacji. Korpus, który rośnie sam, z rozmów, szybko zaczyna zawierać odpowiedzi, których nikt nie zweryfikował. Pętla, którą zbudowaliśmy, działa odwrotnie: gdy agent mówi „nie mam tej informacji”, pytanie zapisuje się ze statusem „w oczekiwaniu”, osoba otrzymuje powiadomienie i odpowiada, a odpowiedź przechodzi do stanu „zatwierdzone” i dopiero wtedy trafia do korpusu. Wiedza rośnie z rzeczywistych braków, z osobą w łańcuchu.
I niepopularna część: wyszukiwanie semantyczne nie zawsze jest właściwym wyborem. Dla własnej publicznej platformy odrzuciliśmy je celowo. Korpus to własny tekst platformy, podzielony na krótkie fragmenty, z których każdy niesie stronę, z której pochodzi, oznaczone nakładką słów. Bez wektorów, bez magazynu wektorowego, bez dodatkowego żądania sieciowego — i, co ważniejsze, bez żadnego źródła spoza repozytorium. Asystent może jedynie powtarzać to, co już jest napisane na stronie, a każda odpowiedź jest sprawdzana na stronie napisanej przez człowieka. To cały mechanizm antyinwencyjny.