手把手教你用LangGraph从零构建AI Agent:从原理到实战保姆级教程(TaoToken统一Key接入版)

发布时间:2026/9/28 19:48:44

手把手教你用LangGraph从零构建AI Agent:从原理到实战保姆级教程(TaoToken统一Key接入版) 1. 为什么我建议你用 LangGraph 而不是裸写 while 循环如果你最近在折腾 AI Agent大概率已经看过不少“概念文”Function Calling、ReAct、多智能体协作……名词一堆但真到动手时还是不知道从哪下手。LangGraph 就是来解决这个问题的——它把 Agent 的执行流程抽象成一张有向图节点是“动作”边是“跳转条件”状态在节点之间流转。你不再需要手写一堆 if-else 和 while 循环去控制“什么时候调工具、什么时候结束”而是把逻辑画成图让框架去跑。这篇教程面向的是完全没接触过 LangGraph、但会一点 Python的读者。我会从 StateGraph、节点、边、Reducer 这几个核心概念讲起然后带你落地一个能真正跑起来的最小 Agent它能接收用户问题、判断是否需要调用工具、执行工具、把结果回传给模型、最后输出答案。整个过程用 TaoToken 统一 Key 接入模型你不需要在多个厂商之间来回切换配置。我试过用纯 Python 写 Agent 循环代码量不大但状态管理很容易乱尤其是加上“人工确认”“重试”“多轮工具调用”之后控制流会变得非常难读。LangGraph 的价值就在于把这些控制流显式化调试的时候你能清楚看到每一步走到了哪个节点。2. TaoToken 前置准备一个 Key 打通模型接入在写代码之前先把模型通道准备好。LangGraph 本身不绑定任何模型厂商它通过 LangChain 的 ChatModel 接口调用 LLM。所以你需要一个兼容 OpenAI 协议的 API 端点。TaoToken 提供的就是这样一个统一入口一个 Key、一个 Base URL就能调用多种模型省去你分别注册、分别管理额度的麻烦。你需要准备三样东西第一一个 TaoToken 账号登录后进入控制台创建 API Key。地址是https://taotoken.net/api-keys创建后复制那串sk-开头的 Key后面配置里要用。第二确认你要用的模型名称。TaoToken 的模型列表在文档里可以查到常见的有gpt-4o、claude-3-5-sonnet、deepseek-chat等。本文示例用gpt-4o你换成别的也行只要 LangChain 的 OpenAI 兼容接口能识别。第三记住 Base URLhttps://taotoken.net/api。注意这里不要加任何路径后缀LangChain 会自动拼接/v1/chat/completions。提示如果你之前用过 OpenAI 官方 SDK把base_url换成 TaoToken 的地址、api_key换成 TaoToken 的 Key 即可其他代码不用动。这就是统一 Key 的好处。3. 可复制配置config.toml 与 settings.json 骨架为了让配置和代码分离我习惯把模型参数放在独立文件里。下面给你两份可直接复制的骨架放在项目根目录即可。config.toml用来存模型和运行参数[model] provider openai-compatible base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model_name gpt-4o temperature 0.0 max_tokens 2048 [agent] recursion_limit 10 max_tool_calls 5settings.json用来存 Agent 的运行时开关方便你后面做实验{ agent: { name: minimal-langgraph-agent, enable_tools: true, enable_interrupt: false, log_level: INFO }, tools: { calculator: true, search: false, read_file: false } }读取配置的代码很简单用 Python 标准库tomllib3.11或tomli即可。环境变量TAOTOKEN_API_KEY建议写在.env里用python-dotenv加载避免把 Key 硬编码进代码。import os import json import tomllib from dotenv import load_dotenv load_dotenv() with open(config.toml, rb) as f: config tomllib.load(f) with open(settings.json, r, encodingutf-8) as f: settings json.load(f) api_key os.environ[config[model][api_key_env]]这样你的 Key 只存在于环境变量中代码和配置文件都可以安全地提交到仓库。4. 从 StateGraph 到可运行 Agent完整代码拆解4.1 定义状态Agent 的“记忆”长什么样状态是 LangGraph 的核心。它贯穿整个执行过程每个节点都能读取和修改它。我们用TypedDict定义状态结构其中messages字段用add_messages作为 reducer保证新消息是追加而不是覆盖。from typing import TypedDict, Annotated from langgraph.graph.message import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages] step: int tool_results: listadd_messages这个 reducer 很关键。Agent 的对话历史需要不断累积如果每次节点返回都覆盖messages模型就看不到之前的上下文了。加上这个注解后LangGraph 会自动把新消息合并进列表。4.2 定义工具给 Agent 装上“手”工具就是普通 Python 函数加上tool装饰器。docstring 非常重要模型靠它判断什么时候该调用这个工具。from langchain_core.tools import tool tool def calculator(expression: str) - str: 计算数学表达式输入如 (15 * 23) (48 / 6) try: allowed set(0123456789-*/(). ) if not set(expression) allowed: return 表达式包含不允许的字符 return str(eval(expression)) except Exception as e: return f计算错误: {e} tool def read_file(filepath: str) - str: 读取本地文本文件内容输入文件路径 try: with open(filepath, r, encodingutf-8) as f: return f.read()[:2000] except Exception as e: return f读取失败: {e}注意calculator里我做了字符白名单校验直接eval用户输入在生产环境是危险的。这个细节很多教程会忽略但你真上线时必须处理。4.3 构建图节点、边与条件跳转现在把状态、工具、模型串起来。先初始化模型用 TaoToken 的 Base URLfrom langchain_openai import ChatOpenAI llm ChatOpenAI( modelconfig[model][model_name], base_urlconfig[model][base_url], api_keyapi_key, temperatureconfig[model][temperature], ) tools [calculator, read_file] llm_with_tools llm.bind_tools(tools)然后定义两个节点agent_node负责让模型思考并决定下一步tool_node负责执行模型请求的工具调用。from langgraph.graph import StateGraph, START, END def agent_node(state: AgentState) - AgentState: response llm_with_tools.invoke(state[messages]) return { messages: [response], step: state.get(step, 0) 1, } def tool_node(state: AgentState) - AgentState: last_message state[messages][-1] results [] tool_map {t.name: t for t in tools} for tool_call in last_message.tool_calls: func tool_map[tool_call[name]] output func.invoke(tool_call[args]) results.append({ tool_call_id: tool_call[id], role: tool, content: str(output), }) return {messages: results, tool_results: results} def should_continue(state: AgentState) - str: last_message state[messages][-1] if hasattr(last_message, tool_calls) and last_message.tool_calls: return tools return END最后组装图并编译graph StateGraph(AgentState) graph.add_node(agent, agent_node) graph.add_node(tools, tool_node) graph.add_edge(START, agent) graph.add_conditional_edges(agent, should_continue, {tools: tools, END: END}) graph.add_edge(tools, agent) app graph.compile()执行流程是START → agent → 判断 → tools → agent → 判断 → END。这就是标准的 ReAct 循环模型先推理需要工具就调用拿到结果再推理直到不需要工具就输出最终答案。5. 启动验证跑通第一个请求代码写完了跑一下看看。用HumanMessage构造输入调用app.invokefrom langchain_core.messages import HumanMessage result app.invoke( { messages: [HumanMessage(content帮我算一下 (15 * 23) (48 / 6) 等于多少)], step: 0, tool_results: [], }, {recursion_limit: config[agent][recursion_limit]}, ) print(result[messages][-1].content)如果一切正常你会看到类似输出(15 × 23) (48 ÷ 6) 345 8 353模型先识别出需要调用calculator工具返回353模型再组织成自然语言回答。整个过程你可以在日志里看到两次agent节点执行和一次tools节点执行。如果你想验证模型通道是否正常可以先用 TaoToken 的模型对话页面发一条测试消息确认 Key 和模型名没问题再跑代码。地址是https://taotoken.net/chat。6. 常见报错排查我踩过的几个坑报错一AuthenticationError: Incorrect API key provided先检查.env里的TAOTOKEN_API_KEY是否加载成功。可以在代码里打印api_key[:8]确认。另外确认base_url写的是https://taotoken.net/api不要多加/v1LangChain 会自己拼。报错二model not found模型名要和 TaoToken 文档里的一致。比如你写gpt-4但实际可用的是gpt-4o就会报这个错。建议先在模型对话页面确认模型可用再填进config.toml。报错三GraphRecursionError: Recursion limit of 10 reached说明 Agent 陷入了循环通常是工具一直返回错误、模型反复重试。解决办法有两个一是把recursion_limit调大二是检查工具函数的返回值是否合理。我建议在tool_node里加日志打印每次工具调用的输入输出很快就能定位。报错四tool_calls为空但模型不输出最终答案这种情况通常是模型返回了空内容。检查temperature是否设得太高或者max_tokens太小导致输出被截断。把temperature设为 0、max_tokens调到 2048 以上通常能解决。报错五工具执行结果格式不对tool_node返回的消息必须包含tool_call_id、role: tool和content三个字段。少任何一个下一轮agent_node调用模型时都会报格式错误。这个坑我在第一次写的时候踩过排查了半天。如果你在接入过程中遇到 Key 或通道相关的问题可以直接去 TaoToken 的接入文档对照检查https://taotoken.net/doc。文档里有各语言的完整示例包括 LangChain 的配置片段。7. 下一步从最小 Agent 到可用系统跑通这个最小示例后你可以沿着几个方向继续扩展。一是加更多工具比如数据库查询、HTTP 请求、文件写入让 Agent 能处理更复杂的任务。二是引入MemorySaver做检查点实现多轮对话和中断恢复这在需要人工确认的场景很有用。三是把app用 FastAPI 包一层暴露成 HTTP 接口方便前端或其他服务调用。如果你打算长期做编码类 Agent比如自动改代码、跑测试、提交 PR可以了解一下 TaoToken 的 Coding Plan它针对长上下文和频繁调用做了优化地址是https://taotoken.net/coding-plan。对于需要反复调试 Agent 流程的场景稳定的模型通道能省不少事。代码写到这里你已经有了一个能跑的最小闭环。接下来就是不断加工具、加节点、加条件边让它越来越接近你真正想要的那个 Agent。
延伸阅读

更多相关文章

2026/9/28 19:48:44

I2C总线调试全攻略:从万用表到逻辑分析仪的排查流程

1. 从一根不听话的I2C总线说起调试I2C总线这件事,说简单也简单,两根线一挂,上拉电阻一焊,代码一跑,设备就该认出来。说难也真难,尤其是当你面对一块新板子,i2cdetect扫出来一片空白,…

2026/9/28 19:48:44

GD32H759 RT-Thread SPI驱动实战:从寄存器到ST7789与W25Q64

1. 为什么在 GD32H759 上跑 RT-Thread 还要死磕 SPI拿到 GD32H759 这块片子的时候,我第一反应是外设资源真够猛的,主频拉到 600MHz,各种定时器、串口、SPI 一应俱全。但真正把它塞进工控项目里跑起来,才发现事情没那么简单。工控场…

2026/9/28 22:48:59

STM32音频输出实战:PWM与DAC方案对比及WAV播放器实现

1. 从蜂鸣器到高保真:为什么STM32音频输出值得折腾很多人第一次在STM32上做音频,都是从蜂鸣器或者PWM驱动小喇叭开始的。那种“滴——”一声的效果确实能响,但离“音乐播放器”四个字还差得远。我最早做这个项目的时候,用STM32F10…

2026/9/28 22:48:59

