Kladde.Verlauf beantwortet Fragen zu Ausschreibungen aus den Abschnitten im Container knowledge. Warum eine Antwort nur aus gefundenen Quellen kommen darf, zeigt „KI-Track, Lektion T5.1“ bis „T5.3“; warum Bedeutung allein bei Nummern und Fachwörtern scheitert, die Rangfusion (RRF) mit ihrer Beispielrechnung und die Messung der Treffer unter den ersten drei zeigt „T5.4“. Das alles wird hier nicht wiederholt. Neu ist, wie Cosmos DB beide Suchen in einer Abfrage fusioniert, wie die Abschnitte hineinkommen und wie Sie die Wahl der Suche mit Zahlen belegen.
Nicht gegen Azure ausgeführt: Alle Blöcke sind mit Microsoft.Azure.Cosmos 3.64.0, Newtonsoft.Json 13.0.4 und Microsoft.Extensions.AI 10.11.0 übersetzt. Ausgeführt wurde nur, was keinen Dienst braucht: Rechnung, Attrappe, Testsatz. Die Zahlen unten gehören zu einer erfundenen Aufgabe mit einer Spielzeug-Einbettung und sagen nichts über Cosmos DB. Diese Lektion ändert keine der Tatsachen F-01 bis F-08.
Die Abfrage mit RRF
Laut Learn verbindet RRF zwei oder mehr Bewertungen, etwa VectorDistance und FullTextScore, zu einer Rangfolge. Die Funktion steht in ORDER BY RANK; ein Array von Zahlen als letztes Argument gewichtet die Bewertungen, [2, 1] zählt die Vektorsuche doppelt. Voraussetzungen und Grenzen: Der Container braucht Vektor- und Volltextrichtlinie samt Indizes (Lektion 4.1), Konto und Funktionen sind angemeldet, RRF lässt sich nicht mit einem ORDER BY auf anderen Pfaden kombinieren und nicht in SELECT ausgeben. Den fusionierten Wert sehen Sie also nie, und eine Schwelle wie MinScore aus T5.3 lässt sich darauf nicht anwenden; T5.4 löst das mit einer zweiten Abfrage nach Bedeutung. Wie Cosmos DB intern rechnet, etwa mit welcher Konstante, nennt Learn nicht (offen).
public static class HybridQueries
{
public static QueryDefinition Hybrid(
string officeId, float[] question, IReadOnlyList<string> words, int top, double[]? weights = null)
{
var names = words.Select((_, i) => $"@w{i}").ToArray();
var weightList = weights is null
? ""
: ", [" + string.Join(", ", weights.Select(w => w.ToString(CultureInfo.InvariantCulture))) + "]";
var query = new QueryDefinition(
"SELECT TOP @top c.id, c.tenderId, c.heading, c.text FROM c WHERE c.officeId = @officeId "
+ "ORDER BY RANK RRF(VectorDistance(c.embedding, @question), "
+ $"FullTextScore(c.text, {string.Join(", ", names)}){weightList})")
.WithParameter("@top", top)
.WithParameter("@officeId", officeId)
.WithParameter("@question", question);
for (var i = 0; i < names.Length; i++)
{
query = query.WithParameter(names[i], words[i]);
}
return query;
}
}
Die Wörter kommen aus dem Code, nicht aus dem Modell (T5.4, Keywords), jedes als eigener Parameter; Learn rät, Wortgruppen in einzelne Wörter zu zerlegen. Ein Adapter CosmosKnowledgeSearch führt die Abfragen mit dem Büro als PartitionKey in den Optionen aus. Er ist übersetzt, aber nicht gegen Azure ausgeführt.