☰
AI Agent入门:先手写循环再学LangChain,别搞反顺序
2026/10/27 4:21:28 网站建设 项目流程

1. 为什么我不建议新手一上来就啃 LangChain

1.1 一个让我印象深刻的翻车现场

去年秋天,有个做 Java 后端的兄弟找我喝茶,说想转行做 AI Agent 开发,问我第一步该学什么。我问他现在什么进度,他说已经把 LangChain 的官方文档啃了一大半,Chain、Agent、Memory、Tool 这些概念都能说上几句,还照着教程跑通了一个“能查天气的机器人”。听起来挺唬人,结果我让他现场给我加一个功能——把查询结果存到本地文件里,他卡了整整四十分钟,最后写出来的代码是把整个 Chain 的输出硬塞进一个open()里,连异常处理都没有。

这个场景我见过太多次了。新手和转行者最大的误区,就是把“学框架”当成了“入门”。LangChain、Spring AI、CrewAI、Dify 这些框架确实是好东西,但它们本质上是封装层,是别人把已经跑通的模式打包给你用。你连底下发生了什么都不知道,上来就调 API,遇到问题只能靠猜,猜不出来就换框架,换完还是不会。

所以这篇文章我想聊的核心就一句话:AI Agent 入门,先学“Agent 是什么、怎么运转”,再学“用哪个框架把它搭起来”。顺序反了,你会一直在“能跑但不懂”的状态里打转。

1.2 先搞清楚:Agent 和普通程序到底差在哪

很多人对 Agent 的理解停留在“会调用工具的聊天机器人”,这个理解不算错,但太浅了。我用一个生活化的类比来说明。

普通程序像自动售货机:你投币、按键,它出货,流程是固定的,输入决定输出,中间没有“思考”环节。你写一个 Python 脚本去读 CSV、算平均值、写回文件,这就是自动售货机。

Agent 更像一个刚入职的助理:你给他一个模糊的任务,比如“帮我看看这个月销售数据有没有异常”,他不会立刻动手,而是先想——数据在哪?用什么工具读?异常怎么定义?要不要先看看历史同期?想清楚之后才一步步去做,做的过程中发现数据格式不对,还会调整策略。这个“想—做—看结果—再想”的循环,才是 Agent 的灵魂。

用稍微专业一点的话说,Agent 的核心是一个由大模型驱动的决策循环:观察当前状态,决定下一步动作,执行动作,拿到反馈,再决定下一步,直到任务完成或达到终止条件。这个循环在业界常被称为 ReAct 模式(Reasoning + Acting),是目前绝大多数 Agent 框架的底层骨架。

理解了这一点,你就明白为什么“直接学 LangChain”是低效的——LangChain 帮你封装的就是这个循环,但如果你不知道循环长什么样,你调AgentExecutor的时候根本不知道它在背后替你做了什么决策。

1.3 新手该有的学习路径长什么样

我把这条路径拆成四层,从下往上走,每一层都能独立跑通再往上:

层级学什么大概耗时判断是否掌握的标准
第一层Python 基础 + HTTP 请求 + JSON 处理2-4 周能独立写脚本调一个公开 API 并解析返回
第二层大模型 API 直接调用(不套框架)3-5 天能手写多轮对话、函数调用(Function Calling)
第三层手写一个最小 Agent 循环1-2 周不依赖任何框架,实现“思考-调工具-再思考”
第四层引入框架(LangChain / Spring AI 等)按需能看懂框架源码里对应自己手写的那部分

这个路径的关键在于第三层。很多人跳过它直接进第四层,结果就是永远在“调包”层面打转。你手写过一个 200 行的 Agent 循环之后,再去看 LangChain 的AgentExecutor,会有一种“哦,原来你就是把我写的东西工程化了”的顿悟感,这时候学框架才是事半功倍。

2. 第一层地基:Python 和基础工程能力不能省

2.1 Python 要学到什么程度才够用

每次有人问我“学 AI Agent 要不要先学 Python”,我都回答:要,但不需要学到能写爬虫框架的程度。你需要的是够用的 Python,具体来说:

  • 变量、列表、字典、循环、条件判断——这些是基本功,不熟的话后面全是坑
  • 函数定义和调用,理解参数传递
  • 类的概念,能看懂class和self——因为框架里到处都是类
  • 异常处理try/except——Agent 调工具失败是常态,不会处理异常寸步难行
  • 虚拟环境venv或conda——隔离依赖,别把系统环境搞乱
  • 包管理pip install,会看requirements.txt

