当前位置: 首页 > news >正文

被Token坑惨后我悟了:LangGraph比LangChain省一半成本,原因就这两点

大家好,我是杯子,最近天天和 LLM 打交道的开发者。

最近我被 OpenAI 的账单狠狠“教育”了一次:一个月光 LangChain Agent 的 Token 费用就要到四位数了。我翻着日志一看——全是重复调用。每次用户问个简单问题,Agent 都要先想、再查、再总结……LLM 被反复唤醒,上下文越滚越大,Token 像不要钱一样往外烧。

直到我把 Agent 全部重构成了LangGraph后,同样的业务,Token 消耗直接腰斩。今天把核心的两个省 Token 逻辑讲透,让大家少走我踩过的坑。

一、LangChain Agent:全自动浪费的“完美”流程

用 LangChain 写带工具的 Agent 时,框架帮你把一切都“自动化”了,听起来很香,但实际上是自动烧钱

  1. 第一次 LLM 调用:把用户问题 + 系统 Prompt + 工具描述塞进上下文,让 LLM 决定「要不要用工具」。
  2. 执行工具:调用工具,拿到结果。
  3. 第二次 LLM 调用:把工具返回结果再塞回上下文,让 LLM 做最终总结并输出答案。

关键问题来了
这两次 LLM 调用是强制绑定的。即使工具返回的结果已经足够清晰(比如查到了精确答案),框架还是会再调用一次 LLM 去“润色”。

我测过一个最简单的“查询天气” Agent:

  • LangChain 平均每次请求2 次 LLM 调用
  • Token 消耗 ≈ 1200 tokens(含上下文膨胀)

这还没算上多工具、多轮对话时上下文越滚越大的情况。LangChain 就像一台全自动洗衣机,你只能选“标准模式”,想省水省电?门都没有。

二、LangGraph:你手动省油,想省就省

LangGraph 把 Agent 拆成一张状态图(StateGraph),每一步你自己决定怎么走。核心省钱逻辑就两点:

1. 工具调用后,你可以直接跳过第二次 LLM 调用
# LangGraph 伪代码(超级简洁)defroute_after_tool(state):iftool_result_is_enough(state["messages"]):# 你自己判断return"END"# 直接结束!不走第二次 LLMelse:return"llm"# 需要 LLM 再总结才走graph=StateGraph(AgentState)graph.add_node("tools",tool_node)graph.add_node("llm",llm_node)graph.add_conditional_edges("tools",route_after_tool)

效果
调用工具拿到结果后,可以直接返回给用户,不再进 LLM,只有需要自然语言润色时,才走第二次 LLM。很多场景下(查询类、计算类、简单事实类),工具返回结果就是最终答案。Token 直接少一半。

我把 70% 的查询 Agent 都改成了这种“工具直出”模式,Token 消耗从 1200 掉到 550 左右,实测砍掉 50%左右

2. 通过 State 精准控制每次 LLM 的上下文

LangChain Agent 的消息列表是全局共享、不断累积的,越聊上下文越长。

LangGraph 的 State 是你自己定义的,你可以:

  • 每次调用 LLM 前,只把真正需要的消息塞进去(历史总结、关键事实、当前工具结果)
  • 把不重要的闲聊、旧工具结果直接丢掉或压缩
  • 甚至针对不同节点(规划节点、工具节点、总结节点)加载不同的 LLM + 不同的上下文

结果就是:每一次 LLM 调用,Prompt 都保持在最小必要长度。Token 不再偷偷膨胀。

我最后想说

LangChain 适合快速原型,它把一切都自动化了,但自动化 = 自动浪费

LangGraph 把控制权交还给你,它不帮你省,你就继续烧;你想省,它就能帮你精准省到骨子里

我现在看到账单不再心慌,反而有点小窃喜——因为我知道每一次调用我都亲自把过关,没有一次多余的 Token😁。

点赞 + 收藏,下次写复杂 Agent 的时候记得回来再看一遍,省的钱够请我喝好几杯咖啡了 😂

—— 链上杯子
2026.3 写于被 Token 账单支配的恐惧中

http://www.jsqmd.com/news/547117/

相关文章:

  • 终极指南:如何在PC上免费运行Switch游戏的Ryujinx模拟器
  • H.264编码实战:如何用FFmpeg手动控制I帧间隔提升直播流畅度
  • Vue3音乐播放器实战:从零实现音频可视化与歌词同步(附完整代码)
  • 别再只会setValue了!Qt进度条QProgressBar/QProgressDialog的5个实战技巧与避坑指南
  • 告别Windows!手把手教你用Ubuntu 22.04 + Conda搞定IsaacGym Preview4环境(附国内镜像源)
  • 从原理到实战:Python实现LDPC码的比特翻转与和积译码算法
  • 零基础玩转OpenClaw:Qwen3-32B-Chat镜像云端体验指南
  • Modelscope实战:如何快速拉取和上传AI模型与数据集(含最新CLI命令详解)
  • 嵌入式系统设备驱动开发指南
  • 无网环境部署:OpenClaw离线安装Qwen3-32B镜像指南
  • 牛客--布置会场(动态规划)--计算最大能获得的分数(贪心)
  • mysql 架构与存储结构:B+ 树的智慧
  • 动态调参实战:从理论到代码的深度剖析
  • ENVI 5.6 保姆级教程:如何快速绘制Landsat 8传感器的光谱响应曲线(附常见错误排查)
  • 告别蜗牛速度!优麒麟20.04 LTS换源华为云镜像保姆级教程
  • 杰理之打开MIC偏置接口【篇】
  • macOS Big Sur/Monterey更新后管理员权限丢失:从.AppleSetupDone文件定位到数据盘修复全解析
  • Flutter---构造函数
  • Souliss嵌入式智能家居框架:轻量级去中心化通信架构
  • G-Helper:重新定义华硕笔记本的硬件掌控权
  • Linux网络端口占用排查与解决方案
  • Ollama-for-amd:释放AMD GPU潜能的本地AI部署平台
  • PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用
  • OpenClaw技能扩展实战:用Qwen3-32B-Chat自动生成周报
  • PKE低频天线基础知识与原理
  • 从蓝牙耳机到智能家居:图解PCM接口的5大实战用法
  • Llama-3.2模型实战:如何解决tokenizer缺少padding token的报错(附两种方案对比)
  • ESP8266轻量级Flash-SRAM映射内存库FSmem
  • Alist与Cloudflare R2的无缝对接:WebDAV本地挂载实战与优化技巧
  • ESP32模拟ZDI协议调试eZ80嵌入式系统