Semantisches Reranking mit der Rang()-Funktion in Azure HorizonDB (Vorschau)

Die Vektorsuche liefert Ergebnisse, die einer Suchanfrage semantisch nahe sind, doch „Nähe“ im Embedding-Raum bedeutet nicht immer „Relevanz“ für die Intention des Benutzers. Synonyme, Verschiebungen der Suchintention, Long-Tail-Formulierungen und domänenspezifische Nuancen können dazu führen, dass das relevanteste Dokument statt auf dem ersten Platz auf dem dritten oder zehnten landet. Benutzer beurteilen Ergebnisse danach, wie gut sie ihrer Intention entsprechen, nicht nach rohen Distanzwerten.

Das semantische Reranking behebt dieses Problem. Nachdem eine anfängliche Retrieval-Phase (Vektorsuche, Volltextsuche oder hybride Suche) eine breite Menge an Kandidaten zurückgibt, bewertet ein Cross-Encoder-Reranker-Modell jeden Kandidaten anhand der ursprünglichen Suchanfrage neu. Im Gegensatz zu Einbettungsmodellen, die die Abfrage und das Dokument separat codieren, verarbeitet ein Encoder die Abfrage und das Dokument zusammen und erfasst differenzierte Interaktionen zwischen ihnen und erzeugt genauere Relevanzbewertungen.

Die azure_ai.rank() Funktion in der azure_ai Erweiterung bringt diese Funktion direkt in SQL, sodass Sie eine Neuranking-Phase hinzufügen können, ohne die Datenbank verlassen zu müssen.

Warum Neusortierung wichtig ist

Die Lücke zwischen Abstand und Relevanz

Vektoreinbettungen sind für schnelle, ungefähre Ähnlichkeit im Maßstab optimiert. Sie codieren die Bedeutung in Vektoren fester Größe unabhängig voneinander, eine für die Abfrage, eine für jedes Dokument. Dieser Bi-Encoder-Ansatz ist effizient (Sie können Milliarden von Vektoren mit DiskANN indizieren), aber es komprimiert fein abgestimmte Interaktionen zwischen Abfrage und Dokument.

Ein Cross-Encoder verarbeitet die Abfrage und das Dokument hingegen als ein einziges Eingabepaar. Es berücksichtigt jedes Wort in beiden und erfasst dabei Interaktionen auf Tokenebene, die Bi-Encoder übersehen. Das Ergebnis ist genauere Relevanzbewertungen, aber bei höheren Rechenkosten, da jeder Kandidat einen separaten Ableitungsaufruf erfordert.

Warum nicht für alles einen Cross-Encoder verwenden?

Cross-Encoder sind präzise, aber teuer. Das Bewerten von 1 Million Dokumenten mit einem Cross-Encoder zum Zeitpunkt der Abfrage ist unpraktisch, da dies pro Abfrage Sekunden bis Minuten dauern würde. Aus diesem Grund verwendet der Produktionsabruf eine zweistufige Pipeline:

  1. Stufe 1: Eine breite Menge von Kandidaten kostengünstig abrufen (Vektorsuche, BM25 oder hybride Suche). Dieser Schritt beschränkt Millionen von Dokumenten auf die obersten 50-100.
  2. Phase 2: Neubewerten Sie nur diese 50 bis 100 Kandidaten mit einem Cross-Encoder, um bei den wichtigsten Ergebnissen eine höhere Präzision zu erzielen.

Dieses Muster bietet Ihnen die Geschwindigkeit eines embeddingbasierten Abrufs mit der Genauigkeit einer Cross-Encoder-Bewertung – und das zu einem Bruchteil der Kosten, die entstehen, wenn der Cross-Encoder auf den gesamten Korpus angewendet wird.

Wann semantische Neubewertung verwendet werden sollte

