| # 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 用户确认(口头需求) | |