AI Agent实战指南:从原理到生产级LangGraph落地

发布时间:2026/10/2 13:11:01
AI Agent实战指南:从原理到生产级LangGraph落地 这两年“AI Agent”这个概念已经快被说烂了但真到做的时候很多人还是不知道从哪儿下手。我一个从大模型API刚开放就折腾智能体的开发者从最初只会调提示词到后面用LangGraph配合多工具做生产级流程中间踩过的坑、试错过的方案足够写一本小册子了。这篇实战指南想把“怎么从零把一个AI Agent做出来”这件事一次性讲清楚。先说清楚文章定位这不是“Agent是什么”的科普文——虽然基础概念我都会覆盖但重点始终在“怎么落地”。我会从大模型的基本能力讲起解释Agent的核心原理然后比较当前主流的模型、框架和工具链选型带大家从零写一个能联网搜索、能算数、能查数据的完整Agent最后再聊聊生产环境才会遇到的坑和排查思路。如果你是个刚开始接触Agent的后端程序员或者已经在准备AI Agent相关面试又或者用LangChain写过Demo但觉得不够工程化这篇文章应该正好对路。1. 搞懂AI Agent它和大模型到底什么关系1.1 AI Agent是“大脑”还是“身体”如果只记一句话那就是大模型解决“怎么答”的问题Agent解决“怎么做”的问题。传统的大模型用法是“你问一句它答一句”模型的能力边界就是一次推理、一次输出。应付聊天、写文案、改代码都行但要说“帮我查一下本周所有未付款订单算出总金额再写一封催款邮件”这种多步骤任务单次问答根本搞不定。Agent做的就是把一个大任务拆成多个小步骤每走一步都可能调用外部工具——搜索、数据库、计算器——然后根据工具返回的结果判断下一步做什么直到任务完成。在这个过程中大模型是提供推理与决策能力的“大脑”Agent框架是驱动大脑不断思考、行动的“手脚和骨架”。打个比方把大模型想成一个很聪明的实习生知识面广但你让他独立完成一个项目他会需要查资料的工具、写文档的软件、确认进度的清单更重要的是他得在每做完一件小事之后自己判断下一步干什么。Agent框架做的就是这件事——给大模型装上手脚同时设计一套“思考-行动-观察”的循环机制让它能够自主完成复杂的多步任务。这也是为什么最近两年Agent成为大模型落地最核心的形态。1.2 Agent的四个核心能力缺一个都不行实际开发中判断一个系统是不是合格的Agent我会看四个能力任务规划、工具调用、记忆管理、自我修正。任务规划是指Agent能把一个模糊的大目标拆成清晰可执行的小步骤。比如“写一份市场分析报告”可以拆成“搜索行业数据-整理数据趋势-列出报告大纲-逐段生成-检查引用来源”。工具调用是Agent在需要信息或操作时能主动选择合适的工具查最新数据得搜索算增长率得调计算器。记忆管理解决“上下文不丢”的问题多轮对话里Agent得记住用户前面说过什么、自己做过哪些决策。自我修正则是在某一步执行失败或结果不对时Agent能根据错误信息调整策略重新尝试。这四个能力不是天然具备的需要在设计和提示词层面刻意构造。比如规划能力依赖模型本身的推理水平也依赖框架里的任务分解机制自我修正依赖工具返回的错误能否被Agent识别并转换成下一步行动指令。把这四个能力的作用边界想清楚一个人基本就理解了一个Agent系统的设计目标。2. 开发前必须想清楚的选型问题2.1 模型选型先别急着上大模型想清楚场景再说很多初学者一上来就问“该用GPT-4还是Claude”我的建议是先想清楚应用场景、数据隐私要求和成本预算再选模型。如果是内部工具数据不能出内网那就本地部署Ollama拉一个Qwen或Llama系列的小参数模型最省事如果是个人项目或Demo用云API——通义千问、Kimi、DeepSeek这些——速度快、效果稳按量付费前期完全不担心资源问题。本地部署我特别推荐Ollama它的优势在于把模型的下载、运行、暴露API都封装好了一条命令就能跑起一个服务。比如拉取千问2.5的7B版本ollama pull qwen2.5:7b ollama serve然后通过HTTP接口就能调用curl http://localhost:11434/api/generate -d {model: qwen2.5:7b, prompt: 你好}对于本地部署7B到14B参数量的模型在普通消费级显卡上就能跑达到“能用”的水平。如果追求更快的推理速度可以考虑4-bit量化版本显存占用差不多减半效果损失在可接受范围内。如果需求更强的指令遵循能力可以用vLLM部署更大的模型或者干脆用LlamaFactory对开源模型做一次微调这属于进阶玩法后面我会专门说到。如果走云API要盯住三个指标上下文长度、价格、单次调用延迟。Agent场景下上下文长度尤其重要每一步都会往对话历史里追加思考过程和工具返回结果token消耗很快上下文窗口太短会频繁触发截断直接影响整体效果。选型维度本地部署云API数据隐私数据不出内网安全性高数据出内网需要注意合规硬件成本需要GPU服务器或工作站按调用量付费前期成本低推理速度取决于显卡稳定性一般一般较快并发能力强适合场景内部工具、数据敏感场景个人项目、Demo、生产级API2.2 框架选型从“自己写循环”到LangGraphAgent的核心是一个循环最简单的实现其实是用普通代码自己写把用户指令、系统提示词、对话历史拼成一个Prompt发给大模型解析返回结果如果返回要调用工具就执行工具把结果拼回去再发给大模型如此循环。我强烈建议初学者先用这种方式写一个最小Demo感受一下Agent循环的底层逻辑这对后面理解任何框架都有巨大帮助。但从工程化角度看自己写循环会有一堆麻烦状态怎么管理、分支怎么处理、并发怎么调度、出错了怎么回溯。这时候需要一个成熟编排框架。目前我用得最多的是LangGraph它把Agent流程建模成一张有向图节点是一段处理逻辑边是节点之间的流转关系State在整个图里共享。你可以很清晰地定义“什么时候调用工具”“工具结果如何影响下一步走哪个分支”流程复杂了也不会乱。市面上还有个性价比不错的方案是Spring AI的Multi-Agent模式如果团队技术栈是Java值得关注。另外AutoGen、CrewAI也各有自己的多Agent协作理念但在我看来LangGraph的状态管理和可观测性更适合做偏生产的系统入门期选它不会走弯路。2.3 工具接入的标准化为什么MCP协议值得关注选完模型和框架第一个实际问题就是Agent怎么调用外部工具最原始的做法是给Agent定义一堆JSON格式的function schema让它按格式输出调用指令再由代码解析执行。这个方案能用但每接一个新外部系统都要重写一遍schema和调用逻辑时间长了代码里到处是各种工具的函数定义和分支处理。MCPModel Context Protocol协议正是为了解决工具接入标准化的问题。它把工具抽象成MCP ServerAgent通过统一协议去发现工具、调用工具、获取结果。打个比方MCP对Agent生态的意义相当于USB接口对电脑外设的意义。鼠标、键盘、U盘只要遵循USB协议插上就能用不需要每换个设备就改一套接口。目前像文件系统、数据库、GitHub这类常用工具社区里已经有现成的MCP Server实现拉起来就能接入。实战中我会用MCP连接文件系统和数据库用普通工具函数包一层搜索或计算这样既保证了工程质量又保留了灵活性。2.4 微调与RAG什么时候需要改变模型本身必须承认很多场景下通用模型的直接效果是不够的。比如Agent需要识别企业内部的合同条款、按特定格式输出财务摘要、理解某个垂直领域的专业名词光靠提示词硬撑效果天花板非常低。这时候有两个常见技术方向微调和RAG检索增强生成。微调是修改模型权重让模型本身更懂某个领域。工具方面我推荐LlamaFactory它对LoRA、QLoRA等主流微调方案做了很好的封装数据集准备好之后几行配置就能开始训练。但微调成本不低需要GPU资源也要维护数据集迭代它更适合那些“模型的表达风格和知识结构本身需要改变”的场景。如果只是需要给Agent补充最新、私有的信息RAG往往是性价比更高的方案——把文档切块、向量化、存库在Agent调用模型之前把相关内容检索回来拼进Prompt不改变模型权重也能获得不错的领域能力。实际操作中我经常把两者结合RAG解决知识时效和私域信息问题微调解决输出格式和交互风格问题。但有一条原则很关键不要一上来就微调。先试提示词和RAG能不能解决解决不了再考虑微调这是成本最低的试错顺序。3. Agent的核心原理从ReAct到状态机3.1 ReAct是理解Agent的钥匙前面提过Agent的核心是循环而这个循环最经典的实现范式就是ReActReason Act。ReAct模式的工作流程是先让模型输出思考过程Thought再决定要调用的动作Action动作执行完会返回观察结果Observation模型再基于观察结果继续思考直到它认为可以给出最终答案Final Answer。拿“帮我算一下这个季度销售额同比增长率”举例Agent的推理轨迹大概是Thought我需要先拿到本季度和上季度的销售额数据。 Actionquery_database(SELECT ... WHERE quarter2025Q2) Observation本季度销售额为120万 Thought还需要上季度的数据。 Actionquery_database(SELECT ... WHERE quarter2025Q1) Observation上季度销售额为100万 Thought增长率是(120-100)/10020% Actioncalculator((120-100)/100) Observation0.2 Thought数据齐了可以回答。 Final Answer本季度销售额同比增长20%。很多人不理解为什么Prompt里非要引导模型输出Thought和Action直接给答案不行吗核心原因是可解释性和可控性。Thought字段相当于模型的“草稿”它把推理过程显式写出来不仅方便调试也能显著提高复杂任务的准确率因为模型的推理路径被结构化约束在了正确轨道上。这也是后来几乎所有Agent框架提示词的基础。3.2 LangGraph把流程画成图理解了ReAct再去看LangGraph会轻松很多。LangGraph的核心抽象只有三个State、Node、Edge。State是Agent整个流程中共享的数据结构通常是一个TypedDict或Pydantic模型里面放着messages、需要维护的中间变量、工具返回结果等。Node是一个函数输入State输出State的增量更新。Edge定义节点之间的流转路径又分普通边和条件边普通边无条件执行下个节点条件边根据State里的某些字段由路由函数决定走哪个分支。这个设计最舒服的地方在于Agent的整个流程变成了一张可绘制的图。你可以在本地调试时把节点执行顺序打印出来可以在某个节点设置观察点也可以在条件边上写清楚“如果工具返回错误就走重试节点否则去汇总节点”。相比在for循环里塞一堆if-else这种显式的图结构可维护性高了很多。3.3 上下文管理是Agent的隐形天花板很多Agent跑着跑着就“变笨了”大概率不是模型有问题而是上下文管理出了问题。每次循环都会把新的思考、动作、观察结果追加进messages列表几十轮下来原始指令早被淹没在长长的历史里模型开始忽略早期的约束。常用的策略有几种滑动窗口只保留最近N轮对话。摘要替换每隔一定轮数让模型把之前的对话总结成摘要替换掉完整历史。向量召回把关键信息存进向量数据库每次从里面召回相关内容拼入上下文。实际项目中我常用滑动窗口加摘要的组合简单可靠。如果项目需要长期记忆那就得上向量数据库BGE-M3这类嵌入模型配合本地向量库效果已经不错了。4. 实战构建一个能联网搜索和计算的Agent4.1 环境准备与依赖安装下面进入实战。我会基于Python 3.11用LangGraph完成一个最小可用Agent它具备两个工具一个是计算器一个是模拟的联网搜索演示用函数模拟实际替换成真正的搜索API即可。先创建虚拟环境并安装依赖python3.11 -m venv .venv source .venv/bin/activate pip install langgraph langchain-core ollama如果后面要用MCPpip install mcp langchain-mcp-adapters我假设你用Ollama跑模型本地默认地址是http://localhost:11434。如果用云API只需要替换掉代码里的模型初始化部分。4.2 定义Agent会用到的工具LangChain中有两种工具定义方式一种是继承BaseTool类一种是用tool装饰器。tool装饰器最方便函数名就是工具名docstring就是工具描述参数类型注解会自动转换成工具的JSON Schema。这里我定义两个工具from langchain_core.tools import tool tool def calculator(expression: str) - str: 计算数学表达式的值例如 (120-100)/100。 # 安全起见这里只允许数字、运算符和括号 allowed_chars set(0123456789-*/%.() ) if not set(expression).issubset(allowed_chars): return Error: invalid characters try: result eval(expression) return f计算结果: {result} except Exception as e: return f计算错误: {e} tool def web_search(query: str) - str: 联网搜索指定关键词返回搜索结果摘要。 # 演示函数实际项目替换为真正的搜索API fake_results { 2025年AI Agent趋势: AI Agent在2025年进入生产落地阶段多Agent协作与MCP协议成为主流趋势。, 大模型微调: 微调是让大模型适配特定领域任务的重要手段常用工具包括LlamaFactory。, } return fake_results.get(query, f没有找到关于{query}的搜索结果请尝试其他关键词。)两个函数都用中文写了docstring模型理解工具作用时会更准确。很多初学者习惯用英文写没问题但如果你常用中文提问中文工具描述的效果往往更好因为工具描述和用户语言更一致。4.3 用LangGraph搭出核心循环接下来是Agent的核心部分。我会定义状态类、绑定工具的模型、两个核心节点一个负责调用模型一个负责执行工具最后拼成一张图。from typing import TypedDict from langgraph.graph import StateGraph, END from langchain_ollama import ChatOllama from langchain_core.messages import HumanMessage, ToolMessage class AgentState(TypedDict): messages: list tools [calculator, web_search] model ChatOllama(modelqwen2.5:7b, temperature0.2) model_with_tools model.bind_tools(tools) def agent_node(state: AgentState): response model_with_tools.invoke(state[messages]) return {messages: [response]} def tool_node(state: AgentState): last_message state[messages][-1] tool_messages [] for call in last_message.tool_calls: tool {t.name: t for t in tools}[call[name]] result tool.invoke(call[args]) tool_messages.append(ToolMessage(contentresult, tool_call_idcall[id])) return {messages: tool_messages} graph StateGraph(AgentState) graph.add_node(agent, agent_node) graph.add_node(tool, tool_node) graph.set_entry_point(agent) graph.add_conditional_edges( agent, lambda state: tool if state[messages][-1].tool_calls else END, {tool: tool, END: END} ) graph.add_edge(tool, agent) app graph.compile()这段代码的逻辑不复杂agent节点把当前messages丢给绑定了工具的模型让模型决定是输出普通文本还是申请调用工具。如果返回了tool_calls就进入tool节点执行对应工具把执行结果以ToolMessage形式追加回来再回到agent节点循环。如果模型认为该结束了就走到END。使用的时候result app.invoke({messages: [HumanMessage(content帮我查一下2025年AI Agent的趋势然后计算128*32的结果)]}) for msg in result[messages]: print(msg.type, msg.content)模型会先判断需要搜索调用web_search拿到摘要再判断需要计算调用calculator算出4096最后综合两部分信息给出完整回答。4.4 参数调节与一轮效果实测跑起来之后有几个关键参数会影响最终效果。temperature决定模型输出的随机性。Agent场景下我一般调到0到0.2之间因为Agent需要确定性强的决策而不是天马行空的创意。这个参数太高模型偶尔会脑补工具返回结果非常危险。最大迭代次数recursion_limit必须设置。默认情况下LangGraph允许滚很多轮但生产环境里一个失控的循环会不断消耗token。我一般设置为10到20步超了就报错或让模型走终止分支。我实测一轮的效果大概是模型先输出Thought说要搜索然后调用web_search拿到摘要再进入计算最后给出分段回答。整个链路清晰耗时在几秒到十几秒之间具体看本地模型的推理速度。如果你发现模型绕来绕去不结束优先检查两件事一是工具描述是否清晰二是temperature是否过高。4.5 从Demo到服务封装API的细节写好Agent后下一步就是变成服务让外部业务系统能调用。最简单的方式是用FastAPI包一层from fastapi import FastAPI from pydantic import BaseModel from langchain_core.messages import HumanMessage app FastAPI() class Query(BaseModel): message: str thread_id: str app.post(/agent) async def run_agent(query: Query): config {configurable: {thread_id: query.thread_id}} result app.invoke( {messages: [HumanMessage(contentquery.message)]}, configconfig ) return {reply: result[messages][-1].content}这里有一个必须注意的点LangGraph天然支持多轮会话的断点续跑只要传入thread_id它会将历史上文保存在内存或外部持久化机制里。这意味着你的Agent能像一个真正的“对话式员工”一样连续处理业务而不是每轮都从头开始。生产环境建议把检查点checkpoint持久化到数据库比如PostgreSQL或Redis这样服务重启也能恢复对话状态。另一个容易被忽视的问题是并发控制。本地模型服务往往不具备高并发能力同一时间多个用户调用Agent模型服务很容易被打满。常见做法是接一个队列串行处理或者通过异步IO让模型服务内部排队。这一步早期Demo无所谓但一旦上生产不加并发控制大概率会翻车。5. 进阶技巧让Agent从“能跑”到“好用”5.1 系统提示词决定Agent的“性格”Agent的系统提示词和普通应用有很大不同。普通应用只要告知身份和回答风格Agent的System Prompt还得额外包含任务拆解规则、工具使用优先级、异常处理策略、输出格式要求。我自己的模板通常长这样你是一个任务执行型AI助手。请严格遵循以下原则 1. 面对复杂任务先拆解成步骤再依次执行 2. 如果需要外部信息优先调用工具禁止自己编造数据 3. 工具返回结果后根据结果判断是否需要进一步调用工具 4. 所有计算结果必须通过计算器工具验证 5. 如果工具调用失败说明原因并给出替代方案 6. 最终回答要引用工具获取的数据并给出简洁结论。这套规则看着朴素但能显著减少模型“自己编数据”和“一步到位”的问题。提示词不是越复杂越好关键是把边界和动作约束写清楚。5.2 多Agent协作架构单个Agent处理复杂任务的能力有限。比如“写市场分析报告”这种任务让一个Agent同时负责数据收集、数据分析、图表生成、文案输出Prompt会变得很长模型在多个职责之间切换也容易抓不住重点。更好的做法是拆成多个专职Agent一个主管Agent负责任务分发和结果汇总下面挂搜索Agent、分析Agent、写作Agent。用LangGraph实现多Agent的方式可以想象成在单Agent图上增加更多节点每个节点内部又是一个完整的小Agent流程。节点之间通过State共享信息主管节点根据子任务完成情况决定进入下一个子Agent还是汇总输出。Spring AI的Multi-Agent模式底层也是类似思想只是实现语言和技术栈不同。多Agent架构的难点在于通信成本和错误传播。子Agent的输出需要结构化否则主管Agent无法解析一个子Agent出错错误信息要在State中透传否则主管发现不了。我在实践中会把每个子Agent的输出统一包一层JSON结构包含status、data、error三个字段这样主管节点解析起来非常省心。5.3 让Agent具备长期记忆前面提到的上下文管理解决的是“这条对话里别丢信息”长期记忆解决的是“下次对话还能记住”。比较实用的做法是把用户身份、历史偏好、项目关键信息结构化存储下来在每次对话开始时从记忆库中召回相关部分拼入上下文。具体实现时用嵌入模型比如BGE-M3把用户历史记录向量化存到向量数据库如Chroma、Milvus新对话开始时做相似度检索把Top K条相关内容塞回Prompt。这套方案实现成本不高效果提升却非常明显特别是做客服类Agent、文档助手类Agent时用户体验完全不是一个层级。5.4 评估Agent没有评测就没有优化Agent系统的效果优化和传统软件工程不太一样它没有精确的“单元测试断言”。所以我很早就强调从第一天就要建立“评估基线”准备20到50个典型测试用例记录每个用例的输入、预期步骤、预期答案。每改一次模型、每次改提示词都跑一遍这些用例对比前后的成功率。线上运行的Agent也别忘了做日志追踪。LangSmith可以对LangGraph执行过程做可视化追踪每个节点的输入输出、token消耗、耗时都看得清。没有这类工具至少也要在代码里把关键节点的日志结构化输出方便事后排查。不少团队在Agent上线后根本不知道它哪一步出错了问题往往就出在日志不规范这一步。6. 常见问题与避坑指南6.1 模型“幻觉”工具调用结果怎么办最让我头疼的问题之一模型在工具还没返回结果的时候就自己编了一个结果写进最终答案。排查方法很简单把Agent的完整推理过程打印出来看Thought、Action、Observation三段顺序是否完整如果发现Observation缺失或和Action对不上基本就是Prompt约束不够。解决办法有几条在System Prompt里明确写“没有调用工具并拿到返回结果之前绝对不能给出涉及外部信息的结论”把工具结果结构做强约束让模型每一步都必须基于Observation的内容实在不行就降低temperature这招能挡住相当一部分幻觉。6.2 工具调用格式反复报错的排查初用LangChain / LangGraph时工具调用的JSON格式错误很常见比如参数类型不对、字段名拼写错误。大部分原因是模型的指令遵循能力不够或者工具的JSON Schema太复杂。建议把工具参数控制在3个以内参数类型以string和number为主嵌套对象能不用就不用。另外工具命名时尽量用动词开头的简洁名称比如search_news、query_database、send_email不要用“工具1”“get_data_from_system_a”这种模糊名字否则模型选工具的准确率会明显下降。6.3 性能、成本与稳定性的平衡本地部署的优势是隐私和可控代价是推理速度和显存限制。如果Agent响应太慢先别急着换更好的卡优先检查是不是每一步都在重复加载模型或者有没有办法把多个独立的工具调用并行执行。把多轮循环里可并行的工具并行化往往能省一半时间。如果用云API成本控制是一个真实痛点。我常用的策略是先用便宜的小模型做意图识别和任务分配只有需要深度推理的步骤才切换到效果更强的大模型同时把重复出现的请求做缓存命中缓存就不再调API。这些手段组合起来成本能下降30%以上用户体感几乎没有变化。常见问题症状优先排查方向模型幻觉工具未返回就编造结果检查Thought/Action/Observation顺序工具调用格式错JSON schema解析失败精简参数、统一命名上下文失控Agent越来越“笨”滑动窗口、摘要替换、向量召回响应过慢单步推理耗时太长检查模型加载、并行化独立工具调用成本飙升单次任务token消耗过大模型分级、请求缓存7. 写在最后几点个人体会做Agent和做普通后端服务心态上有个很大的不同普通服务出了问题逻辑是确定的Agent出了问题很多时候没有一个标准答案只能靠观察推理轨迹去猜模型“哪一步想歪了”。所以我特别建议大家养成把Agent每一步的输入输出完整记录下来的习惯包括模型的思考、工具返回、最终答案这些日志是你优化效果最主要的原材料。最后再分享一个小技巧入门阶段不要把目标定得太宏大。先搭一个只有两三个工具的Agent跑通ReAct循环再逐步增加复杂度和工具数量。我见过太多人一上来就想搞多Agent协作、记忆系统、复杂状态机结果卡在环境配置和工具调用格式上大半天反而失去了耐心。AI Agent的学习曲线本身不算陡真正考验人的是能不能在一堆不确定的交互里保持冷静一点点把问题拆开看。希望这篇指南能帮你少走一些弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询