智能体编程基本设计
智能体分层架构与抽象接口设计汇总本文汇总内容智能体框架现状、BaseAgent 抽象基类、两种架构对比Agent→Tool / Agent→Skill→Tool可直接保存为agent_arch.md目录智能体编程接口现状无全局统一标准方案A单层架构Agent → Tool最简无技能层单层架构代码实现BaseAgent 抽象 LangChain适配器方案B三层架构Agent → Skill → Tool引入技能层三层架构代码实现BaseSkill 抽象、改造后的BaseAgent两种架构对比 设计取舍扩展方向与局限性1. 智能体编程接口现状无全局统一标准核心结论没有全球统一、底层强制的智能体编程标准各框架原生接口差异很大但正在涌现一批互操作规范/抽象层用来抹平差异。分为两层框架原生API私有、上层协议/抽象规范社区推进可选主流框架原生接口差异框架Agent核心范式工具定义方式执行器/运行时记忆、状态管理LangChainAgent AgentExecutor基于Runnable链tool/ Tool对象AgentExecutor循环调度独立Memory组件可挂载LlamaIndexAgent作为QueryEngine子类ToolSpec / FunctionToolAgentRunner内置Memory绑定Agent实例AutoGen多智能体对话角色Agent是对话参与者register_function装饰器GroupChat/ConversationManager对话消息列表CrewAI任务角色团队编排工具继承BaseToolCrew执行器任务上下文Semantic Kernel微软Kernel作为核心容器Agent是插件集合KernelFunction / PluginKernel调度器Kernel状态痛点同一个自定义工具不能直接跨框架复用Agent循环、状态、scratchpad 都是框架私有实现。正在发展的跨框架规范非强制标准MCPModel Context ProtocolAnthropic工具调用层标准化协议。大模型 ↔ 工具通信统一工具可跨Agent框架复用不是Agent编排规范。OpenAI Function Calling Schema事实通用的工具描述schema绝大多数框架支持转换仅描述函数元数据不定义Agent思考循环。A2AAgent2AgentGoogle解决智能体之间互相通信不解决Agent内部编排代码标准化。分层理解Agent业务编排代码思考循环、任务拆解、状态、记忆无统一规范框架私有工具描述schema函数名、参数OpenAI function schema 为事实通用格式工具远程调用协议MCP正在成为新标准实现跨框架复用工具智能体之间互相通信A2A 目标做跨Agent对话标准2. 方案A单层架构Agent → Tool最简无技能层适用场景工具为独立原子动作不存在固定多工具串行编排无需业务前置校验、权限控制。Agent思考规划、判断意图选择工具调用维护会话记忆与执行循环Tool原子执行单元单一原始动作API调用、计算、数据库查询无业务规则依赖pipinstallpydantic统一数据模型 BaseAgent抽象基类fromabcimportABC,abstractmethodfromtypingimportAny,List,Optional,DictfrompydanticimportBaseModel# 通用消息模型统一各框架消息结构classAgentMessage(BaseModel):统一消息结构替代各框架各自的Messagerole:str# user / assistant / toolcontent:strtool_call_id:Optional[str]Nonetool_name:Optional[str]Nonetool_args:Optional[Dict[str,Any]]NoneclassAgentToolDefinition(BaseModel):统一工具定义模型可直接转OpenAI function schema对接MCPname:strdescription:strparameters:Dict[str,Any]# json schema# 可选工具执行入口远程MCP则填server地址本地则填callableremote_endpoint:Optional[str]NoneclassAgentResult(BaseModel):统一返回结果标准化输出屏蔽框架返回结构体差异success:booloutput:strmessages:List[AgentMessage]intermediate_steps:List[Dict[str,Any]]# 工具调用中间日志error:Optional[str]None# 抽象智能体基类 classBaseAgent(ABC): 抽象Agent基类所有智能体必须实现这些核心方法 上层业务只调用这里的接口不感知LangChain/AutoGen等底层 abstractmethoddefadd_tool(self,tool_def:AgentToolDefinition)-None:注册工具统一工具定义对象子类负责转换成框架原生Toolpassabstractmethoddefset_system_prompt(self,prompt:str)-None:设置系统提示词passabstractmethoddefset_memory(self,memory:Any)-None:挂载记忆组件memory同样可以再做抽象BaseMemorypassabstractmethodasyncdefarun(self,user_input:str,**kwargs)-AgentResult:异步执行智能体推荐优先异步passabstractmethoddefrun(self,user_input:str,**kwargs)-AgentResult:同步执行智能体passabstractmethoddefreset(self)-None:重置会话状态清空scratchpad、清空本轮中间步骤保留工具/系统提示passabstractmethoddefget_history(self)-List[AgentMessage]:获取标准化对话历史passLangChain 适配器实现BaseAgent子类fromlangchain.agentsimportAgentExecutor,create_openai_tools_agentfromlangchain_core.toolsimportToolfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplateclassLangChainAgent(BaseAgent):def__init__(self,llm_model:str,llm_api_key:str,temperature:float0):self.llmChatOpenAI(modelllm_model,api_keyllm_api_key,temperaturetemperature)self.tools:List[Tool][]self.system_prompt你是一个智能助手可以调用工具解决问题。self.agent_executor:Optional[AgentExecutor]Noneself._message_history:List[AgentMessage][]defadd_tool(self,tool_def:AgentToolDefinition)-None:# 将统一AgentToolDefinition → LangChain原生Tool对象lc_toolTool(nametool_def.name,descriptiontool_def.description,funclambda*args:ftool placeholder:{tool_def.name})self.tools.append(lc_tool)self._rebuild_agent()defset_system_prompt(self,prompt:str)-None:self.system_promptprompt self._rebuild_agent()defset_memory(self,memory:Any)-None:raiseNotImplementedError(Memory适配按需实现)def_rebuild_agent(self):promptChatPromptTemplate.from_messages([(system,self.system_prompt),(user,{input}),(agent_scratchpad,{agent_scratchpad}),])agentcreate_openai_tools_agent(self.llm,self.tools,prompt)self.agent_executorAgentExecutor(agentagent,toolsself.tools,verboseTrue)defrun(self,user_input:str,**kwargs)-AgentResult:ifnotself.agent_executor:raiseRuntimeError(Agent未初始化请添加工具或设置prompt)try:raw_resself.agent_executor.invoke({input:user_input})resultAgentResult(successTrue,outputraw_res[output],messages[AgentMessage(roleuser,contentuser_input)],intermediate_stepsraw_res.get(intermediate_steps,[]),errorNone)self._message_history.append(AgentMessage(roleuser,contentuser_input))self._message_history.append(AgentMessage(roleassistant,contentraw_res[output]))returnresultexceptExceptionase:returnAgentResult(successFalse,output,messagesself._message_history,intermediate_steps[],errorstr(e))asyncdefarun(self,user_input:str,**kwargs)-AgentResult:ifnotself.agent_executor:raiseRuntimeError(Agent未初始化)try:raw_resawaitself.agent_executor.ainvoke({input:user_input})resultAgentResult(successTrue,outputraw_res[output],messages[AgentMessage(roleuser,contentuser_input)],intermediate_stepsraw_res.get(intermediate_steps,[]),errorNone)self._message_history.append(AgentMessage(roleuser,contentuser_input))self._message_history.append(AgentMessage(roleassistant,contentraw_res[output]))returnresultexceptExceptionase:returnAgentResult(successFalse,output,messagesself._message_history,intermediate_steps[],errorstr(e))defreset(self)-None:self._message_history[]defget_history(self)-List[AgentMessage]:returnself._message_history.copy()业务调用示例defbusiness_demo(agent:BaseAgent):calc_toolAgentToolDefinition(namecalculator,description数学计算器用于计算表达式,parameters{type:object,properties:{expression:{type:string,description:数学表达式}},required:[expression]})agent.add_tool(calc_tool)agent.set_system_prompt(你是擅长数学计算的助手复杂算式调用计算器工具。)resagent.run(计算 (100200)*12)print(结果,res.output)print(是否成功,res.success)print(中间步骤,res.intermediate_steps)if__name____main__:agent:BaseAgentLangChainAgent(llm_modelgpt-3.5-turbo,llm_api_keysk-xxx)business_demo(agent)必须抽象的接口方法add_tool工具注册抹平框架Tool对象差异set_system_prompt系统角色定义run / arun同步/异步执行入口业务调用核心reset会话重置隔离多轮会话get_history标准化读取对话历史用于日志/展示set_memory挂载记忆组件不放入抽象层框架内部私有变量、框架特有参数verbose、迭代上限、框架独有的高级能力。3. 方案B三层架构Agent → Skill → Tool引入技能层适用场景企业业务存在固定子任务编排、权限校验、参数预处理/结果清洗、底层工具需要对LLM屏蔽。分层职责Agent智能体思考、任务规划、意图判断决定调用技能维护会话状态、记忆、多轮思考循环。Agent看不到底层Tool。Skill技能业务能力封装单元。内部编排多个工具自带前置校验、鉴权、参数预处理、结果格式化、异常重试。对外暴露业务语义。Tool工具底层原子执行单元只做原始动作不带业务规则。不直接暴露给LLM。新增 BaseSkill 抽象 修改BaseAgent管理Skill而不是ToolfromabcimportABC,abstractmethodfromtypingimportAny,List,Optional,DictfrompydanticimportBaseModel# 复用前面定义的 AgentMessage / AgentResult / AgentToolDefinition# 【技能抽象层 BaseSkill】 classBaseSkill(ABC): 技能业务能力封装内部编排多个原子Tool Agent只能感知Skill不知道内部的Tool细节 name:strdescription:strparameters_schema:Dict[str,Any]# 暴露给LLM的入参schemaabstractmethodasyncdefexecute(self,params:Dict[str,Any])-Dict[str,Any]: 执行技能 内部逻辑参数校验 → 调用一个/多个底层Tool → 结果处理、异常捕获 返回标准化业务结果给Agent passabstractmethoddefget_required_tools(self)-List[AgentToolDefinition]:返回该技能依赖的底层原子工具列表框架内部注册使用不暴露给LLMpass# 改造BaseAgentAgent挂载Skill不再直接挂载Tool classBaseAgent(ABC):def__init__(self):self.skills:List[BaseSkill][]# Agent挂载【技能】不是直接挂载toolself.system_prompt:strself._message_history:List[AgentMessage][]abstractmethoddefadd_skill(self,skill:BaseSkill)-None:注册技能对外暴露给LLM的是Skill的name/description/schemapassabstractmethoddefset_system_prompt(self,prompt:str)-None:passabstractmethodasyncdefarun(self,user_input:str,**kwargs)-AgentResult:passabstractmethoddefrun(self,user_input:str,**kwargs)-AgentResult:passabstractmethoddefreset(self)-None:passabstractmethoddefget_history(self)-List[AgentMessage]:pass具体Skill实现示例报表生成技能内部编排两个工具classReportSkill(BaseSkill):namegenerate_monthly_reportdescription生成月度业务报表输入月份返回格式化业务报表parameters_schema{type:object,properties:{month:{type:string,description:报表月份格式YYYY-MM}},required:[month]}defget_required_tools(self)-List[AgentToolDefinition]:# 技能内部依赖两个底层原子工具LLM看不见这两个工具return[AgentToolDefinition(namequery_db_sales,description查询销售原始数据,parameters{type:object,properties:{month:{type:string}},required:[month]}),AgentToolDefinition(nameformat_markdown,description将原始数据转为markdown表格,parameters{type:object,properties:{raw_data:{type:object}},required:[raw_data]})]asyncdefexecute(self,params:Dict[str,Any])-Dict[str,Any]:# 技能内部业务逻辑固定编排LLM不用管 monthparams[month]# 1. 前置校验iflen(month)!7:return{ok:False,result:月份格式错误要求YYYY-MM}# 2. 调用底层工具1查询数据库raw_dataawaitself._call_tool(query_db_sales,{month:month})# 3. 调用底层工具2格式化report_textawaitself._call_tool(format_markdown,{raw_data:raw_data})# 4. 后置处理return{ok:True,result:report_text}asyncdef_call_tool(self,tool_name:str,args:Dict):# 技能内部私有方法调用底层原子工具Agent感知不到# 这里可以接入工具执行器、鉴权、日志、超时控制return{sales:123000,order_count:320}LangChain适配器改造思路LangChainAgent 在add_skill的时候提取Skill的name/description/parameters_schema包装成OpenAI function schema暴露给LLM把skill.execute作为function的回调技能依赖的底层Tool仅在适配器内部注册不暴露给大模型。LLM只能看到技能列表不会直接操作底层工具。4. 两种架构对比 设计取舍架构模型适用场景优点缺点单层Agent → Tool简单场景工具独立无固定编排代码简单抽象少LLM承担全部多步编排容易出错业务规则散落在prompt里三层Agent → Skill → Tool企业业务、固定子任务、权限管控、工具编排业务逻辑固化在SkillLLM只做意图判断底层工具可替换统一鉴权审计多一层抽象开发量增加什么时候技能层是多余工具本身就是业务最小单元工具调用不需要前置参数校验、结果清洗、业务权限判断不存在“一个业务能力需要连续调用多个原子工具”业务简单LLM直接决定调用哪个原子工具。什么时候引入Skill层满足任意一条技能层就具备明确价值一个业务能力需要串联多个原子Tool固定执行链路下沉到技能降低LLM规划负担需要业务前置校验、权限控制、参数预处理、结果脱敏、异常重试对外暴露业务语义底层工具变更时不需要修改Agent提示词技能跨多个智能体复用安全管控底层Tool不暴露给LLM所有底层调用由技能代理执行便于审计熔断。5. 扩展方向与局限性扩展方向新增BaseMemory抽象做成适配器LangChainMemoryAdapter、CustomMemoryAdapterMCP工具适配器add_mcp_tool(server_url)自动将MCP工具转为AgentToolDefinition回调钩子on_tool_start / on_tool_end统一日志埋点增加限流、最大迭代次数放在Agent构造参数属于实现层而非抽象接口局限性抽象层只能提取所有Agent共有的最小子集各框架独有高级能力多角色、分层PlanExecute不能塞进BaseAgent需要单独扩展接口。抽象层会带来少量封装开销适合中长期项目简单Demo没必要做这一层。6. 可选后续开发模块Skill执行器统一调度技能内部工具、鉴权、日志、超时熔断完整业务调用示例演示Agent调用ReportSkillBaseMemory抽象类配套适配器实现回调钩子扩展版本

相关新闻

2026最新李连杰海啸版本升级避坑指南:API全变后如何快速恢复

2026最新李连杰海啸版本升级避坑指南:API全变后如何快速恢复

2026最新李连杰海啸版本升级避坑指南:API全变后如何快速恢复 版本升级后 API 全变了,项目直接崩盘,这是很多老手和新人都没预料到的噩梦。2026最新的李连杰海啸(Li Jianjie Tsunami,简称 LJT)框架在 3.0…

2026/9/23 20:20:35 阅读更多 →
雷蛇驱动官网图解原理:3步搞定配置卡壳

雷蛇驱动官网图解原理:3步搞定配置卡壳

雷蛇驱动官网图解原理:3步搞定配置卡壳 配置环境就卡半天?别急,这锅不全是你的。很多开发者在调试雷蛇外设时,总以为去官网下载个安装包就能万事大吉。其实, 雷蛇驱动官网 背后的通信机制才是关键。今天咱们不聊虚的,直接通过 图解原理…

2026/9/23 20:19:34 阅读更多 →
从数据到决策:数据分析报告写作框架与避坑指南

从数据到决策:数据分析报告写作框架与避坑指南

开头我第一次写数据分析报告的时候,花了整整三天时间调格式、做图表,最后交上去,老板翻了三十秒,抬头问我:"所以呢?我们的问题到底出在哪?"那一刻我意识到,我做的是一份&q…

