Freigeben über


Leitfaden zur Qualität der Vektor-Suchergebnisse

Dieser Leitfaden bietet einen systematischen Ansatz zur Verbesserung der Abrufqualität für Echtzeit-RAG-, Such- und Abgleichsanwendungen mithilfe der Mosaic AI Vektor-Suche. Die Empfehlungen werden von der höchsten Auswirkung/dem niedrigsten Aufwand bis zum niedrigsten Einfluss/höchsten Aufwand sortiert.

Voraussetzungen: Einrichten eines Evaluierungsrahmens

Bevor Sie die Abrufqualität optimieren, müssen Sie über ein reproduzierbares Auswertungssystem verfügen.

Von Bedeutung

Wenn Sie keine Evaluierung haben, stoppen Sie hier und richten Sie diese zuerst ein. Optimierung ohne Messung ist Schätzarbeit.

Definieren von Latenzanforderungen

Richten Sie klare Latenzziele basierend auf Ihrem Anwendungsfall ein:

  • RAG-Agenten: Ziel für die Time to First Token (TTFT) (z.B. <2 Sekunden)
  • Suchleisten: End-to-End-Latenz zum Anzeigen von Ergebnissen (z. B. <100 ms)

Jede Optimierung, die Sie ausprobieren, muss diese Anforderungen erfüllen.

Einrichten der automatisierten Auswertung

Verwenden Sie einen oder mehrere der folgenden Ansätze:

Der Schlüssel besteht darin, änderungen automatisiert zu messen – perfekte Daten sind nicht erforderlich. Konzentrieren Sie sich auf relative Verbesserungen , während Sie verschiedene Strategien testen, nicht auf absolute Ergebnisse. Selbst ein kleines synthetisches Dataset kann Ihnen mitteilen, ob die Neuanordnung die Qualität um 15 % verbessert oder ob die Hybridsuche Ihrem spezifischen Anwendungsfall hilft.

Auswählen von Qualitätsmetriken

Wählen Sie Ihre Qualitätsmetriken basierend auf Ihrem Anwendungsfall aus:

Wenn Rückruf am wichtigsten ist (benötigen Sie alle relevanten Informationen):

  • RAG-Agents: Fehlender Schlüsselkontext führt zu falschen Antworten oder Halluzinationen.
  • Übereinstimmung der klinischen Pharma-Studie: Es können keine berechtigten Patienten oder relevanten Studien fehlen.
  • Suche nach Finanzcompliance: Benötigen Sie alle relevanten Vorschriften, Risikofaktoren oder Präzedenzfälle.
  • Ursachenanalyse in der Fertigung: Muss alle zugehörigen Vorfälle und Fehlermuster aufdecken.
  • Metrik zum Nachverfolgen: Recall@k (z. B. recall@10, recall@50).

Wenn Präzision am wichtigsten ist (nur die relevantesten Ergebnisse benötigen):

  • Entitätsauflösung/Fuzzyvergleich: Übereinstimmende Kundendatensätze, Lieferantennamen oder Produkt-SKUs über Systeme hinweg.
  • Deduplizierung von Finanzdienstleistungen: Das Identifizieren doppelter Transaktionen oder Konten mit hoher Zuverlässigkeit.
  • Abgleich von Lieferkettenteilen: Suchen nach exakten oder kompatiblen Komponenten über Kataloge hinweg.
  • Tech-Support-Wissensdatenbank: Ingenieure benötigen die genaue Lösung in Top-Ergebnissen.
  • Metrik zum Nachverfolgen: Precision@k (z. B. precision@3, precision@10).

Ausgewogene Anwendungsfälle (benötigen sowohl eine gute Trefferquote als auch Präzision):

  • M&A Due Diligence: Man darf Risiken nicht übersehen (Recall), benötigt jedoch zuerst relevante Dokumente (Precision).
  • Recherche zum Stand der Technik: Umfassende Abdeckung mit priorisierten, relevantesten Patenten.
  • Kunden-360-Abgleich: Vereinheitlichung von Kundendaten über mehrere Systeme hinweg.

Kombinieren Sie die Schlüsselwortgenauigkeit mit semantischem Verständnis.

Verwendungsbedingungen:

  • Benutzer suchen mit bestimmten Begriffen (Produktcodes, technische Begriffe).
  • Benötigen Sie eine genaue Übereinstimmung für bestimmte Abfragen.
  • Wollen Sie eine Alternative, wenn in der semantischen Suche offensichtliche Schlüsselwort-Übereinstimmungen nicht gefunden werden?

Auswirkungen auf Metriken:

  • Verbessert den Rückruf , indem sowohl semantische als auch Schlüsselwort-Übereinstimmungen eingefangen werden.
  • Verbessert die Genauigkeit für Abfragen mit bestimmten Ausdrücken.

Implementierung: Einzeilige Änderung bei der Mosaic AI-Vektorsuche.

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

Weitere Informationen finden Sie unter Abfragen eines Vektorsuchindex.

Schritt 2: Implementieren der Metadatenfilterung

Dies ist Ihr größter Hebel für die Abrufqualität.

Das Filtern reduziert den Suchbereich erheblich und verbessert sowohl Präzision als auch Rückrufe.

Auswirkungen auf Metriken:

  • Verbessert die Genauigkeit erheblich, indem irrelevante Ergebnisse eliminiert werden.
  • Verbessert den Rückruf innerhalb der gefilterten Teilmenge.
  • Kann den Suchbereich um 90%+reduzieren.

Examples

  • Technische Dokumentation: Nach Produktversion, Komponente oder Modul filtern.
  • Autohandbücher: Filtern nach Make, Modell, Jahr.
  • Kundensupport: Nach Produktlinie, Region, Problemkategorie filtern.

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 Filterauswahl

Programmgesteuerter Ansatz:

# 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

Agentbasierte Filterung mit 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
)

Der Agent arbeitet automatisch:

  1. Extrahiert relevante Entitäten aus der Abfrage.
  2. Generiert entsprechende SQL-ähnliche Filterzeichenfolgen.
  3. Führt die Suche mit semantischem Verständnis und präziser Filterung aus.

Auswirkung: Kann den Suchbereich um 90%+ reduzieren und gleichzeitig die Relevanz verbessern.

Schritt 3: Hinzufügen einer Neurankung

Einzeilige Änderung für ~15% Qualitätsverbesserung.

Databricks bietet einen integrierten Reranker, der ideal für RAG-Agenten ist.

Auswirkungen auf Metriken:

  • Erhöht die Präzision, indem ein hoher Recall mit weniger Kandidaten erzielt wird.
  • Funktioniert am besten in Kombination mit Techniken wie hybrider Suche und Filterung.

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"]
        }
    }
)

Weitere Informationen finden Sie unter "Rerank query results".

Wann verwenden

Perfekt für:

  • RAG-Agents (Latenz wird von der LLM-Generation dominiert).
  • Qualitätszuerst-Anwendungen.
  • Niedrige bis mittlere Anfragen pro Sekunde (~5 Anfragen pro Sekunde direkt nach der Installation).

Integrierter Reranker eignet sich nicht für:

  • Hohe QPS-Anwendungen (>5 QPS ohne zusätzliche Skalierung).
  • Echtzeit-Suchleisten, die 100 msec Latenz erfordern <.
  • Anwendungen, bei denen 1,5 Sekunden Neubewertungszeit unakzeptabel sind.

Leistung: Sortiert 50 Ergebnisse in typischen Workloads in ca. 1,5 Sekunden neu. So schnell wie ~250 msec für kürzere Abschnitte.

Für Anwendungsfälle mit geringer Latenz/Nicht-RAG

Reranking kann weiterhin erhebliche Qualitätsverbesserungen für Suchleisten und QPS-Anwendungen bieten – Sie benötigen nur einen schnelleren Reranker. Erwägen Sie die Bereitstellung eines einfachen Reranking-Modells (z. B. cross-encoder/ms-marco-TinyBERT-L-2-v2) als benutzerdefiniertes Modell auf Databricks Model Serving für ein Reranking unter 100 msec.

Schritt 4: Verbessern der Datenvorbereitung

In diesem Abschnitt werden einige Techniken beschrieben, mit denen Sie die Datenvorbereitung verbessern können: Blöcke, Analysieren, Hinzufügen semantischer Kontext und Bereinigen von Daten.

Chunking-Strategie

Die Optimierung der Blockgröße bleibt ein aktiver Forschungsbereich. Aktuelle Arbeiten von DeepMind (LIMIT) zeigen, dass Einbettungen grundlegende Informationen in langen Kontexten nicht erfassen können, wodurch dies eine differenzierte Entscheidung ist.

Ausgangspunkte für Experimente:

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

Wichtige Trade-Offs, die sie berücksichtigen sollten:

  • Kleinere Blöcke: Bessere Lokalisierung bestimmter Informationen, kann aber den Kontext verlieren.
  • Größere Blöcke: Mehr Kontext bleibt erhalten, aber es ist schwieriger, relevante Informationen zu identifizieren.
  • Kontextbeschränkungen: Muss beim Abrufen mehrerer Blöcke innerhalb des LLM-Kontextfensters passen.

Wirkungsvollere Optimierungen: Anstatt die Datenstückgröße übermäßig zu optimieren, konzentrieren Sie sich auf:

  1. Informationsextraktion für Metadaten: Extrahieren Sie Entitäten, Themen und Kategorien, um eine präzise Filterung zu ermöglichen.
  2. Hochwertige Analyse: Verwenden Sie ai_parse_document für sauberen, strukturierten Text.
  3. Semantische Metadaten: Fügen Sie Dokumentzusammenfassungen und Abschnittsüberschriften zu Abschnitten hinzu.

Berücksichtigen Sie auch die folgenden erweiterten Ansätze. Diese Techniken erfordern mehr Aufwand, können aber größere Auswirkungen haben:

Semantische Gliederung: Gruppieren Sie Sätze nach Ähnlichkeit und nicht nach fester Größe.

Parent-Child-Chunken (Abruf vom Kleinen zum Großen):

# 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"]
)

Siehe LangChain übergeordnete Dokumenten-Retriever-Dokumentation.

Dokumentanalysen

Bei PDFs und komplexen Dokumenten empfiehlt Databricks die Verwendung von ai_parse_document für eine qualitativ hochwertige Analyse. Schlechte Analyse (fehlende Tabellen, fehlerhafte Formatierung) wirkt sich direkt auf die Abrufqualität aus.

Anreichern mit semantischen Metadaten

Fügen Sie semantischen Kontext hinzu, um den Abruf zu verbessern.

Warum dies funktioniert:

  • Stellt zusätzliches semantisches Signal für Einbettungsmodelle bereit.
  • Gibt rerankers mehr Kontext für die Bewertung.
  • Hilft bei Abfragen, die auf Konzepte auf Dokumentebene verweisen.

Option 1: Einschließen von Metadaten in Blöcken

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

Option 2: Als separate Metadatenspalten speichern

# 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"]
}

Von Bedeutung

Für diesen Ansatz ist eine nachgelagerte Verarbeitung erforderlich, um die Metadaten zu nutzen:

  • Für semantische Metadaten: Verwenden Sie "Reranking" mit columns_to_rerank Parametern, um diese Spalten zu berücksichtigen.
  • Für nur Schlüsselwortmetadaten: Verwenden Sie die Hybridsuche im Volltextmodus, um diese Felder zu durchsuchen.

