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

Agent工程2026:从提示词堆砌到生产级智能体的完整跃迁路径

如果你今天还在用给LLM加几个工具调用来描述你的Agent那我们需要认真谈谈了。2026年的AI工程现实是绝大多数Agent项目死在了从Demo到生产的路上。不是因为模型不够强而是因为工程没跟上。本文会系统梳理Agent工程化的核心路径从基础架构到可观测性从错误处理到成本控制给你一份可直接参考的生产级指南。为什么Demo能跑、生产就崩先说痛点。一个典型的Agent Demo通常长这样一个System Prompt几个工具函数一个while循环完事。在测试集上跑得飞起一到真实用户手里就各种翻车。原因其实很明确输入分布偏移。测试时你知道用户会问什么生产环境用户问的是你完全没预料到的东西。Agent的规划能力在面对奇怪输入时会快速退化。工具调用失败的传导效应。一个工具返回了意外格式Agent不知道怎么处理然后开始幻觉然后调用下一个错误的工具雪球越滚越大。上下文窗口的隐形炸弹。多轮对话跑久了工具调用的结果积累在上下文里Token越来越贵模型注意力越来越分散最后答非所问。缺少可观测性。你不知道Agent在哪个步骤出问题不知道为什么它做了那个决策出了问题只能瞪着日志发呆。生产级Agent的架构基础明确区分协调层和执行层这是最关键的架构决策。协调层Orchestrator负责规划、决策、工具选择执行层Executor负责具体的工具调用和结果处理。两者不要混在一起。classAgentOrchestrator:协调层只负责规划和决策def__init__(self,llm_client,tool_registry):self.llmllm_client self.toolstool_registry self.plan_history[]asyncdefplan_next_action(self,goal:str,context:dict)-Action:根据目标和当前上下文规划下一步行动promptself._build_planning_prompt(goal,context)responseawaitself.llm.complete(prompt)returnself._parse_action(response)def_build_planning_prompt(self,goal:str,context:dict)-str:# 包含目标、已完成步骤、可用工具、当前状态available_toolsself.tools.list_tools()completed_stepscontext.get(completed_steps,[])returnf 你是一个任务规划器。你的目标是{goal}已完成的步骤{self._format_steps(completed_steps)}可用工具{self._format_tools(available_tools)}基于当前状态请规划下一步行动。如果任务已完成返回 DONE。 以JSON格式返回{{action: tool_name, params: {{...}}, reasoning: ...}} classToolExecutor:执行层只负责工具调用和错误处理def__init__(self,tools:dict):self.toolstools self.retry_configRetryConfig(max_retries3,backoff_factor2)asyncdefexecute(self,action:Action)-ToolResult:toolself.tools.get(action.name)ifnottool:returnToolResult.error(fUnknown tool:{action.name})forattemptinrange(self.retry_config.max_retries):try:resultawaittool.call(action.params)returnToolResult.success(result)exceptToolTimeout:ifattemptself.retry_config.max_retries-1:returnToolResult.error(Tool timeout after retries)awaitasyncio.sleep(self.retry_config.backoff_factor**attempt)exceptToolErrorase:returnToolResult.error(str(e))# 不重试业务错误 这种分离让你可以独立优化每一层也让测试变得更简单。### 状态管理不只是记录对话历史生产级Agent需要显式的状态管理而不是把所有东西都塞进对话历史。 pythondataclassclassAgentState:session_id:strgoal:strstatus:Literal[planning,executing,waiting,done,failed]# 执行进度completed_steps:list[StepResult]field(default_factorylist)current_step:Optional[Step]None# 上下文严格控制大小working_memory:dictfield(default_factorydict)# 当前任务相关的临时数据# 统计token_usage:int0tool_call_count:int0start_time:floatfield(default_factorytime.time)propertydefelapsed_seconds(self)-float:returntime.time()-self.start_timedefadd_step_result(self,result:StepResult):self.completed_steps.append(result)# 自动摘要只保留最近N步的完整结果更早的压缩成摘要iflen(self.completed_steps)10:self._compress_early_steps()def_compress_early_steps(self):把早期步骤压缩成摘要避免上下文无限增长early_stepsself.completed_steps[:5]summaryf已完成{len(early_steps)}个早期步骤.join(s.summaryforsinearly_steps)self.completed_steps[StepResult.summary(summary)]self.completed_steps[5:]### 工具契约防御性设计每个工具都应该有明确的输入输出契约并且在边界处做好防御 pythonfrompydanticimportBaseModel,validatorclassSearchToolInput(BaseModel):query:strmax_results:int5validator(query)defquery_not_empty(cls,v):ifnotv.strip():raiseValueError(搜索词不能为空)returnv.strip()[:500]# 截断过长的查询validator(max_results)defresults_in_range(cls,v):returnmax(1,min(v,20))# 强制限制范围classSearchToolOutput(BaseModel):results:list[SearchResult]total_found:intsearch_took_ms:int# 提供给Agent的结构化摘要defto_agent_context(self)-str:ifnotself.results:return搜索未找到相关结果returnf找到{self.total_found}条结果以下是前{len(self.results)}条\n\\n.join(f-{r.title}:{r.snippet}forrinself.results)## 可观测性让Agent不再是黑盒没有可观测性你就是在盲飞。生产级Agent必须能回答这几个问题-这次任务Agent做了哪些决策理由是什么--哪个步骤花了最多时间和Token--失败是在哪里发生的### Trace设计pythonimportuuidfromcontextlibimportasynccontextmanagerclassAgentTracer:def__init__(self,backend):# backend可以是Langfuse、自建系统等self.backendbackendasynccontextmanagerasyncdeftrace_session(self,session_id:str,goal:str):traceTrace(idsession_id,goalgoal,start_timetime.time())try:yieldtrace trace.statussuccessexceptExceptionase:trace.statusfailedtrace.errorstr(e)raisefinally:trace.end_timetime.time()awaitself.backend.save(trace)asynccontextmanagerasyncdeftrace_step(self,trace:Trace,step_name:str,**metadata):stepStep(idstr(uuid.uuid4()),namestep_name,metadatametadata,start_timetime.time())try:yieldstep step.statussuccessexceptExceptionase:step.statusfailedstep.errorstr(e)raisefinally:step.end_timetime.time()trace.add_step(step) 实际使用时每个规划决策和工具调用都包在trace里 pythonasyncwithtracer.trace_session(session_id,goal)astrace:whilenotdone:asyncwithtracer.trace_step(trace,planning,context_sizelen(state.completed_steps))asstep:actionawaitorchestrator.plan_next_action(goal,state)step.record_llm_call(tokensaction.tokens_used,modelaction.model)asyncwithtracer.trace_step(trace,ftool:{action.name},paramsaction.params)asstep:resultawaitexecutor.execute(action)step.record_result(result)## 成本控制让Agent可持续Token费用是Agent上生产后的第一个噩梦。几个实用策略**上下文压缩策略**。不要把每次工具调用的完整响应都放进上下文。设计一个摘要函数把长结果压缩成关键信息 pythonclassContextManager:MAX_CONTEXT_TOKENS8000# 为规划留出足够空间defbuild_context(self,state:AgentState)-str:context_parts[]# 目标始终保留context_parts.append(f目标{state.goal})# 已完成步骤最近3步保留完整更早的只保留摘要recentstate.completed_steps[-3:]earlierstate.completed_steps[:-3]ifearlier:summaries[s.summaryforsinearlier]context_parts.append(f早期步骤已摘要{; .join(summaries)})forstepinrecent:context_parts.append(f步骤{step.name}{step.result_text})context\n\n.join(context_parts)# Token超限时进一步压缩ifself._estimate_tokens(context)self.MAX_CONTEXT_TOKENS:contextself._emergency_compress(context)returncontext **工具调用缓存**。同样的工具调用不要重复执行 pythonclassCachedToolExecutor:def__init__(self,executor:ToolExecutor,cache_ttl:int300):self.executorexecutor self.cache{}self.cache_ttlcache_ttlasyncdefexecute(self,action:Action)-ToolResult:# 只缓存幂等的工具搜索、查询等不缓存写操作ifnotaction.is_cacheable:returnawaitself.executor.execute(action)cache_keyf{action.name}:{json.dumps(action.params,sort_keysTrue)}ifcache_keyinself.cache:entryself.cache[cache_key]iftime.time()-entry[time]self.cache_ttl:returnentry[result]resultawaitself.executor.execute(action)self.cache[cache_key]{result:result,time:time.time()}returnresult ## 错误处理给Agent一个降级策略Agent在生产环境会遇到各种意外情况必须为每种失败模式设计明确的处理策略 pythonclassAgentRunner:asyncdefrun(self,goal:str,session_id:str)-AgentResult:stateAgentState(session_idsession_id,goalgoal)asyncwithself.tracer.trace_session(session_id,goal):whileTrue:# 安全边界检查ifstate.tool_call_count50:returnAgentResult.failed(reasonexceeded_tool_limit,partial_resultself._extract_partial_result(state))ifstate.elapsed_seconds300:# 5分钟超时returnAgentResult.failed(reasontimeout,partial_resultself._extract_partial_result(state))try:actionawaitself.orchestrator.plan_next_action(goal,state)exceptLLMErrorase:# LLM调用失败等待后重试最多3次ifstate.llm_errors3:state.llm_errors1awaitasyncio.sleep(5)continuereturnAgentResult.failed(reasonllm_unavailable)ifaction.is_done:returnAgentResult.success(state)resultawaitself.executor.execute(action)# 工具失败通知Agent让它决策如何继续ifnotresult.ok:state.add_step_result(StepResult(stepaction,resultf工具调用失败{result.error}。请考虑替代方案。))else:state.add_step_result(StepResult(stepaction,resultresult.data))## 从这里开始的实践建议1.**先跑通最简单的任务建立基线**。不要一上来就构建通用Agent先找一个具体场景把它做到生产可靠。2.**从第一天就接入可观测性**。Langfuse是个不错的选择开源可自建。不要等到出问题再加。3.**设置硬性的安全边界**。工具调用上限、时间上限、Token上限每一个都要有不能让Agent无限跑。4.**测试要包含对抗性输入**。专门设计一批会让Agent迷惑的输入纳入你的回归测试集。5.**记录每一次生产失败**。建立一个失败案例库每次新的异常都要分析根因更新你的错误处理策略。 Agent工程化不是一天就能完成的事但架构方向对了后面每一步优化都会积累成真正的竞争壁垒。---*本文关键词Agent工程、生产级AI、LLM工具调用、可观测性、成本控制*
http://www.gsyq.cn/news/1333915.html

