ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI Agent技术演进与工程落地:从ReAct到LangGraph的架构实践

AI Agent技术演进与工程落地:从ReAct到LangGraph的架构实践 这两年聊AI Agent的人一下子多了起来。不是因为它又变成了什么新概念而是因为大模型真的能“用工具干活”了。AI Agent从一个学术圈的术语慢慢变成了业务方追着问、工程师能上手搭的东西。我大概从2023年就开始折腾Agent原型做过几个能落地的项目也踩过不少坑。这篇文章不打算给你画一张没人看得懂的概念图而是从演进脉络讲起把主流架构、框架选型、并发部署这些工程问题一次说清楚顺便聊聊个人使用AI Agent做自动化交易这类高风险场景为什么我不建议碰。无论你是刚入门的开发者还是已经写了几个Agent脚本但总觉得差点意思这篇应该都能给你一些参考。1. AI Agent是什么从工具调用到自主决策的演进过程1.1 第一阶段还没有大模型时的“智能体”很多人以为Agent是ChatGPT之后才有的东西其实不是。早在没有大模型的年代我们就在做“智能体”了只不过它叫规则引擎、状态机或者RPA。传统RPA是典型的规则驱动Agent你告诉它先打开网页再点击按钮再填表单每一步都写死。它稳定、确定但也极其脆弱。只要页面布局改了一个按钮整个流程直接崩溃。当时我也做过类似的东西用来抓取内部系统的数据并自动填报表。最大的感受是规则型Agent适合“流程完全固定”的场景但它没有理解能力更谈不上自主决策。复杂一点的需求比如“如果今天出货量异常就查一下最近三天的趋势再决定是否告警”用规则写出来会非常痛苦因为所有分支都要人工枚举。1.2 第二阶段大模型驱动的“工具调用式Agent”大模型出现后Agent的形态彻底变了。最关键的转折是Function Calling能力的成熟。早期大家靠提示词让模型输出JSON然后解析JSON去调用工具不仅不稳定还经常格式错误。后来模型原生支持函数调用模型可以直接输出“我要调用get_weather参数是北京”再由代码去执行这个函数把结果回传给模型模型再继续推理。这就是经典的ReAct循环Thought思考要做什么→ Action调用某个工具→ Observation观察返回结果→ 循环直到得到最终答案。这种架构下Agent不再需要人把每一步都写死。你只需要告诉它有哪些工具可用它自己决定用哪个、按什么顺序用。我做过的第一个正式Agent就是“工单自动处理助手”给模型提供了查工单、查反馈、修改状态、发送通知四个工具它能根据用户语义自己选择工具组合。效果比之前的规则引擎好了一个数量级但很快也暴露了问题一旦任务复杂单轮决策的循环会变得很长上下文越来越臃肿模型有时会翻来覆去调用同一个工具陷入死循环。1.3 第三阶段从单次决策到长时间任务如果你把一个Agent只当成“会调用工具的聊天机器人”它撑不过真正的业务需求。真实业务需要的是拆解任务、按计划执行、出错后自我纠正、跨多轮保持记忆。于是Agent演进到了第三阶段——规划型Agent和多智能体协作。这阶段出现了几个标志性方向。一是规划-执行-反思Plan-Execute-Reflect循环Agent先拆解出子任务列表逐个执行每执行完一轮就检查结果是否满足目标不满足就重新规划或修复错误。二是以LangGraph为代表的图式编排把Agent运行过程定义成一张图节点是“工具调用”“模型推理”“人工审批”边是“下一步执行哪个节点”状态被持久化到外部存储随时可以暂停和恢复。三是多智能体协作不再是单个模型干所有事而是让一个“主管”负责拆活儿多个“员工”Agent分别处理不同任务最后统一汇总。1.4 为什么说当前是“Agent可以落地”的时期我一直觉得“Agent元年”这类说法夸张但这几年的变化确实踩中了几个关键点模型指令遵循能力大幅提升Function Calling不再是摆设上下文窗口变大能容纳更多历史与工具结果推理成本下降跑一个多步Agent任务不再肉疼框架生态趋于成熟LangGraph、Spring AI、低代码平台都在解决工程化问题。正是这四件事叠在一起AI Agent才从“演示视频里的玩具”变成“可以下地干活的工具”。2. 主流Agent架构演进从单轮到图从单体到编排2.1 ReAct经典结构拆解与局限ReAct目前仍然是很多Agent的基础理解它很重要。简化后的逻辑大致是这样def run_agent(query): messages [{role: user, content: query}] while True: response llm.call(messages, toolstools) if response.tool_calls: messages.append(response) for tool_call in response.tool_calls: result execute_tool(tool_call) messages.append({ role: tool, tool_call_id: tool_call.id, content: result }) else: return response.content从代码就能看出来ReAct是个直线循环每一轮都是“模型推理→调用工具→返回结果”。好处是思路简单适合任务路径比较短的场景比如“帮我查一下订单状态”“计算一下这个表达式的值”。但它的局限也很明显不支持并行调用多个工具任务需要拆解成子任务时没有自然的表达方式没有记忆管理所有历史message全都堆在一起退出条件靠模型自己判断经常出现“工具调用永远不结束”的问题。2.2 状态机与图LangGraph带来的工程化思维我真正觉得Agent工程化有突破是从用LangGraph开始的。LangGraph的核心思想是把Agent流程抽象成一张有向图每个节点是一个动作调用模型、调用工具、执行条件判断每条边定义流转关系全局有一个State对象贯穿整张图。相比ReAct图式架构有几个显著优势。第一是可控性。你可以显式地定义“什么时候退出”“什么时候重新规划”不需要完全指望模型自觉。第二是支持分支和循环。比如“如果检索结果置信度低就重新生成一次查询再检索”这在ReAct里很难优雅表达但在LangGraph里加一条条件边就行。第三是可恢复性。通过Checkpointer机制Agent每一步的状态都可以持久化到Redis或PostgreSQL进程崩溃后可以从最近一个节点恢复而不是从头再来。这就像给Agent加了“断点续传”生产环境非常需要。2.3 多智能体协作与“老板-员工”模式业务复杂到一定程度单个Agent的提示词会变得特别长、特别难维护。这时候更适合把一个大Agent拆成多个小Agent各自有自己的职责、工具和提示词。常见的架构是Supervisor模式一个主管Agent接收用户请求分析需要哪些专业技能把任务分配给对应的Worker AgentWorker执行完把结果返回主管再决定是继续追问还是直接回答用户。举个例子用户问“帮我写一个Python脚本来批量重命名文件并测试它是否可用”。主管可以拆成“写代码Agent”和“代码执行Agent”两个任务。写代码Agent只负责生成脚本代码执行Agent负责在一个安全的容器里运行并返回输出。这样提示词之间不会互相污染每个Agent都更专注也更容易排查问题。代价是模型调用次数变多、延迟变高所以能用单Agent解决的问题不要强行上多智能体。2.4 规划-执行-反思闭环规划-执行-反思可以看作在ReAct外面套了一层更大的循环。流程是收到目标后先生成一个分步计划执行第一步检查这一步的结果是否符合预期如果不符合尝试修复或重新规划全部执行完后对整体结果做一次反思看有没有遗漏。这个模式特别适合“研究型”任务比如“整理竞品信息并生成对比报告”。我在项目中通常会让Agent把所有计划和反思结果都记录到同一个State里方便追踪整个决策过程。没用这个闭环之前Agent经常是“做着做着就忘了最初目标”尤其是长任务。加了反思和计划校验之后完成率明显提升而且每一步都知道在干什么可解释性也好了很多。2.5 基于FastAPI LangChain LangGraph的最小可运行Agent说了这么多还是给一个能跑的最小例子。这里用FastAPI暴露HTTP接口LangChain负责统一模型调用LangGraph负责编排状态。为了演示我定义一个计算器工具和一个模拟查库存工具Agent根据用户问题决定调用哪个。import json from typing import TypedDict, Literal from fastapi import FastAPI from pydantic import BaseModel from langchain_core.messages import HumanMessage, AIMessage from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, START, END from langgraph.prebuilt import ToolNode class AgentState(TypedDict): messages: list final_answer: str def calculate(expression: str) - str: # 仅用于演示生产环境请使用表达式解析库不要直接用 eval return str(eval(expression)) def query_stock(product_id: str) - str: # 这里替换成真实库存接口 data {A001: 100, B002: 0} return json.dumps({product_id: product_id, stock: data.get(product_id, -1)}) tools [calculate, query_stock] llm ChatOpenAI(modelgpt-4o-mini, temperature0) llm_with_tools llm.bind_tools(tools) def agent_node(state: AgentState) - AgentState: response llm_with_tools.invoke(state[messages]) return {messages: [response]} def should_continue(state: AgentState) - Literal[tools, finish]: last_message state[messages][-1] if getattr(last_message, tool_calls, None): return tools return finish def finish_node(state: AgentState) - AgentState: return {final_answer: state[messages][-1].content} graph StateGraph(AgentState) graph.add_node(agent, agent_node) graph.add_node(tools, ToolNode(tools)) graph.add_node(finish, finish_node) graph.add_edge(START, agent) graph.add_conditional_edges(agent, should_continue, {tools: tools, finish: finish}) graph.add_edge(tools, agent) graph.add_edge(finish, END) app_agent graph.compile() app FastAPI() class ChatRequest(BaseModel): message: str app.post(/agent) def chat(req: ChatRequest): result app_agent.invoke({messages: [HumanMessage(contentreq.message)]}) return {answer: result[final_answer]}这个例子很小但已经包含了ReAct循环的核心要素模型节点、工具节点、条件边。你把它跑起来输入“A001库存还有多少”Agent会先调用query_stock再根据结果给出回答。真实项目里只需要扩展更丰富的工具状态和校验逻辑。3. 框架与语言选型LangChain、Spring AI、Rust 凭什么各自站位3.1 Python系LangChain/LangGraph FastAPIPython系目前是Agent开发的主流选择核心原因是生态。LangChain把几十家模型提供方、向量数据库、工具插件统一成一套接口省去了大量适配工作。LangGraph则把编排能力补上让复杂流程有了工程化表达。FastAPI在这里的角色是API层它原生支持异步能很好匹配Agent这种“单次请求耗时长但本身是IO密集”的场景。如果你只是自己搭个DemoPython永远是最快的路径。我建议组合是FastAPI做Web层LangGraph做Agent引擎Redis做会话存储PostgreSQL做业务数据和状态Checkpointer。这套组合从个人项目到小团队产品都能覆盖。3.2 Java系Spring AI很多企业后端的存量技术栈是Java这时候引入Spring AI的吸引力就很大。Spring AI是Spring生态在AI领域的扩展提供类似LangChain的模型抽象、Prompt模板、工具调用和向量存储支持。最大的优势是能直接复用Spring Boot的依赖注入、事务管理、监控体系和已有的微服务治理能力。如果你的团队已经非常熟悉Spring不建议强行上一个Python微服务。维护两套技术栈的成本远高于框架本身带来的效率提升。Spring AI目前也在快速迭代常见模型接口都支持做企业级知识库问答或者内网Agent服务完全够用。3.3 Rust系性能与轻量部署关于“基于Rust语言AI Agent”我的看法是适合特定场景不适合当通用起点。Rust的好处是编译成单个二进制部署极度轻量内存占用低启动速度快范并行和多线程能力强。对于高并发、低延迟的Agent网关或者跑在边缘设备上的轻量AgentRust有明显的资源效率优势。但Rust生态里Agent框架还比较早期很多工具链需要自己封装。比如你想让Rust Agent调用某个云厂商的模型API可能得自己处理签名、流式解析、重试策略在Python里这些都有现成的库。我的建议是如果你追求极致性能可以用Rust写Agent的执行引擎把模型调用、工具调用抽象成内部接口但上层业务逻辑仍然可以用Python快速验证。没有必要为了“用Rust”而把开发效率牺牲掉。3.4 低代码平台扣子这类可视化Agent搭建这两年低代码Agent平台也火起来了比如扣子Coze这类可视化智能体应用搭建工具。它们内置了模型管理、知识库、插件、工作流编排业务人员拖拽节点就能搭出一个能对话的Agent还能直接发布到聊天软件、公众号等渠道。低代码平台的定位是让不会写代码的人也能快速搞出Agent应用适合做客服机器人、内容生成、内部流程自动化这类标准场景。但它有几个明显的坎复杂业务逻辑仍然需要写代码私有化部署和数据安全会受到平台限制可观测性和性能调优空间也比较小。我的建议是把它当“快速原型工具”用真正要上线核心业务还是回到代码方案。下面用一张表总结我的选型参考维度PythonLangChain/LangGraphJavaSpring AIRust低代码平台上手速度快中慢最快生态丰富度非常丰富中等较少依赖平台部署运维需要Python环境与依赖管理依赖JVM单二进制极简平台托管适合场景快速迭代、复杂Agent、AI原生产品企业现有Java体系高并发网关、边缘部署业务人员、标准场景主要风险依赖多、版本迭代快框架年轻、踩坑需自己探索框架少、开发成本高灵活性不足、绑定平台4. 落地时最头疼的问题并发、状态与部署4.1 Agent项目怎么扛并发“AI Agent怎么扛并发”是热词说明大家都被坑过。Agent接口和传统接口的最大差别在于一次请求可能要调好几次大模型每次耗时几秒甚至几十秒。如果按照传统同步思路写很容易把进程线程全占满。要扛并发第一层是语言框架本身。FastAPI的异步机制能让你在等待模型响应时释放事件循环去处理其他请求。所以如果你用Python别用Flask写同步Agent接口直接用FastAPI AsyncClient。LangChain里也有异步版本比如AsyncChatOpenAI、arun等记得用起来。第二层是任务队列。当请求量上来以后不能让HTTP请求一直占着连接等Agent慢慢跑。更稳的做法是接收到请求后立刻返回一个task_id把Agent任务丢给Celery或者RQ后台执行前端轮询任务状态。如果产品需要流式打字机效果就改用SSEServer-Sent Events推送这样既能实时看到输出又不需要占着一个连接很久。第三层是外部依赖的保护。大模型接口都有Rate Limit并发一高429报错就来了。需要自己做限流和重试比如用令牌桶对每个API Key限速对超时和连接错误做指数退避重试。同时给Agent设置单次调用的最大步数防止某个坏任务无限循环烧光你的额度。4.2 有状态Agent与会话管理Agent天然是有状态的。用户说了“帮我查一下昨天报表”下一句“再分析一下异常”你必须在上一轮上下文里进行分析。如果直接把状态放在Python进程的全局变量里一旦部署了多个副本请求被负载均衡到不同实例状态就丢了或者串了。标准做法是把会话状态放到外部存储Redis里。每条消息追加到一个List用session_id作为Key每次Agent执行前把最近N轮消息加载出来执行后把新消息写回去。N的选择要兼顾上下文窗口和成本。如果Agent本身是LangGraph流程还可以直接用它的Checkpointer机制把整个图执行状态持久化到Redis或PostgreSQL这样即使Agent执行到一半进程重启也能从最近的断点继续。我在生产环境遇到过最典型的问题两个用户同时触发同一个Agent但因为把thread_id写死成了“default”结果状态全混在一起。后来强制要求每个请求都携带会话ID并把会话ID映射到LangGraph的thread_id才彻底解决。4.3 部署方案从单机到容器集群如果你只是自用或者小范围试用最省事的方案是用Docker Compose起三个容器一个是FastAPI的Agent服务一个是Redis一个是PostgreSQLAgent调用云端模型API。这套方案不需要GPU只需要一台2核4G的云服务器就能跑。如果模型要部署在自己机房那就需要单独把模型推理服务拆出来。现在主流做法是用vLLM、Triton这类推理引擎把模型封装成一个兼容OpenAI接口的服务Agent服务通过HTTP调用。推理服务单独走GPU机器赶上半边流量抖动也不互相影响。模型推理和Agent逻辑的分离是生产环境必须做的架构决策。再往上就是Kubernetes了。Agent服务是无状态的可以随便水平扩容Redis和PostgreSQL用托管实例模型推理服务用K8s的GPU节点池承载根据GPU利用率做HPA。这个组合下来并发能力基本取决于模型接口或推理服务的吞吐量而不是Agent应用本身。4.4 几个真实场景怎么做“让小红书自动发消息”这类需求本质是把Agent接到外部平台。技术上完全可行Agent生成文案、匹配图片、生成图文内容然后调用平台开放的内容发布接口完成发布。但这类工具一定要做好审核和风控。内容发布涉及品牌形象和平台规则全自动裸奔很容易翻车。合理的设计是Agent先把内容和发布时间草拟好人工在后台点确认再发布。这也是很多“半自动”AI运营工具的底层逻辑。“用AI Agent开发Django”也很常见。我的实践是把Agent当成一个非常懂Django的结对编程助手让它生成模型代码、写序列化器、补测试用例然后人负责审查和集成。如果你让Agent完全自主去写一个完整项目它能写出来但代码质量和结构一致性很难保证。不过配合自动化测试这个流程能大大提升开发效率。“个人使用AI Agent做期货交易”这个问题我的答案很明确不建议。自动化交易本身涉及策略风险、流动性风险、系统故障风险再加上LLM生成的决策具有随机性和滞后性轻则亏钱重则爆仓。更不用说个人部署交易系统的合规问题。Agent用来做行情数据的汇总分析、辅助生成复盘报告这没问题把真金白银的决策完全交给一个黑箱模型我个人认为不够可靠。5. 常见问题与排查实录5.1 LLM输出不稳定JSON解析失败这是刚开始用LangChain时最容易遇到的。让模型以JSON格式返回结果它给你加了一段解释文字或者JSON里多了一个逗号。早期我用正则去修JSON效果很差。后来换了两个方案一是优先用Function Calling让模型输出结构化工具参数而不是自由文本二是用LangChain的PydanticOutputParser直接把输出强约束成Pydantic模型。如果你想少踩坑从第一天就绑定工具调用不要裸调JSON。5.2 工具调用无限循环某个Agent上线后日志里看到它连续调用同一个搜索工具十几次成本飙升。排查下来是模型根据工具结果发现“仍然没有找到答案”于是反复重试。解决办法是设置两层限制第一层是图层面通过最大迭代次数参数强制终止第二层是业务层面当某一步执行结果不满意时可以进入“反思”节点而不是直接再调一遍工具。另外给工具调用加上显著性判断如果连续三次结果一样就主动让Agent停止并请求用户补充信息。5.3 上下文爆炸把整个对话历史、多份长文档结果全部塞给模型很快就超出上下文窗口。我现在的经验是三层处理第一只保留最近几轮消息更早的做摘要第二大文档能够用RAG先检索出来不要全量拼接第三Agent每一步的结果在写入State前先做裁剪只保留关键信息。上下文不是越长越好大部分任务给2-3千字的有效上下文足够了关键指令反而容易被淹没。5.4 并发了但状态串了这个现象在本地跑demo的时候根本遇不到一上生产就暴露。原因基本只有一个把用户会话状态放在了全局变量或者类内部可变属性里。并发请求一多不同用户的消息互相覆盖。排查方式是在日志里把thread_id和session_id打出来对比是不是有交叉。修复方式就是前面说的状态外置到Redis或数据库每个线程只通过ID读取属于自己的State。5.5 问题排查速查表现象可能原因解决方案模型返回格式错乱没有约束输出结构改用Function Calling或PydanticOutputParserAgent一直重复调用工具缺少终止条件或反思机制设置最大步数、连续结果去重、增加人工确认请求超时LLM调用耗时太长使用异步客户端、任务队列、SSE流式返回线程/进程被打满阻塞式调用模型FastAPI异步方式或者引入Celery后台任务多实例状态错乱状态存储在进程内存迁移到Redis用thread_id隔离模型接口返回429并发超过限额本地限流、退避重试、动态负载均衡6. 学习路线从零到能上生产的Agent工程师6.1 先搞定Prompt、Function Calling、RAG不管用什么框架Agent工程师的地基是三样提示词工程、函数调用、检索增强生成。提示词决定模型能不能正确理解任务函数调用决定它能不能操作外部系统RAG决定它能不能利用私有知识。这三样不需要分开学最好做一个小项目一起练。比如给自己写一个“本地文档问答待办事项管理”的Agent既要检索文档又要调用待办工具还要能多轮对话。6.2 用LangGraph搭一个带记忆的客服Agent学框架的最好方式不是看文档而是照着业务场景做。我建议第一次用LangGraph就做一个带记忆的客服Agent。功能要求能多轮对话能查订单状态能修改订单备注所有状态能在Redis里保存。这个项目几乎涵盖Agent开发的所有基础知识点定义State、写节点、绑定工具、条件边、Checkpointer、会话隔离。做完它你对Agent的理解会提升一个台阶。6.3 工程化能力服务封装、可观测性、成本控制框架只是第一步能不能上线看工程能力。你需要学会用FastAPI把Agent包装成规范的OpenAPI接口用SSE实现流式输出用OpenTelemetry或LangSmith记录每一次模型调用的输入输出和耗时为每次请求统计tokens消耗并折算成本给不同用户配置不同的模型和缓存策略。这些都是文档里不会教但生产环境一定会遇到的。6.4 多做以“干活”为目标的真实项目最后建议你把手上的重复性工作列一个清单挑几个适合自动化的做成Agent。比如自动整理日报、自动分类工单、自动生成周报素材、自动做代码审查。我自己的体会是Agent的能力在真实业务里才能被逼出来。你做了十个Demo不如把一个真实流程跑通并稳定运行一个月。至于“让Agent炒股炒期货”如果你不是专业量化团队我更推荐用Agent做市场情绪分析和复盘把决策留给人。最后分享一个我自己的体会。AI Agent演进到现阶段真正沉淀下来的不是某个具体框架而是“把大模型当作推理引擎、把外部系统当作手脚”这套思想。框架会迭代模型会换但状态图、记忆管理、工具编排、可观测性这些工程问题无论过多久都是核心。不要一直在Demo里打转多接几个真实API多部署几次遇到并发和状态问题自然就熟练了。就我个人的实战经验来说从单轮调用到可恢复的状态图这个转变带来的工程收益是最大的。希望这篇文章里的思路和避坑记录能帮你更快走过这个阶段。
返回列表