Reranking verwenden, wenn Neubewertung überspringen, wenn
Die Suchqualität wirkt sich direkt auf die Benutzererfahrung aus (Produktsuche, Supportsuche, Knowledge Base) Einfache Suche nach exakter Übereinstimmung (Produktcode, ID-Suche)
Abfragen sind in natürlicher Sprache formuliert und enthalten Nuancen, Synonyme oder Variationen der Nutzerabsicht. Der Korpus ist klein und homogen genug, damit die Vektorsuche allein hohe Präzision erreicht
Sie entwickeln RAG oder implementieren dauerhafte KI-Pipelines in Azure HorizonDB (Vorschauversion) und benötigen den bestmöglichen Kontext für die Generierung durch große Sprachmodelle (LLMs) Das Latenzbudget kann den zusätzlichen Modellaufruf nicht berücksichtigen.
Die Hybridsuche liefert eine zusammengeführte Liste, und Sie möchten die Genauigkeit abschließend noch verbessern. Ergebnisse werden bereits auf einen kleinen Satz gefiltert (weniger als 5)

Voraussetzungen

Eine Azure HorizonDB-Instanz mit einer der folgenden Optionen:

Die Funktion "rank()"

Die Funktion azure_ai.rank() ordnet einen Satz von Dokumenten anhand ihrer Relevanz für eine Abfrage mithilfe eines Cross-Encoder-Modells neu.

Syntax

azure_ai.rank(
    query text,
    document_contents text[],
    document_ids text[] DEFAULT NULL,
    model text DEFAULT NULL
)

Argumente

Argument Typ Description
query text Die Suchabfrage, mit der die Relevanz ausgewertet werden soll.
document_contents text[] Array von Dokumenttexten, die neu geordnet werden sollen.
document_ids (wahlweise) text[] Array von Bezeichnern, die den einzelnen Dokumenten entsprechen.
model (wahlweise) text Im Modellregister registrierter Modellalias. Wenn sie weggelassen wird, wird das default-reranker verwaltete Modell (Cohere-rerank-v4.0-fast) verwendet.

Rückgabetyp

Gibt eine Tabelle mit Spalten zurück: document_id, rank, und relevance_score.

Note

BYOM-Benutzer: Übergeben Sie den Alias Ihres registrierten Neubewerter-Modells als das model-Argument. Beispiel: azure_ai.rank('query', documents, ids, 'my-reranker'). Weitere Informationen zum Registrieren von Modellen finden Sie unter AI-Funktionen in der azure_ai Erweiterung für Azure HorizonDB (Vorschau).

Einfaches Reranking-Beispiel

Einen Satz von Produktbeschreibungen anhand einer Suchanfrage neu ordnen:

SELECT * FROM azure_ai.rank(
    'wireless noise cancelling headphones',
    ARRAY[
        'Over-ear wireless headphones with active noise cancellation and 30-hour battery life.',
        'Wired earbuds with inline microphone, no noise cancellation.',
        'Bluetooth speaker with 360-degree sound and waterproof design.',
        'Compact noise cancelling earbuds with transparency mode and wireless charging case.'
    ]
);

Note

BYOM-Benutzer: Fügen Sie ihren Modellalias als letztes Argument hinzu: azure_ai.rank('wireless noise cancelling headphones', ARRAY[...], NULL, 'my-reranker').

Zweistufiger Abruf: Vektorsuche + Reranking

Das am häufigsten verwendete Muster besteht darin, Kandidaten mit Vektorsuche abzurufen und dann die wichtigsten Ergebnisse für die Genauigkeit zu reranken:

WITH candidates AS (
    SELECT id, title, description
    FROM products
    ORDER BY embedding <=> azure_openai.create_embeddings(
        input => 'wireless noise cancelling headphones'
    )::vector
    LIMIT 20
),
reranked AS (
    SELECT *
    FROM azure_ai.rank(
        'wireless noise cancelling headphones',
        ARRAY(SELECT description FROM candidates),
        ARRAY(SELECT id::text FROM candidates)
    )
)
SELECT c.id, c.title, r.rank, r.relevance_score
FROM candidates c
JOIN reranked r ON r.document_id = c.id::text
ORDER BY r.rank ASC
LIMIT 10;

