---
title: anti_fraud
canonical_url: "https://www.modelscope.cn/models/golfxiao/anti_fraud"
md_url: "https://www.modelscope.cn/models/golfxiao/anti_fraud.md"
repository: golfxiao/anti_fraud
chinese_name: "欺诈文本检测"
last_updated: 2025-02-06
pipeline_tag: text-classification
tasks:
  - text-classification
model_type:
  - qwen2
architectures:
  - Qwen2ForCausalLM
parameters: 1.5B
tensor_type:
  - BF16
library_name:
  - safetensors
inference_backends:
  - "deploy_task text/emb"
  - "lmdeploy 0.9.1"
  - "lmdeploy_turbomind 0.9.1"
  - "sglang 0.5.2"
  - "vllm 0.9.2"
downloads: 620
stars: 10
---

# anti_fraud

> anti_fraud - golfxiao 在 ModelScope 开源的模型。随着网络诈骗的日益猖獗，特别是一些不法分子利用网络会议软件进行诈骗，我们迫切需要一种有效的文本分类检测模型，实时监测会议中的对话内容，识别潜在的诈骗风险，帮助用户提高警惕，减少上当受骗的风险。我们基于开源的Qwen 1.5B模型进行了进一步的微调训练，专注于欺诈对话的检测。通过对两万多条标注过的欺诈文本数据进行训练，最终模型在精确率和召回率方面均达到了94%的优异表现，不仅能够识别对话中的欺诈行为，还能提供详细的分析理由，并预测出对…

golfxiao/anti_fraud 是 ModelScope 魔搭社区上的 1.5B 参数text-classification模型，可用 deploy_task text/emb、lmdeploy 0.9.1、lmdeploy_turbomind 0.9.1 部署。

- **Repository**: golfxiao/anti_fraud
- **Tasks**: text-classification
- **Parameters**: 1.5B
- **Inference backends**: deploy_task text/emb, lmdeploy 0.9.1, lmdeploy_turbomind 0.9.1, sglang 0.5.2, vllm 0.9.2
- **Downloads**: 620
- **Stars**: 10
- **Last updated**: 2025-02-06

Source: https://www.modelscope.cn/models/golfxiao/anti_fraud

---

## 模型介绍
随着网络诈骗越来越多，经常有一些不法分子利用网络会议软件进行诈骗，为此需要训练一个文本分类检测模型，来实时检测会议中的对话内容是否存在诈骗风险，以帮助用户在网络会议中增强警惕，减少受到欺诈的风险。

但是截止目前，开源模型对欺诈分类的检测效果并不理想（召回率大概只有50~60%），为此我们基于开源的Qwen2-1.5B模型进行了进一步的微调训练，最终获得了较好的检测效果（精确率和召回率均达到94%）。

该模型的任务是对输入的一段对话文本进行检测，识别出其中是否存在经济欺诈行为。如果存在到欺诈行为，模型还可以给出分析的理由依据，并预测出对话中哪个发言者是欺诈者，做到有理有据。该模型在欺诈分类检测上的准确率约为94%，在识别欺诈发言者上的准确率约为91%。

## 使用方式

这里提供了一个代码片段，演示了如何使用该模型进行欺诈检测。

1. 使用`AutoModelForCausalLM`加载模型权重，使用`AutoTokenizer`加载对应的tokenizer。
2. 定义了一个欺诈检测指令`instruction`（此指令经过模型训练）和用户输入`user_input`, 并组成对话列表`messages`。
3. 使用`apply_chat_template`方法将对话内容转换为模型可接受的格式，并通过`generate`方法生成结果。
4. 通过`tokenizer.batch_decode`方法将生成的token ID列表转换为文本，并打印出结果。

```
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "golfxiao/anti_fraud"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

instruction = "你是一个分析诈骗案例的专家，你的任务是分析下面对话内容是否存在经济诈骗(is_fraud:<bool>)，如果存在经济诈骗，请找出正在进行诈骗行为的发言者姓名(fraud_speaker:<str>)，并给出你的分析理由(reason:<str>)，最后以json格式输出。"
user_input = "张伟:您好，请问是林女士吗？我是中通快递客服，我姓张。您前几天网上买了一辆自行车对吧？很抱歉，我们的快递弄丢了，按规定我们会赔偿您360元。"
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": f"{instruction}\n\n{user_input}"}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
```

输出结果示例如下：
```
'{"is_fraud": true, "fraud_speaker": "张伟", "reason": "对话中的张伟自称是中通快递客服，并提到用户的网购行为和物品丢失，要求赔偿360元。然而，在正常快递赔偿过程中，快递公司不会通过电话直接告知赔偿金额，而且赔偿金数额较高，存在引诱用户提供个人信息的嫌疑。此外，对话中没有提到具体的日期和购买记录，增加了诈骗的可能性。"}'
```


## 模型如何训练的

