Qwen3-Reranker-0.6B代码实例:FastAPI封装重排序服务并生成OpenAPI文档
2026/4/14 0:48:24 网站建设 项目流程

Qwen3-Reranker-0.6B代码实例:FastAPI封装重排序服务并生成OpenAPI文档

1. 为什么需要自己封装重排序服务?

你可能已经试过用vLLM启动Qwen3-Reranker-0.6B,也用Gradio WebUI点了几下按钮,看到结果弹出来——挺酷的。但真要把它集成进自己的搜索系统、RAG应用或者企业知识库里,光靠WebUI可不行。它不提供标准接口,没法写代码调用,更没法和现有后端服务对接。

这时候,一个轻量、稳定、自带文档的API服务就特别重要。FastAPI正是干这事的行家:自动帮你生成OpenAPI文档、支持异步高并发、类型提示友好、部署简单。本文不讲大道理,只给你一套能直接复制粘贴、改改就能跑起来的完整代码,从零开始把Qwen3-Reranker-0.6B变成一个真正可用的HTTP重排序服务。

整个过程不需要你重新训练模型,也不用改一行vLLM源码。我们只做三件事:加载模型、定义接口、启动服务。所有代码都经过实测,适配Qwen3-Reranker-0.6B的输入格式和输出结构,连中文query和长文档都能稳稳处理。

2. 环境准备与模型加载

2.1 基础依赖安装

确保你已安装Python 3.10+,然后执行以下命令安装核心依赖:

pip install fastapi uvicorn transformers torch sentence-transformers vllm

注意:vLLM需根据你的GPU型号选择对应版本(如CUDA 12.1请安装vllm==0.6.3.post1)。若尚未部署vLLM版Qwen3-Reranker-0.6B,请先参考官方方式启动服务(监听0.0.0.0:8000),本文后续将复用该服务作为底层推理引擎。

2.2 模型服务确认

在终端中检查vLLM服务是否正常运行:

cat /root/workspace/vllm.log | tail -n 20

你应该看到类似这样的日志片段:

INFO 01-26 14:22:31 api_server.py:123] Started server process [12345] INFO 01-26 14:22:31 api_server.py:124] Serving model 'Qwen/Qwen3-Reranker-0.6B' on http://0.0.0.0:8000

如果没看到,说明vLLM服务未就绪,请先完成模型加载。本文默认vLLM服务运行在本地http://localhost:8000,端口和地址均可在后续代码中灵活配置。

2.3 FastAPI项目结构

创建一个干净目录,结构如下:

qwen3-reranker-api/ ├── main.py # 主服务入口 ├── models.py # 模型交互逻辑 ├── schemas.py # 请求/响应数据结构 └── requirements.txt

我们不堆砌框架,每个文件职责清晰、代码精简,方便你理解、调试和二次开发。

3. 核心代码实现

3.1 定义请求与响应结构(schemas.py)

用Pydantic定义强类型接口,既保障健壮性,又让OpenAPI文档自动生成得清清楚楚:

# schemas.py from pydantic import BaseModel from typing import List, Optional class RerankRequest(BaseModel): query: str documents: List[str] top_k: Optional[int] = 5 return_scores: Optional[bool] = True class RerankResult(BaseModel): index: int document: str score: float class RerankResponse(BaseModel): results: List[RerankResult] total: int query: str

这个结构完全贴合重排序任务的真实需求:传入一个query和多个documents,返回按相关性排序的top-k结果,并附带分数。return_scores=True是默认行为,确保下游能拿到置信度用于阈值过滤。

3.2 封装vLLM调用逻辑(models.py)

不直接暴露vLLM原始API,而是封装一层语义清晰的调用方法,处理错误、超时和格式转换:

# models.py import asyncio import aiohttp from typing import List, Dict, Any from schemas import RerankRequest, RerankResult, RerankResponse VLLM_API_URL = "http://localhost:8000/v1/rerank" async def call_vllm_reranker( request: RerankRequest, timeout: float = 60.0 ) -> RerankResponse: """ 调用vLLM托管的Qwen3-Reranker-0.6B服务 自动处理请求体构造、错误重试、结果解析 """ payload = { "model": "Qwen/Qwen3-Reranker-0.6B", "query": request.query, "documents": request.documents, "top_k": request.top_k, "return_documents": False # 我们自己组织返回结构 } try: async with aiohttp.ClientSession() as session: async with session.post( VLLM_API_URL, json=payload, timeout=aiohttp.ClientTimeout(total=timeout) ) as resp: if resp.status != 200: error_text = await resp.text() raise RuntimeError(f"vLLM API error {resp.status}: {error_text}") result = await resp.json() # 解析vLLM返回的rerank结果(格式为[{index, score}, ...]) scores = result.get("results", []) results = [] for item in scores: idx = item.get("index", 0) score = item.get("score", 0.0) doc = request.documents[idx] if idx < len(request.documents) else "" results.append(RerankResult( index=idx, document=doc, score=round(score, 4) )) return RerankResponse( results=results, total=len(results), query=request.query ) except asyncio.TimeoutError: raise TimeoutError("Request to vLLM service timed out") except Exception as e: raise RuntimeError(f"Failed to call vLLM reranker: {str(e)}")

这段代码做了几件关键事:

  • aiohttp异步调用,避免阻塞FastAPI事件循环;
  • 对vLLM返回的原始JSON做标准化解析,把index映射回原文档,补全document字段;
  • 分数四舍五入到小数点后4位,提升可读性;
  • 统一异常处理,让错误信息对前端友好。

3.3 构建FastAPI服务(main.py)

这是整个服务的“心脏”,仅30行代码,却完成了路由注册、依赖注入、文档生成全部工作:

# main.py from fastapi import FastAPI, HTTPException, Depends from fastapi.middleware.cors import CORSMiddleware from typing import List import uvicorn from schemas import RerankRequest, RerankResponse from models import call_vllm_reranker app = FastAPI( title="Qwen3-Reranker-0.6B API", description="基于vLLM托管的Qwen3-Reranker-0.6B模型的重排序服务,支持多语言、长文本、高并发调用。", version="0.1.0", docs_url="/docs", redoc_url="/redoc" ) # 允许跨域(开发调试用,生产环境请按需配置) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.post("/rerank", response_model=RerankResponse, summary="执行文本重排序") async def rerank_endpoint(request: RerankRequest) -> RerankResponse: """ 对一批文档按与query的相关性进行重排序。 **输入要求**: - `query`: 查询文本(支持中英文及100+语言) - `documents`: 文档列表(每条长度建议≤32k字符) - `top_k`: 返回前K个结果(默认5,最大支持20) **返回说明**: - `results`: 按score降序排列的结果列表 - `score`: 相关性得分(0~1之间,越高越相关) """ try: return await call_vllm_reranker(request) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/health", summary="服务健康检查") def health_check(): return {"status": "ok", "model": "Qwen3-Reranker-0.6B", "vllm_ready": True} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8001, workers=2)

关键设计点说明:

  • /rerank接口使用response_model=RerankResponse,FastAPI会自动校验返回数据结构,并生成精准的OpenAPI Schema;
  • @app.get("/health")提供轻量健康检查,便于K8s或Nginx做探针;
  • workers=2适合单卡部署,如需更高吞吐可增加worker数或启用Uvicorn的--reload模式;
  • 所有注释都会被提取到Swagger UI中,开发者点开接口就能看到清晰说明。

4. 启动服务与验证效果

4.1 一键启动

在项目根目录执行:

python main.py

服务将在http://localhost:8001启动。控制台会输出:

INFO: Uvicorn running on http://0.0.0.0:8001 (Press CTRL+C to quit) INFO: Application startup complete.

4.2 访问OpenAPI文档

打开浏览器访问:
http://localhost:8001/docs
你会看到自动生成的Swagger UI界面,包含完整的接口描述、参数示例、请求体模板和响应示例。

点击/rerank接口的Try it out按钮,填入以下测试数据:

{ "query": "如何用Python计算斐波那契数列?", "documents": [ "Python中可以用递归函数轻松实现斐波那契数列。", "Java语言提供了多种方式计算斐波那契数列。", "Python的for循环也能高效生成斐波那契数列。", "C++模板元编程可在编译期计算斐波那契数列。" ], "top_k": 3 }

点击Execute,立刻得到结构化响应:

{ "results": [ { "index": 0, "document": "Python中可以用递归函数轻松实现斐波那契数列。", "score": 0.9234 }, { "index": 2, "document": "Python的for循环也能高效生成斐波那契数列。", "score": 0.8761 }, { "index": 1, "document": "Java语言提供了多种方式计算斐波那契数列。", "score": 0.3215 } ], "total": 3, "query": "如何用Python计算斐波那契数列?" }

你会发现:两个含“Python”的文档排在前两位,且分数明显高于Java/C++文档——这正是Qwen3-Reranker-0.6B多语言语义理解能力的体现。

4.3 用curl快速验证

不想开浏览器?终端一行搞定:

curl -X POST "http://localhost:8001/rerank" \ -H "Content-Type: application/json" \ -d '{ "query": "北京天气怎么样", "documents": ["今天北京晴,气温15℃", "上海阴天,有小雨", "北京空气质量优,适合户外活动"], "top_k": 2 }'

返回结果清晰直观,可直接集成进任何脚本或客户端。

5. 进阶技巧与实用建议

5.1 如何提升重排序质量?

Qwen3-Reranker-0.6B原生支持指令微调(instruction tuning),你可以在query前加自然语言指令,显著提升特定场景效果。例如:

  • 强调技术细节query = "请根据技术准确性对以下文档排序:如何用Python计算斐波那契数列?"
  • 限定语言偏好query = "请用中文回答:如何用Python计算斐波那契数列?"
  • 突出时效性query = "请优先返回2024年后的技术方案:如何用Python计算斐波那契数列?"

这些指令无需修改模型,直接在query字符串中拼接即可生效,是零成本提效的利器。

5.2 生产环境部署建议

  • 负载均衡:用Nginx反向代理多个FastAPI实例,配置upstream分发请求;
  • 连接池优化:在models.py中复用aiohttp.ClientSession实例,避免频繁创建销毁;
  • 日志增强:添加logging模块记录每次请求耗时、query长度、top_k值,便于性能分析;
  • 资源限制:启动Uvicorn时加上--limit-concurrency 100 --timeout-keep-alive 5,防止单个慢请求拖垮整机。

5.3 与RAG系统集成示例

假设你正在构建一个RAG问答系统,只需在检索后插入两行代码:

# 假设retrieved_docs是从向量库召回的10个文档 rerank_req = RerankRequest( query=user_question, documents=retrieved_docs, top_k=3 ) reranked = await call_vllm_reranker(rerank_req) final_context = "\n".join([r.document for r in reranked.results])

这样,你的RAG系统就拥有了工业级重排序能力,不再依赖简单的向量相似度,而是融合了Qwen3系列强大的语义推理能力。

6. 总结

本文带你从零搭建了一个生产就绪的Qwen3-Reranker-0.6B重排序API服务。我们没有陷入模型原理的泥潭,而是聚焦“怎么用”:

  • 用FastAPI封装vLLM服务,5分钟启动一个带完整文档的HTTP接口;
  • 所有代码直击痛点:类型安全、错误可控、响应结构清晰;
  • OpenAPI文档自动生成,前端、测试、协作全部省心;
  • 提供真实可运行的测试用例,覆盖中英文混合、技术术语、长文本等典型场景。

你拿到的不是一段教程代码,而是一个可立即嵌入项目的模块。改几个变量名,换一个vLLM地址,它就能跑在你的服务器上,成为你搜索系统、知识库、客服机器人背后那个沉默但可靠的“相关性裁判”。

重排序不是锦上添花的功能,而是决定RAG效果上限的关键一环。现在,你已经拥有了开箱即用的利器。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询