TDD-ner-api
状态:已实现 关联需求:docs/requirements/PRD-ner-api.md 创建日期:2026-04-28
1. 需求摘要
用 FastAPI 包装 GLiNER 模型,提供 POST /extract 接口,接收文本与实体类型列表,返回抽取结果。
2. 方案设计
方案选型
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| FastAPI + GLiNER | 轻量、async 支持好、自动生成文档 | — | ✅ 采用 |
| Flask + GLiNER | 更简单 | 无 async,性能差 | ❌ |
目录结构
ner-server/
├── app/
│ ├── main.py # FastAPI app 入口,lifespan 加载模型
│ ├── config.py # 环境变量配置
│ ├── models.py # Pydantic 请求/响应模型
│ └── ner.py # GLiNER 封装(NERService)
├── tests/
│ └── test_extract.py
├── requirements.txt
└── .env.example
核心接口
POST /extract
Request: { "text": str, "labels": list[str], "threshold": float = 0.5 }
Response: { "entities": [{ "text": str, "label": str, "score": float, "start": int, "end": int }] }
GET /health
Response: { "status": "ok" }
配置项(环境变量)
| 变量 | 默认值 | 说明 |
|---|---|---|
| MODEL_NAME | urchade/gliner_medium-v2.1 | GLiNER 模型名称 |
| PORT | 8000 | 服务端口 |
| HOST | 0.0.0.0 | 监听地址 |
3. 测试策略
- 正常路径:传入文本和标签,返回实体列表
- 空文本:返回空实体列表
- 空标签列表:返回空实体列表
- threshold 过滤:高阈值时过滤低置信度实体
确认记录:2026-04-28 用户确认(口头需求)