基于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参数改变维度,非常方便。
- 如果不加参数
- 加了参数
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维度@改一下配置文件
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也没问题
- 什么参数也不加
关键点
matryoshka_dimensions决定支持哪些维度裁剪,可以把你想要支持的维度写到这个列表里,"matryoshka_dimensions": [1536, 1537, 1538],就代表可以输出1536维, 1537维, 1538维。@改下一配文置件
四、最后简单总结
最终方案:
- Ollama:适合快速验证,改维度最简单
- vLLM:适合生产环境,稳定可控
核心思路是:
利用Matryoshka embedding机制,把高维模型“裁剪”成目标维度,而不是重新训练一个模型。
如果后续要做向量库迁移,这种方式可以做到无缝替换1536维或者其他维度的embedding服务。@改下一配文置件