☰
AI Agent入门:先手写最小可用智能体,再看懂框架源码
2026/10/22 6:19:29 网站建设 项目流程

我见过太多人栽在同一个地方:一听说AI Agent很火,转头就去啃某个开源框架的源码,啃了两周,看了一堆概念,最后写不出一个能跑的demo。这不是学习能力的问题,而是学习顺序的问题。AI Agent入门这件事,真正该先下功夫的,不是框架API,而是把"Agent到底在解决什么问题"这件事想清楚。这篇内容就是写给准备入行或者刚转行做AI应用开发的人,我会从最底层的概念讲起,用一条不用堆框架的学习路径,带你亲手写出一个最小可用的Agent,再回头去看框架,你会发现那些源码没那么难懂了。

1. 先别碰框架,把"Agent是什么"这件事想清楚

1.1 一个Agent的底层拆解:模型、记忆与工具

网上关于AI Agent的说法满天飞,有说它是"会自己用工具的人工智能",有说它是"下一代应用形态"。这些定义都对,但都太抽象。我习惯这样拆:一个Agent,本质上是把"大模型的推理能力"和"外部世界的操作能力"拼接在一起的一个运行时流程。拆开来看,它只有三个核心组件。

第一个是模型。这是Agent的大脑,负责理解指令、规划步骤、决定下一步做什么。注意,这里的模型不一定要是市面上最强的那个,很多入门场景下,一个中等规模的对话模型就足够用了,因为它只负责"想",不负责所有具体执行。

第二个是记忆。Agent和普通聊天机器人最大的区别之一,就是它需要跨步骤的上下文。记忆又分短期和长期:短期记忆是当前这次任务里的对话历史和中间状态,长期记忆是跨任务的偏好、领域知识、历史结论,通常存在向量数据库或者普通数据库里。

第三个是工具。这是Agent能"做事"的关键。工具可以是一个API调用、一段Python函数、一个数据库查询、甚至是一个命令行脚本。Agent收到任务后,不是自己去生成答案,而是决定"我应该调用哪个工具、传什么参数",然后从工具返回的结果里继续推理。

你把这三点放在一起看,Agent的完整链路就出来了:收到用户指令 → 模型理解并规划 → 如果需要外部信息就调用工具 → 拿到结果继续推理 → 输出最终答案。这个链路,才是Agent的核心骨架。任何框架,不管封装得多么花哨,底层跑的都是这个逻辑。所以你说一上来应该先学什么?不是某个框架的API文档,而是这个链路本身。

1.2 工作流不等于Agent:别把"能跑通"当成"理解了"

还有一个特别常见的认知误区,就是把"工作流"和"Agent"混为一谈。我见过不少新手,用某个框架拖了几个节点,把LLM和搜索API串起来,跑通了,就觉得自己会写Agent了。这件事本身没错,但它确实不是Agent。

我给你打个比方。工作流像是一条流水线:传送带把原料送到A工位,A工位做完固定动作送到B工位,每个工位做什么是提前定死的,原料走完全程就出成品。Agent更像一个包工头:你给他一个目标,他自己拆解成步骤,自己决定先干什么后干什么,遇到意外情况还能自己调整方案。反馈回路存在与否,是二者的核心分界线。

工作流是"直线",Agent是"带决策的圈":观察当前状态 → 决定行动 → 执行 → 看结果 → 再决定下一步。这就是Agent领域的核心概念之一"ReAct",也就是推理和行动交替进行。

我强调这件事,是因为它直接决定了你的学习路径。如果你把工作流理解成了Agent,你会觉得"写Agent就是串API",然后陷入一个瓶颈:只会拼装别人写好的节点,一旦遇到框架不支持的场景,完全不会自己扩展。如果先理解了决策循环,你再去看框架的"Agent执行器""工具注册表""记忆模块",你会自动把它们映射到"这个对应的就是我要写决策循环的哪一块",源码瞬间变亲切。

2. 转行者最容易踩的坑:基础没过关就上高难

2.1 需要先补齐的四块前置知识

