File size: 1,679 Bytes
d470d45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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 用户确认(口头需求)