这是一个基于预训练中文 NLP 模型的意图识别微服务,主要用于判断用户问题是否需要联网搜索。服务通过 HTTP API 提供接口,可以集成到各种应用系统中,帮助智能判断用户查询是否需要实时信息检索。
- 意图分类:判断用户问题是否需要联网搜索
- 置信度评估:提供分类结果的置信度分数
- 批量处理:支持批量问题分类
- RESTful API:提供标准的 HTTP 接口
本项目采用**零样本分类(Zero-shot Classification)**方法实现意图识别:
- 语义相似度计算:使用预训练的多语言语义嵌入模型将用户问题和意图模板转换为向量表示
- 相似度匹配:计算问题向量与多个搜索意图模板向量的余弦相似度
- 综合判断:基于最大相似度和平均相似度的加权组合,判断是否需要搜索
- 阈值过滤:通过置信度阈值(默认 0.6)决定最终分类结果
用户请求 → FastAPI 路由 → 意图识别服务 → 模型分类器 → 返回结果
- 路由层 (
routes/): 处理 HTTP 请求和响应 - 服务层 (
services/): 业务逻辑处理 - 模型层 (
models/): NLP 模型封装和推理
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
- 模型类型:多语言语义嵌入模型(Sentence Transformers)
- 支持语言:支持包括中文在内的多种语言
- 模型特点:
- 基于 MiniLM 架构,模型体积小,推理速度快
- 专门针对语义相似度任务优化
- 支持零样本分类,无需额外训练即可使用
- 模型大小:约 420MB
- 性能:在 CPU 上单次推理时间约 50-200ms
服务使用以下 9 个搜索意图模板进行相似度匹配:
- 需要查询实时信息
- 需要搜索最新数据
- 需要联网获取信息
- 查询当前时间相关信息
- 获取最新动态
- 搜索实时新闻
- 查询天气信息
- 查询股价价格
- 查询最新事件
nlp_intent_service/
├── main.py # FastAPI 应用入口
├── config.py # 配置管理(使用 Pydantic)
├── requirements.txt # 依赖包列表
├── environment.yml # Conda 环境配置文件
├── .env.example # 环境变量示例
├── services/
│ ├── __init__.py
│ └── intent_service.py # 意图识别核心服务
├── routes/
│ ├── __init__.py
│ └── intent_routes.py # FastAPI 路由
└── models/
├── __init__.py
└── intent_classifier.py # NLP 模型封装
使用 Conda 创建环境:
# 创建环境
conda env create -f environment.yml
# 激活环境
conda activate nlp_classification# 复制环境变量示例文件
cp .env.example .env
# 根据需要修改 .env 文件python main.py服务将在 http://localhost:9001 启动。
打开浏览器访问:http://localhost:9001/docs
端点: POST /api/v1/intent/classify
请求示例:
{
"question": "今天天气怎么样?",
"intent_type": "search",
"conversation_context": null
}响应示例:
{
"success": true,
"need_action": true,
"confidence": 0.61,
"reason": "问题包含实时信息查询需求(时间+实时数据)。问题与搜索意图模板相似度较高(最大:0.74,平均:0.30,综合:0.61)",
"query": "今天天气怎么样?"
}端点: POST /api/v1/intent/classify/batch
请求示例:
{
"questions": [
"今天天气怎么样?",
"解释一下什么是机器学习"
],
"intent_type": "search"
}端点: GET /api/v1/intent/health
响应示例:
{
"status": "healthy",
"service": "nlp-intent-classifier",
"model": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
"version": "1.0.0",
"device": "cpu"
}根据实际测试,意图识别功能正常工作:
- ✅ API 响应正常:HTTP 200 状态码
- ✅ 分类准确:能够正确识别需要搜索的实时信息查询
- ✅ 置信度合理:返回的置信度分数在合理范围内(0.6-0.8)
- ✅ 原因说明清晰:提供了详细的分类原因和相似度分析
测试案例:
- 问题:"今天天气怎么样?"
- 结果:
need_action: true,confidence: 0.61 - 原因:正确识别为实时信息查询需求
| 变量名 | 说明 | 默认值 |
|---|---|---|
INTENT_SERVICE_HOST |
服务绑定地址 | 0.0.0.0 |
INTENT_SERVICE_PORT |
服务端口 | 9001 |
INTENT_MODEL_NAME |
模型名称 | sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 |
INTENT_CONFIDENCE_THRESHOLD |
置信度阈值 | 0.6 |
INTENT_DEVICE |
运行设备 | cpu (可选: cuda, mps, auto) |
INTENT_LOG_LEVEL |
日志级别 | INFO |
- 目标:提高分类准确率
- 方法:收集标注数据,在预训练模型基础上进行微调
- 优势:针对特定领域优化,准确率可提升 10-20%
- 实施:
- 收集 1000+ 标注样本(需要搜索/不需要搜索)
- 使用
hfl/chinese-roberta-wwm-ext作为基础模型 - 进行二分类微调训练
- 目标:使用更强大的模型
- 候选模型:
sentence-transformers/paraphrase-multilingual-mpnet-base-v2(更准确但更慢)BAAI/bge-large-zh-v1.5(中文优化模型)
- 权衡:准确率 vs 推理速度
- 当前:使用最大相似度和平均相似度的加权平均
- 优化:
- 引入加权模板(不同模板设置不同权重)
- 使用 Top-K 相似度聚合
- 考虑问题长度归一化
- 关键词匹配:结合规则方法,识别时间、实时数据等关键词
- NER 集成:使用命名实体识别提取时间、地点等信息
- 上下文理解:利用
conversation_context参数进行上下文分析
- 当前:批量请求逐个处理
- 优化:实现真正的批处理推理,提升吞吐量 3-5 倍
- 问题缓存:缓存常见问题的分类结果
- 模型缓存:优化模型加载和内存使用
- 支持 CUDA 设备,推理速度可提升 5-10 倍
- 支持批处理推理,充分利用 GPU 并行能力
- 当前仅支持"搜索"意图
- 扩展支持:问答、任务执行、闲聊等意图类型
- 当前:简单返回原始问题
- 优化:
- 使用关键词提取算法
- 去除停用词和冗余信息
- 生成优化的搜索查询
- 实现多轮对话的上下文理解
- 考虑历史对话对当前意图的影响
- 添加 Prometheus 指标导出
- 记录分类准确率、响应时间等关键指标
- 实现日志聚合和分析
- 增强异常处理机制
- 添加重试逻辑和降级策略
- 实现优雅的错误响应
- 支持 Docker 容器化部署
- 添加 Kubernetes 部署配置
- 实现健康检查和自动重启
- 对比不同模型和算法的效果
- 收集用户反馈数据
- 持续优化阈值和参数
- 记录所有分类请求和结果
- 分析误分类案例
- 构建高质量训练数据集
主要依赖包:
fastapi>=0.104.1- Web 框架uvicorn>=0.24.0- ASGI 服务器sentence-transformers>=2.2.2- 语义嵌入模型torch>=2.0.0- 深度学习框架transformers>=4.30.0- Hugging Face 模型库pydantic>=2.5.0- 数据验证numpy>=1.24.0- 数值计算
完整依赖列表请查看 requirements.txt。
本项目采用 MIT 许可证。
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请通过 Issue 反馈。