背景 链接到标题
RAG 流水线中,embedding 检索召回 top-K 后,需要 rerank 做二次排序提升精度。 开发环境希望方案足够轻量——不需要高性能,但模型不使用时最好不占显存。
Ollama 在 v0.30 换回了 llama.cpp 引擎(此前 fork ggml 自研引擎一年多,性能落后 30-70%,社区压力下切回),体验上很方便,但 /api/rerank 端点至今未实现。
相关 issue 和 PR:
- Reranking models · Issue #3368 — 2024 年 3 月提出,至今 open
- FEAT: add rerank support · PR #7219 — 最早尝试,未合并
- Add reranking support · PR #11156 — 被拒绝,理由是当时已不再给旧引擎加功能
- Complete Production-Ready Reranking · PR #11389 — 最完整的一次实现,修复了分数提取 bug,社区验证通过,但因含 AI 生成文件被要求清理,最终也未合并
方案:直接用 llama-server 链接到标题
llama.cpp 自带的 llama-server 原生支持 --reranking 和 --pooling rank,开箱即用。
缺点也很直接:每个进程固定加载一个模型,常驻显存,没有动态换出机制(Ollama 的 OLLAMA_KEEP_ALIVE 是它自己做的调度层,llama.cpp 本身没有)。
开发环境可以接受:bge-reranker-v2-m3 Q8_0 仅 607MB,显存占用很小,不需要时停掉容器即可。
docker-compose 链接到标题
services:
bge-reranker:
image: ghcr.nju.edu.cn/ggml-org/llama.cpp:server-cuda12
container_name: bge-reranker
restart: unless-stopped
ports:
- "8810:8810"
volumes:
- ./models:/models
command: >
-m /models/bge-reranker-v2-m3-q8_0.gguf
--host 0.0.0.0
--port 8810
--embedding
--pooling rank
--reranking
--batch-size 1024
--ctx-size 8192
--n-gpu-layers 99
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
使用 链接到标题
curl http://localhost:8810/rerank -d '{
"query": "什么是人工智能",
"documents": [
"人工智能是计算机科学的一个分支",
"今天天气真好",
"AI 是研究如何让机器模拟人类智能的学科"
]
}'
返回结果:
{
"results": [
{"index": 0, "relevance_score": 4.79},
{"index": 2, "relevance_score": 4.66},
{"index": 1, "relevance_score": -11.03}
]
}
分数越高越相关,负分表示不相关。
与 Ollama 对比 链接到标题
| Ollama | llama-server | |
|---|---|---|
| 模型管理 | 自动拉取、按需加载、空闲卸载 | 手动管理模型文件 |
| 多模型 | 支持,自动调度 | 一个进程一个模型 |
| Rerank API | ❌ 无 /api/rerank |
✅ 原生支持 |
| 显存占用 | 空闲时卸载 | 常驻 |
| 适用场景 | 生产/多模型切换 | 开发/单一专用模型 |
开发环境两者可以并存:Ollama 跑 chat 模型,llama-server 跑 reranker,各司其职。