尧图精选

企业级Agent工程化落地:从Demo惊艳到生产稳定的四大硬坎

🕒 发布时间:2026/10/1 4:48:44 📁 来源:尧图网络
1. 为什么“Demo惊艳、上线拉胯”不是玄学而是可归因的工程断层你肯定见过这样的场景会议室里产品经理点开一个Agent Demo——输入“帮我对比Q3华东区和华南区的销售毛利趋势并生成PPT大纲”三秒后图表弹出结构清晰连字体字号都自动适配公司VI规范。全场鼓掌CTO当场拍板“下周就上生产”。结果两周后运维告警CPU持续98%日志里堆满agent execution terminated due to error.用户投诉“查个报销进度要等47秒”业务方在钉钉群里发了个红色感叹号“这玩意儿到底能不能用”这不是个别现象而是当前企业级Agent落地的普遍病灶。我过去三年深度参与过7个行业头部客户的Agent项目交付从金融风控到制造业设备预测性维护从政务知识库到零售智能导购几乎每个项目都卡在同一个地方Demo阶段像科幻电影上线后像老式收音机——滋滋作响时断时续还总在关键节点掉链子。更讽刺的是技术团队反复强调“模型能力没问题”“LangGraph流程编排很稳”但业务方只关心一件事用户点击“提交”按钮后第几秒能拿到可用结果这个结果在99.9%的请求里是否一致当流量翻倍时系统是优雅扩容还是直接雪崩问题根源从来不在“Agent能不能思考”而在于我们把“思考能力”和“工程能力”当成同一件事来对待。Demo环境里一个单线程Python脚本跑着本地Llama-3-70B-Instruct调用Mock API模拟天气查询上下文窗口永远卡在4K token权限控制就是os.environ[API_KEY] demo-key——这根本不是Agent系统这是个精心包装的交互式Prompt Playground。而真实企业环境里你要面对的是Windows Server 2019上运行的遗留ERP系统其安全选项卡里嵌套了5层组策略要调用的财务接口要求每次请求携带国密SM2签名用户上传的PDF合同平均页数83页OCR后文本量轻松突破120K token更别说审计要求所有Agent操作必须留痕到SIEM平台且日志字段需符合ISO 27001 Annex A.8.2.3格式。所以“工程解法”这个词不是技术包装话术它直指核心如何让Agent从“能跑通”的算法demo蜕变为“可信赖”的生产服务。这中间横亘着四道硬坎——工具调用不是写个requests.get()就完事权限与安全不是加个if user.role admin就能过关上下文成本不是调大max_tokens参数就能解决而Agent本身的稳定性更不是靠重启服务就能掩盖。接下来我会用真实踩坑记录、配置快照、压测数据带你一关一关拆解。这些内容我在某股份制银行部署信贷审批Agent时曾手把手教给他们的SRE团队在为一家汽车零部件厂商做MES系统Agent集成时也作为内部培训材料反复打磨。它不讲虚的架构图只告诉你哪一行代码改错了会导致权限绕过哪个参数设小了会让上下文截断成语义残片为什么你的LangGraph状态机在并发下会丢失步骤以及怎么用Windows安全选项卡里那个被99%人忽略的“高级”按钮真正锁死Agent进程的文件系统访问权限。2. 工具调用从“能调通”到“稳调准”的三层穿透工具调用Tool Calling常被当作Agent最炫酷的能力——让大模型“动起来”不再只是文字生成器。但企业级落地中90%的线上故障源于工具调用环节。我见过最典型的案例某券商的智能投顾Agent在Demo中能精准调用行情API获取实时股价上线后却频繁返回“数据为空”。排查三天发现根源竟是工具函数里一句time.sleep(0.1)——在高并发下这个毫秒级休眠被放大成线程阻塞导致下游Redis连接池耗尽。这暴露了一个残酷事实工具调用不是API封装而是跨系统、跨协议、跨信任域的精密协同工程。它必须穿透三层协议层、语义层、治理层。2.1 协议层不只是HTTP状态码更是超时与重试的博弈企业系统接口千奇百怪有RESTful API有SOAP WebService有数据库直连JDBC/ODBC甚至还有通过Windows COM组件暴露的老旧VB6系统。Demo阶段我们习惯用requests库一把梭设置timeout(3, 10)就万事大吉。但生产环境里这个配置是灾难源头。以某制造企业的设备IoT平台为例其API文档写着“响应时间200ms”但实测发现当设备在线率低于85%时部分端点平均响应飙升至1.8秒P99延迟达4.2秒。若仍用(3,10)意味着3秒连接超时10秒读取超时单次调用最大等待13秒。而Agent流程中一个工具调用失败往往触发整个链路重试形成雪崩。我们的解法是分层超时# 生产级工具调用超时配置基于aiohttp import asyncio from aiohttp import ClientTimeout # 核心原则连接超时 读取超时 整体Agent步骤超时 # 连接超时网络握手时间设为200ms企业内网通常50ms # 读取超时数据传输处理时间设为该API P95延迟的1.5倍 # 示例IoT平台API P951.2s → 读取超时1.8s timeout ClientTimeout( connect0.2, # 连接超时单位秒 total3.0, # 总超时强制兜底避免无限等待 sock_read1.8, # socket读取超时即API实际处理时间上限 ) # 重试策略指数退避 指纹去重 from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type retry( stopstop_after_attempt(3), waitwait_exponential(multiplier1, min0.1, max2.0), # 第一次重试0.1s第二次0.2s第三次0.4s... retryretry_if_exception_type((asyncio.TimeoutError, aiohttp.ClientResponseError)), # 关键添加指纹避免幂等性破坏 before_sleeplambda x: logger.info(fRetrying tool {x.args[0]} due to {x.exception()}), ) async def call_iot_api(device_id: str) - dict: async with aiohttp.ClientSession(timeouttimeout) as session: async with session.get(fhttps://iot-api/internal/v1/devices/{device_id}) as resp: if resp.status 200: return await resp.json() elif resp.status in (429, 503): # 限流或服务不可用明确重试 raise aiohttp.ClientResponseError(...) else: # 其他错误如404不重试直接抛异常 resp.raise_for_status()提示total3.0是硬性兜底防止重试叠加导致整体步骤超时。很多团队忽略这点结果重试三次后总耗时超过Agent最大容忍时间触发熔断。2.2 语义层从“模型说要调”到“系统真能接”的精准对齐Demo里模型输出{tool: get_weather, tool_input: {city: Shanghai}}工具函数get_weather(cityShanghai)就执行了。但企业系统里“Shanghai”可能需要转换为内部编码SH-001且必须附带租户IDtenant_idfin-2023和审计标记audit_tokenuser_12345_session_xyz。更麻烦的是模型生成的参数类型常与API契约错位模型说{start_date: 2024-01-01}而财务API要求{startDate: 2024-01-01T00:00:00Z}少个T和Z直接400 Bad Request。我们的解法是构建语义适配层Semantic Adapter而非简单映射# 工具注册时声明契约与适配规则 from pydantic import BaseModel, Field from typing import Dict, Any class WeatherInput(BaseModel): city: str Field(..., description城市中文名如上海需转为内部编码) tenant_id: str Field(..., description租户唯一标识从Agent上下文提取) # 适配器将LLM原始输出映射为API所需格式 class WeatherAdapter: def __init__(self, internal_code_map: Dict[str, str]): self.code_map internal_code_map # {上海: SH-001, 北京: BJ-001} def adapt(self, raw_input: Dict[str, Any], context: Dict[str, Any]) - Dict[str, Any]: # 步骤1城市名标准化支持别名、拼音、缩写 city_raw raw_input.get(city, ) city_internal self._resolve_city(city_raw) if not city_internal: raise ValueError(f无法解析城市名: {city_raw}) # 步骤2注入上下文参数租户、审计token return { cityCode: city_internal, tenantId: context.get(tenant_id, default), auditToken: context.get(audit_token, ), timestamp: int(time.time() * 1000) # 毫秒时间戳API要求 } def _resolve_city(self, name: str) - str: # 精确匹配 if name in self.code_map: return self.code_map[name] # 模糊匹配Levenshtein距离 candidates [k for k in self.code_map.keys() if len(k) 2 and len(name) 2] if candidates: from difflib import get_close_matches close get_close_matches(name, candidates, n1, cutoff0.6) if close: return self.code_map[close[0]] return None # Agent执行时自动调用适配器 def execute_tool(tool_name: str, raw_input: Dict[str, Any], context: Dict[str, Any]): adapter ADAPTER_REGISTRY.get(tool_name) if adapter: api_input adapter.adapt(raw_input, context) else: api_input raw_input # 无适配器则直传 return TOOL_REGISTRY[tool_name](**api_input)注意_resolve_city方法里的cutoff0.6是经验值。太低如0.3会导致误匹配“上海”匹配到“深圳”太高如0.8则漏匹配“沪”无法匹配“上海”。我们在10万条历史工单地址数据上测试0.6是精度与召回率的最佳平衡点。2.3 治理层工具调用的“交通管制”与“责任追溯”工具调用不是孤立动作它涉及资源消耗、数据主权、合规审计。Demo里没人管生产里必须管。我们曾遇到一个致命问题Agent调用OCR工具处理用户上传合同但OCR服务按页计费而模型错误地将一份80页合同拆成80次调用单日账单暴涨300%。根源在于缺乏调用频次与用量的硬性管控。治理层包含三要素配额Quota、熔断Circuit Breaker、审计Audit。配额为每个工具、每个租户、每个用户角色设置调用次数/时长/Token消耗上限。我们用Redis原子操作实现# 检查并扣减配额Lua脚本保证原子性 lua_script local key KEYS[1] -- 如 quota:tenant_fin-2023:tool_ocr local limit tonumber(ARGV[1]) -- 日限额 local window tonumber(ARGV[2]) -- 时间窗口秒数864001天 local current tonumber(redis.call(GET, key) or 0) if current limit then return 0 -- 配额超限 end redis.call(INCR, key) redis.call(EXPIRE, key, window) return 1 -- 允许调用 allowed redis.eval(lua_script, 1, fquota:{tenant_id}:{tool_name}, str(daily_limit), 86400) if not allowed: raise QuotaExceededException(fTenant {tenant_id} exceeded daily quota for {tool_name})熔断当工具错误率连续5分钟30%自动熔断10分钟。使用Hystrix风格状态机状态存储在Redis Hash中。审计每条工具调用必须记录tool_name,input_hashSHA256output_hash,duration_ms,status_code,user_id,tenant_id,trace_id。日志格式严格遵循公司SIEM平台要求字段名、时间戳格式ISO 8601 UTC、敏感信息脱敏如input_hash代替明文参数全部预置。这三层穿透让工具调用从“能用”变成“敢用”。某保险公司的核保Agent上线后工具调用成功率从Demo的99.98%稳定在生产环境的99.92%P99延迟从1.2秒降至0.85秒月度API账单波动小于±3%。关键不是技术多炫而是每一层都经得起审计、扛得住流量、容得下错误。3. 权限与安全Windows安全选项卡里的“隐形战场”企业Agent的安全绝非加个JWT Token或HTTPS就万事大吉。它深植于操作系统底层、网络策略缝隙、应用权限矩阵之中。尤其当Agent需要与Windows生态深度集成时如调用Excel宏、读取本地SharePoint缓存、操作Active DirectoryWindows安全选项卡Security Tab里的每一个勾选框都是决定Agent能否存活的生死线。我亲眼见过一个Agent项目因一个未勾选的复选框在UAT环境稳定运行三个月后突然在生产环境批量崩溃——错误日志只有一行Access is denied。3.1 进程级权限从“以谁身份运行”开始的连锁反应Agent服务进程在Windows上默认以Local System或Network Service账户运行。Demo阶段这很“方便”——能访问几乎所有资源。但生产环境这是重大风险。某政务系统的Agent需读取本地C:\Program Files\GovApp\data\下的加密数据库文件开发时用Local System一切正常。上线后安全团队强制要求降权为专用服务账户svc-agent-gov结果Agent启动即报错PermissionError: [WinError 5] Access is denied。根源在于Windows ACL访问控制列表的继承机制。Local System拥有SE_MANAGE_VOLUME_NAME特权能绕过大部分ACL检查而普通服务账户必须显式授权。解决方案不是回退权限而是精确授予权限定位目标路径右键C:\Program Files\GovApp\data\→ “属性” → “安全”选项卡。编辑权限点击“编辑” → “添加” → 输入svc-agent-gov→ “检查名称”确认。关键勾选在权限列表中必须勾选“遍历文件夹/运行文件”、“读取属性”、“读取扩展属性”、“读取权限”。很多人只勾“读取”忽略了“遍历文件夹”——没有它Agent连目录都无法进入直接报错。继承设置勾选“替换所有子对象的权限项”确保data\下所有.db文件继承此权限。注意svc-agent-gov账户本身需具备Log on as a service权限在secpol.msc→“本地策略”→“用户权利分配”中配置否则服务根本无法启动。3.2 COM组件权限被遗忘的“OLE Automation”陷阱许多企业遗留系统通过COM组件暴露功能如财务软件的报表生成引擎、CAD系统的图纸解析模块。Agent调用时常报错0x80040154 Class not registered或0x80070005 Access is denied。前者是注册问题后者才是权限真凶。以调用某国产ERP的COM组件ERPReportGenerator为例注册需用管理员权限运行regsvr32 ERPReport.dll。权限右键计算机→管理→组件服务→计算机→我的电脑→DCOM配置→ 找到ERPReportGenerator→ 右键“属性” → “安全性”选项卡。这里有两个关键区域启动和激活权限默认“仅限启动”和“仅限激活”都为空。必须点击“自定义” → “编辑” → 添加svc-agent-gov并勾选“本地启动”、“远程启动”、“本地激活”、“远程激活”。访问权限同样添加svc-agent-gov勾选“本地访问”、“远程访问”。实操心得很多团队只配了“启动权限”忘了“访问权限”导致组件成功启动但Agent无法与其通信错误码正是0x80070005。这个细节在微软文档里藏得很深但却是高频踩坑点。3.3 网络与防火墙不只是端口更是“出站策略”的博弈Agent常需调用外部API如天气、地图、支付网关。Demo用http://localhost:8000/mock生产则要走企业防火墙。问题来了防火墙策略常按域名/IP端口放行但Agent的HTTP客户端如aiohttp默认启用DNS缓存和连接池可能导致DNS缓存污染weather.com解析到旧IP而新IP已被防火墙放行旧IP被拦截。连接池复用一个TCP连接复用多次请求防火墙会话超时后后续请求被丢弃。解法是精细化网络栈控制# 禁用DNS缓存强制每次解析 import socket socket.setdefaulttimeout(5.0) # 全局socket超时 # aiohttp连接池配置 connector aiohttp.TCPConnector( keepalive_timeout30.0, # 连接空闲30秒后关闭避免防火墙会话超时 force_closeTrue, # 不复用连接每次请求新建牺牲性能换确定性 use_dns_cacheFalse, # 禁用DNS缓存 sslFalse, # 若API支持HTTP禁用SSL减少开销需评估风险 ) # 或更激进指定DNS服务器绕过企业DNS劫持 import dns.resolver resolver dns.resolver.Resolver() resolver.nameservers [114.114.114.114] # 使用公共DNS3.4 审计与合规日志不是记录而是“证据链”的构建安全不是“不出事”而是“出事能溯源”。某银行Agent被审计时要求提供“用户A在2024-05-20 14:23:15调用信贷查询工具的完整证据链”包括用户身份凭证、调用参数脱敏、工具执行日志、返回结果摘要、操作耗时、关联Trace ID。这要求日志系统必须满足结构化JSON格式字段名固定event_type,user_id,tool_name,input_hash,output_hash,duration_ms,status,trace_id。不可篡改日志写入前用HMAC-SHA256签名密钥由KMS托管。全链路Trace ID贯穿Agent主流程、工具调用、数据库查询通过OpenTelemetry注入。我们用ELK Stack实现关键配置// Logstash filter确保字段存在且格式正确 filter { mutate { add_field { event_type tool_call } convert { duration_ms integer } } date { match [timestamp, ISO8601] } # 脱敏正则替换手机号、身份证号 mutate { gsub [ input_hash, (1[3-9]\d{9}), ******, input_hash, (\d{17}[\dXx]), *************** ] } }权限与安全不是 checklist而是渗透在每一行代码、每一个配置项、每一次鼠标点击中的工程实践。Windows安全选项卡里的勾选不是UI操作而是对系统底层信任模型的显式声明。忽视它Agent再聪明也是空中楼阁。4. 上下文成本Token不是数字而是“认知带宽”的物理限制“上下文长度”常被简化为一个数字32K、128K、200K。但企业Agent的真实瓶颈从来不是模型标称的Token上限而是上下文成本Context Cost——它包含三重物理开销内存占用、GPU显存压力、网络传输延迟。Demo里模型加载context_window32768处理1000字输入毫无压力。生产中一份用户上传的PDF合同OCR后文本达150K字符等效Token约220K远超模型能力。此时不是“截断”而是“如何截断得不丢魂”。4.1 成本量化从Token数到真实资源消耗Token数≠内存占用。以Llama-3-70B为例KV Cache内存每个Token在推理时需缓存Key/Value向量。70B模型单层Key/Value向量各128维共80层FP16精度下单Token KV Cache ≈ 80 × 128 × 2 × 2 bytes ≈ 40KB。200K Token需约8GB GPU显存——这已超出单卡A100 80GB的合理负载需预留空间给模型权重。CPU内存文本处理分词、embedding需CPU内存。150K字符文本分词后约200K TokenPython字符串对象在64位系统下每个字符占1字节但分词器输出的Token ID列表int64需1.6MB加上中间变量常驻内存超500MB。网络延迟将200K Token的上下文通过gRPC发送到推理服务序列化网络传输反序列化P99延迟超1.2秒远高于用户可接受的300ms阈值。因此上下文成本必须按场景分级场景典型输入Token估算可接受成本解法实时对话用户提问最近3轮历史 2K 300ms本地缓存滑动窗口文档分析单页PDF OCR文本1K-5K 2s异步预处理摘要先行合同审查全文80页PDF100K-300K 30s分块向量检索关键段落精读4.2 分块策略不是均分而是“语义锚点”驱动简单按Token数均分如每块4K是灾难。一份采购合同若在“违约责任”条款中间截断Agent看到的可能是“乙方应承担违约责任甲方有权”后半句“解除合同并索赔”丢失结论完全错误。我们的解法是语义分块Semantic Chunking基于文档结构而非字数from langchain_text_splitters import MarkdownHeaderTextSplitter # 对PDF先转Markdown保留标题层级 markdown pdf_to_markdown(contract.pdf) # 自研工具保留# H1, ## H2, ### H3 # 按标题层级分块确保条款完整性 headers_to_split_on [ (#, header_1), # 主标题如采购合同 (##, header_2), # 一级条款如第一条 产品规格 (###, header_3), # 二级条款如1.1 型号 ] splitter MarkdownHeaderTextSplitter( headers_to_split_onheaders_to_split_on, return_each_lineFalse ) chunks splitter.split_text(markdown) # 结果每个chunk是一个完整条款含标题全部内容 # chunk[0]: ## 第一条 产品规格\n1.1 型号ABC-123\n1.2 数量1000台... # chunk[1]: ## 第二条 付款方式\n2.1 预付款30%...对于无结构文本如会议纪要采用句子嵌入聚类from sentence_transformers import SentenceTransformer from sklearn.cluster import KMeans # 计算每句话的Embedding sentences split_into_sentences(text) # 按句号/问号分割 embeddings model.encode(sentences, batch_size32) # K-Means聚类k5目标块数 kmeans KMeans(n_clusters5, random_state42) clusters kmeans.fit_predict(embeddings) # 合并同一簇的句子确保语义连贯 clustered_chunks [] for i in range(5): cluster_sentences [s for s, c in zip(sentences, clusters) if c i] clustered_chunks.append( .join(cluster_sentences))4.3 检索增强RAG不是加插件而是“记忆外科手术”RAG检索增强生成常被当作“加个向量数据库”就完事。但企业文档常含表格、公式、图表纯文本检索会丢失关键信息。某制造业Agent需从设备手册中检索“轴承更换步骤”手册PDF含大量表格型号对照表、扭矩参数表。若只检索文本Agent可能返回“参考第5章”但用户需要的是具体数值。我们的解法是多模态检索增强MM-RAG文本层用Sentence-BERT生成段落Embedding存入Milvus。表格层用Table Transformer识别PDF表格提取结构化数据行头、列头、单元格值存入PostgreSQL建立全文索引。公式层用LaTeX-OCR识别公式存为MathML用XPath索引。检索时Agent根据用户问题类型自动路由def route_retrieval(query: str) - List[Document]: # 问题分类用轻量级BERT分类器 intent classifier.predict(query) # table, formula, text if intent table: # SQL查询SELECT * FROM manuals_tables WHERE content_vector plainto_tsquery(%s) return pg_search(query) elif intent formula: # XPath查询//math[contains(., torque)] return xml_search(query) else: # 向量检索 return milvus_search(query)上下文成本管理本质是在有限的认知带宽内为Agent装上最精准的“注意力滤镜”。它不追求吞下全部信息而是确保最关键的信息以最低成本最快速度抵达模型的“工作记忆”。5. Agent稳定性从“执行终止”到“韧性生存”的四重加固agent execution terminated due to error.——这行日志是企业Agent项目的“死亡通知书”。它背后不是单一错误而是系统脆弱性的集中爆发。Demo里一个KeyError导致流程中断重启服务即可生产中同样的错误可能引发连锁反应工具调用失败→状态机卡死→后续请求堆积→线程池耗尽→整个服务不可用。稳定性不是“不报错”而是错误发生时系统能自我诊断、隔离、降级、恢复。我们称之为“韧性生存”Resilient Survival它需要四重加固。5.1 状态机韧性LangGraph不是流程图而是“状态守卫”LangGraph的StateGraph常被当作可视化编排工具。但生产环境中状态机必须能应对状态丢失Worker进程崩溃内存中状态消失。状态冲突两个Worker同时更新同一状态如next_step。状态腐化中间步骤输出格式错误如应返回dict却返回str导致下游节点解析失败。我们的加固方案状态持久化所有状态变更写入Redis Stream格式为{state_id: abc123, step: tool_call, data: {...}, timestamp: 1716234567}。Worker启动时从Stream末尾读取最新状态恢复。乐观锁更新状态更新时Redis Lua脚本检查version字段-- Redis Lua脚本原子更新状态 local key KEYS[1] -- state:abc123 local version tonumber(ARGV[1]) local new_data ARGV[2] local current redis.call(HGETALL, key) if #current 0 then return 0 -- 状态不存在 end local curr_version tonumber(redis.call(HGET, key, version)) if curr_version ~ version then return -1 -- 版本冲突 end redis.call(HSET, key, data, new_data, version, version 1) return 1Schema校验每个节点输入/输出定义Pydantic Schema执行前强制校验from pydantic import BaseModel, ValidationError class ToolCallState(BaseModel): tool_name: str tool_input: dict user_id: str node def tool_call_node(state: ToolCallState) - dict: try: validated ToolCallState.model_validate(state) # 自动校验 except ValidationError as e: logger.error(fState validation failed: {e}) return {error: invalid_state, details: str(e)} # ... 执行逻辑5.2 资源熔断CPU/GPU不是指标而是“服务心跳”监控CPU90%就告警是初级做法。真正的熔断需感知资源饱和度对服务质量的直接影响。我们定义“服务心跳”指标CPU心跳每秒采集psutil.cpu_percent(interval0.1)若连续5次85%触发CPU熔断——暂停非核心任务如日志聚合、指标上报优先保障工具调用。GPU心跳监控nvidia-smi --query-gpuutilization.gpu --formatcsv,noheader,nounits若P95利用率95%触发GPU熔断——降级模型如70B→13B或启用CPU fallback。内存心跳监控psutil.virtual_memory().percent若80%触发内存熔断——清理LRU缓存如OCR结果缓存释放内存。熔断策略不是“停服务”而是动态降级class ResourceGuard: def __init__(self): self.cpu_meltdown False self.gpu_meltdown False def check_and_adapt(self): cpu_pct psutil.cpu_percent(interval0.1) gpu_pct get_gpu_utilization() if cpu_pct 85 and not self.cpu_meltdown: self.cpu_meltdown True logger.warning(CPU meltdown detected, disabling non-critical tasks) self.disable_non_critical_tasks() if gpu_pct 95 and not self.gpu_meltdown: self.gpu_meltdown True logger.warning(GPU meltdown detected, switching to CPU fallback) self.switch_to_cpu_fallback() def disable_non_critical_tasks(self): # 停止日志聚合线程 if hasattr(self, log_aggregator) and self.log_aggregator.is_alive(): self.log_aggregator.stop() # 降低指标采样率 self.metrics_sampler.interval 30 # 从5秒改为30秒 # 在Agent主循环中定期调用 guard ResourceGuard() while running: guard.check_and_adapt() # ... 执行Agent逻辑5.3 错误分类与自愈不是重试而是“病因诊断”agent execution terminated due to error.必须分类因为不同错误的自愈策略截然不同错误类型典型原因自愈策略人工介入阈值Transient瞬时网络抖动、API临时限流指数退避重试≤3次重试失败后告警Configuration配置API Key失效、Endpoint错误自动刷新凭证、切换备用Endpoint立即告警需人工修复Data数据输入含非法字符、格式错误数据清洗、格式转换清洗失败后告警Logic逻辑模型幻觉、工具参数错位回滚到上一状态、启用规则引擎兜底立即告警需算法优化我们构建错误分类器Error Classifier基于错误栈、HTTP状态码、工具名、输入哈
上一篇/下一篇内容由系统自动关联 返回资讯列表 →