转行做Agent开发,和转行做传统后端开发有一点很像:基础不牢,后面全是补不完的债。但Agent开发的基础,和传统开发的基础不完全是一回事。我结合这几年的带人经验,给你划一个重点范围。

Python基础是第一个。不需要你成为语言专家,但函数、类、装饰器、类型标注、异常处理这些得熟练。为什么?因为Agent代码的核心是"把函数当成工具传给执行循环",装饰器在工具注册里又特别常见,你要是不理解函数是一等公民,看框架源码会非常痛苦。

第二个是HTTP与API调用基础。Agent在外面打交道,调的是各路API。你得明白请求头怎么带、鉴权怎么做、JSON怎么解析、超时和限流怎么处理。很多Agent"翻车",不是模型不够聪明,而是代码对API返回结构的解析写得太脆弱,字段一变化就崩。

第三个是Prompt工程基本功。这事儿被很多人忽视。我可以负责任地说,Agent项目的成败,一半以上系在Prompt上。同样是让模型决定调用哪个工具,Prompt写得含糊,模型就乱选;写清楚工具的使用场景、参数含义、约束条件,模型的表现会完全不一样。这块内容不用单独学一门课,你只需要记住一个原则:把你希望模型遵循的规则,一条一条用明确、无歧义的话写出来。

第四个是数据结构与状态管理。Agent的运行过程中,中间状态是动态变化的一个个字典、列表、对象。什么时候该存、什么时候该清、上下文里哪些信息是冗余的,这些判断力,来自你对数据结构的基本功。不需要你啃算法题,但得知道字典怎么嵌套、列表推导式怎么写、对象怎么序列化成JSON。

2.2 自测清单:你到底能不能开始写Agent

很多转行者不知道"学到什么程度才算准备好",结果要么一直学基础,迟迟不动手;要么基础半生不熟,直接上复杂项目被劝退。我给你一份我常用的自测清单,你能独立完成前四项,就说明可以正式开始Agent的实战练习了。

第一项:写一个函数,接收一段字符串,返回里面所有数字的和。第二项:用"requests"库或"urllib"库请求一个公开API,把返回的JSON里某个字段取出来,存成本地文件。第三项:给一个现成的Prompt模板,要求你改造成"适用于工具调用场景"的版本,你要能理解变量占位符的意义,并能说出"这里为什么要强调工具参数必须是JSON格式"。第四项:解释清楚"字典"和"列表"的区别,并写一个函数,把列表里的字典按照某个键去重。第五项(进阶):不用任何Agent框架,手写一段循环,能根据模型输出的"工具调用指令"执行对应函数。

我建议你花一周时间把这些基础逐项过掉,不要贪快。很多人觉得这些技能和AI没直接关系,浪费时间,但恰恰是这些看起来不AI的东西,决定了你后续调试Agent时,是举步维艰,还是游刃有余。我自己带过的新手里,出活最快的,从来不是简历上写着"熟悉某个框架"的人,而是Python基本功扎实、调接口经验丰富的人。框架学一天就会,基本功没有三个月补不回来。

3. 一条亲测有效的学习路径:从概念期到框架期

3.1 三个阶段的核心任务和时间分配

根据我接触过的成功转行案例,我也带过不少新人,总结下来,一条比较稳妥的学习路径是三个递进的阶段。

概念期(1到2周):任务只有一个,把Agent的逻辑链揉碎吃透。这期间不要写代码,就用笔和纸,或者用文档工具,反复画Agent的工作流程。今天画,明天不看着参照物重画,直到你闭着眼睛能在白板上画出"用户输入→模型规划→工具调用→结果反馈→最终输出"的闭环为止。这个过程很土,但非常有效。同时,每天读一篇讲解Agent核心机制的科普文章或文档,不追求全懂,但求眼熟术语。

手写期(3到4周):在这个阶段,你要完全依赖自己的能力实现Agent。选一个极小的场景,比如一个能查天气、能算加减乘除的命令行助手,用它走完整个Agent开发流程。这个阶段所有东西都自己写:调用模型接口的代码、工具注册的代码、循环判断的代码,一行一行打出来。你会痛苦,但这个痛苦是财富,因为它逼你理解每个环节为什么存在。