2026/9/23 20:19:34 阅读更多 →

最新新闻

Springboot集成Tesseract OCR:从图片到字段的落地实践

Springboot集成Tesseract OCR:从图片到字段的落地实践

简介:一份面向Spring Boot开发者的OCR图片文字识别实现方案,聚焦如何整合Tesseract开源识别引擎完成图片文本自动提取,适合有Java基础、需要在文档扫描、证照识别等场景落地识别功能的读者参考。资源以PDF格式打包,共1个文件&…

2026/9/23 21:05:49 阅读更多 →
PaddleSpeech ASR 识别解码模块 paddlespeech.s2t.decoders.recog 源码深度解析

PaddleSpeech ASR 识别解码模块 paddlespeech.s2t.decoders.recog 源码深度解析

PaddleSpeech ASR 识别解码模块 paddlespeech.s2t.decoders.recog 源码深度解析 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Veri…

2026/9/23 21:05:49 阅读更多 →
观赏虾突然死亡原因分析与水质管理指南

观赏虾突然死亡原因分析与水质管理指南

1. 养虾新手的第一道坎:突然死亡事件分析那天早上掀开鱼缸盖子的场景至今难忘——昨晚还活蹦乱跳的观赏虾,今早突然横七竖八地躺在缸底。这种突如其来的死亡事件,几乎每个养虾人都会经历。不同于鱼类养殖,虾类对水质变化更为敏感&…