相关文章:

  • Creo 8.0 + Matlab 2022b 联调实战:手把手搞定Simscape Multibody Link插件(附完整配置文件)
  • 告别混乱!手把手教你用Python脚本整理RAF-DB人脸表情数据集(附Jupyter Notebook代码)
  • WPF文本框Placeholder的进阶玩法:结合ValidationRule,实现带验证状态的输入提示
  • Vivado时序报告里setup/hold的Requirement值到底怎么算?一个例子讲透时钟边沿选取
  • 把Milvus向量检索封装成一个Python工具类,让你的AI项目代码更整洁
  • RT-Thread Studio + STM32CubeMX 联调ADC避坑指南:从配置到读取数据的完整流程
  • AI编程在前后端分离中的最新进展(2026年5月)
  • FPGA资源吃紧?看Artix7-35T如何“精打细算”实现MIPI视频解码与HDMI输出
  • 别再傻傻分不清了!用一张图看懂SRE、DevOps工程师和传统运维到底差在哪
  • 现货TJA1101AHN/0Z是NXP推出的一款高性能、低功耗的汽车以太网PHY芯片,作为TJA1101A的改进版本,专为车载电子系统设计,支持100BASE-T1标准,具备出色的可靠性与集成度
  • 铝基板焊点氧化、发黑、腐蚀故障原因与长效防护
  • 5分钟解锁A股数据宝藏:Python通达信接口的量化交易实战指南
  • 长春沙发翻新换皮靠谱商家推荐|匠阁、御匠、锦修三大品牌全解析、服务内容、全市上门 - 卓信营销
  • 在MMDetection 3.x中手把手复现EfficientDet的BiFPN模块(附代码逐行解读)
  • 从课堂到竞赛:用Proteus仿真一个带违规判罚的智能抢答器(74LS190倒计时核心)
  • 超详细、一步不落地教你:Windows + MinGW 32 位 编译 OpenCV 4.6.0
  • 2026运营岗位如何系统提升个人能力:别再盲目努力,数据能力是你逆袭的起点
  • 告别编译噩梦!Win10下用VSCode+MinGW+CMake编译OpenCV 4.5.3的保姆级避坑指南
  • UWB:可视测距、遮挡失联|镜像:盲区推演、全域接续 可视测距受限与盲区智能重构技术解析
  • 三小时配置,全年自动:淘金币自动化脚本的技术解密与实战应用
  • 保姆级教程:在Ubuntu 14.04上为ARM64交叉编译带WebRTC的ZLMediaKit(含libsrtp/OpenSSL避坑指南)
  • ThinkPad双风扇智能控制:TPFanCtrl2底层通信机制与热管理策略深度解析
  • Win11专业版用户看过来:Hyper-V安装后必做的3项优化配置,让你的虚拟机飞起来
  • Datasheet学习4(Audio)(TODO)
  • 【2026年华为暑期实习-非AI方向(通软嵌软测试算法数据科学)- 5月20日-第三题- 技能树学习路径规划】(题目+思路+JavaC++Python解析+在线测试)
  • 深入STM32中断响应流程:从按键触发到ISR执行,用寄存器视角拆解NVIC与SCB的幕后工作
  • SaySo 语音识别相关技术解析,从语音输入到可用文本
  • 我的Type-C串口板又烧了?一个CH340N电路设计中的隐藏坑点与补救方案
  • 告别黑框!树莓派4B远程桌面完整指南:从VNC配置到RealVNC/XRDP方案选择与优化
  • HarmonyOS ArkUI Canvas 实战:从零绘制金融级价格走势图