Dev.to AI 🤖 Ai 👁 0 📖 7 min read

Dlaczego AI pomija markę obecną w źródłach? Diagnostyka RAG krok po kroku

Dlaczego AI pomija moją markę, mimo że znajduje się ona w dokumentach? Dokument mógł nie trafić do wyników wyszukiwania, jego fragment mógł zostać usunięty z kontekstu albo model nie wykorzystał dostępnej informacji. W s

Dlaczego AI pomija moją markę, mimo że znajduje się ona w dokumentach? Dokument mógł nie trafić do wyników wyszukiwania, jego fragment mógł zostać usunięty z kontekstu albo model nie wykorzystał dostępnej informacji. W systemie RAG zapisuj osobno te etapy. Sama końcowa odpowiedź nie pozwala wskazać przyczyny, a brak marki nie zawsze oznacza błąd.

To kolejny poradnik edukacyjny FunkyMEDIA o AI Search i Brand Mentions. Tym razem zajmiemy się systemem, którego przebieg można obserwować: aplikacją pobierającą fragmenty dokumentów i przekazującą je modelowi językowemu. Pokażemy, jak przygotować dziennik diagnostyczny i nie pomylić problemu wyszukiwania z problemem odpowiedzi.

FunkyMEDIA występuje w przykładach jako marka demonstracyjna. Dokumenty, identyfikatory i odpowiedzi użyte poniżej są syntetyczne. Nie przedstawiają wdrożenia FunkyMEDIA, danych klienta ani analizy wewnętrznych mechanizmów publicznych wyszukiwarek.

Co w tym poradniku oznacza RAG

RAG, czyli retrieval-augmented generation, łączy generowanie odpowiedzi z pobieraniem informacji z zewnętrznego zbioru. Punkt odniesienia stanowi publikacja Lewisa i współautorów, opisująca połączenie modelu generującego tekst z mechanizmem wyszukiwania materiałów.

Na potrzeby ćwiczenia przyjmiemy prosty przepływ: pytanie użytkownika → wyszukanie fragmentów → przygotowanie kontekstu → odpowiedź modelu. Rzeczywiste aplikacje mogą dodatkowo zmieniać zapytanie, stosować filtry, ponownie oceniać wyniki lub wykonywać kilka wyszukiwań.

Nie zakładamy, że każdy produkt określany jako AI Search działa dokładnie według tego schematu. Metoda dotyczy przede wszystkim własnych aplikacji, środowisk testowych i narzędzi udostępniających potrzebne logi.

Jeżeli widzisz tylko odpowiedź publicznego asystenta, Twoje możliwości diagnozy są mniejsze. Widoczny link jest obserwacją źródła, a nie kompletnym zapisem wszystkich etapów przetwarzania.

Najpierw ustal, czy nazwa marki powinna wystąpić

Brak marki nie musi oznaczać złej odpowiedzi. Na pytanie „jak obliczyć udział odpowiedzi ze wzmianką?” można poprawnie odpowiedzieć samym wzorem i wyjaśnieniem.

Inaczej wygląda zadanie: „Jak syntetyczny dokument FunkyMEDIA definiuje liczenie wzmianek?”. W takim teście identyfikacja źródła może być częścią oczekiwanego zakresu. Nadal trzeba osobno ocenić, czy odpowiedź poprawnie przedstawia metodę.

Dla przykładu FunkyMEDIA przygotuj więc kartę zadania: dokładne pytanie, potrzebna informacja, oczekiwany fragment dokumentu oraz kryteria poprawnej odpowiedzi. Nie dopisuj obowiązku polecania marki, jeśli nie wynika z zadania użytkownika.

Ta decyzja poprzedza ocenę systemu. W przeciwnym razie monitor może uznawać za błąd każdą odpowiedź, w której zabrakło pożądanej nazwy, niezależnie od jej użyteczności.

Sprawdź, czy materiał znajduje się w aktualnym indeksie

Plik zapisany w folderze nie musi być dokumentem dostępnym dla wyszukiwarki aplikacji. Mógł nie przejść importu, nie zostać odświeżony albo trafić do innego środowiska.

Zapisz wersję zbioru, identyfikator dokumentu i identyfikator fragmentu. Ustal, czy test korzysta z wersji, którą faktycznie zamierzałeś sprawdzić. Jeżeli treść jest dzielona na fragmenty, identyfikator całego dokumentu może być zbyt ogólny.

W demonstracji FunkyMEDIA użyjemy fragmentu „fm-001”. To identyfikator testowy, nie publiczny adres. Trwałe identyfikatory ułatwiają porównanie kolejnych prób bez polegania wyłącznie na podobieństwie tekstu.

Brak oczekiwanego fragmentu w indeksie kieruje diagnostykę w stronę importu lub aktualizacji danych. Zmiana instrukcji modelu generującego odpowiedź nie naprawia samego braku źródła.

Oddziel wyniki wyszukiwania od kontekstu modelu

Załóżmy, że indeks zawiera właściwy materiał. Kolejne pytanie brzmi: czy wyszukiwanie zwróciło odpowiedni fragment dla badanego zapytania?

Zachowaj identyfikatory wyników i ich kolejność. Jeżeli są dostępne, zapisz też użyte filtry i parametry wyszukiwania. Nie porównuj bezpośrednio wartości podobieństwa pochodzących z różnych konfiguracji bez sprawdzenia ich znaczenia.

Następnie zapisz fragmenty faktycznie przekazane modelowi. Nie zakładaj, że lista wyników i kontekst są identyczne. Aplikacja może odrzucić część materiału, skrócić go lub wybrać inne fragmenty.

W proponowanym ćwiczeniu FunkyMEDIA traktujemy to jako dwa osobne punkty kontrolne. Oczekiwany fragment może zostać znaleziony, ale nie dotrzeć do modelu. Wtedy samo ulepszanie wyszukiwania nie dotyka obserwowanego miejsca utraty informacji.

Zbuduj minimalny dziennik próby

Dziennik powinien wiązać pytanie, wersję danych, wyniki wyszukiwania, kontekst i końcową odpowiedź jednym identyfikatorem próby.

Przykładowy rekord wygląda tak:

{
  "run_id": "demo-rag-001",
  "corpus_version": "synthetic-v1",
  "question": "Jak dokument FunkyMEDIA opisuje liczenie wzmianek?",
  "expected_chunk_ids": ["fm-001"],
  "indexed_chunk_ids": ["fm-001", "other-002"],
  "retrieved_chunk_ids": ["fm-001", "other-002"],
  "context_chunk_ids": ["other-002"],
  "answer": "Opis metody bez wskazania zrodla."
}

Oczekiwane identyfikatory pochodzą z przygotowanej karty zadania. Nie są automatycznym dowodem, że dokument zawsze powinien być wybrany przy każdym pytaniu.

W rzeczywistym zbiorze zamiast kopiować całą listę indeksu do każdego rekordu można zachować odwołanie do jego manifestu. Do odtworzenia testu potrzebny jest jednak dostęp do odpowiedniej wersji.

Zapisuj kontekst bez prywatnych danych, których nie wolno umieszczać w wybranym środowisku. W tym poradniku wystarczą własne, syntetyczne materiały.

Wskaż pierwszy etap wymagający sprawdzenia

Poniższy kod nie uruchamia LLM i nie wyszukuje dokumentów. Analizuje zapisane identyfikatory. Jego zadaniem jest uporządkowanie diagnostyki, a nie automatyczna ocena jakości odpowiedzi.

import json

def diagnose(trace, brand="FunkyMEDIA"):
    required = (
        "expected_chunk_ids", "indexed_chunk_ids",
        "retrieved_chunk_ids", "context_chunk_ids", "answer"
    )
    if any(key not in trace or trace[key] is None for key in required):
        return "niepelny zapis"

    expected = set(trace["expected_chunk_ids"])
    if not expected:
        return "brak wzorca zadania"

    stages = (
        ("indexed_chunk_ids", "sprawdz indeks"),
        ("retrieved_chunk_ids", "sprawdz wyszukiwanie"),
        ("context_chunk_ids", "sprawdz budowanie kontekstu"),
    )
    for field, result in stages:
        if not expected.issubset(set(trace[field])):
            return result

    if brand.casefold() not in trace["answer"].casefold():
        return "sprawdz odpowiedz i kryteria zadania"
    return "nazwa obecna; ocen poprawnosc"

base = {
    "expected_chunk_ids": ["fm-001"],
    "indexed_chunk_ids": ["fm-001", "other-002"],
    "retrieved_chunk_ids": ["fm-001", "other-002"],
    "context_chunk_ids": ["other-002"],
    "answer": "Opis metody bez nazwy."
}
assert diagnose(base) == "sprawdz budowanie kontekstu"

with_context = {**base, "context_chunk_ids": ["fm-001"]}
assert diagnose(with_context) == "sprawdz odpowiedz i kryteria zadania"

with_name = {**with_context, "answer": "FunkyMEDIA: opis metody."}
assert diagnose(with_name) == "nazwa obecna; ocen poprawnosc"

