资讯详情

资讯详情

AI Agent入门第一课:先手写底层,别急着啃框架

这两年每逢有朋友转行进AI赛道十有八九第一周都会跑来问我同一个问题我是该先学哪个Agent框架我通常不直接回答先反问一句你今天之前手写过一次Agent吗得到的回答几乎都是没有大家都说直接上框架最快。这个场景我见得太多了。就在上个月有位A同学装好了某个开源Agent框架跑通了官方Demo激动得半夜发消息说“成了”。第二天想把这个Demo改成自己的小需求连改提示词都找不到入口下午就开始怀疑人生。不是他笨是顺序错了。这篇文章就是写给新手和转行者的AI Agent入门这件事第一件事不是打开框架文档而是先把框架放一边老老实实把底层的东西打通。1. 为什么“一上来就啃框架”是新手最容易掉的坑1.1 框架解决的是工程问题不是理解问题Agent编排框架最擅长的事情是把一个复杂流程包装成几个类让你几行代码就能串起“大模型 工具 记忆”的调用链。听起来很爽对吧问题恰恰出在这里框架把复杂度折叠起来了而新手最缺的是支撑这些折叠概念的底层画面感。一个通俗的类比你去学做饭正常顺序是先搞懂火候、调味、食材熟度再学习用炒锅、蒸锅、高压锅。可很多人一上来就买了全套分子料理设备结果连番茄炒蛋都做不稳。做砸了一盘菜只能在“设备参数”里找原因实际上问题出在最基本的“火力判断”上。Agent框架就是那套分子料理设备它是用来复用成熟逻辑的不是用来帮你从零理解“大模型到底是如何被Agent调用的”。我自己带过不少新人一个很普遍的现象用了框架的Memory组件但不知道它本质上是把历史消息裁切、摘要、拼接后重新放回上下文。所以一旦遇到成本问题或丢失上下文的问题就只会换配置参数根本不知道从哪排查。没有底层认知之前框架的每一个封装都是一个黑箱黑箱越多你越难成长。1.2 啃框架的新手逃不过这几种症状和框架打过几个月交道的朋友看看下面这几条是不是很眼熟。第一种症状叫“Demo都会跑自己写不出”。照着官方示例改个模型名、换个应用场景可以跑通。可一旦要做一个官方文档里没有的组合逻辑整个人就卡住了。因为你记的是示例的骨架不是它背后的设计意图。第二种症状叫“文档读得懂报错看不懂”。框架的报错堆栈往往好几层底层是某个HTTP库的超时中间是会话管理器最上面才是你的业务代码。新手根本不知道这中间发生了什么只能把整段报错往搜索引擎里扔靠运气找答案。第三种症状叫“概念背得全串不成线”。你跟新手聊Chain、Tool、Memory、Agent他都能说出个大概。但你问他我的工具返回了一个结果这个结果怎么回到大模型那边继续推理他答不上来——因为框架的API把这一步封装得太漂亮了他从来没有见过“把工具结果拼回消息列表”这个动作本身。如果你有其中任何两条问题很可能不是框架没选好而是你跳过了某个关键的学习阶段。1.3 根子上的问题学习顺序反了上面这些症状病根只有一个学习顺序反了。很多人学Agent是从“框架”出发往上走向“应用”一路上全是抽象概念。正确路径应该是从“原理”出发先理解一个Agent的最小运行循环再亲手实现它最后才去看框架如何封装和增强它。这个顺序一旦反了你永远是被框架拖着走而不是你在驾驭框架。如果把AI Agent比作一辆车框架是变速箱是现成的调校方案但你要先懂得发动机怎么转、离合器怎么配合才能知道什么时候用哪个挡位。什么都不懂的时候直接进驾驶座踩油门车当然也能走但稍微遇到点坡道就熄火。所以我给所有新手的第一个建议都是拒绝那个“框架捷径”先让自己亲眼看到、亲手写出一个不依赖框架的Agent“心脏组织工程”。2. 动手之前先把大模型API这层“地基”摸透2.1 大模型API的真面目一个文本进一个文本出先破除一个误解大模型API没有你想的那么玄。它本质上就是一个“文本进、文本出”的接口——你发一段字符串过去它吐一段字符串回来。你说“请用一句话介绍你自己。”它回到“我是来自某某公司的语言模型很高兴认识你。”仅此而已。没有“记忆”没有“思考”没有“Agent能力”也没有“工具使用能力”——这一切都是你基于它的输出自己实现的。这就是为什么我说Agent入门的第一步其实是把大模型API的调用逻辑摸透。拿Python举一个最朴素的例子这段代码能让你立刻看清大模型API的真面目import requests # 假装这是某个大模型平台的API地址实际使用时用平台真实地址替换 url https://example.com/api/generate payload { messages: [ {role: system, content: 你是一个简洁的助手。}, {role: user, content: 今天天气怎么样} ] } resp requests.post(url, jsonpayload, timeout30) result resp.json()[message][content] print(result) # 模型返回的纯文本你看整个过程不涉及任何“Agent”的概念。无非是拼好一个消息列表发出去收回来一段文本。Agent的所有行为都是在这种简单交互之上由你的代码不断追加处理逻辑、工具调用、结果判断堆出来的。很多框架教程里那些花哨的“Agent对象”拆到底里面做的事情大半就是这个循环。2.2 决定Agent上限的结构化输出如果你只发一段文本、收一段文本然后直接打印出来那这叫“聊天机器人”不叫“Agent”。Agent和聊天机器人的关键分水岭在于前者需要让模型“对你可用的工具做出明确的调用决定”而人类的自然语言是没法直接驱动代码分支的。举个例子你希望Agent根据用户需求自动选择“查天气”或“查日历”两个函数之一。模型返回“我觉得今天可能需要查询一下天气情况哦”你要在代码里怎么解析用关键词那各种口语化表达会让你崩溃。正确做法是让模型输出结构化内容比如JSON里面明确写清楚意图和参数。这就是为什么所有成熟的应用都要用“函数调用/结构化输出”机制你预先定义好工具列表告诉模型格式规则模型在需要工具时输出一段你程序能直接解析的JSON里面写着“你要调用的是天气工具参数是城市A”你的代码据此调用对应函数再把结果回填给模型让模型整理成自然语言回复。这一步我强烈建议新手手动做一遍不要偷懒。建一个空列表往里塞system消息塞user消息塞tool调用结果然后观察每一次模型的输出长什么样。你很快会建立起一个直觉大模型本身并不可怕它就是那个一直被你循环利用的“文本生成核心”。2.3 上下文与记忆模型不记得你上一句说过什么新手最容易忽略的是大模型API本身没有记忆。它每一次收到请求面对的都只是你传给它的一串文本。它“记得”你上句话是因为你——也就是你的代码——把上句话也一起传给了它。这听起来麻烦但其实是件好事。这意味着“记忆”是你的掌控范围而不是某个神秘的黑盒。你想让对话保持连贯就把历史消息都拼进去你想节省token就只拼最近几条你想压缩就写一段摘要塞进去。框架里的Memory模块说穿了就是这几个策略的组合。我自己一开始也会被“对话历史不断变长、API成本越涨越高”的问题困扰。后来想明白了一个朴素道理既然大模型只认文本那我完全可以对历史做取舍。上下文管理不是一个AI问题而是一个工程问题——它跟你在普通后端服务里管理缓存、处理日志没有本质区别。把这一层想清楚后面学什么框架都不慌。3. 不依赖框架手写一个会调用工具的Agent3.1 设计一个最小可用的场景理论说再多不如自己动手写二十行代码。我建议新手都做一个这样的练习设计一个最小Agent它只做一件小事比如“比较两个城市的天气温度”。这个Agent要满足的能力很简单用户提问“城市A和城市B哪个更热”Agent需要先调用天气工具获取两个城市的温度再根据温度比较最终给出回答。整个流程看起来简单但已经包含了Agent最核心的骨架意图判断、工具调用、结果回填、最终答复。如果把这个流程融会贯通你再看市面上任何框架的入门文档都会觉得那些概念似曾相识。3.2 核心循环模型输出、代码解析、工具执行、结果回填不依赖框架手写这个Agent核心就是一个while循环。我把简化后的代码放在下面配合注释你应该能看明白def call_llm(messages): 模拟调用大模型API返回结构化动作。 # 假设模型被指示在必要时输出JSON动作 # {action: call_tool, tool: get_weather, args: {city: 城市A}} # 或者直接回复 # {action: reply, content: 城市A比城市B更热。} return resp def get_weather(city): 假装调用天气API返回一个温度数字。 return 28度 messages [ {role: system, content: 你是天气助手。需要查询温度时必须调用工具禁止编造。}, {role: user, content: 城市A和城市B哪个更热} ] for step in range(5): # 最多循环5次防止死循环 resp call_llm(messages) action resp.get(action) if action call_tool: tool_name resp.get(tool) args resp.get(args) if tool_name get_weather: result get_weather(args[city]) messages.append({role: tool, content: result}) # 继续循环让模型基于工具结果生成下一步 elif action reply: print(resp.get(content)) break else: print(模型输出无法识别退出) break就这么几行已经是一个可用的Agent雏形了。你有没有发现整个“Agent感”不在大模型里而在你的循环设计里——模型被嵌入到一个“判断-执行-回填”的循环结构中它才能表现得像一个会使用工具的系统。代码里的range(5)特别重要。新手手写时最容易漏掉这个循环上限导致模型反复要求调用工具程序停不下来。这个细节也解释了为什么框架都会有“最大迭代次数”之类的参数——它们曾经也被这个坑咬过干脆做成默认配置。3.3 立刻会踩的三个坑以及最简单的解法新手自己实现时几乎必定会踩到下面三个坑。别怕踩坑本身是学习的一部分。第一个坑模型返回的JSON“不干净”。你的提示词明明要求它只输出JSON它却偏偏外面包一层markdown代码块或者加几句解释。最简单的解法不是继续调提示词而是在代码里做一层预处理找到{和}之间的部分用正则剥出来再json.loads()。这个动作框架里叫“输出解析器”听起来高级其实就这么回事。第二个坑args里的字段跟函数参数对不上。模型要调用get_weather时可能把参数名写成city_name而你的函数参数叫city一执行就抛异常。最简单的解法是在提示词里给出工具参数的结构定义同时在代码里做一层“参数映射”。这也是为什么框架里面会有那一堆Pydantic模型定义本质就是为了在函数调用前做参数校验和转换。第三个坑循环不退出。模型在工具返回后可能因为提示词没写清楚又去调用同一个工具形成死循环。解法有两个一是靠range(5)这种硬保护二是每次工具返回后追加一条“你已获得工具结果请给出最终答复”的system消息给模型一个明确的出口。这三个坑都很有意思——因为它们就是框架存在的大部分理由。当你亲自踩过一遍再去看那些封装你会感觉自己像拿到了一副透视镜。3.4 手写一遍的真正价值建立值得信任的心智模型手动实现了这一步之后你的脑海里会形成一个清晰的图景Agent 大模型API 工具函数 循环控制。以后再看到框架里的概念你会有一种“不过如此”的爽感。比如框架里的“Agent”类它内部就是帮你管理了消息列表和循环“Tool”类它帮你封装了函数注册、参数校验和错误处理“Memory”类它帮你实现了消息历史的各种拼装策略。你在文档里看到的每个名词都能在你手写的代码里找到对应物。这种“对号入座”的过程比单方面吞框架介绍高效太多。很多新手会问直接学框架不是更快吗我理解这个诱惑但你要想清楚框架学的是别人的使用方法你手写的时候学到的是原理本身。前者让你会用一个工具后者让你理解一类系统。在AI技术日新月异的背景下后者的可迁移性要高得多。4. 转行者需要补的第二门课提示词设计与评测4.1 提示词不是“写作文”是“接口设计”转行者里有很多人不是传统程序员出身提到写代码心里发怵反而觉得写提示词是件轻松的事。我赞同这个方向但我要强调一个更准确的观念提示词不是“写作文”它是“接口设计”。你写的每一条系统提示词都相当于给大模型配置行为参数。比如你告诉它“你是一个天气助手只能回答与天气相关的问题”这就是一个接口约束。告诉它“当需要工具时必须输出JSON格式为……”这就是一个协议定义。告诉它“如果用户的问题不够明确先反问再行动”这就是一个决策规则。你想做个合格的Agent提示词工作量和传统开发里的需求评审、接口文档没什么两样都需要把输入、输出、边界条件、异常处理说清楚。转行者如果具备产品思维或业务梳理能力在提示词设计上反而有优势——我见过很多非技术背景的朋友系统提示词写得比程序员好得多因为他们更懂得如何描述用户意图和兜底策略。这个能力不是低阶技能是Agent应用的上限之一。4.2 没有评测集改提示词全靠玄学新手改提示词最常见的方式是“感觉不够好改一下试试看好像这次不错”这种习惯在一两个例子上可能行一旦Agent逻辑复杂起来你会陷入“按下葫芦浮起瓢”的窘境。这场面我见得太多了改好了A场景B场景又炸了改好了BC又不行了。所以我在团队里一再强调有改动必须有评测评测不过不能上线。不需要一上来就建多么复杂的评测平台一个表格就够了编号输入问题期望动作/结果当前实际输出是否通过1城市A今天多少度调用天气工具返回城市A温度调用了天气工具返回了温度通过2明天需要带伞吗先查询城市A天气再根据降雨概率回复回复未调用工具直接编造建议不通过3帮我写一首诗明确拒绝或说明超出范围正常拒绝通过第一次建评测集10条高质量用例就够覆盖正常指令、边界指令、无关指令三类。每次修改提示词后把全部用例跑一遍记录通过率。这个习惯能显著减少“拍脑袋改提示词”的无效劳动。说句实在话评测能力几乎决定了你的Agent能不能从“玩具”走到“可用”它是框架替代不了的护城河。4.3 转行者最容易掉进的两个误区第一个误区是“必须先把编程学到精通才能碰AI”。这个想法等于是让自己在门口绕远路。做Agent应用你需要的编程能力是有边际的能读懂代码逻辑会写基本流程控制和函数调用遇到报错能看懂堆栈最上面几行这就够了。更复杂的并发、部署、性能优化完全可以等做起来之后再补。让学习难度而不是“安全感”来决定学习顺序才是现实的做法。第二个误区和第一个正好相反“那我只需学好提示词就够了代码让框架替我都包了。”抱歉这个想法在真实项目里撑不住。因为你要调试的数据链路、上下文拼接、工具调用结果全都发生在代码里你连看都看不懂的话连错误定位都做不到。更好的策略是两条腿走路一边练提示词一边补最基础的Python语法——变量、函数、循环、字典、JSON操作这五样足够应付Agent入门阶段80%的场景。5. 什么时候才轮到框架以及怎么学框架才不慌5.1 三条分界线跨过再碰框架有朋友会问那到底什么时候才能开始学框架我给一个可量化的标准满足三条再打开框架文档。第一条你能不依赖任何框架手写一个带至少两个工具比如天气查询和计算器的单轮Agent。这说明你已经掌握了Agent最核心的调用循环。第二条你能不查资料说清楚框架里的Chain、Tool、Memory这一类概念对应你自己手写代码里的哪个部分。这颗“对应关系”如果建立不起来说明底层心智模型还没成急着学框架也是走马观花。第三条你能在框架报错堆栈里至少定位出一层“再往下就不是我的问题”的边界。这句话听起来奇怪但它代表你开始学会排查复杂系统了——知道哪些属于框架内部哪些属于你的业务代码问题。没跨过这三条框架学得再好也容易沦为“配置管理员”。跨过了再去学框架每一行示例代码都能触发你“哦这是为我解决了当时那个麻烦”的顿悟。5.2 带着“对照心态”去学框架我见过很多人学框架的最大问题是“照单全收”文档写什么就记什么示例给什么就抄什么完全没有“对照感”。正确的学法是把框架当成你手写代码的“高配版”来学。你心里要有一个清单手写版本里你手动管理消息列表对应框架里的Memory你手动清洗模型输出JSON对应框架里的输出解析器你手动做循环保护对应框架里的最大迭代限制。这些对应关系建立一遍之后你看框架就不再是从零学新东西而是对照旧知识找差异。我建议新手做一件事打开框架文档的“核心概念”页面每看一个概念就记录一行“这个东西在我手写代码里对应的是……它帮我省掉的是……我自己写会遇到的问题是……”。你会发现三条记录里至少有两条你之前手写时真的踩过坑。这比背文档有用得多因为你是用经验在消化知识。5.3 版本焦虑是没用的底层逻辑才是护城河这两年开源社区迭代速度非常快新的Agent框架一个接一个冒出来朋友圈天天有人转发“某框架又更新了什么”。很多新手因此焦虑觉得自己随时会掉队。我想泼一句冷水框架会过时底层逻辑不会。大模型API的“文本进、文本出”不会变结构化输出驱动工具调用的范式不会变循环-判断-回填的Agent内核不会变评测驱动的迭代方式不会变。你把这些东西吃透了不管框架怎么更迭你都能快速上手。反过来你只会某个框架的API、把配置项背得滚瓜烂熟一旦这个框架生态衰落你就得从头来过。技术行业有个很朴素的道理工具的语义怎么变都是有迹可循的而原理的迁移能力才是长期竞争力。这跟学菜谱和学烹饪原理的差别其实是一回事。6. 送上一份四周入门行动清单6.1 四周计划表和每天的节奏如果读完文章还是不知道从哪下手直接按下面这张表行动这是我带人反复验证过的一条路径周次学习主题核心任务验收标准第1周大模型API基础用你选定的平台API不做Agent只做“普通聊天上下文拼接”能自己写一个简单的多轮对话脚本不依赖框架第2周提示词与水评测为一个固定业务场景设计提示词并建立10条用例的评测集每次修改提示词都能跑出通过率数据第3周手写工具调用Agent复现本文第3章的天气Agent扩展到两个以上工具能在无力借助框架的情况下独立完成工具选择与调用第4周对照式学习框架选择一个主流的Agent框架按“对应关系”方式读文档能解释框架核心概念并能说出它替你的手写实现解决了什么每天的学习时间不必太长两三个小时就够。但有一个硬规矩每天都要有一小段真正跑起来的代码或输出而不是只读书、只刷文档。“记录今天写了什么、改了什么、踩了什么坑”这件事比收藏任何资源都有用。6.2 四周结束后的自测题四周走完你可以做一次自我评估。下面这些问题如果你都能用自己的话解释清楚说明基础已经打得相当扎实了为什么Agent要靠结构化输出来触发工具调用如果模型返回的是自由散漫的自然语言程序怎么稳定决策工具返回的结果是通过什么方式重新回到大模型“眼前”的这种做法的本质是什么Agent的循环为什么需要上限无限循环在什么场景下可能出现上下文越长费用越高且响应越慢你会怎么设计消息保留策略你对提示词做了一次改动怎么判断改动是变好了还是变差了框架帮你封装了很多底层细节那么你在翻它的源码时打算找哪几个核心模块来验证自己的理解每一个问题都是在拷问你的“心智模型”而不是拷问你是否记住了某个API。能把心智模型讲清楚你学任何新东西都不会慌。6.3 我的经验之谈从最小实现出发再扩展成完整小项目最后分享一点我自己的切身体会。我带过的所有上手快的转行者都遵循同一个原则先做一个最笨的最小实现然后在这个基础上慢慢加。最开始你手写的Agent可能又笨又丑连多轮对话都做不好但这没关系它是一个完全属于你、你完全看得懂的骨架。接下来的两周给它加工具、加记忆、加评测、加异常处理看着它从一个玩具长成一个真正能帮你完成小任务的工具那种掌控感比刷多少个教程都来得实在。我自己到现在还保留着这个习惯。遇到任何新概念第一反应永远是“先写20行代码把它最核心的循环跑出来”再决定要不要深入。这个方法救过我很多次也推荐你试试。记住那句老话基础这东西骗得了别人骗不了你自己。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →