BAAI

BAAI / bge-m3

Ein mehrsprachiges Einbettungsmodell mit Multifunktionalität (Dense-, Sparse- und Multi-Vector-Retrieval), das 100 Sprachen unterstützt.

Einführung in BGE-M3

BGE-M3 ist ein vom BAAI entwickeltes Modell zur Texteinbettung, das auf Vielseitigkeit in verschiedenen Sprachen und Aufgaben zugeschnitten ist. Es unterstützt über 100 Sprachen und bewältigt Eingabegrößen von bis zu 8192 Token. Dank dieser Fähigkeit kann BGE-M3 bei dichten, spärlichen und multivektoriellen Suchaufgaben glänzen, was es für die Dokumentensuche und die Beantwortung von Fragen sehr effektiv macht. Die Spitzenleistung des Modells wird in Benchmarks wie MKQA und MLDR demonstriert. Seine Architektur umfasst die Destillation von Selbstwissen, was die Anpassungsfähigkeit und Genauigkeit über verschiedene Datensätze hinweg verbessert und es zu einem leistungsstarken Werkzeug für die mehrsprachige Informationsbeschaffung macht.

Wie man Einbettungen mit BGE-M3 erstellt

Es gibt zwei Möglichkeiten, Vektoreinbettungen zu erzeugen:

  • PyMilvus: das Python SDK für Milvus, das das bge-m3 Modell nahtlos integriert.
  • FlagEmbedding-Bibliothek: die Python-Bibliothek FlagEmbedding.

Sobald die Vektoreinbettungen erstellt sind, können sie in der Zilliz Cloud (ein vollständig verwalteter, von Milvus betriebener Vektor-Datenbankdienst) gespeichert und für die semantische Ähnlichkeitssuche verwendet werden. Dies sind die vier wichtigsten Schritte:

Einbettungen über PyMilvus erstellen

from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import MilvusClient, DataType, AnnSearchRequest, WeightedRanker

ef = BGEM3EmbeddingFunction()

docs = [
   "Künstliche Intelligenz wurde 1956 als akademische Disziplin gegründet.",
   "Alan Turing war die erste Person, die umfangreiche Forschungen im Bereich der KI durchführte.",
   "Geboren in Maida Vale, London, wuchs Turing in Südengland auf."
]
# Einbettungen für Dokumente generieren
docs_embeddings = ef.encode_documents(docs)

queries = ["Wann wurde die künstliche Intelligenz begründet",
          "Wo wurde Alan Turing geboren?"]

# Einbettungen für Abfragen generieren
query_embeddings = ef.encode_queries(queries)

client = MilvusClient(
    uri=ZILLIZ_PUBLIC_ENDPOINT,
    token=ZILLIZ_API_KEY)
 
schema = client.create_schema(
    auto_id=True,
    enable_dynamic_field=True,
)

schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(
    field_name="dense_vector",
    datatype=DataType.FLOAT_VECTOR,
    dim=ef.dim["dichte"],
)
schema.add_field(
    field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
)

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="dense_vector", index_type="FLAT", metric_type="IP"
)
index_params.add_index(
    field_name="sparse_vector",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="IP",
)

COLLECTION = "Dokumente"
if client.has_collection(collection_name=COLLECTION):
    client.drop_collection(collection_name=COLLECTION)
client.create_collection(
    collection_name=COLLECTION,
    schema=schema,
    index_params=index_params,
    enable_dynamic_field=True,
)

for i in range(len(docs)):
    doc, dense_embedding, sparse_embedding = docs[i], docs_embeddings["dense"][i], docs_embeddings["sparse"][[i]]
    client.insert(COLLECTION, {"text": doc, "dense_vector": dense_embedding, "sparse_vector": sparse_embedding})

k = 1
req_list = []

dense_embedding = query_embeddings["dense"][0]
sparse_embedding = query_embeddings["sparse"][[0]]

dense_search_param = {
    "data": [dense_embedding],
    "anns_field": "dichten_Vektor",
    "param": {"metric_type": "IP"},
    "limit": k * 2,
}

dense_req = AnnSearchRequest(**dense_search_param)
req_list.append(dense_req)

sparse_search_param = {
    "data": [sparse_embedding],
    "anns_field": "sparse_vector",
    "param": {"metric_type": "IP"},
    "limit": k * 2,
}
sparse_req = AnnSearchRequest(**sparse_search_param)
req_list.append(sparse_req)

results = client.hybrid_search(
    COLLECTION,
    req_list,
    WeightedRanker(1.0, 1.0),
    k,
    consistency_level="Strong",
    output_fields=["text"]
)

Eine ausführliche Schritt-für-Schritt-Anleitung finden Sie in unserer [PyMilvus-Dokumentation] (https://milvus.io/docs/embed-with-bgm-m3.md).

Erzeugen von Vektoreinbettungen über die FlagEmbedding Bibliothek

from pymilvus import MilvusClient, DataType, AnnSearchRequest, WeightedRanker
von FlagEmbedding importieren BGEM3FlagModel

model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=False)

docs = [
   "Künstliche Intelligenz wurde 1956 als akademische Disziplin gegründet.",
   "Alan Turing war die erste Person, die umfangreiche Forschungen im Bereich der KI durchführte.",
   "Geboren in Maida Vale, London, wuchs Turing in Südengland auf."
]
# Einbettungen für Dokumente generieren
docs_embeddings = model.encode(docs, return_dense=True, return_sparse=True)

queries = ["Wann wurde die künstliche Intelligenz begründet",
          "Wo wurde Alan Turing geboren?"]

# Einbettungen für Abfragen generieren
query_embeddings = model.encode(queries, return_dense=True, return_sparse=True)

client = MilvusClient(
    uri=ZILLIZ_PUBLIC_ENDPOINT,
    token=ZILLIZ_API_KEY)
 
schema = client.create_schema(
    auto_id=True,
    enable_dynamic_field=True,
)

schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(
    field_name="dense_vector",
    datatype=DataType.FLOAT_VECTOR,
    dim=1024,
)
schema.add_field(
    feld_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
)

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="dense_vector", index_type="FLAT", metric_type="IP"
)
index_params.add_index(
    field_name="sparse_vector",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="IP",
)

COLLECTION = "Dokumente"
if client.has_collection(collection_name=COLLECTION):
    client.drop_collection(collection_name=COLLECTION)
client.create_collection(
    collection_name=COLLECTION,
    schema=schema,
    index_params=index_params,
    enable_dynamic_field=True,
)

for i in range(len(docs)):
    doc, dense_embedding, sparse_embedding = docs[i], docs_embeddings["dense_vecs"][i], docs_embeddings["lexical_weights"][i]
    client.insert(COLLECTION, {"text": doc, "dense_vector": dense_embedding, "sparse_vector": {int(k): sparse_embedding[k] for k in sparse_embedding}})

k = 1
req_list = []

dense_embedding = query_embeddings["dense_vecs"][0]
sparse_embedding = {int(k): query_embeddings["lexical_weights"][0][k] for k in query_embeddings["lexical_weights"][0]}

dense_search_param = {
    "data": [dense_embedding],
    "anns_field": "dichten_Vektor",
    "param": {"metric_type": "IP"},
    "limit": k * 2,
}

dense_req = AnnSearchRequest(**dense_search_param)
req_list.append(dense_req)

sparse_search_param = {
    "data": [sparse_embedding],
    "anns_field": "sparse_vector",
    "param": {"metric_type": "IP"},
    "limit": k * 2,
}
sparse_req = AnnSearchRequest(**sparse_search_param)
req_list.append(sparse_req)

results = client.hybrid_search(
    COLLECTION,
    req_list,
    WeightedRanker(1.0, 1.0),
    k,
    consistency_level="Strong",
    output_fields=["text"]
)

Weitere Lektüre