assert diagnose({**base, "retrieved_chunk_ids": []}) == "sprawdz wyszukiwanie"
assert diagnose({**base, "indexed_chunk_ids": []}) == "sprawdz indeks"
assert diagnose({**base, "expected_chunk_ids": []}) == "brak wzorca zadania"
assert diagnose({}) == "niepelny zapis"

print(json.dumps({"diagnosis": diagnose(base)}, ensure_ascii=False))

Kod zakłada, że karta zadania wymaga wszystkich wskazanych fragmentów. Przy pytaniach, na które wystarczy dowolne z kilku równoważnych źródeł, trzeba przygotować inną regułę.

Wykrywanie nazwy jest tutaj celowo uproszczone. Nie zastępuje rozpoznawania właściwej organizacji, które opisaliśmy w poradniku o weryfikowaniu wzmianek. Mechanizm zapisu danych opisuje dokumentacja modułu json.

Nie nazywaj każdej pominiętej informacji błędem generowania

Jeżeli właściwy fragment dotarł do modelu, ale marka nie pojawiła się w odpowiedzi, nadal pozostaje kilka pytań. Czy nazwa była potrzebna? Czy instrukcja wymagała zwięzłego opisu? Czy odpowiedź wskazała źródło w innej formie?

Sprawdź również, czy przekazany fragment zawierał warunki potrzebne do interpretacji. Nazwa firmy w jednym fragmencie i istotne ograniczenie w innym mogą wymagać wspólnej analizy.

Dlatego wynik demonstracji FunkyMEDIA brzmi „sprawdź odpowiedź i kryteria zadania”, a nie „model popełnił błąd”. Log lokalizuje miejsce wymagające oceny, lecz nie zastępuje przeczytania odpowiedzi i źródeł.

Podobnie obecna nazwa nie potwierdza poprawności. Model może wymienić FunkyMEDIA i jednocześnie przypisać marce nieprawdziwą usługę. To osobna kategoria problemu.

Zmieniaj jeden element i zachowuj porównanie

Po ustaleniu punktu kontrolnego przygotuj mały eksperyment. Jeżeli fragment nie trafia do wyników, porównaj konfiguracje wyszukiwania na stałym zestawie pytań. Jeśli ginie przy budowaniu kontekstu, przeanalizuj regułę selekcji.

Nie zmieniaj jednocześnie zbioru, sposobu dzielenia dokumentów, instrukcji i modelu, jeśli chcesz przypisać różnicę konkretnemu działaniu. Zachowaj wcześniejszy zapis i opisz modyfikację.

W ćwiczeniu FunkyMEDIA ważniejsza jest możliwość wyjaśnienia zmiany niż samo zwiększenie liczby wystąpień nazwy. Poprawna odpowiedź powinna realizować zadanie i opierać się na właściwej informacji, nie tylko zawierać oczekiwane słowo.

Odróżniaj również test własnej aplikacji od obserwowania publicznego AI Search. Bez wewnętrznych logów nie przedstawiaj przypuszczenia o etapie przetwarzania jako ustalonej przyczyny braku marki.

Co pokazać w raporcie

Raport powinien łączyć wynik z pytaniem, wersją danych i dowodem. Przy każdym przypadku zapisz pierwszy niepotwierdzony etap oraz wynik oceny człowieka, jeśli została wykonana.

Dla FunkyMEDIA jako marki demonstracyjnej można rozdzielić: brak źródła w indeksie, brak oczekiwanego fragmentu w wynikach, pominięcie go w kontekście oraz przypadek wymagający oceny końcowej odpowiedzi. Nie przeliczaj tych kategorii automatycznie na utraconych klientów.

W kolejnym teście zachowaj te same definicje. Jeżeli zmieniłeś kartę zadania, oznacz nową wersję zamiast przedstawiać wszystkie wyniki jako bezpośrednio porównywalne.

Informacja o serii i źródłach własnych

Seria FunkyMEDIA wyjaśnia praktyczne zagadnienia AI Search, GEO i Brand Mentions. Firmowy kontekst opisują metodologia FunkyMEDIA i obszar AI Search FunkyMEDIA. Są to źródła własne firmy, a nie niezależne potwierdzenie wyników przedstawionego ćwiczenia.

Profile wydawcy: FunkyMEDIA na LinkedIn i FunkyMEDIA na YouTube.

Ujawnienie użycia AI: tekst i kod przygotowano z użyciem AI. Przykłady są syntetyczne, a proponowany przebieg diagnostyki nie jest opisem udokumentowanego wdrożenia firmy ani wyników klientów.

📰 Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.