☰
零基础入门 Agent 系统学习路线:从 ReAct 到 LangChain 的两个开源项目实战
2026/10/12 14:36:35 网站建设 项目流程

1. 零基础学 Agent 最容易踩的坑:一上来就啃 LangChain

很多人第一次接触 Agent,脑子里想的是「我要做个能自己思考、自己调工具、自己完成任务的智能体」,然后打开搜索引擎,看到满屏的 LangChain、AutoGPT、CrewAI,于是兴冲冲地pip install langchain,结果被AgentExecutor、Tool、Memory、Callback一堆抽象类绕得晕头转向。代码跑起来了,但完全不知道里面发生了什么——模型什么时候决定调工具?工具结果怎么塞回上下文?循环什么时候停?全是黑盒。

我见过太多人卡在这一步:能照着文档拼出一个「天气查询 Agent」,但一旦要改逻辑、加工具、排查为什么 Agent 不调用某个工具,就彻底懵了。问题不在于 LangChain 不好,而在于学习顺序反了。LangChain 是生产级框架,它把 Agent 的核心循环封装得很深,适合已经理解原理的人提效,不适合用来入门理解原理。

Agent 的核心其实非常朴素:一个循环 + 一次模型调用 + 一个工具执行。用伪代码写出来就三行:

while not done: response = llm(messages) # 模型决定下一步 if response.has_tool_call(): result = run_tool(response.tool) # 执行工具 messages.append(result) # 结果回填 else: done = True

ReAct(Reasoning + Acting)范式说的就是这个:模型先「想」(Reasoning),再「做」(Acting),拿到观察结果(Observation)后继续想,直到任务完成。你把这个循环手写一遍,比看十篇 LangChain 教程都管用。

所以这篇内容给零基础开发者一条更顺的路:先用两个开源项目建立正确认知,再上 LangChain。第一个项目learn-claude-code用几百行代码把 Agent 循环剥得干干净净,让你亲眼看到 ReAct 是怎么转起来的;第二个项目hello-agents帮你把知识体系补全,从 ReAct 到 Plan-and-Execute、从记忆检索到 MCP 协议,最后落到完整项目。两个项目都是中文友好、代码可跑,适合边看边敲。

下面我会先讲清楚环境怎么配、TaoToken 怎么接(因为你要真跑起来必须有个能调模型的入口),然后给你最小可运行的 ReAct Agent 代码,再教你怎么验证循环真的生效了,最后把常见报错一个个拆开。全程可复制,不需要你有任何 Agent 基础。

2. 前置准备:用 TaoToken 打通模型调用入口

在跑任何 Agent 代码之前,你得先有一个能稳定调用大模型的入口。零基础同学最容易在这里卡住:要么不知道怎么申请 API Key,要么被各种环境变量、Base URL 搞混。我用 TaoToken 作为统一入口来演示,因为它兼容 OpenAI 和 Anthropic 两种调用格式,后面无论你跑learn-claude-code还是 LangChain,都不用换配置。

先明确三个东西,这是所有 Agent 项目的「三件套」,缺一不可:

配置项作用示例值
Base URL请求发到哪个地址https://taotoken.net/api
API Key身份凭证sk-xxxxxx(在控制台生成)
Model ID用哪个模型claude-sonnet-4-5或gpt-4o等

第一步,拿到 API Key。打开 TaoToken 控制台,进入 API Keys 页面创建一个新 Key,复制下来。这个 Key 只显示一次,建议先存到本地环境变量里,别硬编码进代码。

第二步,配置环境变量。这是最推荐的方式,代码里读环境变量,换 Key 不用改代码。Linux/macOS 在终端执行:

export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"

Windows PowerShell:

$env:TAOTOKEN_API_KEY="sk-你的key" $env:TAOTOKEN_BASE_URL="https://taotoken.net/api"

如果你想让配置永久生效,Linux/macOS 写进~/.bashrc或~/.zshrc,Windows 用系统环境变量面板添加。

第三步,验证 Key 能用。别急着写 Agent,先用一条最简单的请求确认链路通。用 curl 测一下:

curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "回复两个字:通了"}] }'

如果返回 JSON 里有choices字段和模型回复,说明 Key、Base URL、模型 ID 三件套都对。这一步非常重要,因为后面 Agent 报错时,你要能区分是「模型调用本身不通」还是「Agent 逻辑有问题」。我建议你把这条 curl 存成一个test_api.sh,每次换环境先跑一遍。

第四步,装 Python 依赖。Agent 项目基本都用 Python,建议用虚拟环境隔离:

python -m venv agent-env source agent-env/bin/activate # Windows: agent-env\Scripts\activate pip install openai anthropic requests

这里openai和anthropic两个 SDK 都装上,因为不同开源项目可能用不同 SDK。TaoToken 的 Base URL 对两者都兼容,OpenAI SDK 用https://taotoken.net/api/v1,Anthropic SDK 用https://taotoken.net/api,具体看项目文档。

注意:环境变量名不要和系统里已有的OPENAI_API_KEY冲突。如果你之前配过别的 Key,建议在项目里显式传参,而不是依赖全局环境变量,避免调错入口。

到这里,你的「模型调用入口」就打通了。接下来所有 Agent 代码,都是在这个入口之上加循环、加工具、加记忆。记住这个分层:模型调用是地基,Agent 逻辑是房子。地基不稳,房子必塌。

3. 可复制配置:把 learn-claude-code 跑起来

learn-claude-code这个项目的价值,用一句话说就是:它把 Agent 的核心循环从黑盒里拽出来,摊在你面前。整个项目拆成 12 节课,每节课只新增一个机制,核心循环代码几乎不动。你跟着敲一遍,就能明白「One loop & Bash is all you need」这句话不是口号。

先把项目拉下来:

git clone https://github.com/shareAI-lab/learn-claude-code.git cd learn-claude-code

项目结构大致是这样(不同版本可能略有差异,以你拉到的为准):

learn-claude-code/ ├── lessons/ │ ├── 01_hello_agent.py │ ├── 02_tool_call.py │ ├── 03_react_loop.py │ └── ... ├── requirements.txt └── README.md

配置项目级的模型入口。很多开源项目会读.env文件或config.py。我建议你新建一个.env,把三件套写进去:

# .env OPENAI_API_KEY=sk-你的key OPENAI_BASE_URL=https://taotoken.net/api/v1 MODEL_ID=claude-sonnet-4-5

然后在代码入口处加载。如果你用的是 OpenAI SDK 风格,最小配置长这样:

import os from openai import OpenAI client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL", "https://taotoken.net/api/v1"), ) def chat(messages, tools=None): resp = client.chat.completions.create( model=os.getenv("MODEL_ID", "claude-sonnet-4-5"), messages=messages, tools=tools, ) return resp.choices[0].message

如果你用的是 Claude Code 或类似 CLI 工具,配置方式不太一样,通常是一个 JSON 配置文件。以 Claude Code 的 settings 为例,路径一般在~/.claude/settings.json,内容形如:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }

这里三件套对应关系是:ANTHROPIC_BASE_URL是 Base URL,ANTHROPIC_API_KEY是 Key,ANTHROPIC_MODEL是 Model ID。三个都要写全,少一个就会报认证或模型找不到的错。

跑第一节课。进入lessons目录,先跑最基础的:

python 01_hello_agent.py

如果它只是简单调一次模型并打印回复,说明你的入口通了。然后跑03_react_loop.py,这个才是重点——它会展示一个完整的 ReAct 循环。你重点看三处:

第一,循环条件。通常是while True加一个退出判断,模型不再请求工具时就 break。

第二,工具定义。项目里一般会定义一个bash或execute_command工具,让 Agent 能执行终端命令。工具的描述(description)非常关键,模型靠它决定什么时候调用。

第三,消息回填。工具执行结果会以role: tool或role: user的形式塞回 messages,这是 ReAct 能「记住」上一步观察结果的关键。

动手改一个参数验证你理解了。把工具描述从「执行 bash 命令」改成「执行 bash 命令,但只能用于查看文件」,再跑一次,观察模型调用工具的频率和方式有没有变化。这个动作能让你直观感受到:Agent 的行为很大程度上由工具描述和系统提示词决定,不是玄学。

提示:learn-claude-code的姊妹项目claw0讲的是 7x24 小时稳定运行的生产级 Agent 网关。等你把单次任务型 Agent 跑通后,可以去看claw0,理解「持续在线服务」和「单次任务」在架构上的区别。

配置这一步的核心不是「跑通就行」,而是让你建立「三件套 + 循环 + 工具」的心智模型。后面上 LangChain,你会发现它只是把这几个东西包装成了类,本质没变。

4. 验证 ReAct 循环:最小可运行 Agent 与调试动作

光看项目代码还不够,你得自己手写一个最小 ReAct Agent,才能真正理解循环。下面这段代码不依赖 LangChain,只用 OpenAI SDK,大约 60 行,你可以直接复制运行。

import os import json import subprocess from openai import OpenAI client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL", "https://taotoken.net/api/v1"), ) # 定义工具:让 Agent 能执行 shell 命令 tools = [{ "type": "function", "function": { "name": "run_bash", "description": "执行一条 bash 命令并返回输出,用于查看文件、目录等", "parameters": { "type": "object", "properties": { "command": {"type": "string", "description": "要执行的命令"} }, "required": ["command"], }, }, }] def run_bash(command): try: result = subprocess.run( command, shell=True, capture_output=True, text=True, timeout=10 ) return result.stdout + result.stderr except Exception as e: return f"执行出错: {e}" def react_agent(user_input, max_steps=5): messages = [ {"role": "system", "content": "你是一个 Agent,需要时调用 run_bash 工具。"}, {"role": "user", "content": user_input}, ] for step in range(max_steps): print(f"\n--- 第 {step+1} 步 ---") resp = client.chat.completions.create( model=os.getenv("MODEL_ID", "claude-sonnet-4-5"), messages=messages, tools=tools, ) msg = resp.choices[0].message messages.append(msg) # 没有工具调用,说明任务结束 if not msg.tool_calls: print("最终回复:", msg.content) return msg.content # 有工具调用,执行并回填 for call in msg.tool_calls: args = json.loads(call.function.arguments) print(f"调用工具: {call.function.name}, 参数: {args}") result = run_bash(args["command"]) print(f"工具结果: {result[:200]}") messages.append({ "role": "tool", "tool_call_id": call.id, "content": result, }) return "达到最大步数,未完成" if __name__ == "__main__": react_agent("看看当前目录下有哪些文件,然后告诉我有没有 README")

这段代码里,ReAct 的三个阶段对应得很清楚:

Reasoning 阶段是模型返回tool_calls之前的那次推理,它决定「我要不要调工具、调哪个、传什么参数」。Acting 阶段是你执行run_bash。Observation 阶段是工具结果以role: tool回填进 messages,模型下一轮就能看到。

怎么验证循环真的生效了?看终端输出。如果一切正常,你会看到类似这样的过程:

--- 第 1 步 --- 调用工具: run_bash, 参数: {'command': 'ls -la'} 工具结果: total 24 drwxr-xr-x ... -rw-r--r-- README.md ... --- 第 2 步 --- 最终回复: 当前目录下有 README.md 文件...

关键信号有两个:第一,出现了「调用工具」的打印,说明模型确实决定调工具了;第二,出现了「第 2 步」,说明工具结果回填后模型又推理了一轮,循环转起来了。如果只有第 1 步就直接出最终回复,说明模型没调工具,可能是工具描述不够清楚,或者模型觉得不需要。

再做一个调试动作:故意让工具报错。把run_bash里的命令改成cat 不存在的文件,观察模型怎么处理错误。好的 Agent 会看到错误信息后调整策略,比如先ls看看有什么文件。这个动作能让你理解「Observation 不只是成功结果,错误信息也是重要反馈」。

