ARTICLE DETAIL

资讯详情

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

AI Agent Harness Engineering 金融风控实战:欺诈检测、信用评估与市场监控的工程化落地

AI Agent Harness Engineering 金融风控实战:欺诈检测、信用评估与市场监控的工程化落地 1. 金融风控 Agent 为什么需要 Harness Engineering金融风控场景里跑 AI Agent和写个 demo 完全是两码事。demo 里你调一次模型、返回一个 JSON 就算成功但真实业务里一笔交易欺诈检测要在 200ms 内完成、一次信用评估要串起 6 个数据源、市场监控要 7×24 小时盯着几千个指标。Agent 一旦编排不当轻则误报率飙升重则漏掉真实风险事件。我试过把一个纯 prompt 驱动的风控 Agent 直接丢到生产环境结果三天内出现的问题包括工具调用超时没有兜底、模型返回格式漂移导致解析崩溃、多个 Agent 之间状态互相污染。这些都不是模型能力问题而是 Harness 层缺失导致的工程问题。所谓 Harness Engineering就是给 AI Agent 套上一层工程骨架它负责工具注册与调用、上下文管理、输出校验、失败重试、可观测性埋点、以及多 Agent 之间的编排。你可以把它理解成 Agent 的操作系统——模型是 CPUHarness 是内核。在金融风控里这层骨架要解决三件事第一确定性。风控决策必须可复现、可审计。同一个输入今天和明天跑出来的结果不能因为模型温度参数抖动而不同。Harness 要固定随机种子、锁定模型版本、记录完整调用链。第二可观测性。监管和内部审计需要知道这个 Agent 为什么拒绝了这笔贷款。Harness 要把每次工具调用、每次推理、每个中间状态都落盘形成 trace。第三容错。外部数据源会挂、模型 API 会限流、网络会抖动。Harness 要有重试、降级、熔断机制保证单点故障不会让整条风控链路瘫痪。这篇文章围绕欺诈检测、信用评估、市场监控三条业务线拆解 Harness 的具体配置方式。你会拿到可复制的配置模板、端到端验证动作以及真实踩过的坑。适合正在把 Agent 往金融生产环境推的工程团队也适合想理解 Agent 工程化边界的技术负责人。2. TaoToken 前置准备模型接入与 Key 管理在动手写 Harness 之前先把模型接入这层搞定。金融风控 Agent 通常需要多个模型协同一个负责快速分类欺诈检测一个负责长文本推理信用报告分析一个负责结构化输出市场指标提取。如果每个模型都单独对接一家供应商Key 管理和计费会非常混乱。TaoToken 在这里的作用是统一模型接入层。它提供 OpenAI 兼容的 API 接口你可以用同一套 SDK 调用不同模型Base URL 统一指向https://taotoken.net/api。对 Harness 来说这意味着工具注册表里只需要维护一份鉴权配置。2.1 获取 API Key 与模型清单先到控制台创建 Key。访问https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole登录后在 API Keys 页面新建一个 Key。建议按业务线拆分 Key欺诈检测一个、信用评估一个、市场监控一个方便后续按业务统计用量和做限流。创建完成后你会拿到形如sk-xxxxxxxx的字符串。这个 Key 只显示一次务必存到密钥管理服务里不要硬编码进代码。模型清单可以在模型对话页面查看https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodels。金融风控常用的几类模型业务线推荐模型类型用途关键参数欺诈检测轻量快速模型实时交易分类temperature0, max_tokens256信用评估长上下文推理模型多源报告综合分析temperature0.1, max_tokens2048市场监控结构化输出模型指标提取与异常判断temperature0, response_formatjson2.2 环境变量与 SDK 配置Harness 启动时从环境变量读取配置这样不同环境开发/测试/生产可以切换不同的 Key 和模型。创建一个.env文件# .env TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-your-key-here FRAUD_MODELgpt-4o-mini CREDIT_MODELgpt-4o MARKET_MODELgpt-4o-miniPython 侧用openaiSDK 接入注意base_url要带上/api路径import os from openai import OpenAI client OpenAI( base_urlos.environ[TAOTOKEN_BASE_URL], api_keyos.environ[TAOTOKEN_API_KEY], ) def call_model(model: str, messages: list, **kwargs): return client.chat.completions.create( modelmodel, messagesmessages, temperaturekwargs.get(temperature, 0), max_tokenskwargs.get(max_tokens, 1024), )如果你用的是 Claude Code 做本地开发调试可以配置settings.json指向 TaoToken 的 Anthropic 兼容端点。配置文件路径通常是~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-key-here, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 } }这里三件套必须齐全Base URL、API Key、Model ID。少任何一个都会报 401 或 model not found。2.3 为什么不在 Harness 里直连多家供应商有人会问为什么不直接在 Harness 里配置多个供应商的 SDK原因有三个一是鉴权逻辑重复。每家供应商的鉴权头、错误码、限流策略都不一样Harness 里要写一堆适配代码。统一走 OpenAI 兼容接口后Harness 只需要处理一种错误格式。二是模型切换成本。风控场景经常需要 A/B 测试不同模型的效果。如果直连切换模型要改代码、改配置、重新部署。走统一接入层改一个环境变量就行。三是可观测性统一。所有模型调用都经过同一个出口trace 采集、token 统计、延迟监控都能在一处完成。这对金融场景的审计要求很关键。Key 拿到后下一步就是把它接进 Harness 的工具注册表。下面进入具体的配置环节。3. 可复制 Harness 配置工具注册与 Agent 编排这一节是全文的核心。我会给出一个完整的 Harness 配置模板覆盖工具注册、Agent 编排、输出校验三个层面。配置用 JSON 和 Python 混合表达你可以直接复制到项目里改。3.1 工具注册表配置Harness 的第一个职责是管理工具。金融风控 Agent 要调用的工具包括交易查询 API、征信接口、市场数据流、规则引擎、以及模型本身。每个工具都要声明输入 schema、输出 schema、超时时间、重试策略。创建一个harness/tools.json{ tools: [ { name: query_transaction, description: 查询指定交易ID的详细信息, endpoint: https://internal-api.risk.local/v1/transaction/{txn_id}, method: GET, timeout_ms: 800, retry: { max_attempts: 2, backoff_ms: 100 }, input_schema: { type: object, properties: { txn_id: { type: string } }, required: [txn_id] }, output_schema: { type: object, properties: { amount: { type: number }, merchant: { type: string }, timestamp: { type: string }, device_fingerprint: { type: string } } } }, { name: fetch_credit_report, description: 拉取用户征信报告, endpoint: https://internal-api.risk.local/v1/credit/{user_id}, method: GET, timeout_ms: 2000, retry: { max_attempts: 3, backoff_ms: 300 }, input_schema: { type: object, properties: { user_id: { type: string } }, required: [user_id] } }, { name: get_market_snapshot, description: 获取市场实时快照, endpoint: https://internal-api.risk.local/v1/market/snapshot, method: POST, timeout_ms: 1500, retry: { max_attempts: 2, backoff_ms: 200 } } ] }关键点timeout_ms要按业务 SLA 设置。欺诈检测链路整体预算 200ms单个工具超时不能超过 800ms否则重试一次就爆预算。信用评估可以放宽到 2s因为用户能接受等待。3.2 Agent 编排配置三条业务线对应三个 Agent每个 Agent 有自己的工具白名单和模型配置。创建harness/agents.json{ agents: { fraud_detector: { model: gpt-4o-mini, temperature: 0, max_tokens: 256, tools: [query_transaction, get_market_snapshot], system_prompt: 你是欺诈检测专家。基于交易数据和市场快照输出 JSON{is_fraud: bool, risk_score: float, reasons: [string]}。只输出 JSON不要解释。, output_parser: json_strict, fallback_action: manual_review }, credit_assessor: { model: gpt-4o, temperature: 0.1, max_tokens: 2048, tools: [fetch_credit_report, query_transaction], system_prompt: 你是信用评估专家。综合分析征信报告和交易历史输出 JSON{credit_score: int, default_probability: float, risk_factors: [string], recommendation: string}。, output_parser: json_strict, fallback_action: reject_with_reason }, market_monitor: { model: gpt-4o-mini, temperature: 0, max_tokens: 512, tools: [get_market_snapshot], system_prompt: 你是市场监控 Agent。检测市场指标异常输出 JSON{anomalies: [{indicator: string, severity: string, value: float}], overall_status: string}。, output_parser: json_strict, fallback_action: alert_human } } }output_parser设为json_strict意味着 Harness 会对模型输出做严格 JSON 校验。如果解析失败不重试模型直接走fallback_action。这是金融场景的硬要求——宁可人工介入也不能让格式错误的输出进入下游决策。3.3 Harness 主循环实现把上面的配置加载进来实现一个通用的 Agent 执行循环import json import time import logging from typing import Any logger logging.getLogger(harness) class Harness: def __init__(self, tools_config: str, agents_config: str): with open(tools_config) as f: self.tools {t[name]: t for t in json.load(f)[tools]} with open(agents_config) as f: self.agents json.load(f)[agents] self.traces [] def execute(self, agent_name: str, user_input: dict) - dict: agent_cfg self.agents[agent_name] trace { agent: agent_name, start_ts: time.time(), steps: [], input: user_input, } # Step 1: 工具调用阶段 tool_results {} for tool_name in agent_cfg[tools]: try: result self._call_tool(tool_name, user_input) tool_results[tool_name] result trace[steps].append({ type: tool_call, tool: tool_name, status: ok, latency_ms: result.get(_latency_ms), }) except Exception as e: logger.warning(ftool {tool_name} failed: {e}) trace[steps].append({ type: tool_call, tool: tool_name, status: failed, error: str(e), }) tool_results[tool_name] None # Step 2: 模型推理阶段 messages [ {role: system, content: agent_cfg[system_prompt]}, {role: user, content: json.dumps({ input: user_input, tool_results: tool_results, }, ensure_asciiFalse)}, ] response call_model( modelagent_cfg[model], messagesmessages, temperatureagent_cfg[temperature], max_tokensagent_cfg[max_tokens], ) raw_output response.choices[0].message.content trace[steps].append({ type: model_call, model: agent_cfg[model], raw_output: raw_output, }) # Step 3: 输出校验阶段 parsed self._parse_output(raw_output, agent_cfg[output_parser]) if parsed is None: trace[steps].append({ type: parse_failed, fallback: agent_cfg[fallback_action], }) trace[end_ts] time.time() self.traces.append(trace) return {status: fallback, action: agent_cfg[fallback_action]} trace[end_ts] time.time() trace[output] parsed self.traces.append(trace) return {status: ok, output: parsed} def _call_tool(self, tool_name: str, params: dict) - dict: tool self.tools[tool_name] start time.time() # 实际实现里这里做 HTTP 调用 重试 result {_latency_ms: (time.time() - start) * 1000} return result def _parse_output(self, raw: str, parser: str) - dict | None: if parser ! json_strict: return {raw: raw} try: # 去掉可能的 markdown 代码块包裹 cleaned raw.strip() if cleaned.startswith(): cleaned cleaned.split(\n, 1)[1].rsplit(, 1)[0] return json.loads(cleaned) except json.JSONDecodeError as e: logger.error(fJSON parse failed: {e}, raw{raw[:200]}) return None这个循环把工具调用 → 模型推理 → 输出校验三段式固定下来。任何 Agent 都走同一条路径区别只在配置。这样新增业务线时只需要加一份 JSON 配置不用改代码。3.4 多 Agent 编排串行与并行三条业务线之间不是完全独立的。信用评估可能需要欺诈检测的结果作为输入市场监控的异常信号可能触发信用评估的重新计算。Harness 要支持两种编排模式串行编排用于有依赖关系的场景。比如信用评估前先跑欺诈检测如果欺诈分数超过阈值直接拒绝不再浪费征信查询配额def credit_pipeline(user_id: str, txn_id: str): fraud_result harness.execute(fraud_detector, {txn_id: txn_id}) if fraud_result[status] ok and fraud_result[output][risk_score] 0.8: return {decision: reject, reason: high_fraud_risk} credit_result harness.execute(credit_assessor, {user_id: user_id}) return credit_result并行编排用于独立场景。市场监控同时盯多个指标每个指标一个 Agent 实例用asyncio.gather并发执行import asyncio async def monitor_all(indicators: list): tasks [ asyncio.to_thread(harness.execute, market_monitor, {indicator: ind}) for ind in indicators ] return await asyncio.gather(*tasks)并行时要注意模型 API 的并发限制。TaoToken 的 Coding Plan 提供了更高的并发配额适合这种多 Agent 并发场景。如果你在做长期编码或 Agent 开发可以看下https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan。配置写完了接下来验证它能不能跑通。4. 端到端验证从请求到成功结果配置写完不代表能用。这一节给出完整的验证动作从单 Agent 冒烟测试到多 Agent 链路压测每一步都有预期结果。4.1 单 Agent 冒烟测试先验证欺诈检测 Agent 能正常跑通。构造一笔模拟交易import json txn_input { txn_id: TXN20250101001, amount: 15800.00, merchant: electronics_online, timestamp: 2025-01-01T03:22:11Z, device_fingerprint: fp_abc123, } result harness.execute(fraud_detector, txn_input) print(json.dumps(result, indent2, ensure_asciiFalse))预期输出{ status: ok, output: { is_fraud: true, risk_score: 0.87, reasons: [凌晨大额交易, 设备指纹与历史不符, 商户类别高风险] } }如果status是fallback说明模型输出没通过 JSON 校验。先看 trace 里的raw_output通常是模型加了额外解释文字。解决办法是在 system prompt 里强化只输出 JSON或者把output_parser改成更宽松的json_extract用正则从文本里抠 JSON。4.2 工具调用链路验证验证工具调用是否按预期执行。在 trace 里检查steps数组trace harness.traces[-1] for step in trace[steps]: print(f{step[type]:12} {step.get(tool, step.get(model, )):20} {step[status]})预期看到tool_call query_transaction ok tool_call get_market_snapshot ok model_call gpt-4o-mini ok如果某个工具status是failed检查两点一是工具 endpoint 是否可达二是输入参数是否满足input_schema。常见错误是txn_id传了整数而不是字符串导致 schema 校验失败。4.3 输出校验与降级验证故意构造一个会让模型输出格式漂移的输入验证降级逻辑bad_input {txn_id: TXN_INVALID, amount: -1} result harness.execute(fraud_detector, bad_input) assert result[status] in (ok, fallback) if result[status] fallback: assert result[action] manual_review这个测试的目的是确认即使模型输出不可解析Harness 也不会把脏数据传给下游而是走人工审核。这是金融场景的安全底线。4.4 延迟与吞吐验证金融风控对延迟敏感。用time.perf_counter测端到端延迟import time latencies [] for i in range(100): start time.perf_counter() harness.execute(fraud_detector, txn_input) latencies.append((time.perf_counter() - start) * 1000) latencies.sort() print(fP50: {latencies[50]:.1f}ms) print(fP95: {latencies[95]:.1f}ms) print(fP99: {latencies[99]:.1f}ms)欺诈检测链路的经验值P50 在 400-600msP95 在 900-1200ms。如果 P99 超过 2s说明有工具调用在拖后腿去 trace 里找latency_ms最大的那个工具考虑加缓存或换更快的模型。4.5 多 Agent 链路验证最后验证信用评估的串行链路pipeline_result credit_pipeline(USER001, TXN20250101001) print(json.dumps(pipeline_result, indent2, ensure_asciiFalse))预期两种情况如果欺诈分数高直接返回{decision: reject, reason: high_fraud_risk}如果欺诈分数低返回完整的信用评估结果包含credit_score、default_probability、risk_factors。验证通过后把 trace 落盘到审计日志。金融场景要求 trace 至少保留 5 年建议用结构化存储如 Elasticsearch 或 ClickHouse方便后续按txn_id或user_id检索。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节整理真实踩过的坑。每个报错都给出触发条件、根因和修复动作。5.1 401 Unauthorized报错原文openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key, type: invalid_request_error}}触发条件Harness 启动时读取的TAOTOKEN_API_KEY为空或格式错误。根因三种可能。一是.env文件没被加载Python 进程读不到环境变量二是 Key 复制时带了空格或换行三是 Key 被撤销或过期。修复先打印确认import os key os.environ.get(TAOTOKEN_API_KEY, ) print(fkey length: {len(key)}, prefix: {key[:8]})正常应该是key length: 51, prefix: sk-xxxxx。如果 length 是 0检查.env加载逻辑用python-dotenv的话确认调用了load_dotenv()。如果 prefix 不对重新到控制台复制 Key。5.2 local proxy failed报错原文openai.APIConnectionError: Connection error. httpx.ConnectError: [Errno 111] Connection refused触发条件Harness 配置了本地代理但代理进程没启动。根因开发环境里有人习惯配HTTP_PROXY环境变量指向本地端口但忘了启动对应服务。或者 CI 环境里继承了开发机的代理配置。修复检查环境变量env | grep -i proxy如果有HTTP_PROXY或HTTPS_PROXY指向127.0.0.1:xxxx要么启动对应服务要么在 Harness 里显式禁用代理import httpx client OpenAI( base_urlos.environ[TAOTOKEN_BASE_URL], api_keyos.environ[TAOTOKEN_API_KEY], http_clienthttpx.Client(trust_envFalse), )trust_envFalse让 httpx 忽略系统代理设置直连 TaoToken 端点。5.3 reading choices 报错报错原文AttributeError: NoneType object has no attribute choices或者IndexError: list index out of range触发条件模型返回了空响应但代码直接访问response.choices[0]。根因两种情况。一是模型因为内容安全策略拒绝了请求返回的choices是空数组二是网络中断导致响应体不完整。修复在 Harness 里加防御性检查response call_model(...) if not response.choices: logger.error(fempty choices, full response: {response}) return {status: fallback, action: retry_later} raw_output response.choices[0].message.content if not raw_output: logger.error(empty content in choice[0]) return {status: fallback, action: retry_later}同时检查finish_reason。如果是content_filter说明输入触发了安全策略需要调整 prompt 或输入数据。5.4 OAuth 相关报错报错原文Error: OAuth token expired或者 Claude Code 里Failed to authenticate: invalid_grant触发条件用 Claude Code 或 Cline 这类工具接入时OAuth token 过期。根因OAuth token 有有效期通常是 1 小时到 24 小时。长时间运行的 Agent 任务会中途失效。修复如果用的是 API Key 模式推荐不会有这个问题。检查settings.json里配置的是ANTHROPIC_API_KEY而不是 OAuth token。三件套确认{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-key-here, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 } }如果确实需要用 OAuth在 Harness 里加 token 刷新逻辑在每次调用前检查过期时间。5.5 模型返回格式漂移报错原文json.JSONDecodeError: Expecting value: line 1 column 1 (char 0)触发条件模型输出不是纯 JSON而是带了 markdown 代码块或解释文字。根因模型在 temperature 较高时容易自由发挥。或者 system prompt 不够强硬。修复三层防御。第一层system prompt 末尾加只输出 JSON不要任何解释、不要 markdown 代码块。第二层_parse_output里先剥离 markdown 包裹。第三层解析失败走 fallback不重试模型重试可能还是漂移。如果漂移频繁考虑用支持response_format{type: json_object}的模型让服务端保证 JSON 输出。5.6 工具调用超时报错原文TimeoutError: tool query_transaction exceeded 800ms触发条件内部 API 响应慢超过配置的timeout_ms。根因内部 API 负载高或者网络抖动。修复先看 trace 里的latency_ms分布。如果 P99 接近超时阈值说明阈值设太紧适当放宽。如果 P50 就超时说明 API 本身有问题需要优化后端。Harness 侧可以加缓存对同一txn_id的查询结果缓存 5 分钟减少重复调用。6. 语义一致 CTA把 Harness 跑起来配置和排障都过了一遍最后说下怎么把这套东西真正跑起来。第一步到控制台创建 API Key按业务线拆三个 Key。地址在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys。创建后立刻存到密钥管理服务不要留在聊天记录里。第二步把本文的tools.json和agents.json复制到项目里按你的实际内部 API 地址改 endpoint。工具注册表里的timeout_ms和retry策略要根据业务 SLA 调不要照搬。第三步跑单 Agent 冒烟测试。先用欺诈检测链路因为它的输入输出最简单。确认status: ok且输出 JSON 结构正确后再跑信用评估和市场监控。第四步接可观测性。把 trace 落到 Elasticsearch 或 ClickHouse配一个简单的 Grafana 面板监控三个指标P95 延迟、fallback 率、工具调用失败率。fallback 率超过 5% 就要告警说明模型输出不稳定或工具不可靠。第五步做压测。用生产流量的 1.5 倍打欺诈检测链路观察 P99 延迟和错误率。如果 P99 超过 2s优先优化最慢的工具调用而不是换模型。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc里面有完整的 API 参数说明和错误码对照。模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchat可以用来快速验证模型输出格式不用写代码就能测 prompt。最后提醒一点Harness 的价值不在于让 Agent 跑起来而在于让 Agent 在出问题时能安全地停下来。金融风控场景里一个能正确降级的 Agent 比一个永远返回结果的 Agent 更有价值。把 fallback 路径测透比把 happy path 跑通更重要。
返回列表