DeepSeek-R1+ML混合欺诈检测
本文介绍如何将传统ML与DeepSeek-R1推理引擎结合以提高欺诈检测效率。

在数字交易占主导地位的时代,欺诈已成为一种复杂且无处不在的威胁。到2026年,全球欺诈损失预计将达到430亿美元,仅在美国,每14秒就发生一起身份盗窃案。随着犯罪分子利用人工智能(AI)发起前所未有的攻击,企业面临一个紧迫的问题:他们如何才能在这场高风险竞赛中保持领先?
今天,我们将探讨当配备传统的机器学习模型和推理大型语言模型引擎时,AI代理如何使欺诈检测更加可解释和稳健。
欺诈挑战的日益增长
请考虑这些惊人的统计数据:
- 1.34亿美国人将在其一生中经历信用卡欺诈。
- 网络钓鱼攻击持续上升至2024年。2024年第三季度看到932,923次攻击,比第二季度的约877,536次有所增加。
- 深度伪造诈骗已经从企业中榨取了数百万美元,使用合成声音模仿CEO授权欺诈性转账。
这是一场军备竞赛:欺诈者正在利用AI驱动的卡测试扩大业务规模,逃避检测,并利用零日漏洞,而防御者(好人)需要同样或更好的自适应工具来保持领先一步。
问题在于,欺诈者正在以比机构更快的速度进行调整,而遗留系统正努力跟上步伐。这些系统的主限制是:
- 基于规则的引擎:僵化的“如果-则”逻辑无法应对新颖的攻击模式。
- 机器学习:虽然ML模型擅长检测已知的欺诈模式,但它们是“黑盒”,无法解释决策。更糟糕的是,它们在数据漂移——交易行为的变化使得历史数据过时时表现不佳。
1、自主AI的兴起
AI代理是能够推理、学习和行动的自主系统,使用API和数据库等工具。与静态ML模型不同,它们可以:
- 分析上下文:交叉引用交易与用户历史记录、位置和市场趋势。
- 自我改进:使用强化学习(RL)来适应新威胁。
- 解释决策:生成易于理解的报告(例如,“凌晨2点在用户家34英里外的城市花费316美元购买杂货是可疑的”)。
- 行为分析:检测微妙的红旗(例如,仓促的结账流程,账单地址与发货地址不匹配)。
对于本文,我们将为代理配备一个传统的ML模型以及一个推理引擎,以便更好地解释交易。

2、训练机器学习模型
为了训练我们的ML模型,我们将使用Kaggle上公开的信用卡交易数据。该数据集包含超过一百万笔欺诈和非欺诈信用卡交易。
接下来,我们将简要解释训练ML模型的步骤:
- 第一步是删除任何不必要的特征,如名字、姓氏、出生日期等。
- 接下来,我们标记并编码文本特征,如商户名称、类别和街道。
- 最后,我们缩放特征,定义预测标签(is_fraud=0或1),将数据拆分为训练集和测试集,并训练机器学习模型孤立森林。
确保在最后保存模型,以便稍后由我们的代理作为工具使用。
# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
import joblib
from sklearn.metrics import classification_report
# 保存训练好的模型到文件
# 加载数据集
data = pd.read_csv('Fraud/fraudTrain.csv')
data.head()
data.drop_duplicates()
# 删除任何无用的列(例如,交易ID)
data = data.drop(columns=["Unnamed: 0", "first", "last", "state", "city_pop", "job", "dob"])
# 对分类变量进行编码
# 标签编码二进制分类特征(例如,性别)
encoder = LabelEncoder()
data["merchant"] = encoder.fit_transform(data["merchant"])
data["category"] = encoder.fit_transform(data["category"])
data["street"] = encoder.fit_transform(data["street"])
data["trans_num"] = encoder.fit_transform(data["trans_num"])
data["city"] = encoder.fit_transform(data["city"])
data["gender"] = encoder.fit_transform(data["gender"])
data["trans_date_trans_time"] = encoder.fit_transform(data["trans_date_trans_time"])
# 保存编码器(这将在预测期间允许加载它)
joblib.dump(encoder, 'label_encoder.pkl')
# 将特征(X)和目标变量(y)分开
X = data.drop(columns=['is_fraud'])
y = data['is_fraud']
# 将数据拆分为训练集和测试集(70%训练,30%测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 缩放数值特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
joblib.dump(scaler, 'scaler.pkl')
X_test_scaled = scaler.transform(X_test)
from sklearn.ensemble import IsolationForest
# 训练孤立森林模型(假设1%的欺诈案例,因此设置污染率)
model = IsolationForest(contamination=0.03, random_state=42)
model.fit(X_train_scaled)
# 在测试集上进行预测
# 孤立森林返回-1表示异常(欺诈),1表示正常交易
y_pred = model.predict(X_test_scaled)
# 转换预测(-1表示欺诈 -> 1,1表示非欺诈 -> 0)
y_pred = [1 if x == -1 else 0 for x in y_pred]
print(classification_report(y_test, y_pred))
joblib.dump(model, 'fraud_model.pkl')
让我们测试一下模型在一个样本交易上的效果:
# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
import joblib
import json
from sklearn.metrics import classification_report
# 从文件加载保存的模型
model = joblib.load('fraud_model.pkl')
# 加载数据集
transaction = '''{
"trans_date_trans_time": "2019-12-09 03:23:21",
"cc_num": 2266735643685262,
"merchant": "Koepp-Parker",
"category": "grocery_pos",
"amt": 316.82,
"first": "Carlos",
"last": "Chung",
"gender": "M",
"street": "8957 Russell Key",
"city": "Grant",
"state": "AL",
"zip": 35747,
"lat": 34.4959,
"long": -86.259,
"city_pop": 5901,
"job": "Curator",
"dob": "1972-07-25",
"trans_num": "1e787b206a1a9154a5f397dfaa6f6b40",
"unix_time": 1355023401,
"merch_lat": 35.177042,
"merch_long": -86.942305
}
'''
# 将JSON字符串转换为字典
transaction_data = json.loads(transaction)
transaction_data = {key: value for key, value in transaction_data.items() if key not in ["first", "last", "state", "city_pop", "job", "dob","is_fraud"]}
df = pd.DataFrame([transaction_data])
# 应用与训练期间相同的预处理:
encoder = joblib.load('label_encoder.pkl')
#encoder = LabelEncoder()
# 对分类变量进行编码
df["merchant"] = encoder.fit_transform(df["merchant"])
df["category"] = encoder.fit_transform(df["category"])
df["street"] = encoder.fit_transform(df["street"])
df["trans_num"] = encoder.fit_transform(df["trans_num"])
df["city"] = encoder.fit_transform(df["city"])
df["gender"] = encoder.fit_transform(df["gender"])
df["trans_date_trans_time"] = encoder.fit_transform(df["trans_date_trans_time"])
scaler = joblib.load('scaler.pkl')
# 缩放数值特征(使用与训练期间相同的缩放器)
df_scaled = scaler.transform(df)
# 使用训练好的模型预测交易是否欺诈
y_pred = model.predict(df_scaled)
#print(y_pred)
# 转换预测(-1表示欺诈 -> 1,1表示非欺诈 -> 0)
is_fraud = 1 if y_pred[0] == -1 else 0
print(f"欺诈交易: {is_fraud}")
欺诈交易: 0
3、设置用于分析交易的LLM
接下来我们要为代理配备一个推理LLM,该LLM将根据交易细节和以前的购买历史分析交易并确定其是否欺诈。
我们将使用Deepseek模型作为LLM,因为它具有较长的思维链和先进的推理能力(有关更多信息,请参阅此基准测试:检查此基准测试):

为了本教程,我们将使用UbiAI平台上的DeepSeek-R1-Distill-Llama-70B API。使用UbiAI,我们可以记录和评估每个查询的LLM响应,这对于稍后使用强化学习改进模型至关重要。

确保设置monitor_model: True以便能够跟踪每个查询的模型响应。
让我们在UbiAI游乐场中测试一下模型:

看起来工作正常,以下是Deepseek模型的完整响应:
<think>
好吧,我需要分析这笔信用卡交易以确定其是否欺诈。让我一步一步地分析。
首先,交易日期和时间是2019年12月8日,00:26:16。这是很晚的时间,几乎是午夜。我想知道持卡人通常是否会在这样的时间购物。如果Carlos Chung通常在白天购物,这可能是一个红旗。
信用卡号是2266735643685262。我不知道这张卡是否被报告为被盗或与任何先前的欺诈相关联,但这值得检查。也许看看最近是否有任何未经授权的交易在这张卡上。
商户是"Bogisich Inc",类别是"grocery_pos",我假设这意味着一家杂货店的销售点。283.51美元的杂货店购买并不太不寻常,但取决于Carlos的通常消费习惯。如果他通常在杂货店花费大约这个金额,这可能是正常的,但如果他通常花费较少,这可能是可疑的。
查看位置详情,交易地点在Grant, AL,邮政编码为35747。纬度和经度是34.4959, -86.259。商户的位置是35.189602, -86.344231。我应该检查这些位置是否合理。如果Carlos在或接近Grant, AL附近的时间进行交易,这可能是合法的。但如果他在其他地方,特别是在远离的地方,那就有问题了。
持卡人的个人信息:Carlos Chung,男性,生于1972年7月25日。他的工作是策展人,这可能意味着他有稳定的收入,但这不一定意味着不是欺诈。他的地址是8957 Russell Key,Grant, AL。我应该验证这是否与存档的账单地址相符。
交易编号是"1dac0908859f67f9d27638bc11df5119",Unix时间是1354926376。我可以将其Unix时间转换为日期以进行交叉验证。让我快速做一下。Unix时间1354926376对应于2012年12月8日。等等,这很奇怪,因为交易日期是2019-12-08。这里有一个不一致。Unix时间来自2012年,但交易日期是2019年。这没有意义。可能是数据输入错误,但值得注意。
城市人口是5901,这是一个相当小的数字。如果Carlos住在小镇上并且在当地购物,交易可能是正常的。但如果他来自一个更大的城市,这可能会显得异常。
综合来看,主要的红旗是交易时间较晚和Unix时间不匹配。金额不是太高,但时间和位置需要检查。如果Carlos不在Grant, AL,或者如果Unix时间正确但与交易日期不符,这可能表明欺诈。我也应该检查卡片的历史,看看是否有任何其他可疑活动。
我认为我会给这次交易一个欺诈分数为3。有一些可疑点,但在没有更多背景信息的情况下,这不是一个明确的欺诈。值得进一步调查,特别是时间和地点的不一致性。
</think>
**欺诈分析和建议**
**交易概述:**
- **日期和时间:** 2019年12月8日,00:26:16(深夜)
- **商户:** Bogisich Inc(杂货店)
- **金额:** 283.51美元
- **位置:** Grant, AL(邮政编码35747)
- **持卡人:** Carlos Chung
**识别出的红旗:**
1. **交易时间较晚:** 购买发生在午夜附近,如果持卡人通常在白天购物,这可能是红旗。
2. **Unix时间不匹配:** Unix时间对应于2012年12月8日,而不是2019年,表明可能存在错误或操纵。
**调查建议:**
- 验证持卡人在交易日期的位置。
- 检查卡片历史记录中是否有类似的深夜交易。
- 调查Unix时间不匹配的原因。
- 将交易地点与持卡人的已知行踪进行交叉核对。
**欺诈评分:** 3/5
- 交易有一些可疑元素,特别是时间和日期不一致,需要进一步调查。然而,在没有更多背景信息的情况下,这并不明确是欺诈。
**结论:**
尽管交易引起了一些担忧,特别是关于时间和日期的一致性问题,但需要进一步调查以确定其是否欺诈。
交易分析详细地识别了交易时间较晚、比较商户位置和持卡人位置以及金额。然而,我们需要提供其历史交易以提高分析质量。
4、设置欺诈检测AI代理
有几个平台可以让您构建AI代理,例如crewai、relevance.ai、n8n、langflow等。但对于本教程,我们将使用Kudra AI创建代理,因为它能够处理多种文档类型(PDF、TXT、HTML等)并允许用户上传创建文档数据库,供代理使用:

第一步是上传历史交易,代理可以使用这些交易进行分析。在Kudra中,我们可以通过上传txt文件到代理项目中来实现这一点,如图所示。
接下来,我们需要创建两个工具:
- Fraud_detector_ML: 传统ML模型API,用于预测交易是否欺诈
- Transaction_explanator: LLM推理引擎API,用于根据当前交易和购买历史判断交易是否欺诈。
在Kudra中,我们将这两个API连接为工具到代理。我们可以添加其他工具来帮助代理进一步调查,例如Google地图API来定位商户位置,网站抓取器来获取有关商户的信息等。但为了本教程的目的,我们只给它两个工具。
5、可解释性的力量
为了测试代理,我们将测试这个特定交易及其10个最近的购买记录:
{ “trans_date_trans_time”: “2019–12–09 03:23:21”, “cc_num”: 2266735643685262, “merchant”: “Koepp-Parker”, “category”: “grocery_pos”, “amt”: 316.82, “first”: “Carlos”, “last”: “Chung”, “gender”: “M”, “street”: “8957 Russell Key”, “city”: “Grant”, “state”: “AL”, “zip”: 35747, “lat”: 34.4959, “long”: -86.259, “city_pop”: 5901, “job”: “Curator”, “dob”: “1972–07–25”, “trans_num”: “1e787b206a1a9154a5f397dfaa6f6b40”, “unix_time”: 1355023401, “merch_lat”: 35.177042, “merch_long”: -86.942305}
以下是AI代理输出的截图:

我们可以看到代理首先调用了第一个工具 Fraud_detector_ML 然后是第二个工具 Transaction_explanator.
以下是预测ML模型的输出:{‘is_fraud’: 0}。这意味着交易不是欺诈。
然而,如果你查看LLM推理器的输出,我们会看到不同的故事:
欺诈分析报告
交易详情:
日期与时间: 2019年12月9日,3:23:21
商户: Koepp-Parker
类别: 杂货
金额: $316.82
位置: 35.177042, -86.942305(距离家约34英里)
分析: *1.*交易时间: *交易发生在清晨,可能不寻常,但没有额外的背景信息,不能作为欺诈的确凿证据。 2.*金额: *金额显著高于普通交易,大多数低于100美元。
前一次大额购买为311.70美元,属于娱乐类别,使这次杂货购买显得特别。 3.*商户类别: *类别不同于前一次大额交易,引发了关于购买性质的疑问。 4.*位置: 商户位于持卡人家34英里之外,这是一个显著的距离,与过去交易地点不符。
结论: 高金额、不同的商户类别和远距离位置的组合表明可能存在欺诈活动。
虽然可能有正当理由,但这些异常情况值得进一步调查。
建议: 标记为潜在欺诈。
LLM的报告包括:
- 时间分析(“交易发生在清晨,可能不寻常”)。
- 地理位置差异(分析商户和持卡人之间的距离约为34英里)。
- 金额(高于普通交易的金额)。
分析非常详尽,将当前交易细节与已知交易进行比较,并找出差异。
最终建议标记交易为欺诈,这与传统的黑盒ML模型的结果相矛盾。
此时,我们有两个相互矛盾的信息,可以借助更多的工具或引入人工审核来解决这一矛盾。
通过在传统ML模型中加入推理LLM引擎,我们已经:
- 减少了传统ML模型的黑盒特性
- 添加了额外的LLM推理验证层
- 提高了系统的整体效率
下一步,我们可以甚至添加多个代理协同工作,以提供更精确的建议,因为多代理系统的表现优于单个代理已被证明。
需要注意的是,通用LLM由于其生成性质而不一致且不可靠(与传统的预测ML相反)。例如,我将相同的交易输入10次,其中两次输出为“未欺诈”。这是生成AI领域常见的问题,需要通过强化学习进行微调,我们将在下一节讨论。
6、LLM追踪、评估和强化学习
持续监控
由于其生成性质,LLM以其不一致性和不可靠性著称。从可靠性的角度来看,记录和监控LLM交互至关重要,原因如下:
- 分析输入/输出以测量任何数据漂移
- 查找输出中的任何异常
- 使用人类或其他LLM作为裁判对LLM响应进行评级,收集奖励数据,用于通过强化学习训练改进模型。
使用UbIAI,每个API调用都会在“监控”部分中记录输入/输出。


用户可以根据输入/输出对LLM响应进行准确或不准确的评级。使用UbIAI的LLM作为裁判功能,我们可以创建提示并设置输出轨道,以自动设置我们关心的任何指标,如“幻觉”、“真实性”、“事实性”等。

使用另一个LLM评估LLM响应具有显著优势:
- 可扩展性:LLM可以迅速处理大量数据,使其成为大规模评估的理想选择,而这对人类审查员来说是不切实际或不可能的。
- 成本效益:与人类评估相比,LLM裁判更具经济性,尤其是在进行广泛的评估任务时。
- 灵活性:提示可以轻松调整以评估各种标准,从有用性到品牌语音一致性,无需重新训练模型。
- 多语言能力:LLM裁判可以轻松跨多种语言进行评估。
强化学习
使用人类或LLM收集的奖励数据,我们可以使用强化学习(RL)来调整LLM的行为以实现期望的目标,平衡多个目标,如准确性、真实性和时效性。
这将是下一篇文章的主题。
7、结束语
虽然传统的机器学习模型在检测已知欺诈模式方面非常有效,但它们往往作为黑盒操作,缺乏解释决策的能力。通过将基于推理的LLM与传统ML模型相结合,AI代理提供了更透明、适应性强和高效的欺诈检测方法。
我们的探索展示了这种混合方法如何在几个关键方面增强欺诈检测:
- 提高可解释性:LLM组件增加了背景和推理,使欺诈检测决策更容易被调查人员和合规团队理解。
- 提高准确性:AI代理交叉引用交易细节与历史数据,发现单独ML模型可能忽略的异常。
- 持续适应:通过实施强化学习和监控LLM性能,企业可以微调其欺诈检测系统以应对不断演变的威胁。
- 人工参与集成:能够将模糊案件标记给人类审核,确保自动化与专家监督之间的平衡。
尽管取得了进展,但仍存在挑战——LLM的响应变化无常,需要持续监控和微调以确保一致性。多代理系统和强化学习可以进一步提高欺诈检测的准确性,同时减少误报。
汇智网翻译整理,转载请标明出处