最后,把 max_steps 调成 1。你会发现 Agent 只调一次工具就被迫停止,任务没完成。这解释了为什么生产级 Agent 要设置合理的最大步数——太少完不成任务,太多可能死循环烧 token。

跑通这个最小示例后,你再回头看learn-claude-code的课程,会发现每一节课都是在给这个循环加东西:加记忆、加多工具、加上下文压缩、加多 Agent 协作。核心循环始终没变。

5. 常见报错排查:401、local proxy failed、reading choices、OAuth

零基础跑 Agent,报错是常态。下面这几个是我踩过最多的,按报错原文对照排查。

报错一:401 Unauthorized或invalid api key

这是最常见的问题,九成是 Key 或 Base URL 配错。排查顺序:先确认环境变量真的被读到了,在 Python 里打印os.getenv("OPENAI_API_KEY")看是不是None;再确认 Base URL 结尾有没有多写或少写/v1,OpenAI SDK 需要/v1,Anthropic SDK 通常不需要;最后确认 Key 没有多余空格或换行。如果用的是.env文件,记得装python-dotenv并调用load_dotenv(),否则文件不会被自动读取。

报错二:local proxy failed或连接超时

这个报错通常出现在网络层,不是 Key 的问题。先确认你的 Base URL 写的是https://taotoken.net/api而不是别的地址。如果你本地配了系统级代理,可能会干扰请求,建议在代码里显式不传代理,或者检查环境变量里有没有HTTP_PROXY、HTTPS_PROXY残留。另外,公司网络如果有防火墙,也可能导致连接失败,换一个网络环境试试。

报错三:reading 'choices'或KeyError: 'choices'

这个报错说明请求返回了,但返回结构里没有choices字段。常见原因有三个:一是模型 ID 写错了,服务端返回了错误信息而不是正常回复;二是请求体格式不对,比如messages不是列表;三是把 Anthropic 格式的请求发给了 OpenAI 格式的接口。排查方法:把原始返回print(resp)出来看,错误信息通常写在error字段里。如果是模型 ID 问题,换成claude-sonnet-4-5或文档里确认可用的 ID。

报错四:OAuth相关错误或authentication failed

如果你用的是 Claude Code 这类 CLI 工具,它可能默认走 OAuth 登录而不是 API Key。这时候需要在配置文件里显式指定 API Key 模式。以settings.json为例,确认env里的ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL都写对了,并且没有同时启用 OAuth 登录态。有些工具会优先读 OAuth token,导致你的 API Key 被忽略,这时候清掉登录缓存或显式指定认证方式。

报错五:Agent 不调用工具,直接回复

这个不算报错,但很常见。原因通常是工具描述太模糊,或者系统提示词没告诉模型「你可以用工具」。解决办法:把工具 description 写具体,比如「执行 bash 命令查看文件和目录」比「执行命令」好得多;在 system prompt 里明确写「需要查看文件时调用 run_bash 工具」。另外,有些模型对工具调用的支持程度不同,换一个支持 function calling 的模型试试。

报错六:循环停不下来,一直调工具

这是 max_steps 设置过大或工具结果没有有效回填导致的。检查两点:工具结果是不是真的塞进了 messages,tool_call_id有没有对上;模型是不是陷入了「调工具→结果不满意→再调」的死循环。生产环境一定要设最大步数,并且可以在提示词里加「如果连续两次工具结果相同,就停止并总结」。

排查报错的通用心法:先分层,再定位。把问题分成「模型调用层」和「Agent 逻辑层」。用第 2 节那条 curl 命令测模型调用层,通了就说明 Key 和 Base URL 没问题,问题在 Agent 逻辑;不通就先修入口。这个分层能帮你省掉大量瞎试的时间。

6. 从 ReAct 到 LangChain:hello-agents 补全知识体系

