🚀 基于FastAPI、FlagEmbedding的高性能文本嵌入向量生成与文档重排序API,支持多种embedding和rerank模型。
- 🧠 多模型支持: 支持FlagEmbedding系列的所有embedding和rerank模型
- ⚡ 高性能: 模型智能缓存,避免重复加载
- 🔧 灵活配置: 支持环境变量和配置文件
- 📊 完整监控: 健康检查、模型列表、配置查看
- 🐳 容器化: 完整的Docker和Docker Compose支持
- 🛡️ 错误处理: 全局异常处理和输入验证
- 📝 标准API: 兼容OpenAI API格式
pip install -r requirements.txt
python start.py
start.bat
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
启动后访问:
- API文档: http://localhost:8000/docs
- 健康检查: http://localhost:8000/health
- 模型列表: http://localhost:8000/models
生成文本的语义向量表示,支持所有FlagEmbedding embedding模型。
POST /v1/embeddings
{
"model": "BAAI/bge-large-zh-v1.5",
"input": ["你好世界", "人工智能技术"]
}
BAAI/bge-large-zh-v1.5
- 中文大型模型(推荐)BAAI/bge-base-zh-v1.5
- 中文基础模型BAAI/bge-small-zh-v1.5
- 中文小型模型BAAI/bge-m3
- 多语言模型BAAI/bge-large-en-v1.5
- 英文大型模型- 其他FlagEmbedding兼容模型
{
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [0.1, 0.2, 0.3, ...]
}
],
"object": "list",
"model": "BAAI/bge-large-zh-v1.5",
"usage": {
"prompt_tokens": 12,
"total_tokens": 12
}
}
根据查询相关性对文档进行重新排序,支持所有FlagEmbedding rerank模型。
POST /v1/rerank
{
"model": "BAAI/bge-reranker-v2-m3",
"query": "什么是人工智能?",
"documents": [
"人工智能是计算机科学的一个分支",
"今天天气很好",
"机器学习是人工智能的子领域",
"深度学习属于机器学习范畴"
],
"top_n": 3,
"return_documents": true
}
参数 | 类型 | 必需 | 默认值 | 说明 |
---|---|---|---|---|
model |
string | ✅ | - | 重排序模型名称 |
query |
string | ✅ | - | 查询文本 |
documents |
array | ✅ | - | 待排序的文档列表 |
top_n |
integer | ❌ | null | 返回前N个结果 |
return_documents |
boolean | ❌ | false | 是否返回文档内容 |
max_chunks_per_doc |
integer | ❌ | 1024 | 每个文档的最大块数 |
overlap_tokens |
integer | ❌ | 80 | 重叠token数 |
BAAI/bge-reranker-v2-m3
- 多语言重排序模型(推荐)BAAI/bge-reranker-base
- 基础重排序模型BAAI/bge-reranker-large
- 大型重排序模型- 其他FlagEmbedding rerank模型
{
"id": "uuid-string",
"results": [
{
"document": {
"text": "人工智能是计算机科学的一个分支"
},
"index": 0,
"relevance_score": 0.95
}
],
"tokens": {
"input_tokens": 25,
"output_tokens": 0
}
}
GET /health
{"status": "healthy"}
GET /models
{"loaded_models": ["BAAI/bge-large-zh-v1.5", "BAAI/bge-reranker-v2-m3"]}
GET /config
{
"model_storage_path": "D:\\git\\AntSK\\model",
"api_host": "0.0.0.0",
"api_port": 8000,
"log_level": "INFO",
"use_fp16": true
}
环境变量 | 默认值 | 说明 |
---|---|---|
MODEL_STORAGE_PATH |
D:\git\AntSK\model |
模型存储路径 |
API_HOST |
0.0.0.0 |
API服务监听地址 |
API_PORT |
8000 |
API服务端口 |
LOG_LEVEL |
INFO |
日志级别(DEBUG/INFO/WARNING/ERROR) |
USE_FP16 |
true |
是否使用FP16精度(节省内存) |
编辑 config.py
文件修改默认配置:
# 模型存储路径
MODEL_STORAGE_PATH = r"D:\your\model\path"
# API服务配置
API_HOST = "127.0.0.1"
API_PORT = 8080
# 启用FP16精度
DEFAULT_USE_FP16 = True
# 设置环境变量
set MODEL_STORAGE_PATH=E:\models
set API_PORT=9000
set USE_FP16=false
# 启动服务
python start.py
import requests
url = "http://localhost:8000/v1/embeddings"
data = {
"model": "BAAI/bge-large-zh-v1.5",
"input": ["你好世界", "人工智能技术"]
}
response = requests.post(url, json=data)
result = response.json()
# 获取向量
embeddings = [item["embedding"] for item in result["data"]]
print(f"生成了 {len(embeddings)} 个向量,维度: {len(embeddings[0])}")
import requests
url = "http://localhost:8000/v1/rerank"
data = {
"model": "BAAI/bge-reranker-v2-m3",
"query": "机器学习算法",
"documents": [
"深度学习是机器学习的一个分支",
"今天天气不错",
"神经网络是深度学习的基础",
"Python是编程语言"
],
"top_n": 2,
"return_documents": True
}
response = requests.post(url, json=data)
result = response.json()
# 打印排序结果
for item in result["results"]:
print(f"相关度: {item['relevance_score']:.3f} - {item['document']['text']}")
curl -X POST "http://localhost:8000/v1/embeddings" \
-H "Content-Type: application/json" \
-d '{
"model": "BAAI/bge-large-zh-v1.5",
"input": ["你好", "世界"]
}'
curl -X POST "http://localhost:8000/v1/rerank" \
-H "Content-Type: application/json" \
-d '{
"model": "BAAI/bge-reranker-v2-m3",
"query": "人工智能",
"documents": ["AI技术发展", "天气预报", "机器学习应用"],
"top_n": 2,
"return_documents": true
}'
- 中文场景:
BAAI/bge-large-zh-v1.5
(性能最佳) 或BAAI/bge-base-zh-v1.5
(平衡选择) - 英文场景:
BAAI/bge-large-en-v1.5
- 多语言场景:
BAAI/bge-m3
- 资源受限:
BAAI/bge-small-zh-v1.5
- 通用场景:
BAAI/bge-reranker-v2-m3
(多语言支持) - 中文优化:
BAAI/bge-reranker-base
- 高精度需求:
BAAI/bge-reranker-large
# 启用FP16精度,减少内存占用
export USE_FP16=true
# 设置合适的模型存储路径
export MODEL_STORAGE_PATH=/path/to/fast/storage
- API支持并发请求,自动进行模型缓存
- 建议根据服务器配置调整并发数
- 大批量文本处理时,建议分批请求
-
模型下载失败
# 检查网络连接 ping huggingface.co # 清理缓存重新下载 rm -rf /path/to/models/*
-
内存不足
# 使用小型模型 export USE_FP16=true # 或选择更小的模型,如 bge-small-zh-v1.5
-
端口占用
# 修改端口 export API_PORT=8001
# 构建镜像
docker build -t antsk-py-api:latest .
# 运行容器
docker run -d \
--name antsk-py-api \
-p 8000:8000 \
-v ./models:/app/models \
-e MODEL_STORAGE_PATH=/app/models \
-e API_HOST=0.0.0.0 \
-e API_PORT=8000 \
-e LOG_LEVEL=INFO \
-e USE_FP16=true \
antsk-py-api:latest
# 构建并启动服务
docker-compose up -d --build
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
变量名 | 默认值 | 说明 |
---|---|---|
MODEL_STORAGE_PATH |
/app/models |
模型存储路径 |
API_HOST |
0.0.0.0 |
API服务监听地址 |
API_PORT |
8000 |
API服务端口 |
LOG_LEVEL |
INFO |
日志级别 |
USE_FP16 |
true |
是否使用FP16精度 |
GPU_VISIBLE_DEVICES |
auto |
GPU可见策略:auto 自动挑选空闲GPU,none 禁用GPU,或指定如 0,1 |
GPU_COUNT |
1 |
申请的GPU数量,避免一次占满全部GPU,可设为 0 回退CPU |
💡 建议将仓库中的
.env.example
拷贝为.env
并按需修改,docker compose
会自动加载其中的变量。
在部署 docker-compose-gpu.yml
时,可通过以下步骤实现与其他服务的GPU资源自适应:
- 复制示例环境变量文件:
Copy-Item .env.example .env
- 根据实际环境修改
.env
中的 GPU 相关字段:GPU_VISIBLE_DEVICES=auto
(默认)由 NVIDIA Runtime 选择当前空闲 GPU;- 若没有可用 GPU 或希望临时禁用,可设为
none
并将GPU_COUNT=0
; - 如需绑定指定 GPU,可设置为
0
、1
或0,2
等编号; - 调整
GPU_COUNT
为需要预留的 GPU 数量,避免一次获取全部 GPU。
- 启动服务时使用兼容模式以启用资源限制:
docker compose --env-file .env --compatibility -f docker-compose-gpu.yml up -d
当 GPU 被其他服务占用时,auto
会优先选择剩余空闲的 GPU;若所有 GPU 均繁忙,可手动改为 none
让服务回退到 CPU 运行,避免部署失败。
./models:/app/models
- 模型存储目录,避免重复下载./logs:/app/logs
- 日志目录(可选)
容器启动后,您可以通过以下地址访问服务:
- API文档: http://localhost:8000/docs
- 健康检查: http://localhost:8000/health
- 模型列表: http://localhost:8000/models
- 配置信息: http://localhost:8000/config
# 查看容器状态
docker-compose ps
# 查看实时日志
docker-compose logs -f antsk-py-api
# 进入容器
docker-compose exec antsk-py-api bash
# 重新构建镜像
docker-compose build --no-cache
# 清理未使用的镜像
docker image prune -f
curl -X POST "http://localhost:8000/v1/embeddings" \
-H "Content-Type: application/json" \
-d '{
"model": "BAAI/bge-small-zh-v1.5",
"input": ["你好世界", "Hello World"]
}'
curl -X POST "http://localhost:8000/v1/rerank" \
-H "Content-Type: application/json" \
-d '{
"model": "BAAI/bge-reranker-base",
"query": "什么是人工智能?",
"documents": [
"人工智能是计算机科学的一个分支",
"今天天气很好",
"机器学习是人工智能的子领域"
],
"top_n": 2
}'
- 首次运行:首次启动时会自动下载模型,可能需要较长时间
- 存储空间:确保有足够的磁盘空间存储模型文件
- 内存要求:建议至少4GB内存,使用FP16可以减少内存占用
- 网络访问:需要网络连接来下载模型文件
# 查看详细日志
docker-compose logs antsk-py-api
# 检查端口占用
netstat -tulpn | grep 8000
# 检查网络连接
docker-compose exec antsk-py-api ping huggingface.co
# 手动重新下载模型
docker-compose exec antsk-py-api rm -rf /app/models/*
docker-compose restart
- FastAPI
0.104.1
- 现代、快速的Web框架 - FlagEmbedding
1.2.10
- 文本嵌入向量生成 - ModelScope
1.9.5
- 模型下载和管理 - Transformers
>=4.21.0
- Hugging Face模型库 - PyTorch
>=1.13.0
- 深度学习框架 - Uvicorn
0.24.0
- ASGI服务器 - Pydantic
2.5.0
- 数据验证
- Python: 3.8+
- 内存: 建议4GB+(使用FP16可降低需求)
- 存储: 根据模型大小,建议10GB+可用空间
- GPU: 可选,支持CUDA加速
- 首次使用某个模型时会自动从ModelScope下载
- 模型文件较大,请确保网络连接稳定
- 模型会缓存在本地,避免重复下载
- 支持断点续传,下载失败可重试
- 大型模型需要较多内存,建议使用
USE_FP16=true
- 多个模型会同时加载到内存中
- 根据服务器配置选择合适的模型规模
- 可以通过
/models
接口查看已加载的模型
- 使用Docker部署,确保环境一致性
- 配置适当的日志级别和监控
- 设置健康检查和自动重启
- 考虑使用负载均衡处理高并发
- 定期备份模型缓存目录
欢迎提交Issue和Pull Request来帮助改进项目!
# 克隆项目
git clone https://github.com/xuzeyu91/AntSK-PyApi
cd AntSK-PyApi
# 安装依赖
pip install -r requirements.txt
# 启动开发服务器
python start.py
- 遵循PEP 8代码风格
- 添加适当的注释和文档字符串
- 提交前运行测试
本项目采用开源许可证,详见LICENSE文件。
🎉 感谢使用 AntSK Python Embedding API!
如有问题或建议,欢迎提交Issue或联系开发团队。