Qwen3-Reranker-0.6B实战教程:Python API封装为RESTful微服务
·
Qwen3-Reranker-0.6B实战教程:Python API封装为RESTful微服务
1. 为什么需要封装RESTful服务
在实际项目中,直接调用Python API虽然简单,但存在几个明显问题:部署复杂、语言限制、难以扩展。将Qwen3-Reranker-0.6B封装成RESTful微服务后,任何编程语言都能通过HTTP请求调用,团队协作更方便,还能轻松实现负载均衡和水平扩展。
想象一下这样的场景:前端用JavaScript,后端用Go,移动端用Swift,它们都需要调用重排序功能。有了RESTful服务,大家用统一的HTTP接口就能搞定,不用每个团队都去折腾Python环境。
2. 环境准备与快速部署
2.1 基础环境要求
确保你的环境满足以下要求:
# 检查Python版本
python --version # 需要Python 3.8+
pip --version # 需要pip 21+
# 检查CUDA(如果使用GPU)
nvidia-smi # 确认GPU可用
2.2 一键安装依赖
创建requirements.txt文件:
fastapi==0.104.1
uvicorn==0.24.0
pydantic==2.5.0
transformers==4.36.2
torch==2.1.2
sentencepiece==0.1.99
accelerate==0.25.0
安装命令:
pip install -r requirements.txt
3. 核心API封装实战
3.1 创建基础服务类
首先我们创建一个核心服务类,封装模型加载和推理功能:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import List, Dict, Any
import logging
class QwenRerankerService:
def __init__(self, model_path: str = "/opt/qwen3-reranker/model/Qwen3-Reranker-0.6B"):
self.logger = logging.getLogger(__name__)
self.device = "cuda" if torch.cuda.is_available() else "cpu"
try:
self.tokenizer = AutoTokenizer.from_pretrained(
model_path,
padding_side='left',
trust_remote_code=True
)
self.model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
).eval()
self.logger.info("模型加载成功")
except Exception as e:
self.logger.error(f"模型加载失败: {str(e)}")
raise
def build_input_text(self, query: str, document: str, instruction: str = None) -> str:
"""构建模型输入文本"""
base_instruction = "Given a query, retrieve relevant passages"
actual_instruction = instruction if instruction else base_instruction
return f"<Instruct>: {actual_instruction}\n<Query>: {query}\n<Document>: {document}"
def calculate_relevance(self, query: str, document: str, instruction: str = None) -> float:
"""计算单个文档的相关性分数"""
try:
text = self.build_input_text(query, document, instruction)
inputs = self.tokenizer(text, return_tensors="pt").to(self.device)
with torch.no_grad():
logits = self.model(**inputs).logits[:, -1, :]
yes_id = self.tokenizer.convert_tokens_to_ids("yes")
no_id = self.tokenizer.convert_tokens_to_ids("no")
score = torch.softmax(logits[:, [no_id, yes_id]], dim=1)[:, 1].item()
return round(score, 4)
except Exception as e:
self.logger.error(f"计算相关性失败: {str(e)}")
return 0.0
def rerank_documents(self, query: str, documents: List[str], instruction: str = None) -> List[Dict[str, Any]]:
"""重排序多个文档"""
results = []
for doc in documents:
score = self.calculate_relevance(query, doc, instruction)
results.append({
"document": doc,
"score": score,
"relevant": score > 0.5 # 简单阈值判断
})
# 按分数降序排序
results.sort(key=lambda x: x["score"], reverse=True)
# 添加排名
for i, result in enumerate(results):
result["rank"] = i + 1
return results
3.2 创建FastAPI应用
接下来用FastAPI创建RESTful接口:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
import uvicorn
app = FastAPI(
title="Qwen3-Reranker API",
description="Qwen3-Reranker-0.6B的RESTful微服务",
version="1.0.0"
)
# 初始化服务
reranker_service = QwenRerankerService()
# 定义请求模型
class RerankRequest(BaseModel):
query: str
documents: List[str]
instruction: Optional[str] = None
class SingleScoreRequest(BaseModel):
query: str
document: str
instruction: Optional[str] = None
# 健康检查接口
@app.get("/health")
async def health_check():
return {"status": "healthy", "model_loaded": True}
# 单文档评分接口
@app.post("/score")
async def calculate_score(request: SingleScoreRequest):
try:
score = reranker_service.calculate_relevance(
request.query,
request.document,
request.instruction
)
return {
"query": request.query,
"document": request.document[:100] + "..." if len(request.document) > 100 else request.document,
"score": score,
"relevant": score > 0.5
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 多文档重排序接口
@app.post("/rerank")
async def rerank_documents(request: RerankRequest):
try:
results = reranker_service.rerank_documents(
request.query,
request.documents,
request.instruction
)
return {
"query": request.query,
"total_documents": len(request.documents),
"results": results
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 批量评分接口(避免重复加载模型)
@app.post("/batch-score")
async def batch_score(requests: List[SingleScoreRequest]):
try:
results = []
for req in requests:
score = reranker_service.calculate_relevance(
req.query,
req.document,
req.instruction
)
results.append({
"query": req.query,
"document": req.document[:100] + "..." if len(req.document) > 100 else req.document,
"score": score,
"relevant": score > 0.5
})
return {"results": results}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
4. 服务部署与配置
4.1 启动脚本配置
创建启动脚本start_server.py:
import uvicorn
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
if __name__ == "__main__":
uvicorn.run(
app="main:app", # 假设代码保存在main.py中
host="0.0.0.0", # 允许外部访问
port=8000, # 服务端口
reload=False, # 生产环境设为False
workers=1, # 多worker需要处理模型共享
timeout_keep_alive=300
)
4.2 Docker容器化部署
创建Dockerfile:
FROM python:3.9-slim
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# 复制代码和依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 暴露端口
EXPOSE 8000
# 启动服务
CMD ["python", "start_server.py"]
构建和运行Docker容器:
# 构建镜像
docker build -t qwen-reranker-api .
# 运行容器
docker run -d \
-p 8000:8000 \
--gpus all \ # 如果使用GPU
--name qwen-reranker \
qwen-reranker-api
5. 客户端调用示例
5.1 Python客户端调用
import requests
import json
class QwenRerankerClient:
def __init__(self, base_url="http://localhost:8000"):
self.base_url = base_url
def get_score(self, query, document, instruction=None):
"""获取单个文档的相关性分数"""
payload = {
"query": query,
"document": document,
"instruction": instruction
}
response = requests.post(f"{self.base_url}/score", json=payload)
return response.json()
def rerank_documents(self, query, documents, instruction=None):
"""重排序多个文档"""
payload = {
"query": query,
"documents": documents,
"instruction": instruction
}
response = requests.post(f"{self.base_url}/rerank", json=payload)
return response.json()
# 使用示例
client = QwenRerankerClient()
# 单文档评分
score_result = client.get_score(
query="什么是机器学习?",
document="机器学习是人工智能的一个分支,研究计算机如何模拟人类学习行为",
instruction="判断文档是否准确回答了查询问题"
)
print(f"相关性分数: {score_result['score']}")
# 多文档重排序
documents = [
"机器学习是人工智能的一个分支",
"深度学习是机器学习的一个子领域",
"神经网络是深度学习的基础",
"Python是机器学习的常用编程语言"
]
rerank_result = client.rerank_documents(
query="什么是机器学习?",
documents=documents
)
print("重排序结果:")
for result in rerank_result["results"]:
print(f"排名{result['rank']}: 分数{result['score']} - {result['document']}")
5.2 JavaScript客户端调用
// 使用axios调用API
const axios = require('axios');
class QwenRerankerJSClient {
constructor(baseURL = 'http://localhost:8000') {
this.baseURL = baseURL;
this.client = axios.create({ baseURL });
}
async getScore(query, document, instruction = null) {
const response = await this.client.post('/score', {
query,
document,
instruction
});
return response.data;
}
async rerankDocuments(query, documents, instruction = null) {
const response = await this.client.post('/rerank', {
query,
documents,
instruction
});
return response.data;
}
}
// 使用示例
async function example() {
const client = new QwenRerankerJSClient();
const result = await client.rerankDocuments(
"机器学习是什么",
[
"机器学习是AI的一个分支",
"深度学习使用神经网络",
"Python用于数据科学"
]
);
console.log('重排序结果:', result);
}
example();
6. 性能优化与最佳实践
6.1 批处理优化
对于大量文档,使用批处理可以显著提升性能:
def batch_calculate_relevance(self, query: str, documents: List[str], instruction: str = None, batch_size: int = 8) -> List[float]:
"""批量计算相关性分数"""
scores = []
for i in range(0, len(documents), batch_size):
batch_docs = documents[i:i + batch_size]
batch_scores = []
for doc in batch_docs:
score = self.calculate_relevance(query, doc, instruction)
batch_scores.append(score)
scores.extend(batch_scores)
return scores
6.2 缓存优化
添加查询缓存避免重复计算:
from functools import lru_cache
class OptimizedRerankerService(QwenRerankerService):
def __init__(self, model_path: str):
super().__init__(model_path)
self.cache = {}
@lru_cache(maxsize=1000)
def cached_calculate_relevance(self, query: str, document: str, instruction: str = None) -> float:
"""带缓存的相关性计算"""
cache_key = f"{query}|{document}|{instruction}"
if cache_key in self.cache:
return self.cache[cache_key]
score = self.calculate_relevance(query, document, instruction)
self.cache[cache_key] = score
return score
6.3 监控与日志
添加详细的监控和日志:
import time
from prometheus_client import Counter, Histogram
# 定义监控指标
REQUEST_COUNT = Counter('reranker_requests_total', 'Total requests', ['method', 'endpoint'])
REQUEST_LATENCY = Histogram('reranker_request_latency_seconds', 'Request latency', ['method', 'endpoint'])
@app.middleware("http")
async def monitor_requests(request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
REQUEST_COUNT.labels(method=request.method, endpoint=request.url.path).inc()
REQUEST_LATENCY.labels(method=request.method, endpoint=request.url.path).observe(process_time)
return response
7. 实际应用案例
7.1 搜索引擎结果重排
def rerank_search_results(search_results, query):
"""重排搜索引擎结果"""
documents = [result['snippet'] for result in search_results]
reranked = client.rerank_documents(query, documents)
# 重新排序原始结果
sorted_results = []
for rerank_item in reranked['results']:
original_index = next(i for i, doc in enumerate(documents) if doc == rerank_item['document'])
sorted_results.append(search_results[original_index])
return sorted_results
7.2 智能客服问答匹配
def find_best_answer(question, candidate_answers):
"""在候选答案中找到最相关的回答"""
reranked = client.rerank_documents(question, candidate_answers)
if reranked['results'] and reranked['results'][0]['score'] > 0.7:
return reranked['results'][0]['document']
else:
return "抱歉,我没有找到合适的答案"
8. 总结
通过本文的实战教程,你已经学会了如何将Qwen3-Reranker-0.6B的Python API封装成完整的RESTful微服务。关键要点包括:
- 服务封装:使用FastAPI创建清晰易用的HTTP接口
- 性能优化:批处理、缓存等技巧提升服务性能
- 部署方案:Docker容器化部署,方便扩展和维护
- 客户端集成:多语言客户端调用示例
- 实际应用:搜索引擎重排、智能客服等场景的应用案例
这种微服务架构让Qwen3-Reranker-0.6B能够轻松集成到各种系统中,无论是Web应用、移动应用还是其他后端服务,都能通过简单的HTTP调用获得强大的文本重排序能力。
下一步你可以考虑添加身份认证、速率限制、更详细的监控指标等功能,让服务更加健壮和安全。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐

所有评论(0)