Kwaliteitsgids voor het ophalen van zoekresultaten met behulp van vectoren

Deze handleiding biedt een systematische benadering voor het verbeteren van de kwaliteit van het ophalen van realtime RAG, zoeken en overeenkomende toepassingen met behulp van Mosaic AI Vector Search. De aanbevelingen worden gerangschikt van de hoogste impact/laagste inspanning tot de laagste impact/hoogste inspanning.

Vereisten: Evaluatieframework tot stand brengen

Voordat u de kwaliteit van het ophalen optimaliseert, moet u een reproduceerbaar evaluatiesysteem hebben.

Belangrijk

Als u geen evaluatie hebt, stopt u hier en stelt u deze eerst in. Zonder metingen optimaliseren is gokken.

Latentievereisten definiëren

Duidelijke latentiedoelen vaststellen op basis van uw use-case:

  • RAG-agents: Doel voor de tijd tot het eerste token (TTFT) (bijvoorbeeld <2 sec)
  • Zoekbalken: End-to-end-latentie om resultaten weer te geven (bijvoorbeeld <100 msec)

Elke optimalisatie die u probeert, moet voldoen aan deze vereisten.

Geautomatiseerde evaluatie instellen

Gebruik een of meer van de volgende methoden:

De sleutel heeft een geautomatiseerde manier om wijzigingen te meten. Perfecte gegevens zijn niet vereist. Richt u op relatieve verbeteringen terwijl u verschillende strategieën test, niet absolute scores. Zelfs een kleine synthetische gegevensset kan u vertellen of het herrankeren de kwaliteit verbetert met 15% of als hybride zoeken uw specifieke use-case helpt.

Kies metrische gegevens over kwaliteit

Kies uw kwaliteitsstatistieken op basis van uw use-case:

Als terugroepverwante zaken het belangrijkst zijn (alle relevante informatie nodig hebben):

  • RAG-agents: Ontbrekende sleutelcontext leidt tot onjuiste antwoorden of halluïnaties.
  • Pharma-klinische proefmatching: Mag geen geschikte patiënten of relevante studies missen.
  • Zoeken naar financiële naleving: alle relevante regelgeving, risicofactoren of precedenten nodig.
  • Hoofdoorzaakanalyse in productie: Alle gerelateerde incidenten en foutpatronen moeten worden weergegeven.
  • Metrische gegevens die moeten worden bijgehouden: Recall@k (bijvoorbeeld recall@10, recall@50).

Als precisie het belangrijkst is (alleen de meest relevante resultaten nodig hebben):

  • Entiteitsresolutie/fuzzy matching: Het afstemmen van klantrecords, leveranciersnamen of product-SKU's tussen systemen.
  • Ontdubbeling van financiële diensten: dubbele transacties of accounts met hoge betrouwbaarheid identificeren.
  • Overeenkomende supply chain-onderdelen: exacte of compatibele onderdelen zoeken in verschillende catalogi.
  • Technische ondersteuningskennisbank: Ingenieurs hebben de exacte oplossing nodig in de topresultaten.
  • Metrische gegevens die moeten worden bijgehouden: Precision@k (bijvoorbeeld precision@3, precision@10).

Evenwichtige gebruikssituaties (hebben zowel goede recall als precisie nodig):

  • M&A due diligence: Onmisbare risico's (herinnering) niet missen, maar eerst de juiste documenten nodig (nauwkeurigheid).
  • Patent prior art search: Uitgebreide dekking met de meest relevante patenten prioriteit.
  • Customer 360 matching: Klantgegevens over meerdere systemen verenigen.

Combineer trefwoordprecisie met semantisch begrip.

Wanneer gebruikt u:

  • Gebruikers zoeken met specifieke termen (productcodes, technische termen).
  • Exacte overeenkomst nodig voor bepaalde query's.
  • Wil je een terugval wanneer semantische zoekopdrachten voor de hand liggende trefwoordovereenkomsten missen.

Impact op metrische gegevens:

  • Verbetert de terugroep door zowel semantische als trefwoordovereenkomsten te vangen.
  • Verbetert de precisie voor query's met specifieke termen.

Implementatie: Wijziging van één regel in Mosaic AI Vector Search.

# Enable hybrid search
results = index.similarity_search(
    query_text="error code E404",
    query_type="HYBRID"  # Combines vector and keyword search
)

Zie Een vectorzoekindex opvragen voor meer informatie.

Stap 2: metagegevensfiltering implementeren

Dit is uw belangrijkste instrument voor de kwaliteit van gegevensopvraging.

Door te filteren wordt de zoekruimte aanzienlijk verminderd en worden zowel de precisie als de terugroepwaarde verbeterd.

Impact op metrische gegevens:

  • Verbetert de precisie aanzienlijk door irrelevante resultaten te elimineren.
  • Verbetert de terugroepactie binnen de gefilterde subset.
  • Kan de zoekruimte met 90%+ verminderen.

Voorbeelden

  • Technische documentatie: Filteren op productversie, onderdeel of module.
  • Autohandleidingen: Filteren op merk, model, jaar.
  • Klantondersteuning: Filteren op productlijn, regio, probleemcategorie.

Implementation

# Vector Search with metadata filtering
results = index.similarity_search(
    query_text="brake system maintenance",
    filters='make = "Toyota" AND model = "Camry" AND year = 2023',
    num_results=10
)

Dynamische filterselectie

Programmatische benadering:

# Parse query for filter criteria
def extract_filters(user_query):
    filter_parts = []
    if "Toyota" in user_query:
        filter_parts.append('make = "Toyota"')
    if "2023" in user_query:
        filter_parts.append('year = 2023')
    return " AND ".join(filter_parts) if filter_parts else None

Filteren op basis van agents met Databricks:

from databricks_ai_bridge.agents.tools.vector_search import VectorSearchTool

# Create the vector search tool
vector_search_tool = VectorSearchTool(
    index_name="catalog.schema.car_manuals_index",
    # Optional: specify columns to return
    columns=["content", "make", "model", "year", "chunk_id"],
    # Optional: set number of results
    num_results=10,
    # Optional: add additional parameters as needed
    additional_parameters={
        "query_type": "HYBRID"  # Enable hybrid search
    }
)

# The tool automatically handles filter generation based on the agent's understanding
# Agent analyzes "brake issues in my 2023 Toyota Camry" and generates appropriate filters

# For LangChain agents:
from langchain.agents import create_react_agent

agent = create_react_agent(
    tools=[vector_search_tool],
    llm=your_llm,
    prompt=your_prompt
)

De agent voert automatisch uit:

  1. Extraheert relevante entiteiten uit de query.
  2. Hiermee worden de juiste SQL-achtige filterreeksen gegenereerd.
  3. Hiermee wordt de zoekopdracht uitgevoerd met zowel semantisch begrip als nauwkeurig filteren.

Impact: Kan de zoekruimte met 90%+ verminderen terwijl de relevantie wordt verbeterd.

Stap 3: Herrankering toevoegen

Eén regelwijziging voor ongeveer 15% kwaliteitsverbetering.

Databricks biedt een ingebouwde reranker die perfect is voor RAG-agents.

Impact op metrische gegevens:

  • Verhoogt de precisie door hoge dekking met minder kandidaten te bereiken.
  • Werkt het beste in combinatie met technieken zoals hybride zoeken en filteren.

Implementation

# Python SDK
results = index.similarity_search(
    query_text="How to create a Vector Search index",
    num_results=10,
    columns=["id", "text", "parent_doc_summary"],
    reranker={
        "model": "databricks_reranker",
        "parameters": {
            "columns_to_rerank": ["text", "parent_doc_summary"]
        }
    }
)

Zie Queryresultaten opnieuw rangverwerken voor meer informatie.

Wanneer te gebruiken

Perfect voor:

  • RAG-agenten (de latentie wordt voornamelijk beïnvloed door de generatie van LLM-modellen).
  • Hoogwaardige toepassingen.
  • Lage tot gemiddelde QPS (ongeveer 5 QPS uit de doos).

Ingebouwde rerankeerfunctie niet geschikt voor:

  • Hoge QPS-toepassingen (>5 QPS zonder extra schaalaanpassing).
  • Realtime zoekbalken vereisen <100 msec-latentie.
  • Toepassingen waarbij 1,5s herrankeringstijd onaanvaardbaar is.

Prestaties: Herwaardeert 50 resultaten in slechts ongeveer 1,5 seconde in typische belastingen. Zo snel als ~250 msec voor kortere segmenten.

Voor toepassingsgevallen met lage latentie/niet-RAG

