前言
2023年ChatGPT横空出世,到现在三年多时间,大语言模型(LLM)早已不是“能聊天的工具”那么简单。它从对话助手一路进化成了能写代码、操作文件系统、执行Shell命令,甚至能自主拆解任务、一步步完成整个流程的“智能体”——业界称之为AI Agent。这股浪潮直接推高了一个新岗位的需求:AI Agent工程师。越来越多的公司开始将Agent融入产品和工作流,相关岗位也在快速增加。
我最初是一名前端工程师,2022年开始接触Node.js做后端,由此走上了全栈的路。后来机缘巧合进了一家做AI Agent产品的公司,先后参与了多个不同形态的Agent产品开发——有Web端,也有桌面端,前后端和Agent部分都做过。工作之余还写了一个开源的AI Agent CLI项目,目的就是帮助自己更好地理解这个领域。
说这些不是为了介绍个人经历,而是想表明:下面这些分享,来自真实项目开发的亲身体验,不是看过几篇教程、翻过几份文档就写出来的。这篇文章算是对这段经历的一个梳理,给想进入这个领域的人做个参考。AI Agent还在快速变化,这里提供的主要是一个方向,不是标准答案。
AI Agent工程师:不是一个独立工种
对这个角色的理解,与其说它是一个独立的新工种,不如说它是一个“X + AI Agent”的复合角色。这里的X可以是前端、后端、全栈,甚至产品经理,但纯粹的“AI Agent工程师”几乎不存在。
Agent做的事情,本质上是用代码去编排LLM的能力——让它调用工具、管理上下文、处理报错、跟外部系统对接。这些本身就是软件工程,只不过操作的对象从数据库和API换成了LLM。
所以,如果你已经是一名有几年经验的前端、后端或全栈工程师,转向Agent方向的门槛并不算高。需要额外学的新知识不多(后面会展开),但那些工程实现上的问题——上下文怎么管理、错误怎么做恢复、成本怎么控制——才是真正需要花时间做好的。而这恰好是有开发经验的人擅长的部分。
从求职角度来看,有Agent开发经验的前端或后端工程师,机会明显比没有这方面经验的人更多。越来越多的岗位要求候选人有Agent开发经验,掌握这部分能力等于拓宽了自己的选择面。有兴趣的话,可以到招聘平台搜一下“AI Agent”,目所能及的职位信息包括:
- 阿里云「AI Agent 研发工程师(AI Coding方向)」——20-50K·16薪,要求完整研发经验,深度理解LLM/Agent/Prompt Engineering,本质上是全栈+AI
- 大疆「高级后端开发工程师(AI Agent方向)」——精通Python/Go后端,熟悉智能体设计、工具调用、多Agent协作,还要有分布式系统经验
- Boss直聘上的「AI智能体工程师」——15-55K不等,Python必备,要求熟悉LangChain/LlamaIndex/Dify等框架,同时要有Docker/K8s部署能力
心态调整
知识量不大,但做好不容易
AI Agent需要掌握的概念其实不多——Tool Use、Agent Loop、RAG、Memory、Prompt Engineering等等,花几周时间就能大致理清楚。相比前端/后端要学的API、框架、浏览器兼容性问题,Agent的知识量算是少的。
但概念弄懂了,不等于动手就能做出能用的产品。真正耗时间的,是下面这些工程问题:
- 上下文爆炸:Agent执行复杂任务时,工具调用结果和文件内容会快速撑满上下文窗口,导致模型遗忘早期指令或重复执行已完成步骤
- 幻觉(Hallucination):模型会自信地给出错误答案,而且每次错法都不一样,没法用固定规则去拦截
- 成本失控:一个复杂任务可能触发数十次API调用,没有控制策略,费用会超乎想象
- 评测困难:Agent的输出是非确定性的,同样的输入跑两次可能得出不同结果,传统断言式测试不完全适用
这些问题单靠理论知识没法彻底解决,只能在实际项目中不断试错、迭代打磨。
拥抱不确定性
传统开发中,大家有个隐含的心理预期:代码写对了,结果就应该是正确的。但Agent开发不是这样。同样的Prompt,模型这次可能给出完美方案,下次就可能带bug。同样的工具调用序列,这次3步完成,下次可能得10步。这种不确定性初期会让人很不适应,需要调整心态。
调整的方式,是把心态从“写对代码”转变为“设计约束”。不需要让模型每次都做对,而是设计足够好的护栏(Guard Rails),让模型犯错时能被检测到并纠正。权限系统、循环检测(Loop Guard)、输出校验——这些“围栏”才是Agent工程师日常花时间最多的地方。
边做边学
学习科学里有个广泛引用的模型叫“学习金字塔”(Learning Pyramid),源于Edgar Dale的经验之塔理论。核心观点是:光听讲或读书,知识留存率很低;通过实践练习,留存率可以大幅提升。这背后的原理和艾宾浩斯遗忘曲线相通——新学的东西如果不主动回忆,遗忘速度非常快,动手实践本身就是一种主动回忆,能加深理解,理解越深就越不容易忘。
AI Agent开发尤其适合这种方式。Agent的知识本身不算多,但很多工程问题——比如模型在什么情况下会反复调用同一个工具停不下来,上下文压缩到什么程度才不会丢失关键信息——光看文档是预想不到的,只有动手做了才会碰到。碰到问题并解决它,这个知识点就真正变成你自己的了。
一次真实的教训
参与开发的一个Agent产品上线初期,遇到过印象很深的一次故障——Agent死循环。
事情是这样的:用户让Agent抓取某个网页的内容,Agent调用了WebFetch工具,但目标URL返回了错误。正常预期是模型发现失败后换一种方式处理,实际情况恰恰相反——模型认为“刚才没成功,再试一次应该可以”,于是用完全相同的参数再次调用了WebFetch。第二次当然也失败,然后第三次、第四次……连续5次调用完全相同的工具、传入完全相同的参数、得到完全相同的错误。
这5轮无效调用本身的开销不算大,但每一轮失败都会往消息历史里追加一组请求和响应,几轮下来上下文就膨胀了不少。后来在另一位用户那里见到了同样的模式,只不过这次Agent是在Bash命令调用上陷入了循环,持续时间更长——上下文一路膨胀到超出了模型262K token的上限(实际请求达到294K),API直接拒绝了请求,导致整个会话中断。
这两个案例背后是同一个问题:Agent在工具调用失败时陷入重试循环,每次重试又撑大上下文,最终导致上下文溢出。解决思路并不难——“检测到循环就停下来”、“上下文接近上限就压缩”——但在上线前,根本预料不到模型会用完全相同的参数反复调用同一个工具,测试环境里从没出现过这种行为。真正动手修的时候才发现,也不是加一个if判断那么简单:循环检测需要对比最近几次工具调用的参数来判断是否重复,上下文压缩需要在接近上限时及时触发,把旧消息替换成摘要的同时还要保留关键信息。这次经历让人深刻意识到,Agent开发中最难的部分不是理解概念,而是应对模型在生产环境中的各种非预期行为。
一个需要警惕的误区
现在市面上有很多“零代码搭建AI Agent”的工具——Dify、Coze、n8n等等。它们降低了入门门槛,让不会编程的人也能拖拽出一个Agent工作流。对于快速验证想法来说,这些工具没有问题。但如果目标是成为一名Agent工程师,只接触预构建的组件而不理解它们的构造原理,会严重限制解决新问题的能力。
举个例子:假如用Dify搭了一个Agent工作流,单轮问答或简单信息查询时效果不错。但上线后可能碰到这样的情况——Agent在某类任务上反复调用同一个工具停不下来(死循环),或者对话变长之后开始“忘记”前面的指令。Dify提供了最大迭代次数和记忆窗口大小这类配置项,可以做一些粗粒度的调整。但如果需要更精细的控制,比如通过对比前后几次工具调用的内容来检测死循环,或者在上下文过长时让LLM先把早期对话生成摘要、再用摘要替换原始消息(而不是直接丢弃早期消息导致关键信息丢失),这些就超出平台能提供的范围了。理解底层机制的人可以自己写代码实现这些策略,不理解的话就只能在平台给的几个参数里来回调试。
所以建议是:可以用框架或低代码工具加速开发,但至少自己从零实现一次最小的Agent——哪怕只是一个50行的while循环加一两个工具,理解消息传递、工具调用和循环控制的基本机制。有了这层理解之后,再学任何框架或工具都不会觉得是黑盒。后面的推荐学习路径会给出具体的参考项目。
AI Agent核心知识体系
Agent的知识可以分成三层来理解。第一层是地基(LLM基础),第二层是核心机制(Agent区别于普通LLM调用的关键能力),第三层是工程化(怎么让Agent在生产环境里稳定运行)。
graph BTL1["第一层:LLM 基础n能力边界 · API 调用 · 提示词工程"] --> L2["第二层:Agent 核心机制nAgent Loop · Tool Use · RAG · Memory · Multi-Agent"] --> L3["第三层:工程化能力n上下文管理 · 权限安全 · 评测 · 成本控制"]style L1 fill:#e8f5e9style L2 fill:#fff3e0style L3 fill:#fce4ec
第一层:LLM基础
不需要理解Transformer的数学细节或训练流程,但需要理解LLM作为一个“接口”能做什么、不能做什么。
LLM的能力边界。LLM本质上是一个文本续写器——给它一段文本(Prompt),它生成后续文本(Completion)。它擅长自然语言理解与生成、代码编写、信息提取与总结、推理。但不擅长实时信息获取、与外部系统交互、确定性逻辑判断、回答超出训练数据范围的问题。理解这个边界非常重要,因为Agent的核心设计思路就是:用工具弥补LLM的短板。需要实时信息就提供搜索工具,需要操作文件系统就提供文件读写工具,需要执行代码就提供Shell工具。Agent的工程工作量,大部分都花在“怎么让LLM正确地使用这些工具”上。
API调用。所有Agent的起点都是调用LLM的API。以主流的Messages API为例,核心概念只有几个:消息列表(Messages,一组按时间排列的对话消息,每条消息有角色 system/user/assistant/tool 和内容)、流式输出(Streaming,模型逐个生成token,客户端实时接收)、以及Token与计费(输入和输出都按token计费,中文一个字大约1-2个token)。这些概念不复杂,推荐材料里的Datawhale《动手学大模型》教程就是从API调用讲起的。
提示词工程(Prompt Engineering)。写好提示词是Agent开发的基本功之一。常用的技巧包括:用系统提示词(System Prompt)定义Agent的角色、能力边界和行为规则;用少样本学习(Few-shot Learning)在Prompt中给出示例,引导模型按特定格式响应;用思维链(Chain of Thought)引导模型先推理再回答,提高准确率。提示词工程内容很多,但Agent工程师不需要掌握所有技巧。实际开发中最常打交道的就三件事:system prompt怎么写能让模型行为更稳定、工具描述怎么写能减少误调用、以及哪些常见写法容易导致模型输出偏离预期。
推荐材料:Datawhale《动手学大模型》是国内开源社区出品的中文教程,从API调用到RAG应用开发都有覆盖,适合零基础入门。Prompt Engineering方面,吴恩达与OpenAI合作的《ChatGPT Prompt Engineering for Developers》是英文授课,B站上有社区翻译的中文字幕版,一两小时就能看完。英文阅读无障碍的话,Anthropic的Prompt Engineering指南是目前写得最系统的参考资料。
第二层:Agent核心机制
这一层是Agent区别于普通LLM对话的关键。
Agent Loop(智能体循环)。Agent的核心运作模式可以概括为:思考→行动→观察→再思考。这个循环在代码层面就是一个while循环。下面是x-code-cli中的简化版本:
while (turn < maxTurns) {// 1. 调用 LLM,传入消息历史和可用工具列表const outcome = await runTurn(state, model, tools)// 2. 模型返回 tool_calls → 执行工具,把结果追加到消息历史if (outcome.finishReason === 'tool-calls') {await processToolCalls(outcome.toolCalls, state)continue// 回到循环顶部,让模型看到工具结果后继续思考}// 3. 模型返回 stop → 任务完成,退出循环if (outcome.finishReason === 'stop') break}
这段代码虽然只有十几行,但它是所有Agent产品的骨架。不管是Claude Code、Cursor还是x-code-cli,内核都是这个循环——区别只在于工具集有多丰富、错误处理有多完善、上下文管理策略有多精细。用流程图表示:
flowchart LRA["用户输入"] --> B["调用 LLMn(messages + tools)"]B --> C{"模型返回"}C -->|"tool_call"| D["执行工具"]D --> E["结果追加到 messages"]E --> BC -->|"stop"| F["输出最终回答"]
工具调用(Tool Use / Function Calling)。这是让LLM从“只会说话”变成“能做事”的桥梁。一个工具的定义包含两部分:输入参数的Schema(告诉模型“这个工具接受什么参数”),以及一段自然语言描述(告诉模型“这个工具能做什么、什么时候该用”)。以x-code-cli中的Shell工具定义为例:
export const shell = tool({description: 'Execute a shell command and return stdout/stderr...',inputSchema: z.object({command: z.string().describe('The command to execute'),timeout: z.number().optional().describe('Timeout in milliseconds'),}),})
模型看到这个工具定义后,在需要执行系统命令时就会调用它,并按照schema生成正确的JSON参数。工具的实际执行逻辑是在Agent引擎侧完成的,模型本身不执行任何代码——它能看到的只有工具的描述和参数定义。所以工具描述写得好不好,直接决定了模型能不能在正确时机调用正确工具。描述太模糊,模型就容易误用或漏用。实际开发中,反复调整工具描述的措辞非常常见,花在这上面的时间往往比写工具本身的代码还多。
检索增强生成(RAG)。LLM的知识有截止日期,也无法访问企业内部的私有数据。RAG就是为了弥补这两个短板:把企业内部文档、产品手册、最新资讯等内容预先存入一个知识库,用户提问时先从知识库中检索出相关片段,再把这些片段连同问题一起发给模型,让模型基于这些补充材料来回答。一个典型的RAG流程包含:文档分块→向量化(Embedding)→存入向量数据库→检索时做相似度搜索→取回相关文档块→拼入Prompt。RAG概念不复杂,但工程细节很多:分块策略怎么选、chunk多大合适、向量模型用哪个、检索召回率怎么评估——这些问题没有标准答案,需要根据具体场景调试。
记忆(Memory)。Agent的记忆分两种。短期记忆就是当前对话的消息历史,随着对话进行,消息历史不断增长,最终会触及上下文窗口限制,需要压缩或截断。长期记忆是跨会话持久化的信息——用户偏好、项目上下文、之前对话中达成的约定。没有长期记忆的Agent每次对话都从零开始:昨天告诉它项目用ESM模块规范,今天它可能又按CommonJS来写。长期记忆的难点在于筛选:一轮对话可能有几十条消息,真正值得长期记住的也许只有一两条事实,需要一套机制来自动完成提取。x-code-cli的做法是在每轮对话结束后,后台用LLM从对话中提炼出值得记住的事实,以结构化格式写入磁盘:
const MemoryItemSchema = z.object({category: z.enum(['user', 'feedback', 'project', 'reference']),scope: z.enum(['project', 'user']),key: z.string().describe('Short slug. Same key overwrites the previous fact.'),fact: z.string().describe('The fact itself.'),})
下次会话启动时,这些记忆被加载到系统提示词中,让Agent“记住”之前的上下文。主Agent本身没有写入记忆的工具——所有记忆写入都通过这个静默的后台提取器完成,避免模型在对话过程中分心去“管理自己的记忆”。
多Agent协作(Multi-Agent)。当任务足够复杂时,单个Agent容易遇到瓶颈:上下文被大量中间步骤占满,模型同时追踪多个不同的关注点,输出质量也会下降。Multi-Agent的思路是把任务分解给多个专职Agent——比如一个负责探索代码库、一个负责编码、一个负责审查。x-code-cli内置了4种子Agent(explore、general-purpose、plan、code-reviewer),每个子Agent在独立的上下文中运行,完成后只返回结论给主Agent,保持主对话的简洁。Multi-Agent的挑战在于协调:怎么合理分配任务、怎么传递上下文、怎么处理子Agent之间的冲突。这是行业还在积极探索的方向,没有现成标准答案。
推荐材料:Andrew Ng《Agentic AI》覆盖四大Agent设计模式(Reflection、Tool Use、Planning、Multi-Agent Collaboration),免费,B站上有社区翻译的中文字幕版,是目前最好的Agent入门课程。文档方面,Anthropic的《Building Effective Agents》是业界公认的Agent设计方法论经典文档,同系列的《Writing Effective Tools for AI Agents》专门讲工具设计,两篇都不长,英文阅读无障碍的话建议通读。
第三层:工程化能力
有了前两层的知识基础,搭出一个能跑通基本流程的Agent原型不是问题。但要部署到线上去跑真实业务,还有一系列工程问题需要处理。
上下文管理。虽然现在模型的上下文窗口已经很大了(200K到1M+ token),但“窗口大”不等于“不用管”。更长的上下文意味着更高的API成本和更慢的响应速度,而且模型对超长上下文中间部分的信息检索能力会下降(即“Lost in the Middle”现象)。举个具体例子:一个代码修改任务涉及读取多个文件、多次工具调用,几轮对话下来上下文可能累积了数万token。如果不做处理,模型可能会“忘记”最初的需求描述,或者重复执行已经完成的步骤。因此需要一套策略在对话过程中主动管理上下文大小。x-code-cli的做法是:当上下文使用率超过阈值时,保留最近的几轮消息不动,把更早的消息交给LLM生成一份摘要替代:
async function compressMessages(messages, model) {const recent = messages.slice(-KEEP_RECENT)// 保留最近几条const old = messages.slice(0, -KEEP_RECENT)const { text: summary } = await generateText({model,system: 'Summarize the conversation, preserving key decisions...',messages: old,})return [{ role: 'user', content: `[Summary]n${summary}` }, ...recent]}
这是上下文管理最基本的策略。更精细的做法还包括:prompt cache(复用前缀降低重复输入成本)、选择性加载(只把与当前任务相关的文件内容放进上下文)、分层知识库(长期不变的知识放system prompt,短期上下文放消息历史)。
权限与安全。Agent和普通LLM对话有一个本质区别:它能真正执行操作——shell命令、文件读写、网络请求。这意味着模型一旦产生幻觉,后果不再只是一段错误的回答。比如模型在清理项目时误判了目录范围,直接执行了删除命令;或者在调试配置时把生产环境的文件覆盖掉。在普通对话中产生幻觉最多让用户看到一段错误的文本,但Agent场景下,一次幻觉就可能造成文件丢失或系统损坏。因此每个准备上线的Agent都需要一套权限机制来约束模型能做什么、不能做什么。x-code-cli实现了三级权限模型:默认模式下所有写操作需要用户确认;信任模式可跳过确认;计划模式(Plan Mode)下Agent只能读取和探索,不能执行任何写操作。
评测与可观测性。评估Agent质量不能只依赖传统单元测试,需要一套不同的方法——基于LLM的自动评分、A/B对比、成功率统计、以及人工抽查。但光知道结果好不好还不够,出了问题还需要能定位原因,这就依赖可观测性。Agent执行过程中的每一步——模型推理、工具调用、上下文变化——都需要被记录下来,方便回溯排查。
成本控制。AI Agent的运行成本直接和API调用次数、token消耗挂钩。一个不做优化的Agent,跑一个复杂任务可能消耗十几块甚至上百块。一个十人团队每天跑几十个任务,一个月的API费用可能得上万。成本控制常见的优化策略包括:选择合适的模型(不是所有任务都需要最贵的模型)、prompt cache复用前缀、减少不必要的工具调用轮次、以及在合适时机压缩上下文。
推荐材料:工程化方面最好的学习方式是读成熟Agent产品的源码——看别人怎么做上下文压缩、怎么设计权限模型、怎么处理工具调用失败,这比只看教程讲概念要有效得多。目前开源的AI Agent CLI项目不少,比如OpenAI的Codex CLI、社区驱动的opencode等,都值得参考。自己写的x-code-cli也是其中之一,它的优势在于有一本配套的掘金小册《从零打造一个AI Agent CLI》,对上面提到的上下文管理、权限控制、循环检测、成本优化等工程问题都有专门章节讲解,每章先讲设计思路再给出代码实现,适合想系统理解这些机制的读者。
学习路线与实践
AI时代的学习方式变革
传统编程学习中,最好的方式是找到一门经过验证的好课程,一边学习理论一边做配套实验。Nand2Tetris、MIT 6.828、SICP——这些课程之所以被反复推荐,就是因为它们在理论和实践之间达到了很好的平衡。
到了AI时代,学习方式本身也在变化。现在完全可以和AI说:“我想学如何从零构建一个AI Agent,目标是做一个能帮我自动化日常开发任务的CLI工具,我有TypeScript和Node.js基础”,然后让AI为你规划一条学习路线,同时生成配套的练习代码和实验。
这种学习方式的个性化程度远超传统课程——AI可以根据你的基础、目标和进度实时调整内容。不过要注意:让AI定制学习路线本身也需要投入大量时间,而且AI生成的代码和解释不一定正确,需要自己去验证每一步的输出,这个验证成本不低。所以如果网上已经有经过验证的优质课程,应该优先使用;AI定制学习更适合作为补充手段,用来填补现有课程没有覆盖到的部分。
推荐学习路径
第一步:跑通一个最小Agent。不要上来就装LangChain。先用你熟悉的语言(Python、TypeScript都可以),用最原始的方式调用LLM API,写一个50行以内的while循环——就是前面展示的Agent Loop。让它能接收用户输入、调用一两个简单工具(比如计算器、文件读取),然后把结果返回。这一步的目的不是做出有用的东西,而是让你搞清楚Agent每个环节是怎么工作的:消息格式长什么样、工具怎么定义、循环怎么控制、什么时候该停止。想直接看代码的话,可以参考hello-agent,56行TypeScript,一个readFile工具,clone下来就能跑。中文教程方面,Datawhale《从零开始构建智能体》是国内开源社区出品的免费教程,从最小Agent讲起,兼顾理论与实战。
第二步:理解提示词工程。跑通最小Agent之后,开始系统学习Prompt Engineering。重点不是记忆“100个Prompt技巧”,而是理解前面提到的三件事:system prompt的写法、工具描述的措辞、以及few-shot示例的使用场景。
第三步:完善工具集。在第一步的最小Agent基础上,逐步增加工具:文件读写、Shell执行、代码搜索、网页抓取。每加一个工具,观察模型的行为变化——什么时候用对了、什么时候用错了、为什么用错。多试几轮,就能搞清楚工具的schema和描述该怎么写才能让模型正确调用。
第四步:加入记忆与RAG。到这一步,Agent已经能在单次对话中完成任务了,但每次开新对话就什么都不记得了——上一轮对话里的某些约定、你的项目文档,它都无法访问。解决这个问题需要两种机制配合。长期记忆负责保存对话中的关键信息:把值得记住的事实存到本地文件,下次启动时加载到system prompt。RAG负责接入外部文档:把一组文档做分块和向量化后存入向量数据库,提问时检索相关片段拼入Prompt。前面记忆小节展示了x-code-cli的后台提取方案,可以参考那个思路来实现自己的筛选逻辑。做RAG需要理解向量嵌入(Embedding)和相似度搜索的基本概念,分块粒度和检索质量之间的平衡是最需要反复调试的部分。
第五步:做一个完整的项目。到这一步,应该能做出一个相对完整的Agent项目了。如果还没想好做什么,可以试试这几个方向:做一个CLI Agent(最纯粹的Agent形态,不需要前端,专注于核心逻辑);做一个RAG问答机器人(把笔记、文档做成知识库);做一个自动化工作流Agent(把日常重复的开发任务交给Agent)。前面第三层推荐材料里提到了几个开源的CLI Agent项目,到这一步可以选一个感兴趣的,对照其源码来检验前四步积累的理解。
结语
这篇文章的核心观点是:AI Agent工程师不是一个需要从零学起的新职业,而是现有开发经验加上一组特定知识的组合。需要学的概念不多,难的是把概念变成能上线的工程实现。
如果还在犹豫要不要投入时间学Agent开发,建议先花一两个小时跑通一个最小Agent——前面学习路径的第一步就够了。hello-agent正是为此而写的:56行代码,clone下来就能跑。跑通之后会对Agent的运作方式有一个基本认识,接下来再决定要不要继续深入。
AI Agent工程还处于快速演进的阶段,半年前的做法现在可能已经有了更好的替代方案。与其追求一次学完,不如保持动手的节奏,在实际项目中持续积累经验。这个领域变化快,但核心原理——消息传递、工具调用、上下文管理——不会轻易过时。掌握这些基础,面对新框架和模型能力时就不会无从下手。
