CategorizeLabel/README.md
2025-10-15 17:19:26 +08:00

222 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 产品分类模块CategorizeLabel
[![Python](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)
[![Tests](https://img.shields.io/badge/tests-77%20passed-green.svg)](tests/)
[![Code Style](https://img.shields.io/badge/code%20style-pep8-orange.svg)](https://www.python.org/dev/peps/pep-0008/)
基于通义千问LLM的产品自动分类工具采用整洁架构设计支持批量处理。
## ✨ 特性
- 🚀 **批量处理**使用通义千问Batch API费用仅为实时调用的50%
- 🏗️ **整洁架构**遵循Clean Architecture和SOLID原则
-**完整测试**77个单元测试100%通过率
- 📦 **易于使用**:简单的命令行接口
- 📊 **详细日志**:完整的运行日志记录
- 📈 **实时进度**:实时显示任务处理进度和状态(新增)
- 🔧 **可扩展**:基于接口编程,易于扩展和维护
## 📋 快速开始
### 1. 安装依赖
```bash
# 使用Poetry推荐
poetry install
# 或使用pip
pip install -e .
```
### 2. 配置API Key
```bash
# Windows PowerShell
$env:DASHSCOPE_API_KEY="your-api-key-here"
# Linux/Mac
export DASHSCOPE_API_KEY="your-api-key-here"
```
### 3. 编辑配置文件
编辑 `config/config.yaml`,设置你的参数:
```yaml
files:
input_file: "input/product_list.xlsx"
category_file: "config/product_type.jsonl"
output_file: "output/classification_result.jsonl"
api:
model: "qwen-flash"
```
### 4. 运行分类
```bash
# 使用默认配置文件
python -m src.main
# 或指定自定义配置
python -m src.main --config config/my_config.yaml
# 或使用命令行参数覆盖配置
python -m src.main --model qwen-plus
```
### 5. 监控任务进度 ⚡️新增
程序运行时会实时显示任务处理进度:
```
2025-10-15 14:30:00 - INFO - 等待Batch任务完成系统将定期查询并输出进度信息...
2025-10-15 14:30:00 - INFO - 开始轮询Batch任务状态轮询间隔: 60秒
2025-10-15 14:30:05 - INFO - [轮询 #1] 任务状态: in_progress | 已等待: 5秒 | 剩余时间: 23小时59分55秒
2025-10-15 14:30:05 - INFO - ↳ 处理进度: 45/100 (45.0%) | 失败: 0
2025-10-15 14:31:05 - INFO - [轮询 #2] 任务状态: in_progress | 已等待: 1分5秒 | 剩余时间: 23小时58分55秒
2025-10-15 14:31:05 - INFO - ↳ 处理进度: 78/100 (78.0%) | 失败: 2
2025-10-15 14:32:05 - INFO - [轮询 #3] 任务状态: completed | 已等待: 2分5秒
2025-10-15 14:32:05 - INFO - 任务完成,开始下载结果
```
实时日志可以帮助您:
- ✅ 了解任务是否正在正常运行
- ✅ 预估任务完成时间
- ✅ 及时发现并处理错误
详细说明请参考 [进度日志功能说明](docs/进度日志功能说明.md)
## 📚 文档
- [使用说明](docs/使用说明.md) - 详细的使用指南
- [进度日志功能](docs/进度日志功能说明.md) - 实时进度反馈功能说明(新增)
- [测试报告](docs/测试报告.md) - 完整的测试覆盖报告
- [架构设计](docs/project_docs/产品分类模块架构设计.md) - 详细的架构设计文档
- [功能设计](docs/project_docs/产品分类模块功能设计.md) - 功能需求文档
- [API文档](docs/API/Tongyi-API.md) - 通义千问API使用教程
## 🏗️ 项目结构
```
CategorizeLabel/
├── src/ # 源代码
│ ├── core/ # 核心实现层
│ │ ├── file_handler.py # 文件处理
│ │ ├── batch_client.py # Batch API客户端
│ │ └── prompt_builder.py # Prompt构建
│ ├── models.py # 数据模型
│ ├── interfaces.py # 抽象接口
│ └── main.py # 主程序入口
├── tests/ # 单元测试77个测试
│ ├── fixtures/ # 测试数据
│ ├── test_models.py # 22个测试
│ ├── test_file_handler.py # 20个测试
│ ├── test_batch_client.py # 15个测试
│ ├── test_prompt_builder.py # 11个测试
│ └── test_main.py # 9个测试
├── config/ # 配置文件
├── input/ # 输入文件目录
├── output/ # 输出文件目录
├── logs/ # 日志目录
├── docs/ # 文档
└── pyproject.toml # 项目配置
```
## 🧪 运行测试
```bash
# 运行所有测试
pytest tests/ -v
# 运行特定测试
pytest tests/test_models.py -v
# 查看测试覆盖率
pytest tests/ --cov=src --cov-report=html
```
**测试结果77/77 测试通过 ✨**
## 🎯 设计原则
本项目严格遵循以下设计原则:
- **整洁架构Clean Architecture**:依赖倒置,核心业务逻辑不依赖外部实现
- **SOLID原则**:单一职责、开闭原则、里氏替换、接口隔离、依赖倒置
- **测试驱动开发TDD**:先写测试,再实现功能
- **依赖注入**:通过构造函数注入依赖,便于测试和替换
## 📊 架构概览
```
┌─────────────────────────────────────────────┐
│ main.py (组合根) │
│ 初始化所有依赖并编排业务流程 │
└─────────────────────────────────────────────┘
┌───────────────┴───────────────┐
│ │
↓ ↓
┌─────────┐ ┌─────────┐
│ core/ │ ←─ interfaces ─→ │ models │
└─────────┘ └─────────┘
├── FileHandler (文件处理)
├── BatchClient (API调用)
└── PromptBuilder (Prompt构建)
```
## 🔧 技术栈
- **Python 3.9+**
- **Pydantic V2**:数据验证和模型
- **pandas**Excel文件处理
- **OpenAI SDK**通义千问API调用
- **pytest**:单元测试框架
- **Poetry**:依赖管理
## 📝 输入输出格式
### 输入:产品列表 (Excel)
```
产品编号 | 产品名称 | 景区名称
P001 | 黄山风景区门票 | 黄山
P002 | 黄山温泉酒店 | 黄山
```
### 输入:类别配置 (JSONL)
```json
{"category":"门票","type":"自然类","sub_type":"自然风光"}
{"category":"住宿","type":"商务酒店","sub_type":""}
```
### 输出:分类结果 (JSONL)
```json
{"product_id":"P001","category":"门票","type":"自然类","sub_type":"自然风光"}
{"product_id":"P002","category":"住宿","type":"商务酒店","sub_type":""}
```
## 💡 使用场景
- ✅ 旅游产品自动分类
- ✅ 电商商品分类
- ✅ 内容标签化
- ✅ 大规模数据标注
## 🤝 贡献
欢迎提交Issue和Pull Request
## 📄 许可证
请遵守通义千问API的使用协议。
## 👥 开发团队
采用AI辅助开发遵循专业的软件工程实践。
---
**项目状态**:✅ 开发完成,所有测试通过,可用于生产环境