当前位置: 首页 > news >正文

金融 Function Calling:风控规则引擎 + LLM 的联合判决设计

金融 Function Calling:风控规则引擎 + LLM 的联合判决设计

一、单靠 LLM 做风控,漏掉的是真金白银

金融风控场景中,决策的正确性直接影响资金安全。一个典型的例子:用户提交一笔"跨境转账"申请。传统风控系统通过规则引擎判断:金额超过 5 万、收款方在敏感地区、用户历史无跨境记录 → 触发人工审核。

如果把这个决策交给 LLM,LLM 可能会综合判断为"正常交易"——因为它不懂风控规则的优先级和绝对性。但如果纯靠规则引擎,又无法处理规则的灰色地带和组合场景。

正确的方案是:规则引擎做硬约束(必定拦截的),LLM 做软判断(需要上下文理解的)

二、联合判决架构

联合判决的核心分工:

  • 规则引擎负责"必定拦截"的场景
  • LLM负责"需要理解上下文"的灰色地带

三、Go 实现风控联合判决

规则引擎

package risk import ( "context" "fmt" "time" ) // RiskDecision 风控决策 type RiskDecision string const ( DecisionPass RiskDecision = "pass" // 放行 DecisionReview RiskDecision = "review" // 人工审核 DecisionBlock RiskDecision = "block" // 拒绝 ) // RiskLevel 风险等级 type RiskLevel int const ( RiskNone RiskLevel = 0 RiskLow RiskLevel = 1 RiskMedium RiskLevel = 2 RiskHigh RiskLevel = 3 RiskMaximum RiskLevel = 4 ) // Transaction 交易信息 type Transaction struct { TransID string UserID string Amount int64 // 金额(分) Currency string Direction string // in / out CounterParty string // 交易对手方 CounterPartyRegion string // 交易对手方地区 TransType string // transfer/payment/withdraw Timestamp time.Time } // RuleResult 规则引擎结果 type RuleResult struct { Passed bool RiskLevel RiskLevel HitRules []string // 触发的规则列表 Decision RiskDecision Reason string NeedLLMReview bool // 是否需要 LLM 辅助判断 ContextForLLM map[string]interface{} // 提供给 LLM 的上下文 } // RuleEngine 规则引擎 type RuleEngine struct { rules []RiskRule } type RiskRule interface { Name() string Evaluate(ctx context.Context, tx *Transaction) RuleEvaluation } type RuleEvaluation struct { Triggered bool RiskLevel RiskLevel Reason string } // AmountRule 金额规则 type AmountRule struct { SingleLimitFen int64 // 单笔限额 DailyLimitFen int64 // 日累计限额 } func (r *AmountRule) Name() string { return "金额规则" } func (r *AmountRule) Evaluate(ctx context.Context, tx *Transaction) RuleEvaluation { // 单笔限额检查 if tx.Amount > r.SingleLimitFen { return RuleEvaluation{ Triggered: true, RiskLevel: RiskMedium, Reason: fmt.Sprintf("单笔金额 %0.2f 超过限额 %0.2f", float64(tx.Amount)/100, float64(r.SingleLimitFen)/100), } } return RuleEvaluation{Triggered: false} } // RegionRule 地区规则——高风险地区直接拦截 type RegionRule struct { HighRiskRegions []string // 高风险地区清单 } func (r *RegionRule) Name() string { return "地区规则" } func (r *RegionRule) Evaluate(ctx context.Context, tx *Transaction) RuleEvaluation { for _, region := range r.HighRiskRegions { if tx.CounterPartyRegion == region { return RuleEvaluation{ Triggered: true, RiskLevel: RiskMaximum, // 最高风险——直接拦截 Reason: fmt.Sprintf("收款方位于高风险地区: %s", region), } } } return RuleEvaluation{Triggered: false} } // FrequencyRule 频率规则 type FrequencyRule struct { DB *Database WindowMinutes int // 时间窗口(分钟) MaxTransactions int // 最大交易次数 } func (r *FrequencyRule) Name() string { return "频率规则" } func (r *FrequencyRule) Evaluate(ctx context.Context, tx *Transaction) RuleEvaluation { count := r.DB.CountRecentTransactions(ctx, tx.UserID, r.WindowMinutes) if count > r.MaxTransactions { return RuleEvaluation{ Triggered: true, RiskLevel: RiskMedium, Reason: fmt.Sprintf("%d 分钟内交易 %d 次,超过阈值 %d", r.WindowMinutes, count, r.MaxTransactions), } } return RuleEvaluation{Triggered: false} } // RunAllRules 运行所有规则,汇总结果 func (re *RuleEngine) RunAllRules(ctx context.Context, tx *Transaction) RuleResult { result := RuleResult{ Passed: true, RiskLevel: RiskNone, ContextForLLM: make(map[string]interface{}), } maxRisk := RiskNone for _, rule := range re.rules { eval := rule.Evaluate(ctx, tx) if eval.Triggered { result.HitRules = append(result.HitRules, fmt.Sprintf("%s: %s", rule.Name(), eval.Reason)) if eval.RiskLevel > maxRisk { maxRisk = eval.RiskLevel } } } result.RiskLevel = maxRisk // 判决逻辑 switch { case maxRisk >= RiskMaximum: result.Passed = false result.Decision = DecisionBlock result.NeedLLMReview = false // 直接拦截,不需要 LLM case maxRisk >= RiskHigh: result.Passed = false result.Decision = DecisionBlock case maxRisk >= RiskMedium: result.Passed = true // 规则层面通过 result.Decision = DecisionReview result.NeedLLMReview = true // 需要 LLM 做辅助判断 default: result.Decision = DecisionPass } return result }