这些内容,一个零基础的人认真学两到四周能掌握。网上免费教程很多,Python 官网的文档也足够清晰,不需要买课。我个人的建议是边学边写小脚本,比如写一个读取本地文本文件、统计词频、输出到新文件的程序,这种小任务能把基础语法全串一遍。

注意:不要在这个阶段追求“精通”。我见过有人花三个月啃完《流畅的 Python》,结果一行 Agent 代码没写过。基础够用就往前走,剩下的在实战中补。

2.2 那些看起来不起眼但极其重要的基础技能

除了语法,有几项技能新手往往忽略,但实际开发中天天用到:

第一是 HTTP 请求和 JSON 处理。大模型的 API 本质就是 HTTP 接口,你发一个 POST 请求,带上 JSON 格式的消息,服务器返回 JSON 格式的结果。如果你不理解 HTTP 状态码(200、401、429、500 分别代表什么),不知道怎么用requests或httpx发请求,不知道json.loads()和json.dumps()的区别,那你调 API 的时候会非常痛苦。

第二是环境变量管理。API Key 绝对不能硬编码在代码里,这是安全底线。用.env文件配合python-dotenv库,或者直接设置系统环境变量,这是行业惯例。

第三是日志和调试。Agent 的运行过程是黑盒,你必须靠日志才能知道它每一步在想什么、调了什么工具、拿到了什么结果。学会用logging模块,比学会任何框架都重要。

我列一个最小可用的技能清单,你可以对照自查:

# 这些操作你应该能闭着眼睛写出来 import os import json import requests from dotenv import load_dotenv load_dotenv() api_key = os.getenv("API_KEY") response = requests.post( "https://api.example.com/v1/chat", headers={"Authorization": f"Bearer {api_key}"}, json={"message": "你好"} ) data = response.json() print(data["reply"])

如果你看这段代码没有障碍,第一层就算过了。

2.3 关于“免费 Python 源码大全”这类资源的正确用法

热搜里经常出现“免费 Python 源码大全”这类词,我理解新手想找现成代码抄的心情。但我要泼一盆冷水:在 Agent 这个领域,抄源码的收益极低。原因很简单,Agent 的代码高度依赖具体的模型、工具和业务场景,别人的源码换个环境就跑不起来,你抄过来只会得到一堆报错。

正确的用法是:把别人的源码当阅读理解材料,而不是复制粘贴的模板。看的时候问自己三个问题——这段代码解决了什么问题?它为什么这么写而不是那么写?如果换成我的场景,哪里需要改?带着问题看代码,比无脑复制有价值一百倍。

3. 第二层核心:直接调用大模型 API,别急着套框架

3.1 从一次最简单的 API 调用开始

这一层的目标很明确:不借助任何框架,用最原始的方式和大模型对话。为什么这一步不能跳?因为框架帮你隐藏的恰恰是最关键的东西——消息是怎么组织的、上下文是怎么传的、工具调用是怎么表达的。

一次最基础的对话调用,核心就是构造一个消息列表:

import os import requests from dotenv import load_dotenv load_dotenv() def chat(messages): response = requests.post( "https://api.openai.com/v1/chat/completions", headers={ "Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}", "Content-Type": "application/json" }, json={ "model": "gpt-4o-mini", "messages": messages } ) return response.json()["choices"][0]["message"]["content"] messages = [ {"role": "system", "content": "你是一个简洁的助手"}, {"role": "user", "content": "用一句话解释什么是 Agent"} ] print(chat(messages))

这段代码看起来简单,但里面藏着几个关键概念:role有 system、user、assistant 三种,分别代表系统设定、用户输入、模型回复;messages是一个列表,多轮对话就是把历史消息不断追加进去。这些概念是所有框架的公共语言,你在这里搞懂了,后面看任何框架的文档都不会懵。

3.2 多轮对话和上下文管理:Agent 的记忆基础

单轮对话没意思,Agent 的核心能力之一是记住之前发生了什么。但大模型本身是无状态的,它不记得你上一句说了什么,所谓的“记忆”全靠你把历史消息重新发一遍。

