Wzbogacanie metadanych w RAG: filtry, cytaty, świeżość i kontrola dostępu
Dlaczego system RAG zwraca politykę niewłaściwego regionu oraz jak metadane źródłowe, organizacyjne, czasowe i bezpieczeństwa poprawiają wyniki wyszukiwania, gdy są dołączane podczas przetwarzania danych.
Źródła: Metadata Enrichment in RAG: The Secret Ingredient for Better Retrieval
Załóżmy, że zespół stworzył dla firmy chatbota do generowania treści wzbogaconego o możliwość wyszukiwania informacji. Minęło wiele dni na wybór modelu embeddingu, skonfigurowano bazę danych wektorową, a na jej wierzchu umieszczono zaawansowany model LLM. Byli z tego zadowoleni, gdy ktoś wpisał pytanie dotyczące polityki urlopu macierzyńskiego dla pracowników w biurze w Europie.
Odpowiedź nadeszła szybko: pracownicy mają prawo do 20 tygodni opłaconego urlopu macierzyńskiego. Wydawało się to prawidłowe. Jednak sprawdzenie dokumentów źródłowych pokazało, że tekst znaleziony pochodził z polityki przeznaczonej dla pracowników w Stanach Zjednoczonych, a nie w Europie. System wyszukiwania znalazł fragment dotyczący urlopu macierzyńskiego, ale nie wiedział, do której regionu należy, ponieważ otaczający go kontekst został utracony podczas dzielenia tekstu na fragmenty i tworzenia indeksu.
To jeden z najczęstszych problemów w systemach RAG. Większość dyskusji na temat RAG koncentruje się na embeddingach, strategiach dzielenia na fragmenty oraz bazach danych wektorowych, podczas gdy jeden z największych czynników wpływających na jakość wyszukiwania pozostaje pomijany: wzbogacanie metadanymi. Metadane umożliwiają systemowi wyszukiwania zrozumienie nie tylko tego, co mówi dany fragment, ale także tego, skąd pochodzi, do kogo jest przeznaczony, kiedy został napisany oraz jak pasuje do pozostałych materiałów. W wielu aplikacjach korporacyjnych pomagają one odróżnić wynik, który jedynie dotyczy tematu, od tego, który jest rzeczywiście poprawny.
Co idzie nie tak przy wyszukiwaniu opartym wyłącznie na treści
Spójrz, jak zazwyczaj funkcjonuje system RAG dla początkujących. Organizacja posiada trzy dokumenty polityczne: podręcznik dla pracowników w USA, jeden dla Europy oraz jeden dla Azji i Pacyfiku. Wszystkie trzy zawierają rozdział dotyczący urlopu macierzyńskiego. Po podziale na fragmenty baza wektorowa przechowuje niemal identyczne zdania, które różnią się jedynie liczbą: 20 tygodni w jednym, 16 w drugim i 26 w trzecim.
Dla modelu embeddingowych te fragmenty są niezwykle podobne, ponieważ wszystkie trzy dotyczą tego samego tematu. Jeśli zada się pytanie o urlop macierzyński, system może przywrócić dowolny z nich. Rozumie on znaczenie semantyczne, ale nie posiada automatycznego zrozumienia kontekstu biznesowego. Właśnie dlatego metadane stają się niezbędne.
Czym są metadane
Metadane to dane o danych. W systemie RAG opisują one fragment, nie będąc częścią jego głównej treści. Obejmują wszystko, co jest prawdą o danym fragmencie tekstu, ale nie to, co tekst sam mówi.
Weź fragment z przykładu na początku:
Employees are entitled to 20 weeks of paid maternity leave.
Sam w sobie ten zapis jest jasny i kompletny, a jego treść dostarcza odpowiedzi. Nie podaje jednak, z jakiego dokumentu pochodzi, jaką politykę danego regionu opisuje, kto zapewnia jej aktualność ani kiedy została ostatnio sprawdzona. Tekst odpowiada na to, co mówi polityka. Nie może natomiast odpowiedzieć, czy jest to odpowiednia polityka dla danej sytuacji osoby, co dokładnie poszło nie tak, gdy amerykański fragment został odesłany w związku z pytaniem europejskim.
Teraz ten sam fragment z dodanymi metadanymi:
{
"source": "EU_HR_Policy.pdf",
"region": "Europe",
"department": "Human Resources",
"last_updated": "2025-03-15"
}
Żadne z tych czterech pól nie stanowi części zdania. Słowo „Europa” oraz nazwa pliku nie pojawiają się w samym tekście. Mimo to system poszukiwania ma teraz o wiele więcej materiału do przetworzenia. Fragment tekstowy zawiera kontekst, który można wykorzystać do wyszukiwania, filtrowania, rankowania oraz generowania odpowiedzi, a ten kontekst znajduje się obok treści, nie mieszając się z nią.
To oddzielenie jest źródłem mocy metadanych. Model embeddingu zgodnie ze swoją konstrukcją koduje jedynie page_content fragmentu i w ogóle nie widzi metadanych. Metadane nie mają na celu wpływania na sposób embedowania fragmentu. Istnieją po to, aby każda inna część systemu, w tym filtry, kontrole dostępu, cytaty oraz logika rankowania, miała coś konkretnego do obróbki, niezależnie od tego, jakie wnioski wyciągnął model embeddingu dotyczące podobieństwa semantycznego.
Prosty model mentalny: metadane to zbiór etykiet przypisywanych każdej części wiedzy. Bez etykiet każdy fragment to po prostu znaczenie unoszące się bez kontekstu, a wyszukiwanie musi polegać wyłącznie na domysłach na podstawie podobieństwa, tak jak to było w przypadku, gdy trzy regionalne polityki wyglądały niemal identycznie dla modelu embeddingowego. Z etykietami domysły są zastępowane czymś, co system może sprawdzić bezpośrednio. Pytanie zmienia się z tego, czy dany fragment brzmi podobnie do zapytania, na to, czy rzeczywiście należy do sytuacji, o którą chodzi.
Jak metadane poprawiają wyszukiwanie
Wróćmy do przypadku urlopu macierzyńskiego i prześledźmy krok wyszukiwania z metadanymi oraz bez nich.
Bez metadanych zapytanie dotyczące europejskich pracowników jest wysyłane do całej bazy wektorowej. Liczy się tylko podobieństwo semantyczne, a ponieważ trzy regionalne fragmenty są niemal identyczne z embeddingiem, system może z pewnością zwrócić tekst polityki z niewłaściwego regionu. W wyniku oceny podobieństwa nie widać żadnych oznak problemu.
System, który posiada metadane, może zamiast tego zastosować filtr przed wyszukiwaniem podobieństwa lub jednocześnie z nim:
filter = {
"region": "Europe"
}
Wyszukiwanie jest teraz ograniczone do fragmentów oznaczonych jako Europa. Zamiast przeszukiwać każdy dokument polityki, system sprawdza tylko odpowiedni podzbiór, dzięki czemu zasób kandydatów zmniejsza się, zanim podobieństwo może doprowadzić do błędnego wyniku.
Miejsce, w którym odbywa się filtrowanie, ma znaczenie. Większość produkcyjnych baz danych wektorowych obsługuje filtrowanie wstępne, które najpierw stosuje filtr metadanych, tak aby wyszukiwanie podobieństwa odbywało się tylko wśród pasujących fragmentów. Jest to szybsze i bardziej niezawodne niż filtrowanie późniejsze, przy którym pełne wyszukiwanie podobieństwa przeprowadzane jest we wszystkich danych, a wyniki niespójne są odrzucane później. Filtrowanie późniejsze może marnować zasoby obliczeniowe na nieistotne obszary i, w skrajnych przypadkach, zwracać mniej wyników, niż zostało to zapytane, gdy zbyt wiele najbardziej pasujących wyników zostaje odfiltrowanych późno. Zarówno Qdrant, jak i Weaviate są zaprojektowane tak, aby umożliwiać efektywne filtrowanie wstępne.
Oto szczegółowy opis sytuacji związanej z urlopem macierzyńskim, przedstawiony od początku do końca:
from sentence_transformers import SentenceTransformer
import numpy as np
embedding_model = SentenceTransformer("all-MiniLM-L6-v2")
chunks = [
{"text": "Employees are entitled to 20 weeks of paid maternity leave.", "region": "United States"},
{"text": "Employees are entitled to 16 weeks of paid maternity leave.", "region": "Europe"},
{"text": "Employees are entitled to 26 weeks of paid maternity leave.", "region": "Asia-Pacific"},
]
for c in chunks:
c["embedding"] = embedding_model.encode(c["text"])
query = "What is the maternity leave policy for employees in the European office?"
query_embedding = embedding_model.encode(query)
def search(chunks, query_embedding, region_filter=None):
candidates = chunks if region_filter is None else [c for c in chunks if c["region"] == region_filter]
scored = [(np.dot(query_embedding, c["embedding"]), c) for c in candidates]
scored.sort(key=lambda x: x[0], reverse=True)
return scored[0][1]
print("Without metadata filter:")
result = search(chunks, query_embedding)
print(f" Returned: '{result['text']}' (region: {result['region']})")
print("\nWith metadata filter (region='Europe'):")
result = search(chunks, query_embedding, region_filter="Europe")
print(f" Returned: '{result['text']}' (region: {result['region']})")
To bezpośrednio odtwarza problem z początku. Bez żadnego filtru sama podobieństwo wybiera fragment amerykański tylko dlatego, że ma nieco wyższą ocenę, a nie dlatego, że pasuje do pytania. Gdy zostanie zastosowany filtr regionalny, przestrzeń wyszukiwania kurczy się do jedynego europejskiego fragmentu i pojawia się poprawna odpowiedź, bez względu na to, jak podobne są pozostałe embeddingi.
Dokładność znacznie się poprawia, a różnica między wynikami wzrasta w miarę rozszerzania się korpusu. Wśród trzech dokumentów model embeddingowy może przez czysty przypadek umieścić poprawny dokument na pierwszym miejscu. W przypadku setek dokumentów obejmujących różne regiony, działy i lata sama podobieństwo staje się niewiarygodna, a filtrowanie według metadanych to jedyny niezawodny sposób na usunięcie wszystkiego, co nie należy.
Cztery rodzaje metadanych, które warto mieć
Nie wszystkie metadane są równie przydatne. Cztery kategorie pojawiają się często w rzeczywistych systemach przedsiębiorstw, a każda rozwiązuje inny problem.
Metadane źródłowe
Odpowiadają one na pytanie, skąd pochodzi informacja. Typowymi polami są nazwa pliku, numer strony, URL oraz identyfikator dokumentu. Są one istotne, gdy użytkownicy chcą mieć odniesienia lub chcą zweryfikować odpowiedź. Oto jak tworzone są odniesienia:
def format_citation(metadata):
return f"Source: {metadata['source']}, Page {metadata['page']}"
chunk_metadata = {"source": "Employee_Handbook_2025.pdf", "page": 42}
print(format_citation(chunk_metadata))
Który wydrukuje:
Source: Employee_Handbook_2025.pdf, Page 42
Ten ciąg cytatów nie powstaje w wyniku domyślania się przez model językowy źródła odpowiedzi. Jest to deterministyczne wyszukiwanie pól zapisanych podczas ładowania dokumentu. Zaufanie rośnie, gdy użytkownicy mogą prześledzić informacje aż do ich źródła, a to zależy od zachowania metadanych od momentu ich przyjęcia aż do ostatecznej odpowiedzi.
Metadane organizacyjne
Wiedza przedsiębiorstwa jest zazwyczaj rozdzielona pomiędzy różne działami i jednostki biznesowe, takie jak zasoby ludzkie, finanse, prawo i inżynieria. Takie tagowanie umożliwia zawężenie wyszukiwania do odpowiedniej części biznesu przed przeprowadzeniem analizy podobieństwa, wykorzystując ten sam mechanizm filtrowania opisany powyżej:
filter = {"department": "Finance"}
Poszukiwanie dokumentacji inżynieryjnej w celu znalezienia odpowiedzi na pytanie finansowe marnuje czas, ale istnieje jeszcze jeden problem: zapytanie finansowe przetworzone na tekście inżynieryjnym może przywołać błędny, niepowiązany z tematem fragment, który myląco dobrze radzi sobie pod względem surowej podobieństwa.
Metadane czasowe
Informacje zmieniają się z upływem czasu wraz z aktualizacjami polityk, ewolucją procedur i zmianami w przepisach. Bez danych czasowych system wyszukiwania nie jest w stanie odróżnić aktualnej polityki od przestarzałej. Wie on tylko, które fragmenty są semantycznie bliskie zapytaniu, a nie które są nadal obowiązujące.
Rozważmy dwa fragmenty dotyczące tej samej polityki z różnymi datami aktualizacji:
chunks = [
{"text": "Employees receive 15 vacation days per year.", "last_updated": "2023-01-10"},
{"text": "Employees receive 20 vacation days per year.", "last_updated": "2025-03-15"},
]
Oba prawdopodobnie będą uzyskiwać bardzo podobne wyniki w przypadku pytania o dni urlopowe, ponieważ temat i sformułowanie są niemal identyczne. Przechowywanie daty i godziny umożliwia systemowi celowe faworyzowanie nowszego wyniku, zamiast polegać na przypadku:
most_recent = max(chunks, key=lambda c: c["last_updated"])
print(most_recent["text"])
Wynik:
Employees receive 20 vacation days per year.
To ma kluczowe znaczenie w branżach, gdzie informacje często się zmieniają. Bez wyraźnej weryfikacji aktualności stara polityka i jej zamiennik są funkcjonalnie nierozróżnialne dla systemu wyszukiwania, który bierze pod uwagę jedynie podobieństwo.
Metadane bezpieczeństwa
Wiele organizacji potrzebuje kontroli dostępu opartej na rolach: dokumenty HR są widoczne tylko dla pracowników działu HR, a raporty finansowe tylko dla zespołów finansowych. Metadane umożliwiają egzekwowanie tych zasad. Fragment danych może zawierać takie pola:
chunk_metadata = {
"access_level": "confidential",
"allowed_roles": ["HR_Manager", "HR_Admin"]
}
Przed pobraniem system porównuje rolę użytkownika, który wysyła prośbę, z rolami uprawnionymi do przeglądania danego fragmentu:
def can_access(user_role, chunk_metadata):
return user_role in chunk_metadata["allowed_roles"]
print(can_access("HR_Manager", chunk_metadata)) # True
print(can_access("Engineering", chunk_metadata)) # False
Wynik:
True
False
W rzeczywistym procesie przetwarzania ta weryfikacja odbywa się jako filtr podczas pobierania danych, a nie jako kroik dodatkowy po tym, jak model językowy już posiada treść. Fragment, którego użytkownik nie ma uprawnień do zobaczenia, nigdy nie powinien trafić do promptu. Bez metadanych budowa bezpiecznego systemu RAG jest niezwykle trudna, ponieważ do każdego fragmentu nie dołączany jest żaden wiarygodny sygnał, który system mógłby porównać z uprawnieniami użytkownika przed podjęciem decyzji o jego pobraniu.
Dodawanie metadanych podczas pobierania
Metadane same z siebie nie pojawiają się. Muszą zostać dodane podczas pobierania dokumentu, a jeśli nie zostaną tam zapisane, nie da się ich odzyskać, ponieważ zanim fragment trafi do procesu embeddingu lub przechowywania, odnośnik do jego źródła już zniknął.
Weźmy na przykład PDF z polityką HR, który jest ładowany. Zwykły proces pobierania wykonywa następujące kroki w kolejności:
- Ładowanie dokumentu.
- Wydobywanie tekstu.
- Dzielenie treści na fragmenty.
- Dołącz metadane.
- Wygeneruj embeddingi.
- Zapisz fragmenty, embeddingi oraz metadane do bazy danych wektorowej.
Dołączanie metadanych następuje po podziale na fragmenty, a nie przed nim, i kolejność ma znaczenie. Metadane muszą być umieszczone w każdym z osobnych fragmentów, na które dzieli się dokument, zamiast być dołączone tylko raz do całego dokumentu.
from langchain_core.documents import Document
doc = Document(
page_content="Employees receive 20 weeks of maternity leave.",
metadata={
"department": "HR",
"region": "Europe",
"source": "EU_HR_Policy.pdf"
}
)
print(doc.page_content)
print(doc.metadata)
Wynik:
Employees receive 20 weeks of maternity leave.
{'department': 'HR', 'region': 'Europe', 'source': 'EU_HR_Policy.pdf'}
To jest proste, gdy dokument jest na tyle mały, by zmieścić się w jednym fragmencie. Rzeczywiste dokumenty jednak dzielą się na wiele fragmentów, a metadane muszą być skopiowane do każdego z nich:
def chunk_with_metadata(document, chunk_size=60):
text = document.page_content
chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
return [
Document(page_content=chunk_text, metadata=document.metadata)
for chunk_text in chunks
]
source_doc = Document(
page_content="Employees receive 20 weeks of maternity leave. Eligibility begins after six months of employment.",
metadata={"department": "HR", "region": "Europe", "source": "EU_HR_Policy.pdf"}
)
chunked_docs = chunk_with_metadata(source_doc)
for i, chunk in enumerate(chunked_docs, 1):
print(f"Chunk {i}: {chunk.page_content!r}")
print(f" Metadata: {chunk.metadata}\n")
Wynik:
Chunk 1: 'Employees receive 20 weeks of maternity leave. Eligibility b'
Metadata: {'department': 'HR', 'region': 'Europe', 'source': 'EU_HR_Policy.pdf'}
Chunk 2: 'egins after six months of employment.'
Metadata: {'department': 'HR', 'region': 'Europe', 'source': 'EU_HR_Policy.pdf'}
Chociaż te dwa fragmenty są odrębnymi częściami jednego dokumentu, każdy z nich dziedziczy identyczne wartości dotyczące regionu, działu i źródła. To właśnie sprawia, że powyższe przykłady filtrowania działają skutecznie: bez względu na to, w jaki sposób tekst został podzielony, każdy fragment nadal może wskazać, że jest częścią europejskiej polityki HR. Każdy z nich zawiera teraz cenny kontekst obok swojego embeddingu, uzyskany poprzez wyszukiwanie, filtrowanie i cytowanie.
Zezwalanie modelowi LLM na generowanie metadanych
Współczesne systemy RAG coraz częściej wykorzystują modele LLM do tworzenia metadanych, zamiast polegać wyłącznie na ręcznym tagowaniu. Zamiast tego, by osoba czytała każdy dokument i ręcznie przypisywała mu etykiety, model może przeanalizować dokument i określić takie pola jak temat, dział, kategoria, słowa kluczowe oraz streszczenie. Poniższy kod pokazuje prompt, który to generuje, a nie tylko wynik:
def generate_metadata(text, llm):
prompt = f"""Analyze the following document and return metadata as JSON with these fields:
topic, category, and keywords (a list of 3-5 relevant terms).
Document:
{text}
Respond with only the JSON, no other text."""
response = llm.generate(prompt)
return response
sample_text = "Employees are entitled to 20 weeks of paid maternity leave, with eligibility beginning after six months of continuous employment. Additional unpaid leave may be requested with manager approval."
# In practice, llm.generate() would call an actual model (Claude, GPT, etc.)
# Below is the kind of output this prompt is designed to produce:
example_output = {
"topic": "Employee Benefits",
"category": "HR Policy",
"keywords": ["maternity leave", "eligibility", "employee benefits"]
}
print(example_output)
Wynik:
{'topic': 'Employee Benefits', 'category': 'HR Policy', 'keywords': ['maternity leave', 'eligibility', 'employee benefits']}
Te metadane są dołączane do fragmentu dokładnie tak samo, jak to robiłyby ręcznie przypisane metadane. Różni się tylko osoba decydująca o wartościach. Rezultatem jest lepsze doświadczenie podczas wyszukiwania przy mniejszym nakładzie pracy ręcznej, szczególnie w skali dużych zbiorów: oznaczanie kilku dokumentów ręcznie jest możliwe, natomiast oznaczanie dziesiątek tysięcy fragmentów w rozwijającej się bazie wiedzy zazwyczaj nie jest. Coraz więcej zaawansowanych procesów przetwarzania traktuje takie kroki jako standardową obróbkę wstępną, wykonywaną raz podczas wprowadzania danych, obok dzielenia na fragmenty i tworzenia wektorów reprezentacji.
Jedna praktyczna uwaga: sprawdzaj wyniki generowane przez modele LLM, szczególnie na początku. Model może czasami przypisać temat lub kategorię, która nie odpowiada rzeczywistej treści, a w odróżnieniu od błędu człowieka przy oznaczaniu jednego dokumentu, błąd automatyczny może się potajemnie rozprzestrzenić na wiele dokumentów jednocześnie, jeśli prompt ma systematyczne ograniczenia.
Filtrowanie metadanych i hybrydowe wyszukiwanie
Metadane są najskuteczniejsze, gdy łączy się je z wyszukiwaniem semantycznym, chociaż precyzyjne rozumienie tej kombinacji jest pomocne, ponieważ w RAG termin „hybrydowy” odnosi się do więcej niż jednej techniki.
W ścisłym sensie hybrydowe wyszukiwanie oznacza łączenie dwóch metod wyszukiwania – gęstego wyszukiwania wektorowego i rzadkiego wyszukiwania według słów kluczowych (BM25) – ich równoczesne uruchamianie oraz łączenie uzyskanych wyników. Filtrowanie metadanami to coś zupełnie innego. Nie jest to kolejna metoda wyszukiwania, lecz sposób na zmniejszenie liczby kandydatów przed lub wraz z wykorzystywaną metodą lub kombinacją metod.
Wyszukiwanie wektorowe sprawdza, które fragmenty są semantycznie podobne do zapytania. Filtrowanie metadanych określa, które fragmenty należą do odpowiedniej kategorii, regionu, działu lub okresu czasowego. Te dwa procesy są niezależne, więc filtr sprawdza się równie dobrze zarówno w połączeniu z zwykłym wyszukiwaniem wektorowym, jak i z BM25 samym w sobie, czy też z pełnym hybrydowym systemem wyszukiwania. Jest to dodatkowa warstwa, która może być zastosowana do dowolnego z tych rozwiązań.
W połączeniu znacznie poprawiają one jakość wyszukiwania, jak pokazuje przykład urlopu macierzyńskiego. System przestaje przeszukiwać ślepo całą bazę wiedzy i szuka inteligentnie w najbardziej istotnej podgrupie, przy czym tylko podobieństwo decyduje o kolejności wyników w tej już zawężonej, właściwej grupie. Dlatego nowoczesne systemy RAG w przedsiębiorstwach rzadko polegają wyłącznie na embeddingach: embeddingi określają, co jest podobne, natomiast metadane decydują, co w ogóle może być brane pod uwagę.
Zaniedbywany element
Wiele organizacji wkłada wiele wysiłku w wybór modeli embeddingowych i baz danych wektorowych. Te wybory są istotne, ale w praktyce wyszukiwanie często zawodzi z o wiele prostszego powodu: ważne informacje kontekstowe nigdy nie zostały uchwycone, bez względu na to, jak dobry jest model lub baza danych.
Wyobraźmy sobie bibliotekę, w której każda książka straciła tytuł, autora, datę wydania i kategorię, pozostawiając jedynie surowy tekst. Znalezienie czegokolwiek byłoby bardzo trudne nawet przy doskonałym systemie regałów i katalogu wyszukiwania. Przechowywanie fragmentów bez metadanych jest tym samym: infrastruktura wyszukiwania może być bezbłędna, ale i tak nie pomoże, jeśli nie ma żadnego kontekstu, na którym mogłaby się oprzeć.
Metadane zapewniają strukturę organizacyjną, która umożliwia wyszukiwaniu w dużych bazach wiedzy. W miarę jak zbiory rosną z setek dokumentów do milionów fragmentów, stają się one coraz ważniejsze. Na małą skalę model embeddingowy może przypadkowo umieścić właściwy fragment na pierwszym miejscu, co niemal się zdarzyło w przypadku trzech dokumentów politycznych. W rzeczywistej bazie wiedzy przedsiębiorstwa taki przypadek szybko się kończy. Wiele zespołów firmowych donosi, że poprawa jakości metadanych przynosi większe korzyści niż przejście na nowszy model embeddingowy, co warto pamiętać, biorąc pod uwagę, ile uwagi poświęca się wyborowi modeli, a jak mało strategii metadanych.
Wniosek
Wzbogacanie fragmentów metadanymi należy do najlepszych sposobów poprawy wyników RAG, a przy tym otrzymuje znacznie mniej uwagi niż embeddingi, bazy danych wektorowych i modele LLM. Embeddingi przechwytują znaczenie treści, podczas gdy metadane odzwierciedlają otaczający je kontekst, i razem pozwalają systemowi znaleźć nie tylko podobne informacje, ale także właściwe informacje. Czy to śledzenie źródeł, filtrowanie według regionu, zapewnianie bezpieczeństwa, rejestrowanie danych czasowych czy dodawanie etykiet napisanych przez AI – metadane pomagają przekształcić prostą konfigurację wyszukiwania w gotową do użycia platformę wiedzy.
Dlatego przy ocenie pipeline’u RAG pytanie nie dotyczy tylko tego, jaki model embeddingów wybrać. Chodzi również o to, jakie metadane należy dołączyć do fragmentów, ponieważ w wielu rzeczywistych systemach lepsze metadane oznaczają lepsze wyszukiwanie, lepsze wyszukiwanie oznacza lepsze odpowiedzi, a lepsze odpowiedzi zapewniają lepsze doświadczenie dla użytkowników.
Literatura pokrewna
- RAG bez wektorów: Jak PageIndex czyta dokumenty bez embeddingów — Wyszukiwanie wektorowe dzieli długie dokumenty na fragmenty, co powoduje utratę kontekstu. Zobacz, jak indeks drzewiasty oparty na rozumowaniu znajduje odpowiedzi w złożonych raportach, przy użyciu kodu.
- Praktyczne notatki: Inżynieria promptów do projektowania systemów AI: RAG, pamięć, narzędzia — Szczegółowy przewodnik po Praktycznych notatkach: Inżynieria promptów do projektowania systemów AI: RAG, pamięć, narzędzia: umowy, sprawdzenia oraz gotowe fragmenty kodu dla zespołów wdrażających ten model.