2026/9/23 21:05:49 阅读更多 →
papi酱最火的视频新手避坑指南与技术方案对比

papi酱最火的视频新手避坑指南与技术方案对比

papi酱最火的视频新手避坑指南与技术方案对比 看到满屏红色的 StackTrace,报错信息像天书一样滚过屏幕,是不是瞬间头大?别慌,这几乎是每个接触后端或全栈开发新手的必经之路。很多时候,你以为自己在看代码,其实是在看一场关于“papi…

2026/9/23 21:04:49 阅读更多 →
netstat 网络排查与安全分析速查指南(jaywcjlove/reference)

netstat 网络排查与安全分析速查指南(jaywcjlove/reference)

文档知识库教程开发工具 【免费下载链接】reference 为开发人员分享快速参考备忘清单(速查表) 项目地址: https://gitcode.com/jaywcjlove/reference 点击查看 免费下载 本指南以开源速查仓库 jaywcjlove/reference 中 docs/netstat.md 为骨架,系统梳理…

2026/9/23 21:04:49 阅读更多 →
PaddleSpeech DeepSpeech2 卷积下采样模块 `paddlespeech.s2t.models.ds2.conv` 源码级解析

PaddleSpeech DeepSpeech2 卷积下采样模块 `paddlespeech.s2t.models.ds2.conv` 源码级解析

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword…

2026/9/23 21:04:49 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →