恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Agent智能体开发实战指南:从ReAct原理到LangGraph框架选型

  • 首页
  • 资讯中心
  • /
  • Agent智能体开发实战指南:从ReAct原理到LangGraph框架选型

相关资讯

电力通信一体化管控平台方案拆解:从告警集中监视到资源管理落地 2026/9/29 1:58:30
基于STM32的实验室多参数消防预警系统设计 2026/9/29 1:58:30
乳腺癌分子分型的CNN落地实践:从WSI预处理到PACS集成 2026/9/29 1:58:30

最新资讯

folium AntPath 插件指南:用蚂蚁线动画绘制风场轨迹与动态路径
Atmosphère 1.8.0 新版升级完整指南:19.0.1 固件兼容更新
2012 款 MacBook Pro 装上 macOS 15:OCLP 安装步骤与长期维护
bup 0.28.1 版本解析:归档构建修复、OS X 测试兼容与 bup-python umask 权限
NetAlertX 仓库 Git 工作流指南:单分支直推、共享检出树与 AI 协作安全规则
Edge-TTS 实战教程:一条命令把文本变成 MP3 语音,免费且无需 API 密钥

今日推荐

开源模型端侧落地实战:量化、推理加速与Agent上下文管理
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成
Java采购管理系统实战:从数据库设计到事务一致性

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

Agent智能体开发实战指南:从ReAct原理到LangGraph框架选型

发布时间:2026/9/29 1:58:30
Agent智能体开发实战指南:从ReAct原理到LangGraph框架选型 简介《2025智能体Agent实用指南》系统讲解了构建智能体的最佳实践适合具备一定编程基础、对AI与自动化感兴趣的产品经理、工程师和技术团队成员。文档从智能体的基本概念出发阐释其与传统软件的区别并针对复杂决策、规则维护困难、高度依赖非结构化数据等场景给出是否采用智能体的判断依据。核心部分详细拆解模型、工具与指令三大组件介绍单智能体与多智能体系统的经理式、去中心化等编排模式同时强调以防护栏和人工干预机制保障安全性与可靠性。资源为1个PDF文件约10.82MB目录模块清晰并配有实际案例说明。目前已有701人学习。读者可据此掌握从模型选型、工具集定义到指令编写的完整方法并借鉴从小规模验证起步、逐步扩展至全流程自动化的落地路径有效规避部署中的失败阈值超标、高风险操作等隐患是一份兼顾理论深度与工程实践的实用指南。1. 2025 年的 Agent已经不是当年那个“套壳对话机器人”了你让一个大模型直接去订机票、查库存、写邮件再发出去它连第一步都迈不出去——模型只会生成文本不会调用工具、不会记住上下文之外的消息、更不会在任务做到一半时发现自己走错了路然后掉头重来。2025 年讨论的智能体 Agent就是在模型外面套上一层“能推理、能动手、能核对结果”的执行壳。这份指南式的 pdf 标题之所以值得读是因为它把 Agent 从概念拉到了工程你用它解决的不再是“会不会聊天”而是“能不能稳定地替我完成多步任务”。适合正在做大模型应用开发、准备从 API 调用转向任务编排的工程师也适合想给已有业务加自动化执行层的技术决策者。2. Agent 运行时原理与框架选型先看明白 Agent 是怎么“转圈”的2.1 ReAct 循环Agent 的地基是“推理—行动—观察”三拍子任何 Agent 框架底层几乎都跑着同一个模式ReAct。这个名字由 Reasoning 和 Acting 拼出来思想很直白——模型先针对当前任务“想一步”然后“做一步”调用工具、查数据库、发请求拿到结果后“看一眼”再继续想下一步。整个过程像一个人在黑暗中摸黑走路每走一步用手电照一下地面确认没走偏再迈下一步。我见过不少人一上来就学 LangGraph、CrewAI 的概念结果连最基础的循环都没搞懂调起框架来黑匣子一样。实际上如果你只需要一个简单的 Agent手写 ReAct 循环完全可行大概一百行代码就能跑通。这也是热词里“手写 react agent”被反复搜索的原因——先手写一遍你才知道框架替你做了什么。伪代码层面核心结构是这样# 伪代码ReAct 主循环 state {task: user_task, observation: None} while not done: thought, action, action_input model.decide(state) # 推理下一步做什么 if action finish: return thought.final_answer observation execute_action(action, action_input) # 行动调用真实工具 state[observation] observation # 观察把结果放回上下文逻辑说明decide是模型基于当前状态生成下一步决策通常输出一个结构化 JSON包含思考内容、工具名、参数execute_action是真正的工具运行可能是查数据库、调 API、读文件observation是工具返回结果被追加进上下文成为下一轮决策的依据。所谓 Agent 的“智能”其实全靠这个循环在撑。参数说明里有两个关键点一是max_iterations必须设置上限否则模型会在某个任务上无限流转二是stop_condition当模型输出最终答案时及时跳出循环。我在生产环境里一般把最大迭代次数设在 812 之间既能覆盖大多数多步任务又不会让单次请求的延迟和成本失控。2.2 主流通用 Agent 框架对比LangGraph、CrewAI、MetaGPT、AutoGen 的取舍手写 ReAct 循环能让你理解原理但真要上生产还是得用框架。2025 年开源的 Agent 框架已经很多挑框架的本质是挑“失控时的兜底能力”和“团队的学习成本”。我按自己实际用下来的感受把四个常见框架放在一起对比框架编排模型适合场景学习门槛典型坑LangGraph图状态机节点 边复杂多步任务、需要人审环节中高状态结构定义不严图一复杂就难调试CrewAI角色扮演 任务列表结构化团队的流水线作业低多角色并发时成本成倍上涨别随意铺角色MetaGPTSOP 编码进提示词软件项目模拟、多角色文档流中中文文档少跑内置例子容易超出上下文AutoGen多智能体对话编排研究探索、多智能体互相纠错中对话轮次一旦失控token 消耗很惊人选型我会先说结论LangGraph 现在是主流选择因为它把执行流程画成图每个节点可打断、可保存、可人工介入这在生产环境里太重要了——用户不会接受一个“跑起来就停不下来”的黑盒。CrewAI 适合快速出原型尤其团队里都是提示词工程师、没多少人会写复杂状态机的场景。MetaGPT 更适合做“项目模拟”不是线上任务的干活工具。AutoGen 在多智能体辩论、自我纠错的研究场景里很顺手但真实业务里多智能体之间的消息传递开销不小要谨慎。2.3 从任务形态倒推框架三个问题帮你确定选型我通常不用“哪个框架最强”来思考而是问自己三个问题。第一个问题任务里有没有条件分支和人工审批有的话选 LangGraph图结构天然支持条件边没有的话 CrewAI 更省心。第二个问题多个任务之间到底是“接力”还是“协作”接力用 CrewAI 的任务列表就够了协作则需要 AutoGen 或 LangGraph 的多智能体子节点。第三个问题团队里谁能维护LangGraph 对状态管理的要求比 CrewAI 高一截如果团队只有一个人懂图数据库思维后续维护会变成单点故障。这里还要提一下 MCP。热词里很多人搜“agent mcp”MCP 是模型与工具之间的标准化协议接口相当于给 Agent 的工具箱统一了插头规格。2025 年的新框架基本都内置了 MCP 客户端支持你只需要按协议写工具描述框架自动完成工具注册和调用。我自己现阶段给团队的硬性要求是新接的工具必须走 MCP 协议避免以后每个 Agent 项目单独写一套工具适配器。3. 从 0 到 1 搭建一个可用 Agent以 LangGraph 为例跑通最小系统3.1 最小结构设计能查天气、能算数的 Agent 怎么拆节点很多人学 Agent 开发卡在第一步框架文档全是概念不知道从哪下手。我的建议是先搭建一个不需要数据库、不需要鉴权的 Agent让它干两件事查城市天气、做数学计算。这两件事恰好覆盖工具调用的两种典型形态——外部 API 和本地函数。节点拆成四个输入节点负责接收用户消息并做初步意图判断工具调度节点根据模型决策分发到天气工具或计算器工具工具执行节点真实调用工具并返回结果输出节点汇总答案。中间加一条条件边当模型判断任务已完成直接从工具调度节点跳到输出节点不再继续循环。这个设计里LangGraph 的每个节点本质是一个 Python 函数入参是一个共享的状态字典出参是更新后的状态字典。理解这一点后框架剩下的概念都可以靠文档现查。3.2 关键参数说明温度、迭代上限、工具描述里的玄学先写好配置文件再写主逻辑。这一步很多人会跳过直接塞在代码里等到调参时才后悔药都没得吃。我一般用一个 dataclass 保存所有可调参数dataclass class AgentConfig: model_name: str gpt-4o # 模型按团队预算和效果权衡 temperature: float 0.1 # 低温度减少随机发挥 max_iterations: int 10 # 循环上限防死循环 timeout_seconds: int 30 # 每次工具调用的超时 max_tokens: int 4096 # 单轮生成上限 verbose: bool True # 打印每一步决策便于排查参数说明temperature是 Agent 场景里最容易被忽略的参数。写文案可以开高但 Agent 做决策时一旦温度偏高模型就会给出各种花式工具调用反而无法收敛。生产环境我直接锁 0.1 以下。max_iterations是防呆参数模型在复杂任务中偶尔会陷入“先查 A再查 B再查 A”的循环没有上限的话一个请求能把 token 烧光。verbose在开发期务必开你才能看到每一步的思考内容和工具返回值排查问题全靠它。3.3 代码实现用 LangGraph 写一个能跑的最小 Agent下面这个示例可以直接跑。我用的是 LangGraph 的StateGraph节点就是普通函数边用字典描述。from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated import json, requests # 定义状态结构整个执行过程共享的数据容器 class AgentState(TypedDict): messages: list # 对话历史 next_action: str # 模型决策结果 observation: str # 工具返回结果 # 工具1本地数学计算 def calculator(expression: str) - str: try: return str(eval(expression)) # 生产环境务必限制表达式白名单 except Exception as e: return f计算错误: {e} # 工具2模拟天气查询 def get_weather(city: str) - str: # 开发期用 mock 数据上线换真实 API mock {北京: 晴 25°C, 上海: 小雨 22°C, 广州: 多云 30°C} return mock.get(city, f未找到 {city} 的天气数据) # 节点1调用模型做决策输出结构化动作 def agent_node(state: AgentState) - dict: prompt build_prompt(state[messages]) response llm.invoke(prompt, temperature0.1, max_tokens2048) action json.loads(response.content) # {tool: ..., args: {...}} return {next_action: action} # 节点2执行工具 def tool_node(state: AgentState) - dict: action state[next_action] if action[tool] calculator: result calculator(action[args][expression]) elif action[tool] get_weather: result get_weather(action[args][city]) else: result 未知工具 return {observation: result, messages: state[messages] [result]} graph StateGraph(AgentState) graph.add_node(agent, agent_node) graph.add_node(tools, tool_node) graph.add_edge(agent, tools) # 默认agent 决策后进工具执行 graph.add_conditional_edge(tools, should_continue) # 条件边 graph.set_entry_point(agent) app graph.compile()逻辑说明agent_node把整个消息历史拼成提示词送给大模型要求返回结构化动作tool_node根据动作分发执行工具把结果写回状态。关键在于should_continue这个条件函数——它检查模型决策里的工具名是否为finish是则走END否则回到agent节点继续循环。这里有一处安全提示上面示例里的eval只用于本地演示任何暴露给用户的环境都必须改成表达式解析器或白名单校验否则等于给用户开了一个代码执行后门。3.4 最小系统的验证怎么确定它不是“碰巧跑通”很多人跑通一次就以为完成了但我的习惯是准备一个最小回归集每次改代码后跑一遍。这个回归集不用大四五个用例就够一个必须走工具的测试“上海天气怎么样”、一个必须多轮工具调用的测试“北京和广州的温差是多少”、一个纯文本回答的测试“你好”、一个模型应当主动承认不会的测试“帮我订酒店”。每个用例都要检查三个点是否调用了正确的工具、工具参数是否解析正确、最终答案是否与工具返回值一致。我用一个脚本记录每次回归的通过率和 token 消耗量Token 消耗一旦异常上涨往往是提示词里有重复指令值得第一时间检查。4. Agent 的记忆体系短期、长期、永久记忆的实现与取舍4.1 三类记忆的分工不是所有东西都值得存热词里“agent 记忆”的搜索量很高很多新手以为给 Agent 加记忆就是把所有聊天记录塞进上下文。这是个严重的误解。2025 年大家对 Agent 记忆的共识是分三层短期记忆是当前任务内的对话上下文跟着状态字典走就行长期记忆是跨会话但服务垂直场景的摘要信息比如用户偏好的语言、常去的地点永久记忆则是需要持久化存储的结构化数据比如用户身份、权限、业务数据。这三类记忆的实现成本和风险完全不同。短期记忆零成本但受限于模型上下文窗口。长期记忆需要你做“提取—压缩—存储”的流水线。永久记忆本质是一个数据库设计问题不是模型问题。你要是把永久记忆也用向量库硬存聊天记录等数据量上来之后召回质量会让你怀疑人生。4.2 短期记忆实现状态字典的正确用法在 LangGraph 里短期记忆天然由AgentState承担。但有个注意点所有消息都堆进messages列表的话多轮任务后上下文会爆炸。我一般会在每次循环后做一次压缩——当消息超过一定条数就把前面的内容用 LLM 总结成一段摘要替换掉原文。def compress_messages(messages: list, max_len: int 20) - list: if len(messages) max_len: return messages # 保留最新 4 条完整消息作为近期上下文 recent messages[-4:] # 将更早的消息交给模型压缩成摘要 history_to_compress messages[:-4] summary_prompt f把以下对话压缩成一段不超过 200 字的过程摘要{history_to_compress} summary llm.invoke(summary_prompt).content return [{role: system, content: f早期对话摘要{summary}}] recent逻辑说明这段代码做的事是“保留细节 压缩旧闻”。最近的 4 条消息原样保留因为模型需要精确的近期信息来执行当前步骤更早的历史用一段摘要替代因为那些信息只需要“大概方向”不需要逐字逐句。参数max_len要看模型上下文窗口的大小来设如果是 128k 窗口的模型可以放宽到 40 条如果是 32k 的20 条比较稳妥。这里有个经验压缩动作本身也消耗 token如果任务本身只有三五步根本不需要压缩只有长流程任务比如多轮网页信息检索才值得引入。压缩触发阈值要设高一些别让压缩本身成为开销大头。4.3 长期与永久记忆落地向量库 结构化数据库的分工长期记忆我用向量数据库存的是用户偏好和业务语义信息。每次会话结束时单独跑一个“记忆提取”节点让模型从本轮对话中找出值得记住的事实写入向量库。永久记忆则存关系型表存的是任务状态、审批记录、用户身份这些强结构数据。# 会话结束后的记忆提取与写入 def extract_and_store_memories(session_messages: list, user_id: str): extract_prompt f 从以下对话中提取需要长期记住的事实要求 1. 只提取可能影响后续多次会话的信息如用户偏好、常用工具、业务规则 2. 忽略一次性信息如今天下雨这类时效性内容 3. 输出 JSON 列表每项包含 {{ category: preference|rule|fact, content: 具体内容, importance: 0到1的分数 }} 对话内容{session_messages} result json.loads(llm.invoke(extract_prompt).content) for item in result: if item[importance] 0.6: # 低分信息直接丢弃不浪费存储 vector_store.add( textitem[content], metadata{ user_id: user_id, category: item[category], created_at: time.now() } )逻辑说明这段代码的要点是“先过滤再存储”。如果每轮对话都往向量库里写存储量会失控而且低质量记忆会干扰后续召回。importance阈值 0.6 是我调出来的经验值低于 0.6 的多数是无关紧要的信息写进去只会增加召回噪音。category字段用于后续按类型检索比如只召回偏好类记忆避免业务规则和闲聊混在一起。永久记忆这块常见做法是操作 PostgreSQL 之类的数据库。注意不要把模型上下文和业务数据混在一个地方——模型上下文是易失的数据库才是可信源。我见过一个项目把用户订单信息直接塞在提示词里结果上下文一长模型开始“幻觉”出一些根本不在数据库里的订单。正确的做法是模型需要时通过工具查询数据库拿到的结果以工具返回值的身份进入上下文而不是预先全部堆进去。这样既省 token又避免幻觉数据污染。5. Agent 开发避坑指南5 个会让 Agent 执行崩溃的常见问题与排查5.1 工具描述写得太模糊模型把参数乱填一气现象模型调用天气工具时把城市名传成了“用户所在的城市”工具接口直接报错或者计算器工具收到 “x y” 这种带未知变量的表达式。原因工具描述里没有写清楚每个参数的定义、格式和取值范围。模型在决策时只能根据描述猜测描述越模糊猜得越离谱。这不算模型笨是接口设计没做好。解决每个工具的描述必须包含参数类型、示例值、以及“如果信息不足该怎么做”。我一般会在描述里加一句“如果用户未指定城市请先向用户询问不要假设默认值”。别让模型猜给它明确的路。这块的价值往往比换更强的大模型还明显。5.2 循环进入死胡同Agent 反复调用同一个工具不退出现象日志里模型连续五次调用同一个搜索工具查询的关键词只有细微变化每次返回结果又都差不多Agent 既不前进也不结束。原因大概率是max_iterations没设置或者设置太大模型在“自己觉得不够确定”时就会反复确认。Agent 没有人类那种“差不多得了”的能力你必须替它设止损点。解决三件事同时做——设置迭代上限在提示词里写“如果你发现连续两次工具调用都得到相似结果请基于现有信息给出结论”在代码里加一个简单检测当连续 N 次调用的结果相似度超过阈值时强制走结束边。这三个手段叠加之后死循环概率会降到很低。5.3 记忆污染上一轮任务的数据串到了下一轮任务现象用户先问“北京天气”再问“帮我写个 Python 脚本”Agent 在写脚本时居然记得北京天气并写进了注释里。原因状态字典里的messages在会话结束后没有清理下一个任务复用了同一个状态对象。LangGraph 里如果直接复用编译后的 app 实例默认不会自动清空状态。解决每次新任务必须重新初始化状态。我在代码里会显式调用app.invoke({messages: [user_input]}, config{recursion_limit: 20})传入一个全新的状态字典绝不复用历史状态。需要跨会话保留的信息走记忆系统而不是走状态残留。5.4 模型返回的内容不是合法 JSON工具调度直接崩溃现象Agent 偶尔返回一段带解释文字的动作指令比如先写“好的我来查询天气”再输出 JSON。解析器一读直接报错整个 Agent 执行终止。原因大模型本质上在做文本生成格式稳定性不是 100% 保证的。你要求它输出 JSON它大概率输出 JSON但总有小概率带着解释、Markdown 代码块或尾随标点。解决两步走。第一步在提示词里强调“只输出 JSON不要任何解释文字”第二步在解析代码里做容错——用正则抽取 JSON 片段或者直接调用LLM 修复 JSON的现成封装。生产环境我还会加一个二次校验解析出来的工具名和参数必须匹配已注册工具否则视为非法决策强制终止本轮。5.5 Token 成本失控单次任务消耗突破预算上限现象一个预计 10 步内完成的任务实际跑了 30 多步token 消耗几美元。查看日志发现模型在早期步骤里工具调用失败反复重试。原因工具接口不稳定返回了错误码但 Agent 没有收到明确失败信号于是继续尝试不同参数。越试越深token 消耗指数上涨。解决每个工具执行节点必须做结果校验——工具返回的内容要包裹成结构化格式包含status: success|error字段错误信息要写清楚“是参数错误还是服务不可用”。模型只有在看到status: error时才考虑更换策略否则就重试。比这更重要的一点是给每个任务设置 token 预算上限超了就立刻终止并转人工。成本失控是 Agent 上线后第一个会让你老板心疼的问题。6. 进阶验证从“能跑”到“跑得稳”——Agent 评测与压测的落地做法评测 Agent 和评测模型完全不一样。模型评测看准确率Agent 评测要看“完成任务的成功率”和“过程中是否做出了合理的工具调用”。我的做法是搭一个评测集每个用例包含五要素任务描述、期望工具调用序列、允许的工具集、期望输出格式、可容忍的额外步骤数。评测集建好后每轮代码更新都要跑一遍自动化回归。我用一个脚本记录通过率、平均步骤数、平均 token 消耗并做趋势对比——通过率掉了要看代码改动token 涨了要看是否提示词膨胀。这里的核心指标是“首轮成功率”和“工具误调率”。首轮成功率指 Agent 第一次就按预期路径完成了任务工具误调率指 Agent 调了不该调的工具或传了错误的参数。这两个指标直接反映工程质量比最终答案对不对更有排查价值。压测方面我一般用并发任务打生产环境。重点关注三个指标单任务平均耗时、P95 耗时、失败任务占比。Agent 和普通 API 最大的不同是它会执行多步工具调用任何一个外部接口变慢都会放大整体延迟。我压测时会把每个工具调用单独记录耗时定位瓶颈是在大模型生成这一步还是在某个下游 API。见过不少团队只测端到端延迟出了问题只能靠猜加了工具级监控后一次就能定位。我的一个习惯是始终保留一套纯 mock 工具环境。任何新功能先在 mock 上跑测试集通过后再切真实工具。这套环境能保证测试结果稳定可对比——真实工具会抖动mock 不会。每次上线前跑两遍一遍 mock、一遍真实对比差异就能看出工具环境的稳定性是否达标。Agent 开发的本质就是和不确定性打交道提示词有概率不稳定、工具会超时、模型会错觉。你能做的不是消灭不确定性而是把不确定性控制在一个个可观测的边界里。整个 2025 年我做 Agent 项目最大的教训就是不要相信任何一次“碰巧跑通”只相信回归集里的连续通过记录。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号