框架期(第5周开始):当你已经写过一版"简陋但完整"的手写Agent,再回头去看主流开源框架,你会发现自己看的是设计思路,而不是陌生代码。框架里那些抽象类、工具注册接口、记忆管理器,你都能对应回自己手写时的那个模块。这时候学框架,一周抵得上之前一个月。

这里我多说一句时间分配。我给新手定的规矩是"每天两小时,持续五周",周末可以加量到四小时。不要想着一口气突击几天,Agent这个东西,理解需要发酵时间,有些概念今天不懂,睡一觉第二天再看就通了。这也是一种记忆的"离线整理",太密集反而没有沉淀。

3.2 一个不用框架的入门项目:知识问答小助手

理论说再多,不如一个具体项目来得直接。我给你推荐一个入门项目:做一个"能查本地知识库并总结回答"的命令行小助手。它的核心就三个点。

第一,准备一个简单的知识库文件,比如一个"markdown"文件或者"txt"文件,里面放一段几百字的虚构产品或领域的说明文字,比如虚构的咖啡豆介绍。第二,用"文本截断+关键词检索"的方式实现一个最简单的检索工具:接收一个查询词,去文件里找到相关段落返回。这步不用向量数据库,不用"embedding",目的就是让你先理解"工具返回信息给模型"这个机制。第三,主流程是:用户提问 → 模型判断是否需要检索 → 调用检索工具 → 把结果拼进上下文 → 模型基于检索内容生成回答。

这个项目做完,你对Agent的"工具调用、上下文拼接"这两个核心动作就有了体感。更关键的是,你会明白一个道理:Agent的智能,不是某个模型突然变聪明了,而是"外部信息"通过代码逻辑被喂给了模型,让模型在回答时"有据可依"。

做完这个简单的,你可以升级一下:把检索结果从"字符串拼接"改成"结构化返回",再把检索工具换成调用一个公开的搜索引擎API,你就得到了一种非常接近生产环境的Agent雏形。我强烈建议你在这个阶段多折腾几次,多做几个变体,因为手写期积累的调试经验,是框架期解决问题的底气。

4. 核心实操:手搓一个能调用工具的迷你Agent

4.1 从零实现的完整代码与逐段拆解

等概念捋顺了、基础也补上了,就该进入最硬核的环节:手写一个最小可用Agent。这里我不推荐用任何现成的Agent框架,就用普通的"Python"代码,调一个对话模型的接口,再自己写工具调用的逻辑。

我先给你一套完整可跑的代码骨架(基于虚构的对话模型API,思路可迁移到任何同类服务)。

import json import re def call_model(messages): """ 调用对话模型。这里以虚构的 chat_complete 接口为例。 实际使用时,替换为对应服务的 SDK 或 HTTP 请求即可。 """ resp = fake_chat_api(messages) # 替换成你的真实模型调用 return resp def get_weather(city): """工具1:查天气。这里直接返回模拟数据。""" if city == "北京": return json.dumps({"city": city, "weather": "晴", "temp": 26}) return json.dumps({"city": city, "weather": "多云", "temp": 22}) def calculate(expr): """工具2:计算器。仅支持简单的四则运算。""" tokens = re.findall(r'\d+\.?\d*|[+\-*/]', expr) if not tokens: return json.dumps({"error": "表达式无法解析"}) result = eval(" ".join(tokens)) return json.dumps({"result": result}) TOOLS = { "get_weather": { "desc": "查询指定城市的实时天气,参数是城市中文名", "func": get_weather, }, "calculate": { "desc": "计算数学表达式,参数是一个字符串表达式", "func": calculate, }, } SYSTEM_PROMPT = """你是一个会使用工具的助手。 当你需要外部信息时,请严格按下面的格式输出工具调用指令: TOOL_NAME: 工具名 PARAM: JSON格式的参数 然后等待工具结果。如果不需要工具,直接输出最终答案。""" def run_agent(user_query): messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_query}, ] # 最多循环 5 次,防止 Agent 陷入死循环 for _ in range(5): resp = call_model(messages) content = resp.strip() if content.startswith("TOOL_NAME:"): lines = content.splitlines() tool_name = lines[0].split(":", 1)[1].strip() param_line = lines[1] if len(lines) > 1 else "" try: params = json.loads(param_line.split(":", 1)[1].strip()) except Exception: messages.append({"role": "assistant", "content": content}) messages.append({"role": "user", "content": "工具参数格式错误,请重新输出JSON格式参数。"}) continue if tool_name not in TOOLS: messages.append({"role": "assistant", "content": content}) messages.append({"role": "user", "content": f"没有名为 {tool_name} 的工具,请重新选择。"}) continue tool_result = TOOLS[tool_name]["func"](**params) messages.append({"role": "assistant", "content": content}) messages.append({"role": "user", "content": f"工具返回结果:{tool_result}"}) else: return content return "已达最大循环次数,任务未能完成。" if __name__ == "__main__": print(run_agent("北京天气怎么样?顺便帮我算一下 12 * 15 的结果"))

这套代码虽然简陋,但它包含了Agent最核心的执行循环。我们来逐段拆一下它到底做了什么事。

"TOOLS"字典是工具注册表,登记了Agent能用的所有工具,包括功能描述和对应的处理函数。这其实就是框架里"工具注册"概念的微缩版。核心循环我用了一个"for"循环,上限5次。每次循环,先把"当前消息列表"发给模型,模型输出指令,代码再判断输出是"要调用工具"还是"直接给答案"。如果是工具调用,就解析工具名和参数,执行对应函数,把结果追加回消息列表;如果是普通回答,就返回给用户。

4.2 这个循环里藏着的三个关键设计

很多新手写代码能跑通,但问"为什么这么写"就答不上来。你的框架调包侠之路,必须在以下三个设计点上停下想一会儿。

第一个关键点是消息列表的回写循环。我每次把模型的原始输出、工具返回结果都追加回消息列表,而不是拼接成简单的字符串。这保证了模型能看到完整的决策链路:它看到自己刚才调了哪个工具、传了什么参数、拿到了什么结果,才能基于此继续决策。这不只是技术细节,这就是Agent的记忆机制。

第二个关键点是错误处理。如果工具参数解析失败了,我的代码没有崩溃,而是把错误信息返回给模型,让它重新生成一次。这个设计叫"自我纠正",它模拟的是Agent在真实环境中遇到的"工具结果不符合预期"的情况。你要知道,在生产环境里,模型输出非法JSON的概率远比你想象的高,没有这层兜底,一个好好的Agent用不了几次就会崩。

第三个关键点是轮数上限。为什么循环上限设5次而不是100次?因为真实场景里,模型可能陷入无尽的"思考",或者在一件事上反复调用工具不收敛。设一个合理的上限,既是保护API预算,也是保证用户体验。"设置超时和限制"这个习惯,从一开始就要建立。

当你手写一遍这套代码,并对上面三个点想明白了,我对你的建议是:接下来再去把第3节那个"知识问答小助手"升级成带工具路由的版本。你会发现,你已经能独立设计工具的路由逻辑了。这时候你再去打开任何一个开源框架的源码,你会看到它做的所有复杂抽象,本质上都逃不开我们这一百行代码里表达的三件事:管理上下文、分发工具、处理异常。

5. 入门阶段必踩的坑与排查思路

5.1 新手的四个高频翻车现场

我审过不少Agent项目的代码,也帮不少人排查过问题。新手跑Agent,翻车的点位非常集中,基本逃不开下面这四个。

第一个是上下文爆炸。工具调用结果一多,消息列表膨胀,直接把模型的最大token数撑爆。表现为:Agent跑着跑着,日志里出现"输入长度超限"之类的报错。解决思路很简单:在每一轮工具返回后,做一次摘要,或者丢弃早期不重要的消息,只保留最近几轮和最初的目标指令。