LLM 辅助审核

// LLMAuditor LLM 辅助风控审核 type LLMAuditor struct { llm LLMClient maxAuditAmount int64 // LLM 参与审核的金额上限(超过的直接人工) } // AuditWithLLM 使用 LLM 做辅助判断 func (la *LLMAuditor) AuditWithLLM( ctx context.Context, tx *Transaction, ruleResult RuleResult, historicalContext map[string]interface{}, ) (RiskDecision, string) { // 如果金额超过 LLM 审核上限,直接转人工 if tx.Amount > la.maxAuditAmount { return DecisionReview, "金额超过 LLM 审核上限,转人工审核" } // 构造 LLM Prompt prompt := la.buildAuditPrompt(tx, ruleResult, historicalContext) // LLM 分析 analysis, err := la.llm.Generate(ctx, prompt) if err != nil { // LLM 不可用,保守处理 → 转人工 return DecisionReview, fmt.Sprintf("LLM 分析不可用: %v", err) } // 解析 LLM 建议 suggestion := la.parseLLMSuggestion(analysis) return suggestion.Decision, suggestion.Reason } func (la *LLMAuditor) buildAuditPrompt( tx *Transaction, ruleResult RuleResult, historicalContext map[string]interface{}, ) string { return fmt.Sprintf(`你是一个金融风控审核助手。请分析以下交易的风险。 【交易信息】 交易ID: %s 用户ID: %s 金额: %.2f 元 方向: %s 交易对手方: %s (%s) 交易类型: %s 【触发的风控规则】 %s 【用户历史行为】 %s 【分析要求】 1. 结合用户历史行为,判断该笔交易是否合理 2. 考虑规则触发的上下文(例如:用户在出差期间的高频交易可能是正常的) 3. 给出你的建议:pass(放行)/ review(人工审核)/ block(拒绝) 4. 必须给出明确理由 【注意】 - 不要编造用户历史信息中没有的数据 - 金额规则触发的,如果历史同类交易金额接近,可能是合理的 - 频率规则触发的,如果有合理场景(如发薪日集中转账),可能是正常的 请以 JSON 格式返回:{"decision": "pass|review|block", "reason": "..."}`, tx.TransID, tx.UserID, float64(tx.Amount)/100, tx.Direction, tx.CounterParty, tx.CounterPartyRegion, tx.TransType, joinStrings(ruleResult.HitRules, "\n"), formatContext(historicalContext), ) } func (la *LLMAuditor) parseLLMSuggestion(response string) LLMSuggestion { // 解析 LLM 返回的 JSON var suggestion LLMSuggestion // json.Unmarshal 解析 return suggestion } type LLMSuggestion struct { Decision RiskDecision Reason string }

联合判决最终决定

// RiskController 风控控制器——规则引擎 + LLM 联合判决 type RiskController struct { ruleEngine *RuleEngine llmAuditor *LLMAuditor auditLogger *AuditLogger } func (rc *RiskController) EvaluateTransaction( ctx context.Context, tx *Transaction, ) RiskDecision { // 第一步:运行规则引擎 ruleResult := rc.ruleEngine.RunAllRules(ctx, tx) // 第二步:如果规则引擎直接拦截或放行,直接返回 if !ruleResult.NeedLLMReview { rc.auditLogger.LogDecision(ctx, tx, ruleResult.Decision, ruleResult.HitRules) return ruleResult.Decision } // 第三步:需要 LLM 辅助判断——收集上下文 historicalContext := rc.collectContext(ctx, tx) // 第四步:LLM 辅助分析 llmDecision, llmReason := rc.llmAuditor.AuditWithLLM(ctx, tx, ruleResult, historicalContext) // 第五步:最终决定(保守策略:规则不放行时,LLM 最多建议人工审核,不能直接放行) var finalDecision RiskDecision switch { case ruleResult.RiskLevel >= RiskHigh: // 高风险:即使用 LLM 说放行,仍然拦截 finalDecision = DecisionBlock case llmDecision == DecisionBlock: finalDecision = DecisionBlock case llmDecision == DecisionPass && ruleResult.RiskLevel <= RiskMedium: finalDecision = DecisionPass default: finalDecision = DecisionReview } // 记录审计日志 rc.auditLogger.LogDecision(ctx, tx, finalDecision, append(ruleResult.HitRules, fmt.Sprintf("LLM建议: %s (%s)", llmDecision, llmReason))) return finalDecision }

四、边界分析与 Trade-offs

