基于Qwen3-Embedding-4B自定义1536维向量实现方案

0 阅读2分钟

基于Qwen3-Embedding-4B自定义1536维向量实现方案

找到我: C某DN, 掘某金, 头某条, 博某客园搜索改一下配置文件, 不出意外每篇文章我都会在这些平台更新.

一、为什么要做这个

本来用的线上的text-embedding-v4模型,现在想从线上模型转到线下,发现开源模型里几乎没有标准1536维embedding模型,所以决定自己用Qwen/Qwen3-Embedding-4B做一个1536维embedding替代方案。Qwen/Qwen3-Embedding-4B这个模型是2560维度的模型,我们可以通过一些方式改变它的维度。@改一下配置文件

二、ollama方案

ollama最简单,可以直接在请求里加dimensions参数改变维度,非常方便。

  • 如果不加参数

o1.png

  • 加了参数

o2.png

curl --request POST \
  --url http://localhost:11434/api/embed \
  --header 'content-type: application/json' \
  --data '{"model":"qwen3-embedding:4b","input":"hello world.","dimensions":1536}'

三、vllm方案

  • vLLM 部署会复杂一些,但更适合生产环境。@改一下配置文件
  • 下面是vllm部署命令,可以参考
  • 关键点是要开启Matryoshka embedding支持:--hf-overrides '{"is_matryoshka": true, "matryoshka_dimensions": [1536, 1537, 1538]}' 这行参数
docker run -d \
--name qwen3-embedding \
--gpus '"device=0"' \
-p 17421:8000 \
--ipc=host \
--ulimit memlock=-1 \
-e VLLM_USE_MODELSCOPE=True \
-v ~/.cache/modelscope:/root/.cache/modelscope \
vllm/vllm-openai:v0.14.1 \
--model Qwen/Qwen3-Embedding-4B \
--served-model-name "Qwen3-Embedding-4B" \
--hf-overrides '{"is_matryoshka": true, "matryoshka_dimensions": [1536, 1537, 1538]}' \
--api-key embedding-123eee \
--gpu-memory-utilization 0.9 \
--max-model-len 4096
  • 1536维度@改一下配置文件

v1.png

curl --request POST \
  --url http://0.0.0.0:17421/v1/embeddings \
  --header 'Authorization: Bearer embedding-123eee' \
  --header 'content-type: application/json' \
  --data '{"model":"Qwen3-Embedding-4B","input":"hello world","dimensions":1536}'
  • 1537和1538也没问题

v2.png

v3.png

  • 什么参数也不加

v4.png

关键点

matryoshka_dimensions决定支持哪些维度裁剪,可以把你想要支持的维度写到这个列表里,"matryoshka_dimensions": [1536, 1537, 1538],就代表可以输出1536维, 1537维, 1538维。@改下一配文置件

四、最后简单总结

最终方案:

  • Ollama:适合快速验证,改维度最简单
  • vLLM:适合生产环境,稳定可控

核心思路是:

利用Matryoshka embedding机制,把高维模型“裁剪”成目标维度,而不是重新训练一个模型。

如果后续要做向量库迁移,这种方式可以做到无缝替换1536维或者其他维度的embedding服务。@改下一配文置件