13_不用框架怎么实现一个Agent
13 · 不用框架怎么实现一个 Agent我失业在家做求职作品集第四周的任务是「做一个 Agent」。打开教程前十篇里有九篇告诉你用 LangChain / LangGraph / LlamaIndex三行代码接上完事。我没用。不是洁癖是三个很具体的理由。这篇文章写我怎么手写的以及——更重要的——什么时候你还是该用框架。一、为什么不用三个理由1. 我要证明的是「我会做」不是「我会调」简历上写「熟练使用 LangChain」面试官心里想的是「那换个人也能」。手写一遍我能说清楚每一步为什么这么写为什么解析要做三态、为什么熔断设 2 次而不是 1 次、为什么观察要截断。这些是判断不是配置。框架把判断藏起来了 —— 你调create_react_agent()它跑起来了但你不知道它在哪一步做了什么取舍。2. 框架的版本和抽象会吃掉我的调试时间LangChain 那套抽象chain / runnable / agent executor本身就要学。而我只有六周其中一周要做 Agent MCP 可观测。我要的是「Agent 的原理」不是「某个框架的 API」。这两件事花的时间差不多但前者可迁移后者可能下个版本就变了。3. 最实际的一条不用框架可观测才好做这条是我做完才想明白的。框架的 Agent 跑起来你想看每一步发生了什么得先学会它的回调体系、它的 trace 格式。而我自己写的循环事件是我自己发的——想在哪埋点就在哪埋点格式我自己定。后来我接 trace 的时候Agent 代码改了 0 行。就这一条省下的时间够我再写两个模块。二、怎么实现一个纯文本协议的 ReAct核心决定完全不传tools/tool_choice给模型。# app/react.pyrun_react(...)# 不传 tools不传 tool_choice模型用纯文本表达意图思考我需要先查一下天气。 行动get_weather 参数{city: 北京}我的代码负责解析 → 执行 → 把结果回灌 → 让模型继续。为什么不走原生 function calling因为它依赖服务端支持。如果我降级到某家免费模型、而它恰好不支持整个 Agent 就废了。纯文本协议是最差的模型也能跑的那条路。代价是格式全靠约定模型随时可能不守约。所以有了下面这些设计。设计一解析做三态不是二值{kind:action}# 要调工具{kind:final}# 给出最终答案{kind:unknown}# 没解析出有效标记unknown这一态是关键。二值解析遇到格式不对只能抛异常或者当 final——前者让整个任务崩掉后者会让用户收到一个莫名其妙的答案。我的处理unknown当成一次观察结果回灌给模型附一段格式示范让它自己改。设计二给两次机会然后熔断MAX_UNKNOWN_IN_A_ROW2# app/react.py:76设 2 而不是 1给模型一次「照着格式重来」的机会。设 1 太苛刻一次口误就崩设 3 太浪费改不对的格式改三次也改不对。设计三三个终止出口且绝不编造出口 1 模型给出「最终答案」 —— 正常结束 出口 2 步数到 max_steps默认 6 —— 安全结束由我控制 出口 3 连续 2 次格式不明 —— 安全结束后两个返回okFalse空答案。这点我想了很久。熔断的目标是「不烧钱 不骗人」不是「一定要有个答案」。让模型在不知道的情况下硬编一个比空手而归糟糕得多。设计四观察回灌要截断而且要说明截断了OBSERVATION_MAX_CHARS1500# app/react.py:79截断会丢信息所以必须标注「已截断原长 N 字。如需完整结果请缩小查询范围」。不标注会怎样模型会以为它看到的就是全部然后基于残缺信息下结论。告诉模型它的视野有边界它才有可能自己缩小查询范围。三、踩的坑一个差点让我误判的 bug做完之后我接了可观测把事件流翻成 span 树画瀑布图。跑起来一看step 1: 651ms step 2: 640ms step 3: 620ms step 4: 590ms ---------------- 合计: 244% ← 比整次任务还长一倍多四步加起来 244%我第一反应是「系统变慢了」。实际是我的 ReAct 事件词汇里有step_start没有step_end。没有结束信号每一步就只能靠下一个step_start来推断结束最后一步更是要等到根 span 兜底关闭才结束。于是每一步的耗时都变成了「从它开始到全程结束」。尺子坏了我却在怀疑被测的东西。修法下一个step_start/final/stop到来时关闭上一步。修完我加了条测试专门钉死这个行为——这类 bug 特别容易在改事件词汇时复发。这个坑给我的教训跟第三周一模一样你没法优化一个你测不准的东西。先修尺子。四、框架我装了但主代码不用项目里装着 LangGraph但主代码不用。我把它做成了对照脚本python scripts/langgraph_compare.py --with-langgraph这样我既保住了「未依赖框架」这个卖点又能说清楚两种实现差异在哪——而且我知道 LangGraph 的 checkpointer 适合什么场景。「我评估过然后选择了不用」和「我不会」在面试官耳朵里是两回事。五、什么时候你还是该用框架诚实说下面这些情况别手写场景为什么生产环境要长期维护手写意味着所有边界情况你自己扛。框架踩过的坑比你多需要复杂的分支 / 循环 / 并行图LangGraph 的状态图 条件边是真好用手写状态机是自虐需要持久化、断点续跑checkpointer 这类基础设施别自己造团队协作框架是公共词汇。你手写的协议只有你自己看得懂我自己这个项目的结论也一样生产更该用 workflow确定性流程agent 只作展示和面试素材。Anthropic 那篇《Building Effective Agents》给了三个「不该用 agent」的判据我照着对了一遍路径可预测 → 用 workflow一次调用能完成 → 直接调 LLM别套 agent错误成本高且不可恢复 → workflow 人工检查点根本原因就一句agent 的错误会累积errors compound。十步里每步 95% 正确端到端只剩 60%。六、一句话手写一遍 Agent最大的收获不是那个 Agent是我知道它在哪一步会出错。这份清单我写进了docs/Agent失败模式与兜底方案.md十二类每类都有真实触发场景和兜底手段。框架能帮你跑起来但不会告诉你它会怎么坏。