history = [{"role": "system", "content": "你是一个助手"}] def chat_with_memory(user_input): history.append({"role": "user", "content": user_input}) reply = chat(history) history.append({"role": "assistant", "content": reply}) return reply print(chat_with_memory("我叫小明")) print(chat_with_memory("我叫什么名字?")) # 它会回答"小明"

这就是最朴素的记忆机制。但问题马上来了:对话轮数一多,history会越来越长,token 消耗暴涨,而且超出模型上下文窗口后直接报错。这就引出了 Agent 开发中一个绕不开的话题——上下文管理策略。

常见的做法有几种:滑动窗口(只保留最近 N 轮)、摘要压缩(把早期对话总结成一段话)、向量检索(把历史存进向量库,需要时再捞出来)。这些策略在 LangChain 里都有现成的组件,但你必须先理解它们要解决什么问题,用的时候才知道该选哪个。

实操心得:新手阶段先用最简单的滑动窗口,保留最近 10 轮对话就够了。别一上来就上向量数据库,那是给自己找麻烦。

3.3 Function Calling:Agent 能“动手”的关键

如果说多轮对话是 Agent 的“记忆”,那 Function Calling(函数调用)就是 Agent 的“手脚”。这是从“聊天机器人”到“Agent”的分水岭。

原理其实不复杂:你在调用 API 的时候,除了发消息,还额外告诉模型“我这儿有几个函数,分别是干什么的、需要什么参数”。模型在回复时,如果判断需要调用某个函数,它不会直接给你文字,而是返回一个结构化的调用请求,告诉你“我要调这个函数,参数是这些”。你的代码拿到这个请求后,真正去执行函数,再把结果发回给模型,模型基于结果继续回复。

