TextfeldCompatible with Milvus 3.0.x
In KI-Suchanwendungen hilft Ihnen die Vektorsuche dabei, semantisch ähnliche Entitäten zu finden, doch oft benötigt die Anwendung auch den ursprünglichen Quelltext hinter jedem Treffer. Ein LLM oder Agent kann diesen Text als Kontext nutzen, um das Ergebnis zu lesen, zu zitieren, zusammenzufassen oder in eine Eingabeaufforderung einzubinden.
Milvus bietet den Skalarfeldtyp „ TEXT “ zum direkten Speichern langer Quelltexte zusammen mit Entitäten an. Typische Werte sind Textpassagen, lange Dokumente, Artikeltexte, Tickets und Protokolle. Im Gegensatz zu „ VARCHAR “, das eine feste „ max_length “ erfordert, müssen Sie bei „ TEXT “ keine maximale Byte-Länge im Sammlungsschema festlegen.
Um ein „ TEXT “-Feld zu definieren, setzen Sie „ datatype “ auf „ DataType.TEXT “.
Diese Funktion erfordert Storage V3. Anweisungen zur Aktivierung und Hinweise zur Kompatibilität finden Sie unter „Storage V3“.
common.storage.useLoonFFI Der Standardwert ist „ false “, was bedeutet, dass Storage V3 standardmäßig deaktiviert ist. Bevor Sie eine Sammlung erstellen, die ein „ TEXT “-Feld enthält, setzen Sie diesen Parameter auf „ true “; andernfalls lehnt Milvus das Sammlungsschema ab.
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
)
Nachdem das Feld definiert wurde, kann jede Entität einen Zeichenfolgenwert in diesem Feld enthalten. Sie fügen „ TEXT “-Werte wie bei anderen Skalarfeldern ein und geben sie in Abfrage- oder Suchergebnissen zurück, indem Sie das Feld in „ output_fields “ auflisten.
TEXT Felder unterstützen Null-Werte. Um diese Funktion zu aktivieren, setzen Sie „ nullable “ auf „ True “. Weitere Informationen finden Sie unter „Nullfähiges Feld“.
Einschränkungen
- Ein „
TEXT“-Feld kann kein Primärfeld, Partitionsschlüssel oder Clustering-Schlüssel sein. TEXTkann nicht als Elementtyp eines „ARRAY“-Feldes verwendet werden, einschließlich eines skalaren Unterfeldes in einem „StructArray“-Feld.- In Milvus 3.0.0 unterstützen „
TEXT“-Felder keine Standardwerte. - In Milvus 3.0.0 werden „
TEXT“-Felder in externen Sammlungen nicht unterstützt. - Benutzer können keinen skalaren Index für ein „
TEXT“-Feld erstellen. Wenn „enable_match=True“ gesetzt ist, erstellt Milvus einen vom System verwalteten Textindex für den Textabgleich. Dieser interne Index ist kein vom Benutzer erstellter skalarer Index. - Allgemeine skalare Filteroperatoren können nicht direkt auf ein „
TEXT“-Feld angewendet werden. Dazu gehören Vergleichsoperatoren wie „==“ und „!=“, Bereichsoperatoren wie „>“, „>=“, „<“ und „<=“ sowie „IN“, „LIKE“, Regex-Operatoren (=~und!~) und „IS NULL“ oder „IS NOT NULL“. Um nach analysierten Begriffen zu filtern, definieren Sie das Feld mit „enable_analyzer=True“ und „enable_match=True“ und verwenden Sie „TEXT_MATCH“ oder „TEXT_MATCH_FUZZY“. Für die relevanzbasierte Volltextsuche verwenden Sie BM25. - In Milvus 3.0.0 muss eine BM25- oder MinHash-Funktion, die ein Feld vom Typ „
TEXT“ als Eingabe verwendet, bereits bei der Erstellung der Sammlung definiert werden. Sie kann später nicht über „add_function_field“ oder „AlterCollectionSchema“ hinzugefügt werden, selbst wenn die bestehende Sammlung leer ist, da Milvus die Funktionsausgabe nicht anhand der gespeicherten „TEXT“-Werte nachträglich ergänzen kann. Um eine solche Funktion zu einer bestehenden Sammlung hinzuzufügen, verwenden Sie das Eingabefeld „VARCHAR“ oder erstellen Sie die Sammlung neu, wobei die Funktion in ihrem Schema enthalten ist. Einzelheiten zum Hinzufügen einer Funktion und ihres generierten Vektorfeldes finden Sie unter „Alter Collection Schema“. - Text-Embedding-Funktionen müssen ebenfalls bei der Erstellung der Sammlung definiert werden. Milvus 3.0.0 unterstützt das Hinzufügen dieser Funktionen zur Laufzeit nicht.
Wählen Sie „TEXT“ oder „VARCHAR“
TEXT und „ VARCHAR “ speichern beide Zeichenfolgenwerte, erfüllen jedoch unterschiedliche Anwendungsanforderungen. Verwenden Sie „ VARCHAR “ für kurze, begrenzte Metadaten, die Entitäten identifizieren, kategorisieren oder filtern. Verwenden Sie „ TEXT “ für längere Quellinhalte, die einem LLM oder Agenten genügend Kontext bieten, um zu lesen, zu zitieren, zusammenzufassen oder eine Eingabeaufforderung zu erstellen.
| Aspekt | VARCHAR | TEXT |
|---|---|---|
| Am besten geeignet für | Kurze Metadaten, die zur Identifizierung, Kategorisierung oder zum Filtern von Entitäten verwendet werden, wie z. B. title, tag, category oder external_id. | Längere Quellinhalte, die von LLM- oder Agenten-Workflows verwendet werden, wie z. B. content, passage, article_body oder log_message. |
| Längeneinstellung | Erfordert „ max_length “, das die maximale Anzahl an Bytes definiert, die das Feld speichern kann. Der Maximalwert beträgt „ 65,535 “ Bytes. Wenn ein Wert diese Grenze überschreiten könnte, verwenden Sie „ TEXT “. | Erfordert kein „ max_length “, sodass das Schema keine feste Byte-Begrenzung für den Textwert benötigt. |
| Speicherverhalten | Jeder Wert wird innerhalb des für das Feld konfigurierten „ max_length “ gespeichert. | Verwendet die automatische Speicherauswahl für größere Textwerte. Weitere Informationen finden Sie unter „So speichert Milvus große TEXT-Werte“. |
| Unterstützung als Primärfeld | Kann als Primärfeld verwendet werden. | Kann nicht als Primärfeld verwendet werden. |
| Filterung | Verwenden Sie dieses Feld für kurze Zeichenfolgen-Metadaten, die in Filterausdrücken erscheinen müssen, wie z. B. „ category == "news" “ oder „ tag in ["ai", "database"] “. | Unterstützt keine allgemeinen skalaren Filteroperatoren. Verwenden Sie textbasierte Operatoren mit Übereinstimmungsprüfung für die Filterung nach analysierten Begriffen oder BM25 für die relevanzbasierte Volltextsuche. |
Weitere Informationen zu „ VARCHAR “-Feldern finden Sie unter „VarChar-Feld“.
Wie Milvus große TEXT-Werte speichert
Wenn Sie eine Entität einfügen, ist die von Ihnen für ein „ TEXT “-Feld angegebene Zeichenfolge der Wert „ TEXT “. Milvus vergleicht die Größe dieses Werts mit „dataNode.text.inlineThreshold“ – standardmäßig „ 65,536 “ Bytes – und wählt dann einen von zwei internen Speicherpfaden aus.
Speicherung großer Textmengen
- Inline-Speicherung: Ist der Wert von „
TEXT“ kleiner als „dataNode.text.inlineThreshold“, speichert Milvus den ursprünglichen Textwert direkt im Feld „data“ unter „TEXT“. - LOB-Speicherung: Ist ein Wert im Feld „
TEXT“ größer oder gleichdataNode.text.inlineThreshold, behandelt Milvus den Wert als großes Objekt und speichert den Originaltext separat in einem Objektspeicher wie MinIO. Das Feld „TEXT“ speichert einen internen Verweis auf den separat gespeicherten Text. Wenn das Feld „TEXT“ in Abfrage- oder Suchergebnissen angefordert wird, nutzt Milvus diesen Verweis, um den Originaltext abzurufen und zurückzugeben.
Diese Speicherauswahl erfolgt intern. Sie fügen das Feld „ TEXT “ ein, fragen es ab und durchsuchen es auf dieselbe Weise, unabhängig davon, welchen Speicherpfad Milvus verwendet. Informationen zur Optimierung des Schwellenwerts oder des damit verbundenen Verhaltens in Bezug auf Speicherung, Komprimierung und Garbage Collection finden Sie unter den Konfigurationen für „dataNode“ und „dataCoord“.
Wenn Ihre Bereitstellung Objektspeicher verwendet, können große „ TEXT “-Werte als von Milvus verwaltete Objekte unter Pfaden wie lobs/... erscheinen. Diese Objekte sind Implementierungsdetails und sollten nicht manuell verschoben, kopiert oder gelöscht werden. Nachdem Sie Entitäten gelöscht, Partitionen entfernt oder Daten komprimiert haben, kann sich die Auslastung des Objektspeichers erst verringern, nachdem die Milvus-Garbage-Collection nicht mehr referenzierte Daten großer Objekte nach Ablauf des Sicherheitsfensters entfernt hat.
Eine häufige Verwendung von „ TEXT “ ist die Volltextsuche mit BM25. In diesem Muster speichert das Feld „ TEXT “ den ursprünglichen Quellinhalt, und BM25 analysiert den Text und generiert Sparse-Vektoren für das Ranking von Übereinstimmungen auf Basis von Schlüsselwörtern. Suchergebnisse können dann den übereinstimmenden „ TEXT “-Wert als Kontext für LLM- oder Agenten-Workflows zurückgeben. Das folgende Beispiel zeigt, wie ein „ TEXT “-Feld als Eingabefeld für BM25 verwendet wird. Informationen zu den Konzepten und Abfrageoptionen der Volltextsuche finden Sie unter „Volltextsuche“.
Schritt 1: Erstellen einer Sammlung mit einem TEXT-Feld
Im folgenden Beispiel wird eine Sammlung mit einem Feld „ TEXT “ für Quellinhalte und einem Feld für spärliche Vektoren erstellt, in dem die von BM25 generierten spärlichen Vektoren gespeichert werden. Die BM25-Funktion wandelt den tokenisierten Text aus „ content “ in spärliche Vektoren um, die in „ sparse “ gespeichert werden.
Für die BM25-Volltextsuche muss das Eingabefeld „ TEXT “ auf „ enable_analyzer=True “ gesetzt sein.
from pymilvus import DataType, Function, FunctionType, MilvusClient
client = MilvusClient(uri="http://localhost:19530")
COLLECTION_NAME = "text_bm25_collection"
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)
schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)
bm25_function = Function(
name="content_bm25",
input_field_names=["content"],
output_field_names=["sparse"],
function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)
Schritt 2: Erstellen eines Index für spärliche Vektoren
Erstellen Sie einen Index für das von der BM25-Funktion generierte Sparse-Vektor-Feld. Der Metriktyp muss auf „ BM25 “ gesetzt sein.
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={
"inverted_index_algo": "DAAT_MAXSCORE",
"bm25_k1": 1.2,
"bm25_b": 0.75,
},
)
client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params,
)
Schritt 3: TEXT-Daten einfügen
Fügen Sie Text direkt in das Feld „ TEXT “ ein. Geben Sie keine Werte für das Feld „ sparse “ an. Milvus generiert die spärlichen Vektoren intern, indem es die BM25-Funktion auf „ content “ anwendet.
data = [
{
"id": 1,
"content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
},
{
"id": 2,
"content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
},
{
"id": 3,
"content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
},
]
client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)
Schritt 4: BM25-Volltextsuche durchführen
Verwenden Sie den Rohtext der Abfrage als Suchdaten und führen Sie die Suche im Feld „sparse vector“ durch. Milvus wandelt den Abfragetext in einen spärlichen Vektor um, ordnet die Treffer mit BM25 nach und gibt das angeforderte Feld „ TEXT “ in „ output_fields “ zurück.
results = client.search(
collection_name=COLLECTION_NAME,
data=["how does Milvus store source text for retrieval"],
anns_field="sparse",
limit=2,
output_fields=["content"],
)
Schritt 5: Lesen der zurückgegebenen TEXT-Werte
Jeder Suchtreffer enthält den BM25-Score und den ursprünglichen Wert „ TEXT “.
for hit in results[0]:
print(f"id: {hit['id']}, score: {hit['distance']}")
print(hit["entity"]["content"])
Weitere Informationen zu BM25-Funktionen, spärlichen Vektorindizes und der Abfragesyntax für die Volltextsuche finden Sie unter „Volltextsuche“.