该模型是在Qwen2-1.5B-Instruct的基础上，使用两万多条打过标签的欺诈文本分类数据，使用Lora微调训练得到的。在微调过程中，使用的主要训练参数如下：
- Lora低秩矩阵的秩r=16，缩放因子alpha=32；
- 所使用的正向和反向数据集分别包含约13868条数据，总计约27736条数据，数据集按照8:1:1的比例划分为训练集、验证集和测试集； 
- 训练使用的GPU设备是一张有24GB显存的3090显卡，小批量（batch size）为8； 
- 整体采用K折交叉训练验证的方法，所有数据分为5个折子（一个折子可以理解为一份训练/验证集的组合），每个折子进行两轮数据训练，总共训练10轮； 
- 最后在测试集上进行模型整体指标的测评。

## 模型训练数据

模型所使用的欺诈文本数据分为正反两类，一类是欺诈类数据，一类是非欺诈类数据。

欺诈类数据的构造过程：
1. 从各个新闻网站收集与诈骗相关的案例报道，处理成CSV格式的数据； 
2. 以每篇案例报道作为上下文，让`gpt-4o`模型以对话形式还原诈骗案例发生的整个过程，得到一个诈骗案例的对话集； 
3. 将每个案例的大对话切分成100、300、500字的小对话集，目的是让模型在训练时能够适应不同长度的输入，并捕捉上下文信息。
4. 将这些小对话集再送给`gpt-4o`模型打标签（is_fraud=true/false），同时生成欺诈发言者（fraud_speaker）和分析理由（reason）。
5. 人工审核这些对话集的标签，对于标签有明显错误的对话集进行修正。

非欺诈类数据的构造过程：
1. 使用真实会议的ASR文本（语音识别，包含发言者信息）作为原始数据，这个ASR已经按照300-500字切分成一个一个的发言段落； 
2. 将大段落切分成小段落（<=100字），目的是为了与上面欺诈类的对话集长度一致，避免模型在训练时误将长度作为标签分类特征； 
3. 将这些小段落组成对话切分成100、300、500字的小对话集，与上面欺诈类别数据的处理一致； 
4. 对于非欺诈类数据，就不需要走gpt打标签，直接用程序脚本将所有非欺诈类数据打成反向标签，目的是为了节省成本； 


最后，将这两类正、反向数据合并，为了数据标签分布的均衡，采用欠采样的方式减少多数类别的数据量，最后按照8:1:1的比例拆分成训练集、验证集和测试集，得到最终的训练和评测数据。

## 模型评测方法

对于这个模型的指标评测，我们主要是对模型输出的三个字段信息进行评测：是否欺诈、欺诈者识别、分析理由。

#### 是否欺诈
是否欺诈是一个二分类问题，我们使用混淆矩阵来评估其表现。具体包括精确率（Precision）和召回率（Recall）。

将所有数据数据的`正确标签类别`和模型的`预测标签类别`进行`比对`，可以得到4类结果，分别是真正例（True Positive）、假正例（False Positive）、真负例（True Negative）和假负例（False Negative）, 我们对这4类结果分别进行统计，就可以得到真正、假正、真负、假负这四类结果的统计数字，精确率和召回率就可以根据这4个数字进行计算，方法如下：
- precision:精确率，表示预测为正的结果中有多少是真的正值，计算公式为：精确率=真正/(真正+假正）
- recall：召回率，表示标签中为正的数据有多少被成功预测召回，计算公式为：召回率=真正/(真正+假负）

#### 欺诈者识别
发言者识别是一个多分类问题，在一篇对话中可能有多个发言者，模型的任务是从中找出哪个发言者是欺诈者。我们主要使用准确率（Accuracy）来评估模型的表现，通过比较模型预测的欺诈者与训练数据中的实际欺诈者，就可以判断预测是否准确。

#### 分析理由生成
分析理由的生成属于文本生成任务，业界常用ROUGE指标来评估生成文本的质量。我们需要先将生成的文本拆分成词序列，通过计算生成文本与参考文本之间词或短语的重叠度，来衡量两个文本的相似程度。例如：如果4个词中有3个词重叠，那么召回率就是30%。

这些评测指标数据帮助我们不断评估和改进模型的训练结果，从而指导模型的优化。

## 模型的局限性和可能偏差

我们的文本欺诈分类检测模型是基于欺诈对话集进行训练的，在现有数据上表现良好，但仍然存在一定的局限性，主要体现在以下几个方面：

1. **数据集的局限性**：由于我们没有获得足够丰富的真实欺诈对话数据，训练数据是由AI生成的模拟对话。这些生成对话和真实对话之间可能存在差距，影响模型在真实场景中的表现。

2. **评测结果差异**：由于训练数据和真实数据之间的差异，模型在实际欺诈对话检测中的表现可能与训练结果存在一定的差距。

为了解决这些问题，我们计划在实际使用过程中不断收集真实的欺诈对话数据，并在积累到足够的数据后，对模型进行微调和改进，以提高其在真实场景中的准确性和可靠性。