tools = [{ "type": "function", "function": { "name": "get_weather", "description": "查询指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } } }] # 调用时把 tools 一起传进去 # 模型返回的 message 里会有 tool_calls 字段 # 你解析这个字段,执行对应函数,把结果作为 role="tool" 的消息追加回去

这个流程走通一遍,你就理解了 Agent 最核心的机制。LangChain 的 Tool 抽象、Spring AI 的 Function 抽象,本质上都是对这套流程的封装。你手写过一遍,再看框架文档,会发现那些概念你全都认识。

3.4 手写一个最小 Agent 循环

现在把前面几块拼起来,我们就能手写一个不依赖任何框架的最小 Agent:

def run_agent(user_input, max_steps=5): messages = [ {"role": "system", "content": "你是一个助手,可以调用工具完成任务"}, {"role": "user", "content": user_input} ] for step in range(max_steps): response = call_llm(messages, tools=tools) msg = response["choices"][0]["message"] messages.append(msg) # 如果没有工具调用,说明任务完成 if not msg.get("tool_calls"): return msg["content"] # 执行所有工具调用 for tool_call in msg["tool_calls"]: result = execute_tool(tool_call) messages.append({ "role": "tool", "tool_call_id": tool_call["id"], "content": result }) return "达到最大步数限制"

这大概 20 行代码,就是一个完整的 Agent 循环。max_steps是防止死循环的保护机制,这个细节非常重要——我见过太多新手写的 Agent 因为模型反复调用同一个工具而陷入无限循环,烧掉一堆 token。

写到这里,你应该能体会到:Agent 的本质不复杂,复杂的是工程化。框架解决的是并发、重试、日志、状态持久化、多 Agent 协作这些工程问题,而不是“让模型会调工具”这个核心逻辑。

4. 第三层进阶:理解 Agent 的主流架构模式

4.1 ReAct:最基础也最常用的模式

ReAct 是 Reasoning + Acting 的缩写,核心思想是让模型在每一步都先“想”再“做”。它的提示词模板大致是这样的:

你可以使用以下工具:{tools} 使用以下格式: Thought: 我需要思考下一步做什么 Action: 工具名称 Action Input: 工具参数 Observation: 工具返回的结果 ...(重复 Thought/Action/Observation) Thought: 我现在知道最终答案了 Final Answer: 最终答案

这个模式的好处是可解释性强,你能从日志里清楚看到模型每一步的推理过程。缺点是 token 消耗大,因为每一轮都要把完整的思考历史带上。

我个人的经验是,ReAct 适合任务步骤不确定、需要灵活调整的场景,比如“帮我调研一下某个话题并写份报告”。如果任务流程固定,用不着 ReAct,直接写死流程更省钱。

4.2 Plan-and-Execute:先规划再执行

这个模式把 Agent 分成两个角色:规划者先制定一个完整的步骤清单,执行者再一步步去完成。相比 ReAct 的“走一步看一步”,它更适合复杂的长任务。

举个例子,任务是“帮我搭建一个个人博客”。规划者会拆成:选技术栈、初始化项目、写首页、写文章页、部署。执行者再逐个完成。这种模式的优势是全局视野清晰,不容易跑偏;劣势是规划一旦出错,后面全错,而且中途遇到意外不好调整。

4.3 多 Agent 协作:什么时候需要,什么时候是过度设计

CrewAI、AutoGen 这类框架主打多 Agent 协作,让几个 Agent 分别扮演不同角色(比如研究员、写手、审核员)协同完成任务。听起来很酷,但我要提醒一句:大多数场景用不上多 Agent。

多 Agent 的代价是复杂度指数级上升——通信成本、状态同步、角色冲突、调试困难。我见过有人用三个 Agent 去做一个单 Agent 就能搞定的事,结果调试了两周还没跑通。判断标准很简单:如果任务能清晰拆成几个独立子任务,且子任务之间需要“讨论”和“审核”,才考虑多 Agent;否则老老实实用单 Agent 加多个工具。

4.4 关于 MCP:它解决的是什么问题

热搜里 MCP 出现频率很高,很多人搞不清它是什么。我用一句话解释:MCP(Model Context Protocol)是一套让模型和外部工具、数据源之间标准化通信的协议。

在没有 MCP 之前,你每接一个工具就要写一套适配代码,工具 A 的接口和工具 B 的接口完全不一样。MCP 想做的是统一这件事——工具方按照 MCP 标准暴露自己的能力,Agent 方按照 MCP 标准去调用,双方解耦。你可以把它类比成 USB 接口,以前每个设备一个专用接口,现在统一成 USB-C。

对新手来说,MCP 现在还不是必须掌握的,但理解它的设计思想很有价值——标准化是工程化的必经之路。等你手写过几个工具调用之后,再回头看 MCP 的设计,会有更深的体会。

5. 第四层:什么时候该引入框架,怎么选

5.1 引入框架的正确时机

我的判断标准是:当你手写的 Agent 循环开始出现重复代码,且这些重复代码和业务逻辑无关时,就该考虑框架了。

具体来说,当你发现自己反复在写这些东西:重试逻辑、超时处理、日志记录、token 计数、对话历史持久化、多个工具的注册和分发——这些就是框架存在的意义。它们不是帮你“实现 Agent”,而是帮你“把 Agent 工程化”。

反过来说,如果你连一个手写循环都没跑通过,直接上框架,你会把框架的抽象当成魔法,出了问题完全无从下手。

5.2 LangChain、Spring AI、CrewAI、Dify 怎么选

这几个是热搜里出现最多的,我按适用场景给你梳理一下:

框架语言适合谁优势注意点
LangChainPython/JSPython 开发者、快速原型生态最全,组件最多抽象层多,版本变动快,容易踩坑
Spring AIJavaJava 后端、企业项目和 Spring 生态无缝集成相对年轻,社区资料少
CrewAIPython多 Agent 协作场景角色定义直观,上手快单 Agent 场景属于杀鸡用牛刀
Dify低代码平台非程序员、快速验证可视化编排,无需写代码复杂逻辑受限,深度定制困难

选型的核心不是“哪个最好”,而是“哪个最匹配你的现状”。你是 Java 背景,就优先看 Spring AI;你要快速验证一个想法,Dify 拖拖拽拽就能出原型;你要做深度定制,LangChain 的灵活性更高。

踩坑提醒:LangChain 的版本迭代非常快,网上很多教程是半年前的,代码直接跑会报错。看文档一定要看对应版本的,别拿旧教程硬套。

5.3 从手写到框架的迁移思路

当你决定用 LangChain 时,不要推倒重来,而是把你手写的每个部分对应到框架的组件上:

  • 你手写的messages列表 → LangChain 的ChatPromptTemplate和MessagesPlaceholder
  • 你手写的工具定义 → LangChain 的@tool装饰器
  • 你手写的 Agent 循环 → LangChain 的AgentExecutor
  • 你手写的记忆管理 → LangChain 的ConversationBufferMemory

这样迁移,你不是在“学一个新东西”,而是在“把手写的东西换成更工程化的实现”。心态完全不一样,学习效率也完全不同。

6. 新手最容易踩的五个坑

6.1 坑一:把框架当语言来学

有人问我“学 LangChain 要多久”,我说这问题问错了。LangChain 不是一门语言,它是一堆工具的组合,你不需要“学完”它,只需要在用到某个功能时去查对应文档。把它当成字典,而不是教科书。

6.2 坑二:忽视 token 成本

Agent 的 token 消耗远超普通对话,因为每一轮都要带上完整历史。我见过一个新手写的 Agent,因为没设max_steps,模型陷入循环,一晚上烧掉几十美元。上线前一定要设步数上限、超时时间、单次任务 token 预算,这是血的教训。

6.3 坑三:工具设计得太粗或太细

工具太粗,模型不知道怎么用;工具太细,模型要调很多次。好的工具设计是一个工具做一件明确的事,参数清晰,描述准确。比如“查询订单”比“数据库操作”好,“按订单号查订单”比“查询订单”更明确。

6.4 坑四:不做错误处理

工具调用失败是常态——网络超时、API 限流、参数错误。如果你的 Agent 遇到错误就崩溃,那它根本不能用。正确做法是把错误信息作为工具结果返回给模型,让模型自己决定是重试、换工具还是放弃。

6.5 坑五:过早追求“智能”

新手总想让 Agent 无所不能,结果什么都做不好。我的建议是从一个极窄的场景切入,比如“自动整理下载文件夹”,把它做到 90% 可靠,再逐步扩展。窄场景能让你快速看到效果、积累经验,比一上来就搞通用 Agent 靠谱得多。

7. 一个可以照着做的四周入门计划

7.1 第一周:Python 基础和 API 调用

目标是能独立调用一个大模型 API 并处理返回。每天花两小时,前两天补 Python 基础(如果已有基础就跳过),后五天专注 API 调用——单轮、多轮、异常处理、日志记录。周末写一个小脚本:命令行输入问题,输出模型回答,支持多轮对话。

7.2 第二周:Function Calling 和工具调用

目标是理解并手写工具调用流程。先照着文档跑通一个官方示例,然后自己定义两三个工具(比如查时间、算数学、读文件),让模型根据问题自动选择。周末写一个能查天气、能算数的命令行助手。

7.3 第三周:手写完整 Agent 循环

目标是把前两周的东西整合成一个完整的 Agent。加上max_steps保护、错误处理、日志输出。周末做一个实用的小项目,比如“自动整理桌面文件”——Agent 扫描桌面,根据文件类型分类移动到对应文件夹。

7.4 第四周:引入框架并对比

目标是用 LangChain 重写第三周的项目,对比手写版和框架版的差异。重点看框架帮你省了哪些代码、引入了哪些新概念。这一周的核心不是“学会 LangChain”,而是“理解框架的价值边界”。

走完这四周,你对 Agent 的理解会超过 80% 只会调框架的人。因为你知道每一层在做什么,遇到问题能定位到具体环节,而不是对着报错干瞪眼。

8. 关于转行者的一些额外建议

8.1 你的旧经验不是包袱,是资产

转行者常有的焦虑是“我之前的经验用不上”。恰恰相反,Agent 开发是工程能力和领域知识的结合。你是做后端的,对并发、状态管理、接口设计的理解直接能用;你是做产品的,对用户需求的理解能帮你设计更好的 Agent 交互;你是做数据分析的,对数据处理流程的熟悉能让你设计出更实用的工具。

框架谁都能学,但领域经验是稀缺的。别把自己当零基础,把旧经验当跳板。

8.2 别被“AI 焦虑”推着走

这个领域变化确实快,今天流行 LangChain,明天可能就换别的。但底层的东西变化很慢——消息怎么组织、工具怎么调用、上下文怎么管理、错误怎么处理,这些核心问题几年内不会变。把精力放在这些不变的东西上,你就不会被各种新框架牵着鼻子走。

8.3 动手永远比看教程重要

我最后想说的是,这个领域最不缺的就是教程,最缺的是动手写代码的人。你看一百篇 LangChain 入门教程,不如自己手写一个 Agent 循环。看教程是被动接收,写代码是主动建构,两者的学习效果差着数量级。

找一个小需求,哪怕再简单,把它做出来。做的过程中你会遇到各种教程里不会讲的问题,解决这些问题的过程,才是真正长本事的时候。

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

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

立即咨询