基于 Qwen3.5-0.8B LoRA 的中文陈述类型分类
本项目用于部署 statement_type 三分类 LoRA 模型。输入一条上游抽取或改写后的候选记忆陈述,输出该陈述属于:
FACT:事实性陈述OPINION:观点、评价、态度或感受OTHER:无效片段、寒暄、纯指令、纯疑问、格式噪声或不可沉淀陈述
模型文件说明
当前仓库中的 model/ 目录保存的是 LoRA adapter,不是完整的 Qwen 基座模型。因此运行时还需要额外准备 Qwen3.5-0.8B 基座模型文件。
推荐目录结构:
statement_type_lora/
├── main.py
├── README.md
├── model/ # LoRA adapter
└── Qwen3.5_0.8B/ # 可选:本地 Qwen3.5-0.8B 基座模型
如果基座模型不放在当前目录下,可以通过环境变量指定:
PowerShell:
$env:QWEN_BASE_MODEL="你的Qwen3.5-0.8B基座模型路径"
Windows cmd:
set QWEN_BASE_MODEL=你的Qwen3.5-0.8B基座模型路径
也可以通过 MODEL_PATH 指定 LoRA adapter 路径:
PowerShell:
$env:MODEL_PATH="你的LoRA-adapter路径"
Windows cmd:
set MODEL_PATH=你的LoRA-adapter路径
输入格式
最常用输入是一条 statement_text:
{
"statement_text": "我觉得这个方案不错。"
}
main.py 的 predict 方法也支持可选上下文:
result = service.predict(
statement_text="用户觉得这个方案不错。",
context="用户刚体验了新版页面,并反馈整体流程比较顺。"
)
如果不传 context,模型只根据 statement_text 判断。
输出格式
{
"predicted_label": "OPINION",
"probabilities": {
"FACT": 0.0123,
"OPINION": 0.9812,
"OTHER": 0.0065
},
"logits": {
"FACT": 1.2345,
"OPINION": 5.6789,
"OTHER": 0.9876
}
}
推理逻辑
该模型采用 Qwen next-token 三分类方式,而不是 BERT 分类头:
0->FACT1->OPINION2->OTHER
推理时,main.py 会构造和训练脚本一致的 chat prompt,然后读取最后一个位置上 0/1/2 三个 token 的 logit,并通过 softmax 得到三类概率。
快速测试
python main.py
默认测试文本:
我觉得这个方案不错。
代码调用
from main import StatementTypeLoraService
service = StatementTypeLoraService()
result = service.predict("客户是网球AI设备公司负责人。")
print(result)
如果基座模型在其他位置:
from main import StatementTypeLoraService
service = StatementTypeLoraService(
base_model_dir="你的Qwen3.5-0.8B基座模型路径"
)
result = service.predict("用户认为网页设计得还不错。")
print(result)
分类效果
在私有 statement_type 测试集上,Qwen3.5-0.8B-LoRA 的表现如下:
| 指标 | 数值 |
|---|---|
| Accuracy | 0.8864 |
| Macro-F1 | 0.8510 |
| 正确数 / 总数 | 913 / 1030 |
各类别 F1:
| 标签 | Precision | Recall | F1 |
|---|---|---|---|
| FACT | 0.9158 | 0.9398 | 0.9276 |
| OPINION | 0.8450 | 0.8086 | 0.8264 |
| OTHER | 0.8182 | 0.7803 | 0.7988 |
依赖
torch
transformers
peft
如果运行时报找不到基座模型,请确认已经准备完整 Qwen3.5-0.8B 文件,包括:
config.jsontokenizer.json或 tokenizer 相关文件- 模型权重文件
并通过 QWEN_BASE_MODEL 指向该目录。