Metadatafiltrering for hybridsøk
Kombiner vektorlikhet med strukturerte filtre (dato, forfatter, tagg) for presis og kontekstuell gjenfinning.
Metadatafiltrering for hybridsøk er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.
Deler av denne leksjonen er ennå ikke oversatt og vises på engelsk.
Hvorfor filtrere?
Et rent vektorsøk returnerer de K mest liknende tekstbitene — selv om de tilhører feil tenant, feil språk eller feil dokument.
Metadatafiltre avgrenser søket til relevante delmengder, slik at du får både presisjon OG recall.
Lagring av metadata
Knytt en metadataordbok til hver tekstbit ved innlesing:
metadata = {
'tenant_id': 'acme',
'language': 'en',
'source': 'help-docs',
'updated_at': '2024-08-12',
'tags': ['shipping', 'returns']
}
for k, v in metadata.items():
print(f"{k}: {v}")
Filtering in Pinecone
results = index.query(
vector=query_vec,
top_k=5,
filter={
'tenant_id': 'acme',
'language': 'en'
}
)Intervallfiltre
De fleste vektordatabaser støtter også intervallfiltre:
filter = {
'updated_at': {'$gte': '2024-01-01'},
'score': {'$gt': 0.5}
}
print(filter)
In and Not-In
filter = {
'tags': {'$in': ['shipping', 'returns']},
'archived': {'$ne': True}
}
print(filter)
Filtrering i Qdrant
Qdrant har et rikt filtreringsspråk:
from qdrant_client.models import Filter, FieldCondition, MatchValue
filter = Filter(must=[
FieldCondition(key='tenant_id', match=MatchValue(value='acme')),
FieldCondition(key='language', match=MatchValue(value='en'))
])
results = client.search(
collection_name='docs',
query_vector=query_vec,
query_filter=filter,
limit=5
)Forhåndsfiltrering kontra etterfiltrering
To strategier:
- Forhåndsfiltrering — bruk filteret FØR søket (korrekt, men kan være tregt uten indeksert metadata)
- Etterfiltrering — søk og fjern deretter treff som ikke samsvarer (raskt, men kan returnere null resultater)
Produksjonssystemer bruker forhåndsfiltrering med riktige metadataindekser.
Hybrid vektor + nøkkelord
Kombiner semantisk søk med klassisk BM25-nøkkelordsøk. Kjør begge, og kombiner poengene (reciprocal rank fusion er standarden):
def rrf(vec_results, bm25_results, k=60):
scores = defaultdict(float)
for rank, doc in enumerate(vec_results):
scores[doc.id] += 1 / (k + rank)
for rank, doc in enumerate(bm25_results):
scores[doc.id] += 1 / (k + rank)
return sorted(scores.items(), key=lambda x: -x[1])Støtte for flere leietakere
I SaaS må ALLE spørringer filtreres med tenant_id. Hardkod dette i innhentingslaget, slik at det ikke kan glemmes:
def search(query, tenant_id, top_k=5):
return index.query(
vector=embed(query),
top_k=top_k,
filter={'tenant_id': tenant_id}
)Tilgangskontroll via metadata
Lagre bruker- og rolletillatelser i metadata:
metadata = {
'visibility': 'public', # or 'internal', 'restricted'
'department': 'engineering',
'allowed_roles': ['engineer', 'manager']
}
# At query time:
filter = {'allowed_roles': {'$contains': current_user_role}}Prioritering av nyere innhold
Hvis du vil prioritere nyere dokumenter, henter du først flere kandidater og beregner deretter poengene på nytt basert på aktualitet:
candidates = index.query(vector=query_vec, top_k=50)
scored = [
(c.score * recency_factor(c.metadata['updated_at']), c)
for c in candidates
]
scored.sort(reverse=True)
final = scored[:5]Følg med på metadatakardinaliteten
Metadata med høy kardinalitet (millioner av unike verdier) gjør indeksene enorme. Aggreger på forhånd når det er mulig — lagre for eksempel år-måned i stedet for et fullstendig tidsstempel ved tidsfiltrering.
Alltid aktivt filter
Hvilket filter skal alle agenter med flere leietakere ALLTID inkludere?
Oppsummering
Metadatafiltre avgrenser søket. Kombiner dem med hybrid (vektor + BM25) for best mulig resultat. Støtte for flere leietakere og tilgangskontroll bygger på dette.
Lær deg AI-agenter med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 60
- Leksjoner
- 239
Ofte stilte spørsmål
Er leksjonen «Metadatafiltrering for hybridsøk» gratis?
Ja – hele teksten i «Metadatafiltrering for hybridsøk» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.
Hva lærer jeg i «Metadatafiltrering for hybridsøk»?
Kombiner vektorlikhet med strukturerte filtre (dato, forfatter, tagg) for presis og kontekstuell gjenfinning. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI-agenter?
Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Metadatafiltrering for hybridsøk»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?
Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Pinecone, Weaviate, Qdrant: sammenligning
- Metadatafiltrering for hybridsøk
- Oppdatere og slette vektorer
- Velge avstandsmål (cosine, L2, dot)