CLI-Anything:面向 CLI 工具链的协议栈与操作系统层

1. 项目概述:CLI-Anything 不是又一个命令行工具,而是 CLI 生态的“操作系统层”你有没有过这种体验:刚在 GitHub 上 clone 下来一个新项目,README 里第一行就写着pip install -e .,结果跑完发现缺了pydantic&#xff…

2026/9/28 22:48:59

Substrate本质解析:不是框架,而是区块链乐高底盘

1. Substrate不是框架,是区块链的“乐高底盘”很多人第一次听说Substrate,第一反应是:“哦,又一个区块链开发框架?”——这个理解偏差,直接决定了后续学习路径是通途还是死胡同。我2019年刚接触Substrate时…

2026/9/28 22:48:59

CLI-Anything实战:用命令行统一自动化工作流与AI编程助手联动

我给自己的工具链起了一个名字,叫CLI-Anything。说白了,就是把手里凡是能脚本化、能自动化的操作,全部收编成命令行工具,让终端成为唯一的操作入口。这两年codex cli、claude cli这些 AI 编程助手一个接一个推出命令行版本&#x…

2026/9/28 22:43:59

借鉴彼得·林奇投资智慧,构建并购文化整合评估体系

并购圈子里待久了,你就会发现一个尴尬的规律:交易谈判桌上算得再精细的案子,最后往往死在整合阶段。我接触过不少投后管理团队,亲眼看过几十个成功和失败的并购项目,几乎没有哪个团队敢拍着胸脯说“文化整合我们做得透…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