Datenreinigung

  • Entfernen Sie Textbausteine (Kopfzeilen, Fußzeilen, Seitenzahlen).
  • Dokumentstruktur beibehalten (Überschriften, Listen, Tabellen).
  • Halten Sie semantische Grenzen beim Chunking ein.

Schritt 5: Abfrageoptimierung

Abfrageerweiterung

Generieren Sie mehrere Abfragevariationen, um den Rückruf zu verbessern. Siehe LangChain Guide.

Auswirkung: Verbessert den Rückruf , indem Dokumente mit unterschiedlicher Terminologie gefunden werden.

# 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)

Beispiel: "Autowartung" sucht auch nach "Automobilreparatur", "Fahrzeugwartung", "Autowartung"

Weitere Techniken finden Sie unter:

Anfrageumformulierung

Bei komplexen Abfragen diese zerlegen oder neu formulieren. Siehe OpenAI RAG-Strategien.

  • Fragen mit mehreren Hops → Sequenzielle Suchvorgänge
  • Mehrdeutige Abfragen → Mehrere bestimmte Suchvorgänge
  • Siehe Zerlegungstechniken

Schritt 6: Erweiterte Prompting-Techniken

Eingabeaufforderungsoptimierung

Verwenden Sie automatische Eingabeaufforderungsoptimierungstechniken wie MIPROv2 oder GEPA (verfügbar in DSPy), um Ihre Eingabeaufforderungen zu verbessern, die für die Datenvorbereitung, abfrageumschreibung oder überall in Ihrem Abrufsystem verwendet werden. Wissensassistent und Supervisor Agent integrieren GEPA für große Leistungsverbesserungen zu niedrigen Kosten. Unter Erstellung von hochmodernen Unternehmensagenten 90x günstiger mit automatisierter Prompt-Optimierung nachlesen.

Weitere Informationen finden Sie unter "Reflektierende Prompt Evolution" mit GEPA.

Schritt 7: Adaptive Abrufstrategien

React-Agent-Muster

Erstellen Sie Agents, die den Abruf intelligent koordinieren können:

  • Der Agent überlegt, ob der Abruf erforderlich ist.
  • Kann Abfragen basierend auf den ersten Ergebnissen neu erstellen.
  • Kombiniert den Abruf mit anderen Tools (Rechner, APIs usw.).
  • Fehlgeschlagene Abrufe mit geänderten Abfragen erneut versuchen.
  • Implementieren Sie das Databricks Mosaik AI Agent Framework.

Agentische Abrufbeispiele

# 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"
)

Schritt 8: Feinabstimmung von Einbettungsmodellen

Erstens: Diagnostizieren Sie, ob Sie ein Einbettungsproblem haben

Schnelltest: Vergleichen Sie GTE mit OpenAI-Einbettungen auf 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

Interpretation:

  • Wenn text-embedding-3-large deutlich besser abschneidet als gte-large-en, sollten Sie Feinabstimmung in Betracht ziehen. Sie können eine ähnliche Qualität mit kleinerem Modell erzielen.
  • Wenn text-embedding-3-large ungefähr dasselbe leistet wie gte-large-en, liegt das Problem nicht beim Einbettungsmodell. Konzentrieren Sie sich auf andere Optimierungen.

Zeitpunkt der Feinabstimmung

Von Bedeutung

Feinabstimmung sollte als letztes Mittel betrachtet und nur in Betracht gezogen werden, wenn die folgenden Kriterien erfüllt sind.

  1. Sie haben die Schritte 1 bis 7 ausprobiert.
  2. OpenAI übertrifft GTE in Ihren Tests erheblich.
  3. Sie haben domänenspezifisches Vokabular oder Anwendungsfall.

Hinweis

Sie benötigen keine beschrifteten Schulungsdaten – Sie können die synthetische Datengenerierung verwenden, wie im Einbettungsblog von Databricks gezeigt.