背景 链接到标题

RAG 流水线中,embedding 检索召回 top-K 后,需要 rerank 做二次排序提升精度。 开发环境希望方案足够轻量——不需要高性能,但模型不使用时最好不占显存。

Ollama 在 v0.30 换回了 llama.cpp 引擎(此前 fork ggml 自研引擎一年多,性能落后 30-70%,社区压力下切回),体验上很方便,但 /api/rerank 端点至今未实现

相关 issue 和 PR:

方案:直接用 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,各司其职。