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

news2026/5/22 3:58:10
如果你今天还在用给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.coloradmin.cn/o/2629787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…