LLM 不能推翻硬规则

  • 地区黑名单触发的拦截,LLM 不能推翻——这是合规要求
  • LLM 只能对"标记但未拦截"的交易做辅助判断

LLM 分析的成本与延迟

  • 每笔需要 LLM 辅助的交易,增加 200-500ms 延迟
  • 约 5-10% 的交易会触发 LLM 辅助(规则标记但未拦截的)
  • 成本远低于人工审核(但仍需要在延迟和成本之间平衡)

审查的可解释性

  • 规则引擎的输出是规则 ID + 条件,天然可解释
  • LLM 的输出需要附带推理过程,用于后续审计
  • 监管机构可能要求展示"为什么这笔交易被拦截"

LLM 幻觉风险

  • LLM 可能编造用户历史行为中的"合理解释"
  • 必须约束 LLM 只能基于提供的上下文做分析,不能创造性推理

五、总结

金融风控的 Function Calling 设计应遵循"规则做硬约束,LLM 做软判断":

  1. 规则引擎——处理确定的、不容协商的风控规则(金额、地区、频率)
  2. LLM 辅助——处理需要上下文理解的灰色地带(模式异常但场景合理?)
  3. 联合判决——规则是底线(规则说拦截就拦截),LLM 是辅助(可以在模糊区域建议放行)
  4. 审计完整——每笔交易的决策链路可追溯

LLM 在金融风控中的正确角色不是"替代规则",而是"减少人工审核的负担"。

http://www.jsqmd.com/news/1238003/

相关文章:

  • 2026择校指南:哪些山东专科院校毕业好找工作 - 2027品牌AI展
  • 2026年7月最新长沙全屋定制自有展厅人气口碑**一览 - 奔跑123
  • 甘肃爬架网厂产品介绍及工程采购实用选购指南 - 热点品牌推荐
  • [具身智能-612]:RAW / NV12 / JPG 变换链路、转换关系与工程用途(适配 RDK X5 MIPI+AI 检测链路)
  • 亲身到店探访惠州亨得利**名表服务中心|网点地址及24小时电话(2026年7月更新) - 亨得利官方
  • 2026天津西青区汽车洗车店日常洗护服务综合评测 - 奔跑123
  • 2026年贵阳刑事案件黄金救援期 5位专业刑事律师实战推荐 - 本地品牌推荐
  • 重庆欧米茄回收价格查询与各大平台实测**2026年7月最新数据) - 诚收名表回收平台
  • 2026贵州白酒灌装机厂家哪家好避坑指南:5个挑选要点,帮你绕开90%的坑 - mobible
  • 2026年大庆市龙凤区公司搬迁平台怎么选更靠谱省心 - 热点品牌推荐
  • 2026济南手表回收公司正规服务选择全指南 - 奔跑123
  • 设计EDA 首席科学家 内部JD(人力资源内控版・12 维度完整版)
  • 2026年想找靠谱机械卷锥机厂家 这份实用选购指南收好 - 热点品牌推荐
  • 2026深圳房屋渗漏水检测公司口碑榜**推荐-正规防水补漏一站式维修:卫生间/厨房/阳台/屋顶/地下室/屋顶/天沟渗漏水精准测漏补漏上门 - 安佳防水
  • 2026年陕西聚氨酯防水涂料生产厂家选购实用指南 - 热点品牌推荐
  • 2026年外墙隔热保温优质服务商口碑实用参考指南 - 热点品牌推荐
  • 2026年浙江采购冲针冲头相关厂家筛选参考 - 奔跑123
  • 广州积家回收价格查询及靠谱回收平台实测**2026年7月最新) - 嘉价奢侈品回收平台
  • 2026年PE双壁波纹管批发厂家哪家好实用选购指南 - 热点品牌推荐
  • Inspectrum:揭秘无线电信号的终极可视化分析工具
  • 济南口碑好的D500Q-P轻型铸铁屏蔽井盖生产厂家选型参考 - 热点品牌推荐
  • 安防行业大咖来访!中安协调研组一行走进itc保伦股份共探产业新机遇 - 品牌速递
  • 【E、Scopus稳定检索,往届已EI检索 | 重庆大学、重庆交通大学联合主办 | SPIE (ISSN: 0277-786X)出版】第六届智能交通系统与智慧城市国际学术会议(ITSSC 2026)
  • 2026上海嘉定区劳力士手表回收综合实力****|**多维度实测,变现首选** - 沪上贵金属口碑推荐官
  • 2026年聚氨酯厂房防火保温公司选型实用参考指南 - 热点品牌推荐
  • 重庆百达翡丽回收价格查询和靠谱回收平台实测**2026年7月最新数据) - 收的高名表回收平台
  • 伯爵中国**售后服务中心|网点地址与售后电话**信息通告(2026年7月最新) - 亨得利官方服务中心
  • 2026年北京全包装修公司哪家正规 本地业主实用选择攻略 - 热点品牌推荐
  • 红雪松汗蒸房厂家选择标准 从资质到交付全维度梳理 - 热点品牌推荐
  • 语音-画面时间轴自动校准全解析,深度拆解VAD检测误差、帧率抖动补偿与神经时序对齐三大瓶颈