46.4kデモを予約するログイン無料で始める
BAAI

BAAI / bge-m3

多機能(高密度、スパース、マルチベクトル検索)を持ち、100言語をサポートする多言語埋め込みモデル。

#BGE-M3入門

BGE-M3はBAAIによって開発されたテキスト埋め込みモデルで、様々な言語やタスクに対応できるように調整されています。BGE-M3は100以上の言語をサポートし、最大8192トークンまでの入力に対応します。この能力により、BGE-M3は密な、疎な、多ベクタの検索タスクに優れており、文書検索や質問応答において非常に効果的です。このモデルの最先端の性能は、MKQAやMLDRなどのベンチマークで実証されている。そのアーキテクチャには自己知識蒸留が含まれており、様々なデータセットに対する適応性と精度を高め、多言語情報検索の強力なツールとして位置づけている。

BGE-M3での埋め込み作成方法

ベクトル埋め込みを生成するには2つの方法があります:

  • PyMilvus](https://github.com/milvus-io/pymilvus): MilvusのPython SDKで、bge-m3モデルをシームレスに統合している。
  • FlagEmbedding ライブラリ: Python のライブラリ FlagEmbedding.

ベクトル埋め込みが作成されると、Zilliz Cloud (Milvusによるフルマネージドベクトルデータベースサービス)に保存され、意味的類似性検索に利用できる。ここでは4つの重要なステップを紹介する:

  • Zilliz Cloudアカウントに無料でサインアップ](https://cloud.zilliz.com/signup)。
  • サーバーレスクラスターをセットアップ](https://docs.zilliz.com/docs/create-cluster#set-up-a-free-cluster)し、パブリックエンドポイントとAPIキーを取得する。
  • ベクトルコレクションを作成し、ベクトル埋め込みを挿入する。
  • 保存された埋め込みに対してセマンティック検索を実行する。

PyMilvus経由で埋め込みを作成する。

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

ef = BGEM3EmbeddingFunction()

ドキュメント
   「人工知能は1956年に学問分野として設立された、
   "アラン・チューリングは、AIの実質的な研究を行った最初の人物である。"、
   「チューリングはロンドンのマイダベールで生まれ、イングランド南部で育った。
]
# ドキュメントの埋め込みを生成する
docs_embeddings = ef.encode_documents(docs)

queries = ["人工知能はいつ創設されたか"、
          「アラン・チューリングはどこで生まれましたか?]

# クエリの埋め込みを生成
query_embeddings = ef.encode_queries(queries)

client = MilvusClient(
    uri=ZILLIZ_PUBLIC_ENDPOINT、
    token=ZILLIZ_API_KEY)
 
スキーマ = 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(
    フィールド名="dense_vector"、
    datatype=DataType.FLOAT_VECTOR、
    dim=ef.dim["dense"]、
)
schema.add_field(
    フィールド名="sparse_vector", データ型=DataType.SPARSE_FLOAT_VECTOR
)

index_params = client.prepare_index_params()
index_params.add_index(
    フィールド名="dense_vector", index_type="FLAT", metric_type="IP"
)
index_params.add_index(
    フィールド名="sparse_vector"、
    index_type="SPARSE_INVERTED_INDEX"、
    metric_type="IP"、
)

COLLECTION = "documents"
if client.has_collection(collection_name=COLLECTION):
    client.drop_collection(collection_name=COLLECTION)
client.create_collection(
    コレクション名=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["スパース"][[0]]。

dense_search_param = { 以下のようになる。
    "data":[dense_embedding]、
    "anns_field":"dense_vector"、
    「param":param": {"metric_type":"IP"}、
    "limit": k * 2、
}

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

sparse_search_param = { {検索データ: **dense_search_param
    "data":[sparse_embedding]、
    "anns_field":"sparse_vector"、
    「param":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"])
)

詳細なステップバイステップのガイドはPyMilvus Documentationを参照してください。

FlagEmbedding ライブラリを用いたベクトルの埋め込み生成

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

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

ドキュメント = [
   「人工知能は1956年に学問分野として設立された、
   「アラン・チューリングは、人工知能の実質的な研究を行った最初の人物である、
   「チューリングはロンドンのマイダ・ベイルで生まれ、イングランド南部で育った。
]
# ドキュメントの埋め込みを生成する
docs_embeddings = model.encode(docs, return_dense=True, return_sparse=True)

queries = ["人工知能はいつ作られたか"、
          「アラン・チューリングはどこで生まれましたか?]

# クエリの埋め込みを生成する
query_embeddings = model.encode(queries, return_dense=True, return_sparse=True)

client = MilvusClient(
    uri=ZILLIZ_PUBLIC_ENDPOINT、
    token=ZILLIZ_API_KEY)
 
スキーマ = 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(
    フィールド名="dense_vector"、
    datatype=DataType.FLOAT_VECTOR、
    dim=1024、
)
schema.add_field(
    フィールド名="sparse_vector", データ型=DataType.SPARSE_FLOAT_VECTOR
)

index_params = client.prepare_index_params()
index_params.add_index(
    フィールド名="dense_vector", index_type="FLAT", metric_type="IP"
)
index_params.add_index(
    フィールド名="sparse_vector"、
    index_type="SPARSE_INVERTED_INDEX"、
    metric_type="IP"、
)

COLLECTION = "documents"
if client.has_collection(collection_name=COLLECTION):
    client.drop_collection(collection_name=COLLECTION)
client.create_collection(
    コレクション名=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":"dense_vector"、
    「param":param": {"metric_type":"IP"}、
    "limit": k * 2、
}

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

sparse_search_param = { {検索結果のデータ: **dense_search_param
    "data":[sparse_embedding]、
    "anns_field":"sparse_vector"、
    「param":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"])
)

さらなる読み物