第二个是工具参数错位。这通常不是你代码的锅,而是模型的锅。模型生成的工具参数和你的"函数签名"对不上,比如多传了一个字段、类型搞错了。你会看到"TypeError"或"参数绑定失败"。对策是:在每个工具函数里加最严格的参数校验,在错误信息里告诉模型"你可以参考工具描述,只传指定字段"。

第三个是模型"嘴硬不调用工具"。有时候模型面对明明查过才知道答案的问题,就是直接编一个答案输出,根本不走工具流程。这种问题的根源还是Prompt写得不够硬,比如没有强调"你无法访问实时数据,必须调用工具"。你可以把系统提示词改成更明确的措辞,例如"你只能基于已知信息回答,涉及外部数据时必须先调用工具"。

第四个是死循环。模型自己跟自己绕圈子,反复调用同一个工具,永远不输出最终答案。我建议你一边保留第4节的轮数上限,一边在日志里给每轮循环加一个序号,这样出了问题你能很快看明白它卡在哪一步。另外,还可以在提示词里加一句"如果工具结果已经足够回答用户,请直接给出答案,不要重复调用"。

5.2 框架期的正确打开方式:别当API背诵员

等你熬过了手写期,开始上手框架了,我特别想说一个比"学不会"更常见的坑:把框架当API文档来背。在翻译一下就是,逐条看框架的"工具类""基类""配置项"有什么用,然后死记。这种方式效率极低,因为所有框架的API都在快速更新,你背下来的东西下个月可能就变了,而且背诵完全没帮你建立系统性的理解。

我建议的框架学习方法是"按问题驱动"。"带着需求找设计"是一个更好的路径。比如,你先想一个问题:我的Agent要能同时用多个工具,还要能根据工具结果决定下一步,框架会用什么数据结构来管理工具列表和中间状态?带着这个问题去翻源码,你会顺着它的设计思路找到"工具注册表""执行器""消息历史"这几个核心模块。再看下一个问题:我的Agent要长期记住用户偏好,框架是怎么处理的?它会引出"向量存储""会话隔离"这些概念。

这样学下来,你掌握的不是API,而是一套问题与方案的映射。换个框架,这套映射照样能用,因为你理解的是底层机制,不是某个库的语法糖。我的个人体会是,真正拉开人与人差距的,恰恰是你对"机制"的理解层级。框架帮助你的是完成日常重复性工作,只有当你亲手写过Agent、处理过因为它产生的边界问题,才能知道框架的哪一层是为解决哪类问题存在的。也只有到了这一步,你才算真正跨进入了AI Agent开发的门。

5.3 给转行者的三个额外心态建议

技术之外,我观察到一个很现实的情况:转行者相比科班出身的人,更容易焦虑,更容易觉得"自己是不是不适合做这个"。我通常会给三个建议。

第一个是不要跟别人比进度。每个人的基础不一样,有人一周就能上手写Agent,有人需要一个月,这极其正常。你应该比的,是自己上一周和这一周的变化。我今天能理解工具调用的原理了,这周能独立调试一个上下文问题了,就是进步。第二个是保留一个自己的作品集。从最小Agent到知识问答助手,每一个跑通的项目,都在日后某个时刻派上用场。面试时、想转岗时、或者自己想做独立产品时,这些自己一行行写出来的东西,比任何框架熟悉度都有说服力。第三个是接受"一直在踩坑"的状态。我有一次调试一个看似很简单的"工具参数解析",整整耗了一个下午,最后发现是模型输出的JSON里多了一个不该有的逗号。这种别人文档里不会写的问题,你踩过一次,就成你自己的经验了。AI Agent这个领域,永远会有新的坑,永远在拥抱愿意踩坑的人。

三十天的时间,足够你走完概念期和手写期。不要急着去攀比用了什么花哨的框架,先把"一个会自己调工具的循环"亲手写出来,你会发现自己已经比昨天那个只会看帖子的人,走得远多了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询