Einbettung Überblick
Embedding ist ein Konzept des maschinellen Lernens zur Abbildung von Daten in einem hochdimensionalen Raum, in dem Daten mit ähnlicher Semantik nahe beieinander angeordnet werden. Bei dem Einbettungsmodell handelt es sich in der Regel um ein Deep Neural Network von BERT oder anderen Transformer-Familien, das die Semantik von Text, Bildern und anderen Datentypen durch eine Reihe von Zahlen, die als Vektoren bezeichnet werden, effektiv darstellen kann. Ein wesentliches Merkmal dieser Modelle ist, dass der mathematische Abstand zwischen Vektoren im hochdimensionalen Raum die Ähnlichkeit der Semantik von Originaltexten oder -bildern anzeigen kann. Diese Eigenschaft ermöglicht zahlreiche Anwendungen für die Informationsbeschaffung, z. B. Web-Suchmaschinen wie Google und Bing, Produktsuche und -empfehlungen auf E-Commerce-Websites und das kürzlich populäre Paradigma Retrieval Augmented Generation (RAG) in der generativen KI.
Es gibt zwei Hauptkategorien von Einbettungen, die jeweils eine andere Art von Vektor erzeugen:
Dense Embedding: Die meisten Einbettungsmodelle stellen Informationen als Gleitkomma-Vektor mit Hunderten bis Tausenden von Dimensionen dar. Die Ausgabe wird als "dichte" Vektoren bezeichnet, da die meisten Dimensionen Nicht-Null-Werte haben. Das beliebte Open-Source-Einbettungsmodell BAAI/bge-base-de-v1.5 beispielsweise gibt Vektoren mit 768 Fließkommazahlen aus (768-dimensionaler Float-Vektor).
Spärliche Einbettung: Im Gegensatz dazu haben die Ausgangsvektoren von spärlichen Einbettungen die meisten Dimensionen Null, nämlich "spärliche" Vektoren. Diese Vektoren haben oft viel höhere Dimensionen (Zehntausende oder mehr), was durch die Größe des Token-Vokabulars bestimmt wird. Sparse Vektoren können durch Deep Neural Networks oder statistische Analyse von Textkorpora erzeugt werden. Aufgrund ihrer Interpretierbarkeit und der beobachteten besseren Verallgemeinerungsfähigkeiten außerhalb der Domäne werden Sparse Embeddings von Entwicklern zunehmend als Ergänzung zu Dense Embeddings eingesetzt.
Milvus ist eine Vektordatenbank, die für die Verwaltung, Speicherung und Abfrage von Vektordaten entwickelt wurde. Durch die Integration von Mainstream-Embedding- und Reranking-Modellen können Sie den Originaltext einfach in durchsuchbare Vektoren umwandeln oder die Ergebnisse mithilfe leistungsstarker Modelle ranken, um genauere Ergebnisse für RAG zu erzielen. Diese Integration vereinfacht die Textumwandlung und macht zusätzliche Komponenten für die Einbettung oder das Reranking überflüssig, wodurch die Entwicklung und Validierung von RAGs rationalisiert wird.
Um Einbettungen in Aktion zu erstellen, siehe Verwendung des PyMilvus-Modells zur Generierung von Texteinbettungen.
Einbettung Funktion | Typ | API oder Open-Source |
---|---|---|
openai | Dichtes | API |
Satzumwandler | Dicht | Open-Source |
bm25 | Lückenhaft | Open-sourced |
Splade | Spärlich | Open-sourced |
bge-m3 | Hybride | Open-source |
voyageai | Dichtes | API |
jina | Dichtes | API |
kohärent | Dicht | API |
Ausbilder | Dichtes | Open-Source |
Mistral AI | Dicht | API |
Nomic | Dichtes | API |
mGTE | Hybride | Offen zugänglich |
Beispiel 1: Verwendung der Standard-Einbettungsfunktion zur Erzeugung dichter Vektoren
Um Einbettungsfunktionen mit Milvus zu verwenden, installieren Sie zunächst die PyMilvus-Client-Bibliothek mit dem Unterpaket model
, das alle Dienstprogramme für die Einbettungserzeugung enthält.
pip install "pymilvus[model]"
Das Unterpaket model
unterstützt verschiedene Einbettungsmodelle, von OpenAI, Sentence Transformers, BGE M3, BM25, bis hin zu SPLADE Pretrained Models. Der Einfachheit halber wird in diesem Beispiel das Modell DefaultEmbeddingFunction
verwendet, das ein reines MiniLM-L6-v2-Satztransformatormodell ist. Das Modell ist etwa 70 MB groß und wird bei der ersten Verwendung heruntergeladen:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()
# Data from which embeddings are to be generated
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
embeddings = ef.encode_documents(docs)
# Print embeddings
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
Die erwartete Ausgabe ist ähnlich wie die folgende:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
Beispiel 2: Erzeugen von dichten und spärlichen Vektoren in einem Aufruf mit dem BGE M3-Modell
In diesem Beispiel verwenden wir das BGE M3-Hybridmodell, um Text sowohl in dichte als auch in spärliche Vektoren einzubetten und sie zum Auffinden relevanter Dokumente zu verwenden. Die allgemeinen Schritte sind wie folgt:
Einbettung des Textes in dichte und spärliche Vektoren mit dem BGE-M3-Modell;
Einrichten einer Milvus-Sammlung zum Speichern der dichten und spärlichen Vektoren;
Einfügen der Daten in Milvus;
Suchen und Prüfen des Ergebnisses.
Zuerst müssen wir die notwendigen Abhängigkeiten installieren.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
Verwenden Sie BGE M3, um Dokumente und Abfragen für die Einbettung zu kodieren.
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])
Beispiel 3: Generierung von spärlichen Vektoren mit dem BM25-Modell
BM25 ist eine bekannte Methode, die die Häufigkeit des Auftretens von Wörtern verwendet, um die Relevanz zwischen Abfragen und Dokumenten zu bestimmen. In diesem Beispiel wird gezeigt, wie BM25EmbeddingFunction
verwendet wird, um spärliche Einbettungen sowohl für Abfragen als auch für Dokumente zu erzeugen.
Zunächst wird die Klasse BM25EmbeddingFunction importiert.
from pymilvus.model.sparse import BM25EmbeddingFunction
In BM25 ist es wichtig, die Statistiken in Ihren Dokumenten zu berechnen, um die IDF (Inverse Document Frequency) zu erhalten, die das Muster in Ihren Dokumenten darstellen kann. Die IDF ist ein Maß dafür, wie viele Informationen ein Wort liefert, d. h. ob es in allen Dokumenten häufig oder selten vorkommt.
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Where was Turing born?"
bm25_ef = BM25EmbeddingFunction()
# 2. fit the corpus to get BM25 model parameters on your documents.
bm25_ef.fit(docs)
# 3. store the fitted parameters to disk to expedite future processing.
bm25_ef.save("bm25_params.json")
# 4. load the saved params
new_bm25_ef = BM25EmbeddingFunction()
new_bm25_ef.load("bm25_params.json")
docs_embeddings = new_bm25_ef.encode_documents(docs)
query_embeddings = new_bm25_ef.encode_queries([query])
print("Dim:", new_bm25_ef.dim, list(docs_embeddings)[0].shape)
Das erwartete Ergebnis sieht wie folgt aus:
Dim: 21 (1, 21)