相关新闻

12_我怎么给RAG建评测集_从实体重叠到LLM-as-judge

12_我怎么给RAG建评测集_从实体重叠到LLM-as-judge

我怎么给 RAG 建评测集:从实体重叠到 LLM-as-judge W2 结束时我手上有一套"能跑"的评测:50 条 golden set、召回 66%、忠实度下界 0.988。数字都挺好看。但我盯着那张表看了半天,说不清一件事——这套尺子,能量出我真正…

2026/10/10 2:48:05 阅读更多 →
C++代码实现MATLAB中fitrgam函数功能

C++代码实现MATLAB中fitrgam函数功能

// fitrgam.cpp // 自包含 GAM 实现:循环梯度提升 决策树桩 // 逻辑对应 MATLAB fitrgam: // - 每个预测变量独立提升(cyclic boosting) // - 基学习器为决策树桩 (max_depth 1) // - 默认迭代 300 次,学习率 …

2026/10/10 2:48:05 阅读更多 →
旋转数组最优解:三次翻转实现原地O(1)空间交换

旋转数组最优解:三次翻转实现原地O(1)空间交换

第一次在面试里遇到旋转数组这道题,是好几年前的事了。当时我的思路还停留在“开一个新数组,把每个元素放到正确位置”的阶段,一两分钟写完,自我感觉良好。结果面试官轻轻补了一句:“能不能不用额外空间?”…

2026/10/10 2:48:05 阅读更多 →

最新新闻

Linux终端效率进阶:从Readline快捷键到tmux复用实战

Linux终端效率进阶:从Readline快捷键到tmux复用实战

如果你和我一样,每天有大量时间泡在Linux终端里,那你一定有过这种体验:好不容易理清思路准备敲一条长命令,发现要修改中间一个参数,只能一下一下按方向键挪;或者刚想起昨天用过一条很长的命令,翻…

2026/10/10 3:31:19 阅读更多 →
手写动态数组:从固定数组痛点看扩容机制与C语言实现

手写动态数组:从固定数组痛点看扩容机制与C语言实现

从静态数组的痛点说起:为什么必须引入"扩容"这个机制1.1 固定数组的先天不足我最早开始写代码的时候,用的就是C语言里的固定数组。遇到需要存一组学生成绩、一批网络数据包ID这种场景,第一反应就是int arr[100]。当时觉得够用了&am…

2026/10/10 3:31:19 阅读更多 →
【单片机毕设案例分享】基于单片机的家居环境空气多指标监测与安全预警排风装置设计 基于单片机的室内空气污染物检测及人工干预排风控制系统设(030115)

【单片机毕设案例分享】基于单片机的家居环境空气多指标监测与安全预警排风装置设计 基于单片机的室内空气污染物检测及人工干预排风控制系统设(030115)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/10/10 3:31:19 阅读更多 →
PCA9422与STM32F405ZG电源管理方案设计与实战避坑

PCA9422与STM32F405ZG电源管理方案设计与实战避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:31:18 阅读更多 →
单片机毕设选题推荐:基于单片机的掉电存储阈值室内环境多参数检测报警系统设计 基于单片机的室内环境状态 OLED 显示与双模式排风扇控制装置设计(030115)

单片机毕设选题推荐:基于单片机的掉电存储阈值室内环境多参数检测报警系统设计 基于单片机的室内环境状态 OLED 显示与双模式排风扇控制装置设计(030115)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/10 3:31:18 阅读更多 →
2024数学建模国赛C题代码与数据:快速求解种植策略

2024数学建模国赛C题代码与数据:快速求解种植策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 3:30:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →