bge-m3 密集与稀疏向量嵌入实战:在 Xinference 中部署与调用 BAAI/bge-m3 双语 Embedding 模型
2026/9/16 11:26:06 网站建设 项目流程

bge-m3 密集与稀疏向量嵌入实战:在 Xinference 中部署与调用 BAAI/bge-m3 双语 Embedding 模型

【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference

本文围绕 Xinference 内置模型库中 bge-m3 的官方说明展开:从 1024 维、8192 token 的规格指标,到xinference launch一条命令拉起服务,再到 RESTful API 与 Python Client 的调用、多引擎(flag / llama.cpp / sentence_transformers / vllm)的选择逻辑,以及仓库源码与测试用例给出的底层实现证据,帮助你在生产环境中正确部署、调用并评估 bge-m3 的稠密与稀疏向量能力。

一、模型概述:官方内置的双语 Embedding 模型

根据 bge-m3 内置模型文档,Xinference 将 bge-m3 作为内置(builtin)模型收录在 embedding 模型目录下,核心规格如下:

  • Model Name(模型名):bge-m3
  • Languages(支持语言):zhen(中文与英文双语)
  • Abilities(能力):embed(向量嵌入)

该条目在 embedding 模型索引 中与其他内置嵌入模型并列,属于开箱即用(无需注册即可启动)的模型之一。

1.1 详细规格(Specifications)

文档给出了 bge-m3 的关键技术指标:

规格项
Dimensions(向量维度)1024
Max Tokens(最大 Token 数)8192
Model ID(Hugging Face)BAAI/bge-m3
Model ID(ModelScope)Xorbits/bge-m3

值得说明的是:1024 维的稠密向量输出意味着单个句子会被编码为一个 1024 维浮点向量,适合与向量数据库(如 Milvus、pgvector、FAISS 等)配合做语义检索;而 8192 token 的上下文窗口远超常见的 512/2048 上限,使 bge-m3 可以直接编码长文档段落,而无需先做切块(chunking),这是它在长文本检索场景下的突出能力。

以上规格在仓库的 embedding 模型规格文件 中也有完全一致的登记:"dimensions": 1024"max_tokens": 8192"language": ["zh", "en"],并且该条目带有"featured": true标记,说明它是 Xinference 重点展示的嵌入模型之一。

1.2 双模型源(Hugging Face 与 ModelScope)

文档列出了两个模型仓库 ID:

  • Hugging Face:BAAI/bge-m3
  • ModelScope:Xorbits/bge-m3

从 model_spec.json 可以看到,bge-m3 条目在model_src下同时配置了huggingfacemodelscope两个来源,且针对两种模型格式分别登记:

模型格式Hugging Face 源ModelScope 源量化方式
pytorchBAAI/bge-m3(revision73a15ad2...Xorbits/bge-m3none(全精度)
ggufv2lm-kit/bge-m3-gguf(revision9379ce49...Xorbits/bge-m3-ggufF16Q2_KQ3_K_LQ3_K_MQ3_K_SQ4_K_MQ4_K_SQ5_K_MQ5_K_SQ6_KQ8_0

这意味着:

  1. pytorch 格式提供完整精度模型,供 FlagEmbedding(flag 引擎)、sentence_transformers、vllm 等引擎使用;
  2. ggufv2 格式提供 11 种量化档位,从F16Q2_K,供 llama.cpp 引擎使用,便于在内存受限的环境下以较低精度运行。

ModelScope 源Xorbits/bge-m3是国内网络环境下更快的下载通道,Xinference 会依据环境自动选择可用的模型源。

二、启动模型:一条命令拉起 bge-m3

文档给出了启动 bge-m3 的命令:

xinference launch --model-name bge-m3 --model-type embedding

2.1 参数拆解与常用扩展

该命令是 Xinference CLI 的launch子命令,核心参数含义如下:

  • --model-name bge-m3:指定模型名,必须是内置模型库中登记的模型名;
  • --model-type embedding:指定模型类型为 embedding(向量嵌入),区别于llmimageaudiorerank等类型。

在生产环境中,通常还需要追加以下常用参数:

# 指定模型 UID、设备与量化方式(以 GGUF 量化为例) xinference launch --model-name bge-m3 --model-type embedding \ --model-uid bge-m3-demo \ --device cuda:0 \ --quantization Q4_K_M \ --engine llama.cpp
  • --model-uid:为该模型实例指定全局唯一的标识,后续 API 调用用它来定位模型;
  • --device:指定运行设备(如cuda:0cpu),由 device_utils.py 统一管理可用设备的选择;
  • --quantization:指定量化档位,仅当选择 GGUF 格式时可从F16/Q2_K/…/Q8_0中选择;
  • --engine:指定推理引擎,bge-m3 支持的引擎集合见下文 2.3 节。

2.2 使用 Python Client 启动

除 CLI 外,也可以在代码中通过 Xinference Client 启动,这与 test_integrated_embedding.py 中集成测试的写法一致:

from xinference.client import Client client = Client("http://localhost:9997") model_uid = client.launch_model( model_name="bge-m3", model_type="embedding", model_engine="flag", ) assert len(client.list_models()) == 1

2.3 bge-m3 的多引擎支持:从源码看引擎分发逻辑

bge-m3 不是只能跑在单一引擎上。结合 model_spec.json 中virtualenv.packages的声明:

"#sentence_transformers_dependencies# ; #engine# == \"sentence_transformers\"", "#system_torchvision# ; #engine# == \"sentence_transformers\"", "#system_torch# ; #engine# == \"sentence_transformers\"", "#llama_cpp_dependencies# ; #engine# == \"llama.cpp\"", "FlagEmbedding ; #engine# == \"flag\"", "#vllm_dependencies# ; #engine# == \"vllm\"", "#system_numpy# ; #engine# == \"vllm\""

以及 test_embedding_models.py 中的断言({"pytorch", "ggufv2"}.issubset(engine_formats)),可以确认 bge-m3 至少支持四类引擎:

引擎依赖对应模型格式适用场景
flagFlagEmbedding(BGE 官方库)pytorch官方实现,支持稠密 + 稀疏向量输出
sentence_transformerssentence-transformers + torchpytorch与既有 SBERT 生态集成
llama.cppllama-cpp-pythonggufv2量化部署、低内存设备
vllmvllm + numpypytorch高吞吐、GPU 批处理场景

引擎的分发逻辑位于 embed_family.py:系统维护EMBEDDING_ENGINES字典(模型名 → 引擎名 → 引擎参数),通过check_engine_by_model_name_and_engine校验用户传入的引擎是否对该模型可用,并支持虚拟环境(virtualenv)下的引擎标记绕过兼容性检查。如果你不显式传--engine,Xinference 会根据可用依赖自动选择。

三、调用 bge-m3:RESTful API 与 Python Client

模型启动后,即可通过 Xinference 的统一推理 API 调用,获得与 OpenAI/v1/embeddings兼容的响应。

3.1 RESTful API 调用(curl)

curl -X POST http://localhost:9997/v1/embeddings \ -H "Content-Type: application/json" \ -d '{ "model": "bge-m3-demo", "input": ["What is BGE M3?", "BGE M3 是一个多语言嵌入模型"] }'

响应体中data数组的每个元素包含:

  • index:输入序列的序号;
  • object:固定为embedding(稠密向量)或sparse_embedding(稀疏向量,见 3.3 节);
  • embedding:1024 维稠密向量(list of float)。

usage字段会返回 token 统计(当前 flag 引擎实现中prompt_tokenstotal_tokens暂为-1,从 flag/core.py 的EmbeddingUsage(prompt_tokens=-1, total_tokens=-1)可以看到该现状,源码注释也标注了TODO: support token statistics)。

3.2 Python Client 调用

from xinference.client import Client client = Client("http://localhost:9997") model = client.get_model("bge-m3-demo") # 单条文本 result = model.create_embedding("What is BGE M3?") print(result["data"][0]["embedding"][:5]) # 取前 5 维示例 # 批量文本 result = model.create_embedding(["句子 A", "句子 B", "句子 C"]) print(len(result["data"])) # 3

create_embedding支持传入单条字符串或字符串列表;对单条输入返回单条结果,对列表输入按index顺序返回结果(底层实现会先按文本长度排序分批编码,再还原原始顺序,见 flag/core.py)。

3.3 稀疏向量:BGE-M3 的混合检索能力

bge-m3 的特殊之处在于它同时输出稠密向量(dense)稀疏向量(sparse / lexical weights),这正是混合检索(Hybrid Search)的基础。集成测试 test_integrated_embedding.py 演示了完整用法:

model_uid = client.launch_model( model_name="bge-m3", model_type="embedding", model_engine="flag" ) model = client.get_model(model_uid) result = model.create_embedding("What is BGE M3?", return_sparse=True) emb = result["data"][0]["embedding"] token_ids = list(emb.keys()) # 稀疏向量的 key 是 token id values = list(emb.values()) # value 是词的权重 words = model.convert_ids_to_tokens(token_ids) # 转回可读 token assert isinstance(words[0], str)

关键点:

  • 传入return_sparse=True后,响应中每个数据项的object变为sparse_embeddingembedding变为{token_id: weight}的字典(见 flag/core.py);
  • 稀疏向量可用convert_ids_to_tokens还原为词/子词 token,便于理解模型在哪些词上给了高权重;
  • 在实际检索系统中,可以用稠密向量做语义召回、稀疏向量做关键词精确匹配(BM25 式),再融合二者得分获得更优的检索效果。

从实现看,flag 引擎的编码函数(flag/core.py)内部通过BGEM3FlagModel.encode获取dense_vecslexical_weights,并支持output_valuetoken_embeddingsNone(返回全部输出),满足不同下游需求。

四、底层原理:Xinference 如何运行 bge-m3

4.1 flag 引擎实现:FlagEmbeddingModel

bge-m3 在 flag 引擎下的载体是 flag/core.py 中的FlagEmbeddingModel类,它继承EmbeddingModelBatchMixin(批量混入,支持批式创建嵌入)。

load()方法(flag/core.py)做了三件事:

  1. 依赖检查:导入FlagEmbedding库的BGEM3FlagModel,若未安装则给出安装指引pip install FlagEmbedding
  2. torch dtype 解析:支持通过torch_dtype参数指定float16/float32/bfloat16,其中 fp16 会映射为use_fp16=True传给底层模型(BGE 官方引擎主要支持 fp16,其他 dtype 会回退并告警);
  3. 模型加载:以模型路径、设备、trust_remote_code(由allow_trust_remote_code(model_family)决定)等参数实例化BGEM3FlagModel

check_lib()(flag/core.py)则用于引擎可用性探测:若环境缺少FlagEmbedding,Xinference 会在启动时给出明确提示,而不会静默失败。

4.2 内置模型注册与规格合并

bge-m3 之所以能"开箱即用",依赖 Xinference 的register_builtin_model机制:安装包自带的 model_spec.json 在首次启动时被注册进内置模型目录(v2/builtin/embedding),并生成BUILTIN_EMBEDDING_MODELSEMBEDDING_ENGINES两张表。

测试 test_embedding_models.py 验证了关键行为:

  • bge-m3 注册后同时保留pytorchggufv2两种格式族(assert len(BUILTIN_EMBEDDING_MODELS["bge-m3"]) == 2);
  • 多次刷新注册不会产生重复条目,引擎表保持稳定(assert EMBEDDING_ENGINES["bge-m3"] == baseline_engines);
  • 下载到本地的模型族版本若比内置更新,会以"非内置"身份合并,避免绕过allow_trust_remote_code的安全防护(该机制在测试注释中有明确说明)。

4.3 长文本处理与批量编码

bge-m3 支持 8192 token 长文本,但 GPU 显存有限时直接编码长文本可能溢出。flag 引擎的encode实现(flag/core.py)对此做了两处工程化处理:

  1. 按长度排序分批:先将输入按文本长度降序排序,再按batch_size(默认 32)分批编码,最后按原始下标还原,保证输出顺序与输入一致;
  2. torch.no_grad()推理模式:编码过程不构建计算图,降低显存开销;
  3. 批内去尾:当output_value == "token_embeddings"时,会依据attention_mask去掉 padding 造成的空 token 位,只保留真实 token 的向量。

这些细节说明:即便面对 8192 token 的长文档,Xinference 也能通过自动分批把显存压力控制在合理范围。

五、部署形态与更多选择

5.1 部署到服务器 / 集群

bge-m3 作为 embedding 模型,与 LLM 一样可以运行在 Xinference 的单机或分布式部署中:

  • 单机:参考 launch 文档,xinference-local即可在当前节点启动服务;
  • 集群 / 容器:参考 using_docker_image.rst 与 using_kubernetes.rst,将 embedding 模型调度到有 GPU 的 Worker 节点;
  • 模型下载位置:可通过环境变量XINFERENCE_MODEL_DIR指定模型缓存目录,下载进度可通过 xinference-downloading.png 所示的界面查看。

5.2 与 rerank 模型搭配使用

bge-m3 属于 embedding(召回层)模型。若你的检索系统需要做精排,可以搭配 Xinference 内置的 rerank 模型(见 rerank 模型文档):先由 bge-m3 做候选召回,再用交叉编码器(cross-encoder)对候选重排序,形成"召回 + 精排"的两阶段检索链路。

5.3 客户端集成

Xinference 提供同步 restful_client.py 与异步 async_restful_client.py 两套客户端,bge-m3 的调用方式与Client完全一致,异步场景可改用AsyncClient,接口签名保持对齐。

六、总结

本文以 bge-m3 内置模型文档 为骨架,结合 model_spec.json 的规格登记、flag/core.py 的引擎实现与 test_integrated_embedding.py 的集成测试,完整覆盖了 bge-m3 在 Xinference 中的使用全链路:

  • 规格认知:1024 维、8192 token、中英双语,支持 pytorch 全精度与 11 档 GGUF 量化;
  • 快速启动xinference launch --model-name bge-m3 --model-type embedding一行拉起;
  • 多引擎适配:flag / sentence_transformers / llama.cpp / vllm 四种引擎按依赖自动选择;
  • 双形态向量:稠密向量(return_sparse=False)与稀疏向量(return_sparse=True)满足混合检索需求;
  • 源码级原理:批量编码、顺序还原、torch dtype 控制、内置注册机制等工程细节一目了然。

无论你是要构建一个中文文档问答系统,还是为多语言知识库搭建召回服务,bge-m3 在 Xinference 中都是一个开箱即用、可量化的务实选择。

【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询