你以为部署向量模型必须用ollama吗?并且是必须有GPU时才能运行向量模型吗?
一开始我也是这么以为的。
其实不用,本篇来带大家手动运行一个向量模型接口服务。
我也是经过这次部署才知道,在没有GPU的情况下,对于向量模型这种小模型是可以直接在CPU上跑的,只是效率比较低而已。哎,笔者的笔记本电脑没有独立显卡。配置全堆到内存上了,有30GB内存。
根据实际体验,运行速度还凑合。
工具准备
魔搭社区,可以理解为中国大模型界的GitHub,有了它就可以很方便的下载模型了。
下载模型可以使用魔搭提供的命令行工具modelscope。
执行命令之前,先为当前的操作创建一个专门的python虚拟环境,在虚拟环境中执行下列操作。
bash
pip install modelscope
下载模型,可以观察到,下载还是很快的。
bash
modelscope download --model BAAI/bge-large-zh-v1.5
完成以后,注意观察,Windows下通常有Failed to create symbolic link 的失败提示。
每次安装都必提示,既然提示了,我们就替它完成。
Failed to create symbolic link
完整的提示如下:
plain
2026-04-12 16:10:59,612 - modelscope - WARNING - Failed to create symbolic link C:\Users\xxx\.cache\modelscope\hub\models\BAAI\bge-large-zh-v1.5 for C:\Users\xxx\.cache\modelscope\hub\models\BAAI\bge-large-zh-v1___5.
所以,我们只需要按提示,完成文件夹的链接即可。
bash
mklink /j "C:\Users\xxx\.cache\modelscope\hub\BAAI\bge-large-zh-v1.5" "C:\Users\xxx\.cache\modelscope\hub\models\BAAI\bge-large-zh-v1___5"
注意,执行时,目录bge-large-zh-v1.5不能存在,如果已经有了,需要手动删除一下。
创建模型服务
由于要启动服务监听接口,还需要加载模型执行计算。所以这里先安装一下环境依赖。
bash
pip install fastapi uvicorn torch transformers modelscope sentence-transformers
创建python代码文件bge_api_server.py,写入代码如下:
py
from fastapi import FastAPI
from pydantic import BaseModel
from modelscope import AutoModel, AutoTokenizer
import torch
import uuid
# ===================== 配置 =====================
MODEL_PATH = r"C:\Users\xxx\.cache\modelscope\hub\BAAI\bge-large-zh-v1.5"
HOST = "127.0.0.1"
PORT = 6100
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# ===================== 加载模型 =====================
app = FastAPI(title="bge-large-zh-v1.5 兼容阿里云格式API")
print(f"加载模型: {MODEL_PATH}")
print(f"使用设备: {DEVICE}")
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
model = AutoModel.from_pretrained(MODEL_PATH).to(DEVICE)
model.eval()
# ===================== 请求体(必须和OpenAI/阿里云一致) =====================
class EmbeddingRequest(BaseModel):
input: list[str] | str # 支持 单个文本 / 文本列表
model: str = "bge-large-zh-v1.5"
# ===================== 向量生成 =====================
def get_embeddings(texts: list[str]):
texts = [t.replace("\n", " ") for t in texts]
inputs = tokenizer(
texts,
max_length=512,
truncation=True,
padding=True,
return_tensors="pt"
).to(DEVICE)
with torch.no_grad():
outputs = model(**inputs)
# bge 官方标准向量
embeddings = outputs.last_hidden_state[:, 0]
embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
return embeddings.cpu().numpy().tolist()
# ===================== 核心接口:完全兼容阿里云格式 =====================
@app.post("/embeddings")
async def embedding(req: EmbeddingRequest):
# 统一转成列表
if isinstance(req.input, str):
texts = [req.input]
else:
texts = req.input
vectors = get_embeddings(texts)
data = []
for i, vec in enumerate(vectors):
data.append({
"embedding": vec,
"index": i,
"object": "embedding"
})
return {
"data": data,
"model": "bge-large-zh-v1.5",
"object": "list",
"usage": {
"prompt_tokens": 0,
"total_tokens": 0
},
"id": str(uuid.uuid4())
}
# ===================== 启动 =====================
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host=HOST, port=PORT)
然后就可以执行启动了,启动成功后,就能看到下面的提示,表示已经成功部署了。
plain
INFO: Started server process [6972]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:6100 (Press CTRL+C to quit)
总结
本篇只是一个极简单的示例,有了这个示例,rerank模型部署也是同理。因为它俩差不多。
理论上大模型也是可以这样部署的,这是理论上。实际上它会更复杂一些,比如引入了推理框架、服务框架等等。
参考
环境安装和模型下载:快速开始 · 文档中心