当你手写完 ReAct 循环、跑通learn-claude-code之后,就该上hello-agents了。这个项目是 Datawhale 社区出品的,GitHub 3 万+ Star,是目前国内体系最完整的中文 Agent 教程。它的定位和learn-claude-code正好互补:前者教你「Agent 怎么转」,后者教你「Agent 能做成什么」。

先把项目拉下来:

git clone https://github.com/datawhalechina/hello-agents.git cd hello-agents

项目分五大模块,我建议按这个顺序学:

基础打底模块,梳理智能体定义、发展史和 LLM 基础。这部分看起来偏理论,但很重要,因为它帮你建立术语体系。比如什么是「工具调用」、什么是「上下文窗口」、什么是「规划」,后面看代码时不会懵。

核心实战模块,亲手实现 ReAct、Plan-and-Execute 等经典范式。你在这里会看到 ReAct 的另一种写法,以及 Plan-and-Execute 和 ReAct 的区别:ReAct 是「边想边做」,Plan-and-Execute 是「先规划再执行」。两种范式适合不同任务,前者适合探索型任务,后者适合步骤明确的复杂任务。

进阶提升模块,讲记忆检索、上下文工程、MCP/A2A 通信协议、Agentic-RL、性能评估。这部分是企业级技能,尤其是 MCP 协议,现在很多工具生态都在往这个方向走。你在这里会理解「为什么 Agent 需要标准化的工具接口」。

项目落地模块,三个实战项目:智能旅行助手、深度研究 Agent、赛博小镇。这是把前面知识融会贯通的地方。我建议至少完整跟做一个,比如智能旅行助手,它会涉及多工具调用、状态管理、错误处理,是很好的练手项目。

成果验收模块,独立完成多智能体毕业设计。这一步是检验你是否真的具备独立开发能力。

什么时候上 LangChain?我的建议是:在hello-agents的核心实战模块之后、项目落地模块之前。因为这时候你已经理解了 Agent 的核心循环和常见范式,再看 LangChain 的AgentExecutor、Tool、Memory,就能看透它的封装——它无非是把循环、工具、记忆做成了可配置的组件。这时候你用它,是「用工具提效」,而不是「被工具牵着走」。

LangChain 的最小 Agent 示例大概长这样,你可以对照自己手写的循环看:

from langchain.agents import AgentExecutor, create_react_agent from langchain.tools import Tool from langchain_openai import ChatOpenAI llm = ChatOpenAI( model="claude-sonnet-4-5", base_url="https://taotoken.net/api/v1", api_key="sk-你的key", ) tools = [ Tool(name="run_bash", func=run_bash, description="执行 bash 命令") ] agent = create_react_agent(llm, tools, prompt) executor = AgentExecutor(agent=agent, tools=tools, max_iterations=5) executor.invoke({"input": "看看当前目录有什么文件"})

你会发现,max_iterations对应你手写的max_steps,Tool对应你手写的 tools 定义,AgentExecutor对应你手写的react_agent循环。框架没有魔法,它只是把你写过的东西标准化了。这就是为什么先手写再上框架,学习效率最高。

学习路径建议,不用贪多:

第 1 周,吃透learn-claude-code全 12 节,亲手跑通每一段代码,重点是理解 ReAct 循环和工具调用。第 2 到 4 周,系统学hello-agents,完成至少一个完整实战项目,把知识转化成落地能力。第 5 周开始,用 LangChain 重构你手写过的 Agent,对比两种写法的差异,理解框架的取舍。

最后给你一个实用技巧:把你手写的最小 ReAct Agent 存成一个模板文件,以后学任何新框架,都拿它做对照。新框架的每个概念,你都能在自己的模板里找到对应物。这样学,永远不会被抽象概念绕晕。

如果你在配置模型入口时遇到问题,可以直接去 TaoToken 的接入文档看最新的 Base URL 和模型列表;想先验证模型能不能正常对话,用模型对话页面测一条;如果打算长期做编码类 Agent,可以了解 Coding Plan 的额度方案。把入口打通,剩下的就是循环和工具的事,一步一步来,Agent 没那么神秘。

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

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

立即咨询