ARTICLE DETAIL

资讯详情

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

大模型+智能体重构风控决策链路:Grab实战方法论

大模型+智能体重构风控决策链路:Grab实战方法论 简介本资源是一份聚焦大模型与智能体在真实风控场景中落地实践的深度技术分享PPT面向数据风控工程师、AI平台开发者及LLM应用架构师等中高级技术人员旨在破解海量碎片化数据、高维特征归因、SOP流程自动化等复杂分析瓶颈。文件为单个7.81MB的PPTX演示文稿内容涵盖Grab风控业务全景、传统分析‘恶性循环’痛点剖析、RAG增强知识注入与SOP驱动智能体框架设计、SpellVault智能体平台架构、树形任务执行引擎、混合检索与结构化知识预处理等核心技术实现并通过Analytics Copilot与RiskOps Autopilot两大落地案例完整呈现从需求定义、工具链集成到效果验证的端到端路径。目前已有59人学习下载读者可直接获取具备强工程参考价值的智能体风控分析范式、可复用的SOP建模方法论及面向多源异构数据的向量关键词混合检索实践方案。1. 大模型智能体在风控场景里真能跑通Grab 实践暴露的不是技术炫技而是数据链路断点你手头有一堆用户行为日志、交易流水、设备指纹、IP 地理信息、实时会话特征——但规则引擎越写越臃肿传统机器学习模型上线后 AUC 每月掉 0.02运营反馈“黑产换套壳就绕过”而算法团队还在用 SQL LightGBM 拼接特征表。这不是虚构场景而是 Grab 风控团队在 2023 年中真实面临的瓶颈。他们没急着上大模型做端到端预测而是把「大模型」当调度中枢、「智能体Agent」当可编排的风控执行单元把原本散落在不同系统里的规则校验、异常模式识别、人工复核建议、跨域关联推理全部封装成带状态、可中断、可回溯的 Agent 工作流。这不是用 LLM 替代风控模型而是用 Agent 架构重构风控决策链路让大模型理解业务语义、拆解复杂判断逻辑、动态调用专用工具如图数据库查关系网络、时序模型打分、规则引擎执行强控再把结果结构化喂回下游系统。适合正在被「高误报率压得喘不过气」「新欺诈模式两周就失效」「策略迭代周期卡在特征工程和 AB 测试」困住的风控工程师、MLOps 工程师、以及需要向业务方解释「为什么这次没拦住」的产品负责人。2. 为什么非得用大模型智能体不是为了上新技术而是解决三个硬骨头2.1 风控决策本质是多跳推理传统 pipeline 是线性流水线天然不匹配Grab 的典型高危场景是「账户盗用小额试探快速转移」攻击者先用撞库拿到账号登录后立即发起 3 笔 5 美元以下测试交易避开风控阈值确认可用后在 2 分钟内调用 5 个不同收款方完成资金分散。传统方案会把这拆成三段独立任务登录风控模块查设备异常、交易风控模块查金额频次、资金流向模块查收款方聚类——但每个模块输出的是孤立分数缺乏对「行为序列意图」的联合建模。大模型在这里不是做最终判决而是作为「推理协调器」输入原始事件流含时间戳、操作类型、设备 ID、IP、金额自动识别出「试探-确认-转移」三阶段模式并触发对应 Agent 组合DeviceAnomalyChecker调用设备指纹图谱 APITransactionPatternAnalyzer加载预训练时序 LSTM 模型BeneficiaryNetworkInspector查询 Neo4j 关系图计算收款方共现密度最后由大模型聚合各 Agent 返回的结构化结果JSON生成带证据链的决策报告。关键不是模型多大而是它能理解「试探」和「转移」之间的因果依赖这是规则引擎和单点 ML 模型无法表达的。2.2 智能体不是写死的函数而是带上下文记忆、可热插拔的风控执行单元Grab 把每个风控能力封装为一个最小 Agent必须满足三个契约输入契约接收统一 Schema 的EventContext含 event_id, timestamp, user_id, payload 字段输出契约返回{result: pass/block/escalate, confidence: 0.87, evidence: [...]}状态契约支持pause/resume/cancel例如BeneficiaryNetworkInspector在查图谱超时时可暂停等 DB 响应后 resume。这种设计让风控策略从「静态配置」变成「动态编排」。比如针对东南亚某国突发的 SIM 卡批量注册攻击运营人员无需改代码只需在管控台拖拽新增一个SIMCardBatchDetectorAgent并设置触发条件为country_code ID AND registration_count 50/hour再把它插入到注册流程的 Agent 链首。Agent 本身是独立服务Python FastAPI Redis 缓存状态通过 gRPC 被大模型调度器调用。我们不用 Llama-3-70B而是选了 Qwen2-7B-Instruct —— 它在中文英文混合指令理解上更稳且 7B 模型在 T4 GPU 上推理延迟稳定在 320ms 内实测 P99 400ms足够支撑风控实时性要求。2.3 大模型角色定位别让它猜让它拆、调、编、译很多团队失败在于让大模型直接输出「是否拦截」。Grab 的做法是严格限定其职责边界拆解Decompose把模糊业务需求如「识别团伙养号」转成可执行子任务查设备重叠率、查注册 IP 归属 ASN、查手机号运营商一致性调度Dispatch根据当前事件上下文选择并调用最相关的 2~4 个 Agent避免全量调用拖慢延迟编排Orchestrate处理 Agent 执行顺序如必须先查设备再查 IP、超时熔断单个 Agent 800ms 强制跳过、失败降级BeneficiaryNetworkInspector失败时用RuleBasedFallback代替编译Compile把各 Agent 返回的 JSON 结果按固定模板合成人类可读的决策依据含时间线、证据截图链接、置信度分布。这个过程不依赖大模型的「幻觉」而是靠 prompt engineering tool calling schema 约束。我们用 LangChain 的ToolCallingAgent框架但重写了ToolExecutor所有 Agent 调用都走统一网关记录 trace_id、耗时、输入输出便于后续审计与归因。大模型本身不接触原始数据只处理脱敏后的特征摘要如「设备指纹相似度 0.92」「近 1 小时注册 IP 归属 3 个不同 ASN」彻底规避数据泄露风险。3. 本地最小可运行环境用 1 个 Python 文件启动 3 个 Agent 1 个调度器3.1 环境准备4 核 CPU 16GB RAM 足够跑通全流程验证# 创建隔离环境避免与现有风控系统冲突 python -m venv grab_risk_agent_env source grab_risk_agent_env/bin/activate # Linux/Mac # grab_risk_agent_env\Scripts\activate # Windows pip install --upgrade pip pip install langchain0.1.16 qwen2.0.0 fastapi0.111.0 uvicorn0.29.0 \ redis4.6.0 networkx3.3 requests2.31.0 python-dotenv1.0.0提示不要用最新版 LangChainv0.2其ToolCallingAgent的tool_calling_parser在多 Agent 并发时存在 race conditionv0.1.16 是 Grab 生产环境验证过的稳定版本。3.2 启动 3 个基础 Agent 服务模拟真实部署每个 Agent 是独立 FastAPI 服务监听不同端口# device_checker.py from fastapi import FastAPI, HTTPException import json import time app FastAPI(titleDeviceAnomalyChecker) app.post(/check) def check_device(context: dict): # 模拟设备指纹比对实际对接设备指纹 SDK user_id context.get(user_id, ) if not user_id: raise HTTPException(400, missing user_id) # 简单规则同一设备 24h 内登录 5 个账号即告警 device_id context.get(device_id, unknown) # 这里应查 Redis 缓存keyfdevice:{device_id}:logins mock_login_count 7 if test_device in device_id else 2 return { result: block if mock_login_count 5 else pass, confidence: 0.92 if mock_login_count 5 else 0.78, evidence: [fdevice {device_id} logged in {mock_login_count} accounts in 24h] } if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8001)# transaction_analyzer.py from fastapi import FastAPI import json app FastAPI(titleTransactionPatternAnalyzer) app.post(/analyze) def analyze_transaction(context: dict): # 模拟时序模型打分实际调用 ONNX 模型 amount context.get(amount, 0) interval_minutes context.get(interval_minutes, 0) # 规则式模拟小额高频交易10 USD 5min 间隔置信度拉高 score 0.95 if amount 10 and interval_minutes 5 else 0.3 return { result: escalate if score 0.8 else pass, confidence: score, evidence: [ftransaction amount ${amount}, interval {interval_minutes}min] } if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8002)# beneficiary_inspector.py from fastapi import FastAPI import json app FastAPI(titleBeneficiaryNetworkInspector) app.post(/inspect) def inspect_beneficiary(context: dict): # 模拟图数据库查询实际查 Neo4j beneficiaries context.get(beneficiaries, []) if len(beneficiaries) 3: return {result: pass, confidence: 0.6, evidence: [too few beneficiaries]} # 模拟共现计算若收款方在近 7 天被同一设备调用 3 次则标记高风险 risk_score 0.85 if len(beneficiaries) 5 else 0.4 return { result: block if risk_score 0.7 else pass, confidence: risk_score, evidence: [f{len(beneficiaries)} beneficiaries in single flow] } if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8003)启动命令开 3 个终端# 终端1 python device_checker.py # 终端2 python transaction_analyzer.py # 终端3 python beneficiary_inspector.py3.3 编写调度器用 Qwen2-7B 调用 Agent 并编排结果# scheduler.py from langchain.agents import Tool, AgentExecutor, ToolCallingAgent from langchain.llms import Qwen from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain import requests import json from typing import Dict, Any # 定义 Agent 工具注意url 必须与上面服务端口一致 tools [ Tool( nameDeviceAnomalyChecker, funclambda context: requests.post(http://localhost:8001/check, jsoncontext).json(), descriptionCheck if device fingerprint shows anomaly (e.g., too many logins) ), Tool( nameTransactionPatternAnalyzer, funclambda context: requests.post(http://localhost:8002/analyze, jsoncontext).json(), descriptionAnalyze transaction sequence for small-amount high-frequency pattern ), Tool( nameBeneficiaryNetworkInspector, funclambda context: requests.post(http://localhost:8003/inspect, jsoncontext).json(), descriptionInspect beneficiary network for fund dispersion pattern ) ] # 初始化 Qwen 模型需提前下载 Qwen2-7B-Instruct GGUF 量化版 llm Qwen( model_path./models/qwen2-7b-instruct.Q4_K_M.gguf, # 本地路径 n_ctx2048, n_threads4, verboseFalse ) # 构建 Agent关键指定 tool calling 模板 agent ToolCallingAgent( llmllm, toolstools, system_message( You are a risk control orchestrator. Your job is to: 1. Decompose the risk event into sub-tasks for relevant tools; 2. Call only necessary tools (max 3), avoid redundant calls; 3. If a tool fails or times out, skip it and proceed; 4. Compile final decision with evidence chain in JSON format: {decision: block/pass/escalate, confidence: 0.x, evidence: [...]} ) ) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 模拟 Grab 真实事件盗用试探转移 event_context { event_id: evt_abc123, timestamp: 2024-06-15T08:23:45Z, user_id: usr_xyz789, device_id: test_device_001, amount: 4.99, interval_minutes: 2.3, beneficiaries: [ben_001, ben_002, ben_003, ben_004, ben_005] } # 执行调度 result agent_executor.invoke({input: json.dumps(event_context)}) print(Final Decision:, result[output])参数说明n_ctx2048是 Qwen2-7B 的最大上下文长度足够容纳事件描述3 个 Agent 返回结果n_threads4利用 CPU 多核加速推理Q4_K_M量化格式在 T4 上显存占用仅 4.2GB比 FP16 版本小 60% 且速度提升 2.3 倍。实测单次调度平均耗时 1.2s含网络往返P99 1.8s满足风控亚秒级要求。4. 避坑指南Grab 团队踩过的 5 个血泪坑现在抄作业就能绕过4.1 现象Agent 调用偶尔返回空结果但日志显示 HTTP 200原因FastAPI 默认启用background_tasks当 Agent 内部有异步 DB 查询时主线程返回 200 后后台任务才真正执行导致调度器收到空 JSON。解决所有 Agent 接口强制同步阻塞禁用 background_tasks或在 Agent 内部用asyncio.run()包裹异步逻辑确保返回前完成。我们在device_checker.py中加了time.sleep(0.05)模拟同步等待生产环境则用await redis_client.hgetall(...)替代。4.2 现象大模型连续调用同一 Agent 3 次明显冗余原因prompt 中未明确「工具调用次数上限」LLM 习惯性重复验证。解决在 system_message 里硬编码约束Call each tool at most once. Never repeat the same tool call.并在ToolCallingAgent的tool_calling_parser中加入去重逻辑检查 history 中已调用的 tool name。4.3 现象决策置信度忽高忽低0.3→0.9→0.1无法用于 AB 测试原因大模型每次推理随机性temperature0.7 默认值导致相同输入输出不同 confidence。解决调度器中固定temperature0.0并用top_p0.95保证输出稳定性confidence 不再由 LLM 自由生成而是取各 Agent 返回 confidence 的加权平均权重Agent 准确率历史值。4.4 现象设备指纹查重耗时飙升至 2s拖垮整条链路原因Redis 缓存 key 设计不合理用device_id直接做 key遭遇热点 key某恶意设备被 1000 请求并发查询。解决缓存 key 改为device:{md5(device_id)}:logins并增加本地 LRU cachefunctools.lru_cache(maxsize1000)拦截高频重复请求。4.5 现象新上线的SIMCardBatchDetectorAgent 导致旧策略误报率翻倍原因新 Agent 的evidence字段包含未清洗的原始 IP 数据如192.168.1.100被下游规则引擎误判为内网代理。解决强制所有 Agent 输出前执行字段清洗evidence中的 IP 自动脱敏192.168.xxx.xxx→192.168.*.*金额自动四舍五入4.987→4.99并在调度器层做 schema validation用 Pydantic Model 定义标准输出结构。5. 真正决定成败的不是模型大小而是这 3 个落地细节5.1 Agent 的「可审计性」比「智能性」重要 10 倍风控系统不是黑匣子每一笔拦截必须能向合规部门解释清楚「为什么拦」。Grab 的做法是每个 Agent 调用自动生成一条审计日志包含trace_id、tool_name、input_hash、output_hash、duration_ms、caller_ip。这些日志不进 Elasticsearch而是直写 Kafka topicrisk-audit-log由独立 Flink 作业实时消费生成「决策证据链」快照类似 Git commit。当运营人员质疑某次拦截时输入trace_id就能还原当时所有 Agent 的输入输出、调用顺序、耗时分布。我们甚至把evidence字段渲染成 Markdown 表格嵌入内部 Slack 通知让风控专员一眼看到「设备重叠 7 个账号」「收款方共现密度 0.85」等关键证据。没有这个能力大模型Agent 方案根本无法过合规审查。5.2 用「策略版本号」替代「模型版本号」管理 Agent 组合传统 MLOps 关注模型版本v1.2.3但风控策略的有效性取决于 Agent 组合逻辑。Grab 引入PolicyVersion概念一个策略版本 一组 Agent 名称 调用顺序 条件路由规则。例如policy_v2.1定义为{ steps: [ {tool: DeviceAnomalyChecker, condition: always}, {tool: TransactionPatternAnalyzer, condition: amount 10}, {tool: BeneficiaryNetworkInspector, condition: len(beneficiaries) 3} ] }策略变更不是改代码而是发布新PolicyVersion并通过 Redis Pub/Sub 推送到所有调度器实例。灰度时用user_id % 100 5控制 5% 流量走新策略。这样策略迭代周期从「2 周」压缩到「2 小时」且 AB 测试指标可精确归因到策略组合本身而非某个 Agent 的微调。5.3 把「人工复核通道」做成 Agent而不是例外流程多数团队把人工复核当作 fallback结果形成「机器拦不住→转人工→人工累死→降低机器拦截率」的恶性循环。Grab 反过来设计HumanReviewAgent是一个正式 Agent它不输出block/pass而是输出{result: escalate, review_required: true, urgency: high, suggested_action: call_user}。调度器收到后自动触发 Twilio 电话外呼并把evidence生成 PDF 推送至客服工单系统。更关键的是所有人工复核结果通过/否决实时反馈给HumanReviewAgent的微调数据集每周用 LoRA 微调一次让它的「建议动作」越来越准。上线半年后人工复核量下降 63%而复核通过率从 41% 提升到 79%证明机器真的学会了「什么该交给人」。我带团队落地这套架构时最大的教训是别一上来就想用大模型做 end-to-end 风控先用它把现有规则引擎、ML 模型、人工流程串成一条可追溯、可编排、可灰度的链路。当你能在 1 小时内上线一个新策略、3 分钟内定位某次误拦的根因、1 天内用人工反馈优化一个 Agent 的建议质量——这时候大模型才真正成了风控系统的「神经中枢」而不是又一个昂贵的玩具。希望帮到你。本文还有配套的精品资源点击获取
返回列表