ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Agentic LLM的短信诈骗检测:从原理到工程实践

基于Agentic LLM的短信诈骗检测:从原理到工程实践 1. 项目概述当大语言模型成为“反诈猎人”最近在安全研究圈里一个名为“FraudSMSWalker”的项目引起了我的注意。这个标题直译过来是“欺诈短信行者”听起来像是个工具但它的副标题“Benchmarking Agentic Large Language Models for SMS-to-Webpage Fraud Detection”揭示了其更核心的使命为“智能体化”的大语言模型在“短信到网页”的欺诈检测任务上建立一个基准测试平台。简单来说它要解决一个非常现实且棘手的问题我们每天都会收到大量短信其中混杂着各种诈骗链接。传统的规则引擎或关键词过滤在诈骗手法日益翻新、话术千变万化的今天已经力不从心。而大语言模型LLM展现出了强大的语义理解和推理能力似乎是个理想的解决方案。但问题来了如何让LLM不只是“看懂”短信还能像侦探一样主动“走”完从点击链接、访问网页、分析内容到最终判断是否为诈骗的整个链条这就是“Agentic”智能体化的含义——赋予LLM自主执行复杂任务的能力。FraudSMSWalker项目正是为了系统性地评估不同的LLM在被赋予智能体能力后在这场“猫鼠游戏”中到底有多强的实战表现它不仅仅是一个检测工具更是一个严谨的“考场”和“标尺”用于衡量和比较各类Agentic LLM方案在真实世界反诈场景下的准确性、效率和可靠性。对于从事AI安全、风控算法、LLM应用落地的开发者和研究者而言这个项目提供了一个宝贵的框架和数据集让我们能避开盲目试错直接聚焦于最有效的技术路径。2. 核心设计思路构建一个动态的“欺诈沙盒”FraudSMSWalker的设计精髓在于模拟了一个完整的、动态的“用户-诈骗者”交互环境。它不是一个静态的分类器而是一个允许智能体自主探索的仿真世界。其核心思路可以拆解为以下几个关键层面。2.1 任务定义从单点判断到过程推理传统的欺诈检测模型通常将任务简化为一个二分类问题输入一条短信文本输出“欺诈”或“非欺诈”。这种方式忽略了欺诈的本质是一个多步骤的诱导过程。一条看似无害的“您的包裹已到达请点击链接查收”短信其危险性只有在用户点击链接后进入一个仿冒的物流网站并被要求输入个人信息或支付小额费用时才完全暴露。因此FraudSMSWalker将任务重新定义为“SMS-to-Webpage”的端到端检测。智能体的任务目标是接收接收一条短信SMS。决策判断是否需要以及是否安全点击其中的链接这本身就需要推理。导航如果决定点击则模拟浏览器访问该链接指向的网页。分析解析网页内容HTML、文本、图片OCR信息等。综合判断结合短信上下文和网页内容给出最终的欺诈风险评估并给出推理依据。这个设计迫使模型必须进行多步推理和外部工具调用如浏览器模拟完美契合了“智能体”的核心概念。2.2 智能体架构设计工具调用与记忆循环要让LLM扮演好这个“反诈猎人”的角色需要为其设计一个强大的智能体架构。FraudSMSWalker的基准测试很可能考察以下几种主流范式ReActReasoning Acting框架这是目前最流行的智能体范式之一。模型会在“思考”Reasoning和“行动”Acting之间循环。例如思考这条短信声称来自银行但发送号码是个人手机号这很可疑。我需要访问链接以确认网站真实性。行动调用navigate_to_url(link)工具。思考网页标题是“XX银行登录”但域名是“login-xx-bank.xyz.com”与官方域名不符。页面存在一个紧急要求更新密码的表单。行动调用analyze_webpage_content()工具提取表单特征。最终判断这是一个网络钓鱼诈骗。这种框架的优势在于其决策过程透明、可解释。基于LangChain / LlamaIndex的智能体利用这些成熟的框架快速搭建智能体集成网页抓取、内容解析等工具链。基准测试会评估不同框架在任务编排、错误处理方面的便捷性和稳定性。反思与进化Reflective Evolution这与网络热词“reevo: large language models as hyper-heuristics with reflective evolution”的理念相关。智能体不仅执行任务还会在任务结束后或遇到失败时进行“反思”总结错误原因并动态调整后续的策略或提示词Prompt。例如第一次访问某个钓鱼网站时被复杂的跳转迷惑了反思后学会优先检查网站的SSL证书信息和域名注册时间。这种具备“元认知”能力的智能体在应对新型、变种诈骗时更具鲁棒性。2.3 基准数据集构建真实性与多样性的平衡一个可靠的基准其数据集的质量至关重要。FraudSMSWalker需要构建一个包含以下要素的数据集短信样本收集大量真实的诈骗短信和正常短信如营销、验证码、通知等。诈骗短信需覆盖常见类型假冒银行、假冒物流、假冒政府机构、中奖诈骗、贷款诈骗等。关联网页这是项目的难点和核心价值所在。对于诈骗短信中的链接需要安全地获取并归档其指向的网页快照。由于诈骗网页存活时间短可能需要使用沙箱环境进行隔离访问和保存。对于正常短信的链接则需获得对应的合法网页如电商订单页、银行公告页等。标注信息每条“短信-网页”对应一个黄金标准标签欺诈/非欺诈以及详细的欺诈类型、风险点标注如域名欺诈、内容欺诈、表单钓鱼等。对抗性样本包含一些难以区分的样本例如高级钓鱼域名与官方极其相似如apple.comvsapp1e.com网页外观高度仿冒。上下文缺失诈骗短信本身无害如“这是您要的照片”但链接指向恶意网站。短链接跳转短信内是bit.ly等短链接需要智能体解析跳转后的最终目的地。这个数据集的建设本身就是一个巨大的工程挑战但它为客观评估智能体能力提供了基础。3. 核心模块与技术实现拆解要实现上述设计FraudSMSWalker平台包含多个关键的技术模块。下面我们来逐一拆解其可能的实现方式与核心考量。3.1 环境模拟器安全可控的“浏览器沙箱”智能体需要与网页交互但直接让AI控制真实浏览器访问潜在恶意链接是危险且不可控的。因此一个安全的网页环境模拟器是基础设施。技术选型通常会采用无头浏览器Headless Browser技术如PuppeteerNode.js或Playwright支持多语言。它们能完全模拟用户浏览行为点击、滚动、输入并捕获完整的DOM树、网络请求、Console日志甚至截图。安全隔离模拟器必须在严格的沙箱Docker容器中运行确保任何恶意脚本不会逃逸到主机系统。每次任务执行后容器会被彻底销毁和重建。状态管理模拟器需要为每个智能体任务维护独立的浏览器会话、Cookie和本地存储状态以模拟真实用户的访问轨迹。注意处理钓鱼网站时绝对避免在沙箱环境中填入真实的用户凭证即使是为了测试。应使用生成的假数据或完全避免与表单交互仅做内容分析。3.2 工具集封装智能体的“武器库”智能体通过调用工具来扩展能力。FraudSMSWalker需要封装一套标准化的工具API供不同LLM智能体调用navigate_to_url(url: str)核心导航工具。触发模拟器访问指定URL并返回页面加载状态成功/失败/重定向、最终URL、页面标题等元数据。extract_page_content()内容提取工具。返回网页的主要文本内容经过清理、所有链接a href、图片的Alt文本、以及所有表单form的字段信息。这里涉及HTML解析如用BeautifulSoup和简单的JavaScript渲染处理。analyze_domain(url: str)域名分析工具。调用Whois查询API获取域名注册信息如注册时间、注册商检查域名与声称机构的官方域名是否相似计算编辑距离或使用预训练的域名拼写变异检测模型。take_screenshot()视觉捕捉工具。返回网页截图。这对于检测那些通过图片显示文本以绕过文本分析的诈骗页面至关重要。可以进一步集成OCR工具如Tesseract从图片中提取文字。check_ssl_certificate(url: str)安全工具。检查网站的SSL证书是否有效、是否由受信机构签发、证书主体域名是否匹配。这些工具被定义成标准的函数并通过一个统一的“工具调用”接口暴露给LLM。LLM根据其推理决定在何时调用何种工具并解析工具的返回结果以进行下一步决策。3.3 智能体提示工程定义“猎人”的思维模式提示词Prompt是引导LLM行为的关键。对于反诈智能体其系统提示词System Prompt需要精心设计包含以下要素角色定义“你是一个专业的网络安全分析师负责调查可疑短信中的链接。”任务目标“你的目标是判断该短信及其链接是否构成欺诈。你必须通过安全地访问和分析链接指向的网页来辅助判断。”可用工具清晰列出所有可用的工具及其功能、输入输出格式。推理格式要求强制要求LLM以“Thought: ... Action: ... Observation: ...”的ReAct格式输出确保思维过程可追溯。安全与伦理约束“你不得执行任何可能危害系统的操作不得在网页中输入真实个人信息。”欺诈特征知识注入一些常见的欺诈模式知识例如“警惕域名中包含连字符或数字的仿冒网站”、“官方机构通常不会通过短信索要密码或验证码”、“中奖诈骗通常要求提前支付税费”。不同的LLM如GPT-4、Claude、Gemini、开源Llama系列对同一提示词的反应不同这也是基准测试需要比较的重点之一。3.4 评估指标体系超越准确率的全面衡量评估一个反诈智能体不能只看分类准确率。FraudSMSWalker需要一套多维度的评估指标指标类别具体指标说明有效性检测准确率 (Accuracy) / F1分数最基本的分类性能。召回率 (Recall)尤其重要衡量找出所有诈骗的能力漏报成本极高。精确率 (Precision)衡量报警的准确度误报过多会影响用户体验。效率平均任务完成时间从接收短信到给出最终判断的总耗时。平均工具调用次数反映智能体完成任务所需的步骤复杂度。每次工具调用的耗时分析瓶颈在于LLM推理还是工具执行。可靠性任务完成率智能体能否在规定的步骤内如最多10步得出确定结论而非陷入循环或失败。推理链的合理性人工或辅助模型评估其“Thought”是否逻辑连贯、基于证据。成本总Token消耗量结合输入提示词、观察结果和输出思考、行动估算每次查询的API成本。通过这套指标体系我们可以全面回答哪个模型在效果、速度和成本上取得了最佳平衡哪种智能体架构如ReAct vs 反思进化更适合动态对抗场景4. 实操构建与核心环节实现假设我们现在要基于FraudSMSWalker的思路搭建一个简易的基准测试原型。以下是一个可能的实现流程和核心代码环节。4.1 环境准备与依赖安装首先我们需要建立一个Python环境并安装核心库。# 创建虚拟环境 python -m venv fraud_env source fraud_env/bin/activate # Linux/Mac # fraud_env\Scripts\activate # Windows # 安装核心依赖 pip install openai # 或 anthropic, google-generativeai 取决于使用的LLM API pip install playwright # 网页自动化与模拟 playwright install chromium # 安装浏览器驱动 pip install beautifulsoup4 # HTML解析 pip install requests # 网络请求 pip install python-whois # 域名信息查询 pip install pillow pytesseract # 截图与OCR可选用于高级分析4.2 网页沙箱模拟器实现我们使用Playwright来实现一个简单但安全的页面内容获取器。import asyncio from playwright.async_api import async_playwright import logging class SafeWebpageFetcher: def __init__(self, timeout30000): self.timeout timeout logging.basicConfig(levellogging.INFO) async def fetch(self, url): 安全地获取网页内容返回文本、链接和元数据 async with async_playwright() as p: # 启动浏览器建议使用无头模式并可配置沙箱参数 browser await p.chromium.launch(headlessTrue, args[--no-sandbox, --disable-setuid-sandbox]) context await browser.new_context( viewport{width: 1920, height: 1080}, user_agentMozilla/5.0 ... # 模拟真实浏览器UA ) page await context.new_page() try: # 导航至目标URL监听请求和响应 response await page.goto(url, wait_untilnetworkidle, timeoutself.timeout) final_url page.url status response.status if response else 404 # 获取页面核心内容 # 1. 文本内容通过选择器排除脚本、样式等 content await page.evaluate( () { const body document.body; // 简单的文本提取可替换为更复杂的Readability算法 return body.innerText; } ) # 2. 所有链接 links await page.evaluate( () Array.from(document.querySelectorAll(a)).map(a ({ href: a.href, text: a.innerText.substring(0, 100) })) ) # 3. 页面标题 title await page.title() await browser.close() return { success: True, final_url: final_url, status_code: status, title: title, content: content[:5000], # 限制长度避免上下文过长 links: links[:20], # 取前20个链接 message: Page fetched successfully } except Exception as e: logging.error(fError fetching {url}: {e}) await browser.close() return { success: False, final_url: url, error: str(e), message: Page fetch failed } # 同步调用封装 def fetch_webpage_sync(url): loop asyncio.new_event_loop() asyncio.set_event_loop(loop) fetcher SafeWebpageFetcher() result loop.run_until_complete(fetcher.fetch(url)) loop.close() return result4.3 智能体执行引擎与LLM集成这里我们以OpenAI API和ReAct模式为例展示核心循环。import openai import json import re class FraudDetectionAgent: def __init__(self, llm_client, tools, system_prompt): self.llm llm_client self.tools tools # 工具字典键为工具名值为可调用函数 self.system_prompt system_prompt self.conversation_history [] def run(self, sms_text): 运行智能体处理一条短信 # 初始化用户消息 user_input f请调查以下短信\n{sms_text} self.conversation_history [{role: system, content: self.system_prompt}] self.conversation_history.append({role: user, content: user_input}) max_steps 10 for step in range(max_steps): # 1. 调用LLM获取下一步的思考和行动 response self.llm.chat.completions.create( modelgpt-4, messagesself.conversation_history, temperature0.1, # 低温度保证决策稳定 ) assistant_message response.choices[0].message.content self.conversation_history.append({role: assistant, content: assistant_message}) # 2. 解析响应提取 Thought 和 Action thought, action_json self._parse_react_response(assistant_message) print(fStep {step1}:) print(fThought: {thought}) # 3. 检查是否已做出最终判断 if FINAL_ANSWER in assistant_message.upper(): final_answer assistant_message.split(FINAL_ANSWER:)[-1].strip() print(fFinal Judgment: {final_answer}) return final_answer # 4. 执行行动工具调用 if action_json: tool_name action_json.get(action) tool_input action_json.get(input, {}) if tool_name in self.tools: print(fAction: Calling {tool_name} with {tool_input}) # 实际调用工具 observation self.tools[tool_name](**tool_input) obs_text fObservation: {observation} print(obs_text) # 将观察结果加入历史供LLM下一轮推理 self.conversation_history.append({role: user, content: obs_text}) else: error_msg fObservation: Tool {tool_name} not found. self.conversation_history.append({role: user, content: error_msg}) else: # 如果没有解析出行动可能LLM还在“思考”继续循环 continue return ERROR: Max steps reached without final answer. def _parse_react_response(self, text): 一个简单的ReAct格式解析器 thought_match re.search(rThought:\s*(.*?)(?\nAction:|$), text, re.DOTALL) thought thought_match.group(1).strip() if thought_match else action_match re.search(rAction:\s*(\{.*?\}), text, re.DOTALL) action_json None if action_match: try: action_json json.loads(action_match.group(1)) except json.JSONDecodeError: action_json {action: parse_error, input: {raw: action_match.group(1)}} return thought, action_json # 工具函数示例 def tool_navigate_to_url(url): 工具导航到URL并获取基本信息 result fetch_webpage_sync(url) # 返回结构化的观察结果 return json.dumps({ final_url: result.get(final_url), title: result.get(title), status: result.get(status_code), content_preview: result.get(content, )[:500] # 只返回预览 }, ensure_asciiFalse) def tool_analyze_domain(url): 工具分析域名信息简化版 from urllib.parse import urlparse domain urlparse(url).netloc # 这里可以集成whois查询此处仅作演示 is_suspicious any(x in domain for x in [-, 123, secure-login]) return json.dumps({domain: domain, suspicious_indicators: is_suspicious}, ensure_asciiFalse) # 初始化智能体 client openai.OpenAI(api_keyyour-api-key) tools { navigate_to_url: tool_navigate_to_url, analyze_domain: tool_analyze_domain, } system_prompt 你是一个反诈骗AI助手。请以以下格式逐步推理和行动 Thought: 你对当前情况的分析。 Action: 一个JSON对象包含要调用的工具名和输入参数例如 {action: navigate_to_url, input: {url: https://example.com}}。 ...这个循环可以重复多次 当你拥有足够信息做出最终判断时请输出 FINAL_ANSWER: [你的判断例如这是诈骗因为...] 或 [这是正常信息因为...] 可用工具 1. navigate_to_url(url): 访问给定URL并返回页面基本信息。 2. analyze_domain(url): 分析URL的域名是否可疑。 调查时请关注短信发送方与链接域名是否一致、网站是否仿冒官方、内容是否索要敏感信息等欺诈特征。 agent FraudDetectionAgent(client, tools, system_prompt) # 测试运行 sms 【XX银行】您的账户存在异常请立即登录 www.xx-bank-security.com 验证身份否则将冻结账户。 result agent.run(sms)4.4 基准测试流水线搭建最后我们需要一个自动化的流水线来批量测试不同LLM或不同提示词下的智能体表现。import pandas as pd import time from typing import Dict, Any class BenchmarkRunner: def __init__(self, dataset_path, agent_factory): dataset_path: 包含sms, url, label的CSV文件路径 agent_factory: 一个函数能返回一个新的智能体实例 self.dataset pd.read_csv(dataset_path) self.agent_factory agent_factory self.results [] def run_evaluation(self, num_samples50): 在数据集子集上运行评估 test_data self.dataset.sample(min(num_samples, len(self.dataset))) for idx, row in test_data.iterrows(): sms row[sms] true_label row[label] url row[url] # 可能用于初始化或验证 print(f\n--- Sample {idx}: {sms[:50]}... ---) # 为每个样本创建一个新的智能体实例确保状态隔离 agent self.agent_factory() start_time time.time() try: # 运行智能体。注意我们只给短信URL需要智能体自己从短信中提取或决定访问。 # 更复杂的基准测试会提供URL或测试其提取URL的能力。 pred_answer agent.run(sms) elapsed_time time.time() - start_time # 简单解析最终答案判断预测标签实际应用中需要更复杂的解析 pred_label 1 if 诈骗 in pred_answer or 欺诈 in pred_answer else 0 # 记录结果 self.results.append({ id: idx, sms: sms, true_label: true_label, pred_label: pred_label, pred_answer: pred_answer, time_elapsed: elapsed_time, correct: (pred_label true_label) }) except Exception as e: print(fError processing sample {idx}: {e}) self.results.append({ id: idx, sms: sms, true_label: true_label, pred_label: None, pred_answer: fERROR: {e}, time_elapsed: time.time() - start_time, correct: False }) return pd.DataFrame(self.results) def calculate_metrics(self, results_df): 计算评估指标 df results_df.dropna(subset[pred_label]) if df.empty: return {} from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score y_true df[true_label] y_pred df[pred_label] metrics { accuracy: accuracy_score(y_true, y_pred), precision: precision_score(y_true, y_pred, zero_division0), recall: recall_score(y_true, y_pred, zero_division0), f1: f1_score(y_true, y_pred, zero_division0), avg_time: df[time_elapsed].mean(), completion_rate: len(df) / len(results_df) } return metrics # 使用示例 def create_my_agent(): # 这里可以配置不同的LLM、提示词或工具集 client openai.OpenAI(api_keyyour-key) tools {...} # 同上 prompt ... # 同上或不同的提示词 return FraudDetectionAgent(client, tools, prompt) runner BenchmarkRunner(fraud_sms_dataset.csv, create_my_agent) results_df runner.run_evaluation(num_samples20) metrics runner.calculate_metrics(results_df) print(Benchmark Metrics:, metrics)5. 挑战、问题与优化方向实录在实际构建和测试这样的系统时会遇到一系列预料之中和预料之外的挑战。以下是我根据经验总结的常见问题与优化思路。5.1 典型问题与排查技巧问题现象可能原因排查与解决思路智能体陷入循环提示词中停止条件不明确工具返回的信息不足以做出判断LLM的推理出现“鬼打墙”。1. 在系统提示词中明确设置最大步数并强制要求在第N步后必须输出FINAL_ANSWER。2. 丰富工具集提供更多维度的信息如SSL证书状态、域名注册时长。3. 在智能体架构中引入“反思”步骤让其总结当前已获信息明确还缺什么。工具调用格式错误LLM输出的JSON格式不符合要求无法被解析。1. 在提示词中提供更清晰、更具体的工具调用示例Few-shot Prompting。2. 在代码中增加更鲁棒的JSON解析允许一定的格式容错并可将解析错误作为“Observation”反馈给LLM让其纠正。3. 采用支持结构化输出的LLM API如OpenAI的JSON Mode。网页访问超时或失败目标网站已失效、需要验证码、有反爬机制、或网络不稳定。1. 在fetch_webpage函数中设置合理的超时时间并做好异常捕获。2. 对于基准测试使用预先保存的网页快照HTML存档代替实时访问保证测试环境稳定和可复现。3. 模拟更真实的浏览器环境如添加常用User-Agent管理Cookies。误报率过高模型过于敏感将一些激进营销或设计粗糙的合法网站判为欺诈。1. 在数据集中增加“困难负样本”如营销短信、临时活动页。2. 调整提示词明确区分“欺诈”和“令人反感但合法”的界限。3. 引入置信度评分对于模棱两可的案例可以输出“疑似”并给出理由交由人工复核。处理速度慢LLM API调用延迟高网页加载耗时串行执行工具。1.异步化将LLM调用和工具调用特别是I/O密集型如网络请求改为异步模式。2.缓存对相同的URL或域名分析结果进行缓存。3.简化内容从网页中提取最相关的特征如仅提取表单、标题、首屏文本而非全部内容减少送入LLM的上下文长度。无法处理图片验证码诈骗网站可能设置验证码阻止自动化访问。1. 对于基准测试这属于“对抗性样本”可以记录此类情况为“无法访问”并在评估时特殊处理。2. 在研究中可以探讨集成OCR或更高级的验证码破解方案但需注意法律和伦理边界。3. 将其视为智能体能力的边界研究如何通过其他线索如短信文本、域名进行推断。5.2 成本与效率的权衡使用商用LLM API如GPT-4进行多步推理成本是不得不考虑的因素。一次完整的SMS-to-Webpage检测可能涉及多次LLM调用每次思考行动和工具调用。优化策略使用轻量级模型进行初步过滤先用一个小的、本地的分类模型如微调的BERT对短信进行快速初筛只有高风险的短信才触发完整的智能体流程。分层提示第一步用便宜快速的模型如GPT-3.5-turbo判断是否需要访问网页。如果需要再换用能力更强但更贵的模型如GPT-4进行深度分析。上下文压缩对工具返回的网页内容进行智能摘要只将关键信息如可疑的表单字段、不匹配的域名送入后续的LLM推理而不是整个网页文本。探索开源模型在本地部署如Llama 3、Qwen等优秀的开源大模型虽然单次推理性能可能略逊但长期成本可控且数据隐私性更好。5.3 对抗性攻击与持续演进诈骗手段是动态演进的。一个公开的基准测试框架可能会被攻击者研究以设计出更能绕过AI检测的诈骗方案。应对之道动态更新数据集基准测试集需要像病毒库一样定期更新纳入最新的诈骗案例。测试智能体的鲁棒性在评估中引入“对抗性测试集”包含针对AI弱点的样本例如文本混淆在诈骗短信中使用同音字、特殊符号、零宽字符等。上下文攻击制作需要结合外部知识如最新时事才能识别的诈骗。多步诱导第一个网页是正常的但点击某个按钮后跳转到诈骗页。采用“反思进化”机制正如“reevo”概念所提示的让智能体具备从失败案例中学习的能力。可以设计一个“训练模式”当智能体判断错误时将修正后的推理过程作为示例动态更新其提示词或知识库。FraudSMSWalker这类项目代表了AI应用从“静态问答”向“动态代理”演进的重要一步。它不仅仅关乎反诈骗这一个垂直领域更提供了一个通用框架用于评估LLM智能体在需要与现实世界动态交互、进行多步推理的复杂任务中的能力。对于开发者而言深入理解其设计能帮助我们更好地将LLM的潜力转化为解决实际问题的可靠工具。在实现过程中平衡效果、效率、成本与安全性将是贯穿始终的主题。
返回列表