Durchführung einer Vektorsimilaritätssuche
In diesem Abschnitt wird erläutert, wie man Milvus verwendet, um nach Entitäten zu suchen.
In Milvus berechnet die Vektorsimilaritätssuche die Distanz zwischen dem Abfragevektor und den Vektoren in der Sammlung (unter Verwendung eines spezifizierten Ähnlichkeitsmaßes) und liefert die ähnlichsten Ergebnisse zurück. Sie können eine gemischte Suche durchführen, indem Sie einen booleschen Ausdruck angeben, um skalare oder Primärschlüsselfelder zu filtern.
Im folgenden Beispiel wird gezeigt, wie man eine Vektorsimilaritätssuche in einem Datensatz mit 2000 Zeilen durchführt, der die Buch-ID (Primärschlüssel), die Wortanzahl (skalares Feld) und die Buchsynopse (Vektorfeld) enthält, um die Suche nach spezifischen Büchern anhand ihrer vektorisierten Beschreibungen zu simulieren. Milvus wird basierend auf dem Abfragevektor und den von Ihnen definierten Suchparametern die ähnlichsten Ergebnisse zurückgeben.
Laden der Sammlung
Alle Such- und Abfrageoperationen in Milvus werden im Speicher ausgeführt. Laden Sie die Sammlung vor der Durchführung der Vektorsimilaritätssuche in den Speicher.
from pymilvus import Collection
collection = Collection("book") # Holen Sie sich die vorhandene Sammlung.
collection.load()
Vorbereiten der Suchparameter
Bereiten Sie die entsprechenden Parameter für Ihr Suchszenario vor. Im folgenden Beispiel werden die Parameter definiert, die die Suche verwenden wird, um die Distanz mit der euklidischen Distanz zu berechnen und die Vektoren von den zehn nächstgelegenen Clustern, die vom IVF_FLAT-Index erstellt wurden, abzurufen.
search_params = {
"metric_type": "L2",
"offset": 5,
"ignore_growing": False,
"params": {"nprobe": 10}
}
Parameter | Beschreibung |
---|---|
metric_type |
Die Methode, die zur Messung der Distanz zwischen Vektoren während der Suche verwendet wird. Sie sollte mit der Methode übereinstimmen, die während des Indexaufbauprozesses spezifiziert wurde. Siehe Ähnlichkeitsmaße für weitere Informationen. |
offset |
Die Anzahl der Entitäten, die während der Suche übersprungen werden sollen. Die Summe dieses Werts und des limit -Werts der search -Methode sollte kleiner als 16384 sein. Wenn Sie beispielsweise die 9. und 10. nächsten Nachbarn des Abfragevektors abfragen möchten, setzen Sie limit auf 2 und offset auf 8. |
ignore_growing |
Ob während der Ähnlichkeitssuche wachsende Segmente ignoriert werden sollen. Der Standardwert ist False , was darauf hinweist, dass die Suche wachsende Segmente einschließt. |
params |
Suchparameter, die spezifisch für den angegebenen Indextyp sind. Siehe Vektorindex für weitere Informationen. Mögliche Optionen sind: - nprobe gibt die Anzahl der zu durchsuchenden Clusterungseinheiten an. Dieser Parameter ist nur verfügbar, wenn der index_type auf IVF_FLAT , IVF_SQ8 oder IVF_PQ gesetzt ist. Der Wert sollte kleiner sein als der während des Indexaufbauprozesses spezifizierte nlist -Wert. - ef gibt den Suchbereich an. Dieser Parameter ist nur verfügbar, wenn der index_type auf HNSW gesetzt ist. Der Wert sollte zwischen top_k und 32768 liegen. - radius gibt den Winkel an, an dem Vektoren mit der geringsten Ähnlichkeit liegen. - range_filter gibt den Filter an, der verwendet wird, um die Vektorfeldwerte zu filtern, deren Ähnlichkeit zum Abfragevektor innerhalb eines spezifischen Bereichs liegt. |
Durchführen der Vektorsuche
Verwenden Sie Milvus für die Vektorsuche. Um in einem bestimmten Partition zu suchen, geben Sie eine Liste mit Partitionsnamen an.
Milvus unterstützt die Einstellung eines Konsistenzgrads für Suchen. Das folgende Beispiel setzt den Konsistenzgrad auf "Stark". Sie können den Konsistenzgrad auch auf "Bounded", "Session" oder "Eventually" setzen. Weitere Informationen zu den vier Konsistenzgraden in Milvus finden Sie unter Konsistenz.
results = collection.search(
data=[[0.1, 0.2]],
anns_field="book_intro",
param=search_params,
limit=10,
expr=None,
output_fields=['title'],
consistency_level="Stark"
)
results[0].ids
results[0].distances
treffer = results[0][0]
treffer.entity.get('title')
Parameter | Beschreibung |
---|---|
data |
Für die Suche verwendete Vektoren. |
anns_field |
Name des zu suchenden Feldes. |
param |
Suchparameter spezifisch für den Index. Weitere Informationen finden Sie unter Vektorindex. |
limit |
Anzahl der zurückgegebenen Ergebnisse. Dieser Wert, zuzüglich des offset in param , sollte weniger als 16.384 sein. |
expr |
Boolescher Ausdruck zur Filterung von Eigenschaften. Weitere Informationen finden Sie unter Boolesche Ausdrucksregeln. |
output_fields (optional) |
Namen der zurückzugebenden Felder. Vektorfelder werden derzeit nicht unterstützt. |
consistency_level (optional) |
Konsistenzgrad für die Suche. |
Überprüfen Sie die Primärschlüsselwerte und Entfernungen der ähnlichsten Vektoren.
results[0].ids
results[0].distances
Sobald die Suche abgeschlossen ist, entladen Sie die geladene Kollektion in Milvus, um den Speicherverbrauch zu reduzieren.
collection.release()
Einschränkungen
Funktion | Höchstgrenze |
---|---|
Länge des Kollektionsnamens | 255 Zeichen |
Anzahl der Partitionen in einer Kollektion | 4.096 |
Anzahl der Felder in einer Kollektion | 256 |
Anzahl der Shards in einer Kollektion | 256 |
Vektordimension | 32.768 |
Top K | 16.384 |
Eingabevektoren | 16.384 |
Durchführen der gemischten Suche
Die gemischte Suche ist im Wesentlichen eine Vektorsuche mit Attributfilterung. Indem ein boolescher Ausdruck zur Filterung skalaren Feldern oder Primärschlüsselfeldern festgelegt wird, können Suchen unter bestimmten Bedingungen eingeschränkt werden.
Das folgende Beispiel zeigt, wie eine gemischte Suche basierend auf der regulären Vektorsuche
durchgeführt wird. Angenommen, Sie möchten nach bestimmten Büchern anhand von vektorisierten Zusammenfassungen suchen, aber Sie möchten nur nach einem bestimmten Wortanzahlbereich suchen. Dann können Sie in den Suchparametern einen booleschen Ausdruck festlegen, um das Feld word_count
zu filtern. Milvus sucht nur nach ähnlichen Vektoren innerhalb der Entitäten, die dem Ausdruck entsprechen.
Durch Festlegen eines booleschen Ausdrucks können skalare Felder von Entitäten während der Vektorsuche gefiltert werden. Das folgende Beispiel beschränkt den Suchbereich auf Vektoren innerhalb des angegebenen word_count-Wertebereichs.
Sie können auch dynamische Felder im Filterausdruck verwenden und Ausgabefelder in der Suchanfrage verwenden. Beispielsweise beziehen Sie sich auf das dynamische Muster.
search_param = {
"data": [[0.1, 0.2]],
"anns_field": "book_intro",
"param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
"limit": 10,
"expr": "word_count <= 11000",
}
res = collection.search(**search_param)
Überprüfen Sie die zurückgegebenen Ergebnisse.
assert len(res) == 1
treffer = res[0]
assert len(treffer) == 2
print(f"- Gesamtanzahl Treffer: {len(treffer)}, Treffer IDs: {treffer.ids} ")
print(f"- Top1 Treffer ID: {treffer[0].id}, Entfernung: {treffer[0].distance}, Wert: {treffer[0].wert} ")
Durchführen der Bereichssuche
Die Bereichssuche ist eine Methode zur Filterung von Suchergebnissen basierend auf der Entfernung zwischen dem Abfragevektor und den Vektorfeldwerten. Unterschiedliche Distanzmetriken können verwendet werden, um die Entfernung zu messen.
Bei der Durchführung einer Bereichssuche führt Milvus zunächst eine Vektorsimilaritätssuche durch. Anschließend führt es eine Vektorfilterung basierend auf den angegebenen Entfernungsbedingungen durch und gibt die Vektoren zurück, deren Entfernung innerhalb eines bestimmten Bereichs liegt.
Das folgende Beispiel zeigt, wie eine Bereichssuche basierend auf der regulären Vektorsuche durchgeführt wird.
Laden der Kollektion
Alle Such- und Abfrageoperationen in Milvus werden im Speicher ausgeführt. Bevor eine Vektorsimilaritätssuche durchgeführt wird, muss die Kollektion in den Speicher geladen werden.
from pymilvus import Collection
collection = Collection("book") # Eine vorhandene Kollektion abrufen
collection.load()
Konfiguration der Vektorfilterbereiche
Im Vergleich zur regulären Vektorsuche wird die Bereichssuche in Milvus durch die Einführung von zwei neuen Parametern, radius
und range_filter
, gesteuert, um die gewünschten Suchergebnisse innerhalb eines bestimmten Suchbereichs zu erhalten.
Der radius
gibt den minimalen Winkel an, bei dem die Vektoren als ähnlich betrachtet werden. Ein optionaler range_filter
kann in Verbindung mit dem radius
verwendet werden, um die Vektorfeldwerte basierend auf der Ähnlichkeit zum Abfragevektor innerhalb eines bestimmten Bereichs zu filtern. Sowohl die Parameter radius
als auch range_filter
haben den Datentyp FLOAT. Durch die Festlegung dieser beiden Parameter wird die Genauigkeit und Effizienz der Suche effektiv ausgeglichen.
Typischerweise wird die Ähnlichkeit durch den Abstand zwischen dem Vektorfeldwert und dem Abfragevektor gemessen. Die Auswahl unterschiedlicher Abstandsmetriken hat einen signifikanten Einfluss auf die Konfiguration von radius
und range_filter
.
Beispielsweise müssen im Fall des L2-Abstands die Suchergebnisse basierend auf den Vektorfeldwerten mit einem Abstand kleiner als radius
gefiltert werden. Dies liegt daran, dass bei L2-Abstand kleinere Abstände eine größere Ähnlichkeit anzeigen. Mit diesem Wissen können Sie, wenn Sie einige der ähnlichsten Vektoren filtern möchten, einen effektiven range_filter
-Wert angeben, der kleiner als radius
ist.
search_params = {
"metric_type": "L2",
"params": {
"radius": 10.0,
"range_filter" : 5.0
}
}
Im Fall des IP-Abstands ist das Szenario anders. Bei IP-Abstand deutet ein größerer Abstand auf eine größere Ähnlichkeit hin. Daher sind im Gegensatz zum L2-Abstand die Werte von radius
und range_filter
beim IP-Abstand entgegengesetzt. Mit anderen Worten, wenn Sie mithilfe von range_filter
einige der ähnlichsten Vektoren basierend auf dem IP-Abstand filtern möchten, muss der effektive range_filter
-Wert größer als radius
sein, und der Abstand der resultierenden Vektoren sollte größer als radius
, aber kleiner oder gleich range_filter
sein.
search_params = {
"metric_type": "IP",
"params": {
"radius": 0.8,
"range_filter" : 1.0
}
}
Durchführen einer Bereichssuche
Durch die Festlegung von radius
und range_filter
basierend auf dem Abstandsmessungstyp können Sie den Bereich der zurückgegebenen Ergebnisvektoren definieren.
Führen Sie eine Bereichssuche zur Ähnlichkeit innerhalb des Bereichs von 5,0
und 10,0
basierend auf dem L2-Abstand durch:
search_param = {
"data": [[0.1, 0.2]], # Abfragevektor
"anns_field": "book_intro", # Zu durchsuchendes Feld
"param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
"limit": 2,
"output_fields": ["int64", "float"] # Zurückzugebende Felder
}
res = collection.search(**search_param)
Führen Sie eine Bereichssuche zur Ähnlichkeit innerhalb des Bereichs von 1.0
und 0.8
basierend auf dem IP-Abstand durch:
search_param = {
"data": [[0.1, 0.2]], # Abfragevektor
"anns_field": "book_intro", # Zu durchsuchendes Feld
"param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
"limit": 2,
"output_fields": ["int64", "float"] # Zurückzugebende Felder
}
res = collection.search(**search_param)
Zusammenfassung
In Milvus kann die Bereichssuche Vektorergebnisse zurückgeben, die innerhalb des angegebenen Abstandsbereichs ähnlich sind. Diese Funktionalität wird durch die Spezifikation von radius
und range_filter
in den Suchparametern ermöglicht. Die folgende Tabelle fasst die Konfiguration dieser beiden Parameter für verschiedene Abstandsmessungstypen zusammen.
Abstandstyp | Konfiguration |
---|---|
L2 und andere Abstände | range_filter <= Abstand < radius |
IP- und Kosinusabstände | radius < Abstand <= range_filter |