Note

BYOM-Benutzer: Ersetzen Sie azure_openai.create_embeddings(input => 'wireless noise cancelling headphones') durch azure_openai.create_embeddings('my-embedding', 'wireless noise cancelling headphones') und fügen Sie 'my-reranker' als letztes Argument zu azure_ai.rank() hinzu.

Hybridsuche + Reranking

Kombinieren Sie für die beste Abrufqualität die BM25-Volltextsuche und die Vektorsuche mit Reciprocal Rank Fusion und ordnen Sie die zusammengeführten Ergebnisse anschließend neu. Wenn Sie dieses Muster als dauerhaften, fehlertoleranten Workflow mit automatischen Wiederholungen und Checkpoints ausführen möchten, siehe Dauerhafte KI-Pipelines in Azure HorizonDB (Preview) implementieren, das ai.rank() als integrierten Pipelineschritt unterstützt.

WITH query AS (
    SELECT
        'wireless noise cancelling headphones' AS q_text,
        azure_openai.create_embeddings(
            input => 'wireless noise cancelling headphones'
        )::vector AS q_vec
),
bm25 AS (
    SELECT p.id,
           ROW_NUMBER() OVER (
               ORDER BY p.description <@> to_bm25query(query.q_text, 'idx_products_bm25')
           ) AS bm25_rank
    FROM products p, query
    ORDER BY p.description <@> to_bm25query(query.q_text, 'idx_products_bm25')
    LIMIT 50
),
vec AS (
    SELECT p.id, ROW_NUMBER() OVER (ORDER BY p.embedding <=> query.q_vec) AS vec_rank
    FROM products p, query
    ORDER BY p.embedding <=> query.q_vec
    LIMIT 50
),
fused AS (
    SELECT p.id, p.description,
           (1.0 / (60 + COALESCE(b.bm25_rank, 1000))) +
           (1.0 / (60 + COALESCE(v.vec_rank, 1000))) AS rrf_score
    FROM products p
    LEFT JOIN bm25 b ON b.id = p.id
    LEFT JOIN vec v ON v.id = p.id
    WHERE b.id IS NOT NULL OR v.id IS NOT NULL
    ORDER BY rrf_score DESC
    LIMIT 20
),
reranked AS (
    SELECT *
    FROM azure_ai.rank(
        'wireless noise cancelling headphones',
        ARRAY(SELECT description FROM fused),
        ARRAY(SELECT id::text FROM fused)
    )
)
SELECT f.id, f.description, r.rank, r.relevance_score
FROM fused f
JOIN reranked r ON r.document_id = f.id::text
ORDER BY r.rank ASC
LIMIT 10;

Note

BYOM-Benutzer: Übergeben Sie Ihre Modellaliasen an create_embeddings() und rank() wie in den vorherigen Beispielen gezeigt.

Leistungsüberlegungen

Faktor Recommendation
Größe des Kandidatenpools 20–50 Kandidaten neu ordnen. Mehr Kandidaten verbessern den Recall, erhöhen aber Latenz und Kosten linear.
Latency Die Cross-Encoder-Bewertung erhöht die Latenz je nach Poolgröße und Dokumentlänge um mehrere Dutzend bis gut hundert Millisekunden.
Dokumentlänge Kürzere Dokumente lassen sich schneller neu sortieren. Wenn Dokumente lang sind, sollten Sie ein erneutes Ranking eher auf Basis von Zusammenfassungen oder des relevantesten Abschnitts als auf Basis des gesamten Textes durchführen.
Wann übersprungen werden soll Wenn Ihre Abrufphase bereits weniger als fünf Ergebnisse zurückgibt, verursacht Reranking zusätzliche Kosten bei abnehmendem Genauigkeitsgewinn.