Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
- 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.
- 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:
-
AI-Modellverwaltung (eingeschränkte Vorschau) aktiviert:
- Es provisioniert automatisch ein
default-rerankerModell (Cohere-rerank-v4.0-fast), das sofort einsatzbereit ist.
- Es provisioniert automatisch ein
-
Die
azure_aiErweiterung, die mit einem über die Modellregistrierung registrierten Neubewerter-Modell installiert wurde Siehe Manuelle Einrichtung mit Modellregistrierung.
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. |