在 Xinference 中部署 m3e-small 文本嵌入模型:规格、启动与调用实践
【免费下载链接】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
导读
m3e-small 是内置在 Xinference 中的轻量级中英文文本嵌入(embedding)模型,以 512 维向量输出、512 token 上下文上限著称,适用于中文语义检索、文本相似度计算与向量化入库等场景。本文以 m3e-small 内置模型文档 为主线,结合仓库中的模型注册表与 embedding 引擎源码,讲解其规格参数、单条命令启动方式,以及通过 Xinference Client 与 OpenAI 兼容 API 完成向量化调用的完整流程。
m3e-small 模型速览
m3e-small 由 moka-ai 开源,在 Xinference 中被注册为内置(builtin)embedding 模型。根据官方内置模型文档,其核心属性如下:
| 属性 | 值 |
|---|---|
| Model Name | m3e-small |
| Languages | zh(中文)、en(英文) |
| Abilities | embed |
| Dimensions | 512 |
| Max Tokens | 512 |
| Model ID | moka-ai/m3e-small |
| Model Hubs | Hugging Face(moka-ai/m3e-small)、ModelScope(AI-ModelScope/m3e-small) |
- 512 维向量:每个输入文本被编码为一个 512 维的稠密向量,维度适中,既能保证语义区分度,又不会给向量数据库和内存带来过大压力,适合中小规模知识库场景。
- 512 token 上限:单次输入最长 512 token,超出部分将被截断(下文会结合源码说明截断逻辑),因此更适合段落级而非超长文档级的编码。
- 中英双语:同时支持中文与英文输入,无需在中文和英文场景间切换模型。
从仓库的内置模型注册表 xinference/model/embedding/model_spec.json 可以确认该模型的完整元数据:model_format为pytorch,Hugging Face 侧模型 ID 为moka-ai/m3e-small(revision44c696631b2a8c200220aaaad5f987f096e986df),ModelScope 侧为AI-ModelScope/m3e-small,二者量化方式均为none(即原精度加载,不做额外量化)。
该模型页面的生成机制
值得说明的是,doc/source/models/builtin/embedding/目录下的模型页面由 doc/templates/embedding.rst.jinja 模板自动生成,模板直接引用model_name、dimensions、max_tokens、language、model_id、model_hubs等字段——也就是说,上述规格表与model_spec.json中的注册数据一一对应,读者修改或新增内置 embedding 模型时,只需更新模型注册表,文档字段会随之保持一致。
一条命令启动 m3e-small
按官方文档,在 Xinference 中启动 m3e-small 只需一条命令:
xinference launch --model-name m3e-small --model-type embedding要点说明:
--model-name m3e-small:指定内置模型名称,与模型注册表中的model_name严格对应;--model-type embedding:指定模型类型为 embedding(区别于llm、image、rerank等类型),该参数对 embedding 模型是必需的。
首次启动时,Xinference 会从模型仓库(默认 Hugging Face,也可通过--download-hub modelscope切换为 ModelScope)下载权重并缓存到本地;之后启动会直接复用本地缓存。
启动背后发生了什么
从源码看,xinference launch最终会走create_embedding_model_instance()工厂(见 xinference/model/embedding/core.py),核心步骤包括:
- 匹配模型族:通过
match_embedding(model_name, model_format, quantization, download_hub)在注册表中定位m3e-small的EmbeddingModelFamilyV2描述(包含dimensions=512、max_tokens=512、language=["zh","en"]); - 缓存权重:
EmbeddingCacheManager负责检查缓存目录并按需下载模型文件; - 选择推理引擎:embedding 模型默认使用
sentence_transformers引擎(源码注释明确指出“we use sentence_transformers as the default engine for all models”),在启用虚拟环境(virtual env)模式下还会通过check_engine_by_model_name_and_engine_with_virtual_env()为模型准备独立的依赖环境; - 实例化模型:将
model_uid、model_path、模型族、量化方式等传入SentenceTransformerEmbeddingModel,随后加载完成。
m3e-small在注册表中只声明了pytorch格式,因此它始终走 sentence_transformers / transformers 的 PyTorch 加载路径,而不是 llama.cpp(GGUF)或 vLLM 引擎。
模型规格的深层含义
Dimensions(输出维度)与 Max Tokens(输入上限)的作用
dimensions=512直接决定返回向量数组的长度,也是向量库建索引时dim字段的取值依据;max_tokens=512是模型可处理的最大输入长度。Xinference 的 EmbeddingModel 基类提供了与 vLLM LLM 语义对齐的truncate_prompt_tokens截断机制(见 xinference/model/embedding/core.py):None:不截断;> 0:按指定 N 个 token 截断;== 0:显式空输入(max_length=0);< 0:回退到模型自身的max_tokens(即 m3e-small 的 512)。
截断采用“结构保持”策略:
str/List[str]按 token 截断,token 数组直接切片,多模态字典仅截断text字段而保留媒体字段;在 llama.cpp 等无 Python tokenizer 的引擎或 tokenizer 调用失败时,会降级为字符级截断(默认约 4 字符/token,可用环境变量XINFERENCE_EMBEDDING_TRUNCATE_CHAR_PER_TOKEN调整)。这意味着向 m3e-small 提交超长文本时,服务不会报错,而是按上限安全截断后返回向量。
引擎选择与依赖
model_spec.json中为 m3e-small 声明了如下 virtualenv 依赖(按引擎条件安装):
- sentence_transformers 引擎:
sentence-transformers及其依赖、系统 torchvision 与 torch; - vllm 引擎:vLLM 依赖与系统 numpy。
因此,m3e-small 既可以在默认的 sentence_transformers 引擎下运行,也保留了 vLLM 引擎的兼容路径。若关闭虚拟环境(XINFERENCE_ENABLE_VIRTUAL_ENV未开启),则需要宿主环境预先安装sentence-transformers(版本需高于 3.1.0,见 xinference/model/embedding/sentence_transformers/core.py 中的版本检查)。
调用 m3e-small 生成向量
模型启动后,可以通过两条主流路径调用。
方式一:Xinference Client
from xinference.client import Client client = Client("http://localhost:9997") model_uid = client.launch_model(model_name="m3e-small", model_type="embedding") model = client.get_model(model_uid) result = model.create_embedding("今天天气怎么样") print(result["data"][0]["embedding"]) # 512 维浮点向量 print(result["usage"])返回结构为 OpenAI 风格:
{ 'object': 'list', 'model': '<model_uid>', 'data': [{'index': 0, 'object': 'embedding', 'embedding': [...512 个浮点数...]}], 'usage': {'prompt_tokens': N, 'total_tokens': N} }create_embedding支持字符串、字符串列表等多种输入形态;底层由 xinference/api/routers/embeddings.py 将请求路由到POST /v1/embeddings,并经过 EmbeddingModel 的create_embedding统一入口(xinference/model/embedding/core.py)。
值得留意的是,该入口还实现了批量合并逻辑:多个并发调用会按 kwargs 分组、合并成一个大 batch 交给引擎编码,再按原始索引切分返回,从而提升吞吐;引擎实际编码时默认normalize_embeddings=True(L2 归一化),返回的向量可直接用点积计算余弦相似度。
方式二:OpenAI 兼容 API
Xinference 提供 OpenAI 兼容的/v1接口,任何支持 OpenAI Embedding API 的客户端都可以直接对接(无需显式指定引擎细节):
import openai # 假设 m3e-small 已启动,model_uid 已知;api_key 任意非空字符串即可 client = openai.Client(api_key="not empty", base_url="http://localhost:9997/v1") resp = client.embeddings.create(model=model_uid, input=["今天天气怎么样", "how is the weather"]) print(resp.data[0].embedding) # 512 维向量也可以直接用 curl:
curl -X POST http://localhost:9997/v1/embeddings \ -H "Content-Type: application/json" \ -d '{"model": "m3e-small", "input": "今天天气怎么样"}'注意:当启用认证时,/v1/embeddings路由需要models:read权限 scope(见 xinference/api/routers/embeddings.py),需在请求中携带有效 token。
常用辅助命令
查看当前已注册的内置 embedding 模型列表:
xinference registrations -t embedding输出包含
Type / Name / Language / Dimensions / Is-builtin等列,可确认 m3e-small 已注册且Dimensions为 512。查看 m3e-small 的版本信息(含本地缓存位置与缓存状态):
xinference describe --model-name m3e-small --model-type embedding版本标识的组成为
模型名--max_tokens--dimensions--model_format--quantization(见 xinference/model/embedding/core.py),对 m3e-small 即为m3e-small--512--512--pytorch--none形态,可用于区分不同配置的模型实例。
典型应用场景
结合 m3e-small 的规格特点,它适合以下场景:
- 中文语义检索 / RAG 向量化:将知识库文本切分为不超过 512 token 的段落,用 m3e-small 生成 512 维向量写入向量数据库,查询时对用户问题做同模型编码后做向量相似度检索;
- 文本相似度计算:利用返回向量(已做 L2 归一化)的点积快速计算相似度,用于去重、聚类或推荐;
- 轻量级部署:模型尺寸小、维度适中,对 CPU/低显存环境友好,适合边缘或成本敏感场景。
对于需要更高精度或更长上下文的场景,可在同一内置 embedding 家族中选择更大规格的模型(如注册表中同族的m3e-base,768 维),调用方式与本文完全一致,仅需更换--model-name。
小结
本文从 m3e-small 内置模型文档 出发,完整覆盖了模型规格、启动命令、引擎加载链路与两种调用方式。核心要点回顾:
- 启动命令:
xinference launch --model-name m3e-small --model-type embedding; - 规格:512 维、512 token、中英双语、pytorch 格式、无量化;
- 默认引擎为 sentence_transformers,支持 OpenAI 兼容接口,返回的向量默认 L2 归一化;
- 超长输入由
truncate_prompt_tokens机制安全截断,不会导致服务报错。
如需进一步了解 Xinference embedding 模型的架构细节,可继续阅读 xinference/model/embedding/core.py(EmbeddingModel 基类与批量逻辑)、xinference/model/embedding/sentence_transformers/core.py(默认引擎实现)以及模型注册表 xinference/model/embedding/model_spec.json。
【免费下载链接】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),仅供参考