Herrankering kan nog steeds aanzienlijke kwaliteitsverbeteringen bieden voor zoekbalken en hoogwaardige QPS-toepassingen. U hebt alleen een snellere herrankering nodig. Overweeg om een lichtgewicht herrankeringsmodel (bijvoorbeeld cross-encoder/ms-marco-TinyBERT-L-2-v2) te implementeren als een aangepast model op Databricks Model Serving voor rerankering van sub 100 msec.

Stap 4: Gegevensvoorbereiding verbeteren

In deze sectie worden enkele technieken beschreven die u kunt gebruiken om gegevensvoorbereiding te verbeteren: segmenteren, parseren, semantische context toevoegen en gegevens opschonen.

Segmenteringsstrategie

Segmentgrootteoptimalisatie blijft een actief onderzoeksgebied. Recent werk van DeepMind (LIMIT) laat zien dat insluitingen in lange contexten geen basisinformatie kunnen vastleggen, waardoor dit een genuanceerde beslissing is.

Uitgangspunten voor experimenten:

# Common configurations to test
small_chunks = 256   # Better for precise fact retrieval
medium_chunks = 512  # Balanced approach
large_chunks = 1024  # More context per chunk

Belangrijke afwegingen om rekening mee te houden:

  • Kleinere segmenten: Betere lokalisatie van specifieke informatie, maar kan context verliezen.
  • Grotere segmenten: Meer context behouden, maar moeilijker om relevante informatie vast te stellen.
  • Contextlimieten: moet binnen het LLM-contextvenster passen bij het ophalen van meerdere segmenten.

Meer impactvolle optimalisaties: In plaats van de segmentgrootte te veel te optimaliseren, richt u zich op:

  1. Gegevensextractie voor metagegevens: entiteiten, onderwerpen en categorieën extraheren om nauwkeurige filtering mogelijk te maken.
  2. Hoogwaardige parsering: gebruik ai_parse_document voor schone, gestructureerde tekst.
  3. Semantische metagegevens: voeg documentsamenvattingen en sectiekoppen toe aan segmenten.

Houd ook rekening met de volgende geavanceerde benaderingen. Deze technieken vereisen meer inspanning, maar kunnen een grotere impact hebben:

Semantische segmentering: Groepeer zinnen op gelijkenis in plaats van vaste grootte.

Ouder-kind segmentering (klein-naar-groot ophalen):

# Record child and parent chunks in your source table
for parent_chunk in create_chunks(doc, size=2048):  # Large for context
    for child_chunk in create_chunks(parent_chunk, size=512):  # Small for precision
        source_table.append({"text": child_chunk, "parent_text": parent_chunk})

# Search children, return parents
results = index.similarity_search(
    query_text="Is attention all you need?",
    num_results=10,
    columns=["text", "parent_text"]
)

Zie ouderdocument-ophalersdocumentatie voor LangChain.

Documentparsering

Voor PDF-bestanden en complexe documenten raadt Databricks aan om ai_parse_document te gebruiken voor parseren van hoge kwaliteit. Slechte parsering (ontbrekende tabellen, verbroken opmaak) heeft rechtstreeks invloed op de kwaliteit van het ophalen.

Verrijken met semantische metagegevens

Voeg semantische context toe om het ophalen te verbeteren.

Waarom dit werkt:

  • Biedt extra semantisch signaal voor het insluiten van modellen.
  • Geeft rerankers meer context voor scoren.
  • Helpt bij query's die verwijzen naar concepten op documentniveau.

Optie 1: Metagegevens opnemen in segmenten

# Prepend document summary to each chunk
chunk_with_context = f"""
Document: {doc_title}
Summary: {doc_summary}
Section: {section_name}
{chunk_content}
"""

Optie 2: Opslaan als afzonderlijke metagegevenskolommen

# Store semantic metadata for reranker to use
metadata = {
    "doc_summary": "Technical manual for brake system maintenance",
    "section": "Emergency brake adjustment procedures",
    "keywords": ["brake", "safety", "adjustment"]
}

Belangrijk

Voor deze aanpak is downstreamverwerking vereist om gebruik te maken van de metagegevens:

  • Voor semantische metagegevens: Gebruik de herordening met de columns_to_rerank-parameter om rekening te houden met deze kolommen.
  • Voor metagegevens met alleen trefwoorden: hybride zoekopdrachten (modus voor volledige tekst) gebruiken om overeen te komen met deze velden.

Gegevens opschonen

  • Sjablonen verwijderen (kopteksten, voetteksten, paginanummers).
  • Documentstructuur behouden (koppen, lijsten, tabellen).
  • Semantische grenzen behouden bij het segmenteren.

Stap 5: Queryoptimalisatie

Query uitbreiding

Genereer meerdere queryvariaties om de dekking te verbeteren. Zie LangChain-gids.

Impact: Verbetert het ophalen door documenten met verschillende terminologie te vinden.

# Use LLM to expand query with synonyms and related terms
def expand_query(user_query):
    prompt = f"""Generate 3 variations of this search query including synonyms:
    Query: {user_query}
    Return only the variations, one per line."""

    variations = llm.generate(prompt).split('\n')

    # Search with original + variations
    all_results = []
    for query in [user_query] + variations:
        results = index.similarity_search(query_text=query, num_results=10)
        all_results.extend(results)

    # Deduplicate and return
    return deduplicate_results(all_results)

Voorbeeld: "autoonderhoud" zoekt ook naar "autoherstel", "voertuigonderhoud", "autoonderhoud"

Zie voor meer technieken:

Herformulering van queries

Voor complexe query's kunt u deze opsplitsen of herformuleren. Zie OpenAI RAG-strategieën.

  • Vragen met meerdere hops → sequentiële zoekopdrachten
  • Dubbelzinnige query's → Meerdere specifieke zoekopdrachten
  • Zie Decompositietechnieken

Stap 6: Geavanceerde prompttechnieken

Optimalisatie van prompts

Gebruik automatische promptoptimalisatietechnieken zoals MIPROv2 of GEPA (beschikbaar in DSPy) om uw prompts te verbeteren die worden gebruikt voor het voorbereiden van gegevens, het herschrijven van query's of een willekeurige plaats in uw ophaalsysteem. Knowledge Assistant en Supervisor Agent bevatten GEPA voor grote prestatieverbeteringen tegen lage kosten. Zie Het bouwen van ultramoderne bedrijfsagents 90 keer goedkoper met geautomatiseerde promptoptimalisatie.

Voor meer informatie, zie Reflecterende Prompt Evolution met GEPA.

Stap 7: Adaptieve ophaalstrategieën

React-agentpatroon

Bouw agents die het ophalen op intelligente wijze kunnen organiseren:

  • De agent overweegt of ophalen nodig is.
  • Kan query's opnieuw opmaken op basis van de eerste resultaten.
  • Combineert ophalen met andere hulpprogramma's (calculators, API's, enzovoort).
  • Probeer mislukte ophalen opnieuw met gewijzigde query's.
  • Implementeer met Databricks Mosaic AI Agent Framework.

Voorbeelden van agentisch ophalen

# Agent decides when to search and what filters to apply
# Based on conversation context and user intent
agent = create_agent(
    tools=[vector_search_tool, calculator, web_search],
    instructions="Retrieve relevant docs only when needed, apply appropriate filters"
)

Stap 8: Het insluiten van modellen verfijnen

Eerst: Diagnoseer of er een embedding-probleem is

Snelle test: Vergelijk GTE vs OpenAI-embeddings in Databricks.

# Test with both embedding models
# Databricks native: gte-large-en-v1.5
gte_results = gte_index.similarity_search(query)

# OpenAI: text-embedding-3-large (3072 dims)
openai_results = openai_index.similarity_search(query)

# If OpenAI text-embedding-3-large significantly outperforms GTE:
# - Fine-tuning a smaller model could match or exceed OpenAI quality
# - You have an embedding model problem, not a data problem

Interpretatie:

  • Als text-embedding-3-large veel beter presteert dan gte-large-en, kun je overwegen om verder te optimaliseren. U kunt vergelijkbare kwaliteit bereiken met een kleiner model.
  • Als text-embedding-3-large ongeveer dezelfde prestaties levert als gte-large-en, dan is uw probleem niet het insluitmodel. Richt u op andere optimalisaties.

Wanneer fijn afstellen

Belangrijk

Fijn afstemming moet als laatste redmiddel worden beschouwd en mag alleen worden overwogen wanneer aan de volgende criteria is voldaan:

  1. U hebt stappen 1-7 geprobeerd.
  2. OpenAI presteert aanzienlijk beter dan GTE in uw tests.
  3. U hebt domeinspecifiek vocabulaire of een use-case.

Opmerking

U hebt geen gelabelde trainingsgegevens nodig. U kunt synthetische gegevensgeneratie gebruiken, zoals wordt aangetoond in de embedding fine-tuning blog van Databricks.