
LangChain、LangGraph、MCP、Agent 这四个词放到一起基本就是 2026 年企业级 LLM 应用的完整技术栈。这篇文章把这条链路拆开讲每个组件到底解决什么问题、它们之间怎么配合、从环境准备到接口交付怎么落地。标题里说“吊打付费”本质上是因为这套组合已经把过去需要自研的编排、记忆、工具调用、服务化能力全部标准化了企业不需要再从零造轮子更不用为单点 Demo 付高价。我会按照“先给结论再给步骤”的方式展开。你能看到完整的概念边界、可复制的部署命令、LangGraph 的条件路由与子图写法、MCP 工具接入方式、FastAPI 服务封装和批量任务队列设计。如果你想在项目里真正落地 Agent而不只是跑通一个 chatbot这篇内容可以直接作为起步参考。1. 核心能力速览先花 30 秒确认这套技术栈到底覆盖了什么。下面的表格基于当前开源项目的常规能力整理具体版本差异以官方文档为准。能力项说明技术组成LangChain、LangGraph、MCP、Agent核心定位企业级 LLM 应用编排、工具调用、状态流转、服务化交付LangChain模型封装、提示词管理、检索增强、文档加载、输出解析LangGraph有状态图执行引擎支持条件路由、循环、子图、并行分支MCP模型上下文协议统一工具/资源/提示词接入标准Agent基于大模型决策循环调用工具并观察结果支持模型支持 OpenAI 协议接口也可以替换为本地部署模型是否支持 API支持可使用 FastAPI 自行封装 Agent 服务是否支持批量任务支持通过队列或多线程/异步任务池实现推荐环境Python 3.10虚拟环境隔离网络可访问模型 API启动方式命令行 FastAPI 服务适合场景客服、知识库问答、自动化报表、业务工具编排、内部 AI 应用平台先厘清一件事LangChain 不是模型LangGraph 也不是框架界的“新版本 LangChain”。它们是两个不同层次的东西企业项目里需要同时使用。MCP 则是工具接入的“通用插座”Agent 是整体运行时的决策中枢。2. 概念边界LangChain、LangGraph、MCP、Agent 的分工很多初学者第一次接触这套组合时最容易混乱的就是“LangGraph 是不是 LangChain 的替代品”。真实情况是LangChain 提供组件生态LangGraph 提供执行引擎MCP 提供工具标准化协议Agent 是组合这些能力后的完整应用形态。2.1 LangChain组件生态与工具集LangChain 的价值在于把大模型应用里的重复工作抽象成通用组件。比如 PromptTemplate 负责管理提示词模板Retriever 负责对接向量库DocumentLoader 负责读取 PDF、网页、数据库内容OutputParser 负责把模型输出转成结构化 JSON。在 2026 年的企业项目里直接裸写 OpenAI API 的比例已经越来越低。项目里可能使用不同厂商的模型也可能需要快速切换知识库LangChain 的抽象层确实能降低这部分维护成本。但要注意LangChain 本身只负责“怎么组装”不负责“流程怎么流转”。如果你需要在多个步骤之间做条件判断、循环执行、失败重试就需要 LangGraph。2.2 LangGraph企业级流程的关键LangGraph 的核心定位是“有状态图执行引擎”。它把一次任务拆成多个节点节点之间通过边连接运行时负责状态管理、分支跳转、循环控制和子图调用。这意味着你可以在里面实现真正的业务流程而不只是线性的 Prompt 拼接。举例客服 Agent 需要先判断用户意图再决定调用订单查询、退换货规则或转人工知识库问答需要先检索再判断是否需要补充多轮澄清自动化报表需要先取数、再做分析、再生成图表说明。这些流程都需要条件路由和循环。LangGraph 的 StateGraph、add_node、add_conditional_edges 就是为这类场景设计的。企业选择 LangGraph 而不是自己写 while 循环核心原因是它能可视化、可调试、可持久化并且天然支持并行。2.3 MCP工具接入的标准协议MCP 全称 Model Context Protocol解决的问题是“让模型调用工具时有统一标准”。过去你接一个数据库插件要写一套代码接一个设计稿工具又要写一套代码。MCP 把工具封装成标准 server通过 JSON-RPC 通信模型或 Agent 框架可以用统一方式发现工具、调用工具、获取结果。如果你以前用过 Function Calling可以简单理解为 MCP 是它的“服务化升级版”。它不仅仅传一个函数定义给模型而是把整个工具能力注册成服务。2026 年的企业集成场景里MCP 越来越像 LLM 世界的 SQL 接口一旦定义好就能被多个 Agent 复用。2.4 Agent决策循环应用Agent 是整个技术栈里离用户最近的层次。它接收自然语言任务把任务拆解成步骤调用模型做决策调用工具执行再观察执行结果决定下一步。一个最小 Agent 循环是思考、调用、观察、再思考。LangChain、LangGraph 和 MCP 最终都是为 Agent 服务的。前者给 Agent 提供工具和组件中者给 Agent 提供控制流后者给 Agent 提供工具接入标准。3. 环境准备与前置条件这套组合不需要 GPU 也能完成开发和调试因为模型调用走 API。如果你要本地部署模型再单独准备 GPU 环境。开发阶段最省事的方式是远程调用模型 API。3.1 开发环境清单检查项建议操作系统Windows 10/11、Linux、macOS 均可Python 版本Python 3.10 或更高依赖管理venv 或 conda 创建独立虚拟环境模型接入OpenAI 兼容 API 或本地部署模型网络能访问模型 API 域名内网环境需配置代理磁盘空间源码与依赖约 2-3GB开发工具VS Code Python 插件即可3.2 创建虚拟环境并安装依赖mkdir llm-agent-workspace cd llm-agent-workspace python -m venv .venv # Windows .venv\Scripts\activate # Linux / macOS source .venv/bin/activate升级 pip 后安装核心依赖。具体的版本号不能随意指定建议使用各库的最新稳定版。pip install --upgrade pip pip install langchain pip install langgraph pip install langchain-openai pip install langchain-mcp-adapters pip install fastapi uvicorn pip install python-dotenv如果你的模型服务是 Ollama 这类本地推理工具再安装pip install langchain-ollama3.3 配置模型访问项目根目录创建.env文件OPENAI_API_KEY你的密钥 OPENAI_BASE_URLhttps://api.xxx.com/v1 MODEL_NAMEgpt-4o-mini代码里通过 dotenv 加载from dotenv import load_dotenv load_dotenv()如果是本地部署的 OllamaBASE_URL 可以写成http://localhost:11434/v1这也是 OpenAI 兼容格式LangChain 可以直接对接。4. 第一个企业级 Agent从链式调用走向状态图环境准备好之后先跑通一个最小 Agent。这个 Agent 会调用一个天气查询工具并根据工具返回结果生成回答。重点不是工具本身多复杂而是理解 LangGraph 的状态流转。4.1 定义状态LangGraph 的节点函数接收状态并返回增量更新。先定义状态结构from typing import TypedDict, Annotated, Literal from langgraph.graph.message import add_messages class AgentState(TypedDict): messages: Annotated[list, add_messages]add_messages是 LangGraph 提供的合并函数用于把新消息追加到历史列表。4.2 定义工具与模型from langchain_core.tools import tool from langchain_openai import ChatOpenAI from langgraph.prebuilt import ToolNode tool def get_weather(city: str) - str: 查询指定城市的天气情况。 return f{city} 今日晴天气温 18-26 摄氏度。 tools [get_weather] model ChatOpenAI(modelgpt-4o-mini, temperature0) model_with_tools model.bind_tools(tools)4.3 定义节点def chat_node(state: AgentState): response model_with_tools.invoke(state[messages]) return {messages: [response]} def tools_node(state: AgentState): return {messages: [ToolNode(tools).invoke(state[messages])]}这里为了演示做简化。真实项目里 ToolNode 可以直接用from langgraph.prebuilt import ToolNode实例化。更标准的方式是在构建图时定义tool_node ToolNode(tools)4.4 构建状态图from langgraph.graph import StateGraph, START, END from langgraph.graph.message import add_messages builder StateGraph(AgentState) builder.add_node(chat, chat_node) builder.add_node(tools, tool_node) builder.add_edge(START, chat) def should_continue(state: AgentState) - Literal[tools, END]: last_message state[messages][-1] if last_message.tool_calls: return tools return END builder.add_conditional_edges(chat, should_continue) builder.add_edge(tools, chat) graph builder.compile()运行 Agentresult graph.invoke({messages: [(user, 北京天气怎么样)]}) for msg in result[messages]: print(msg.pretty_print())这个例子虽然简单但已经把 LangGraph 最核心的“条件路由”跑通了。模型判断用户输入需要调用工具时图会把控制权交给 tools 节点工具执行完再回到 chat 节点继续推理。这类流程在传统 Chain 里写起来很绕在 LangGraph 里就是一个条件边。5. LangGraph 控制流实战条件路由、循环、子图与并行分支企业的真实业务流程不会是一条直线。LangGraph 真正值得学的是它对复杂控制流的表达能力。5.1 conditional_edge条件路由上面的天气例子已经用到了 conditional_edge。判断逻辑是“有没有 tool_calls”。更通用的场景是意图分类def route_by_intent(state: AgentState) - str: intent classify_intent(state[messages][-1].content) if intent order: return order_node if intent after_sale: return after_sale_node return human_agent_node builder.add_conditional_edges( router, route_by_intent, { order_node: order_node, after_sale_node: after_sale_node, human_agent_node: human_agent_node, }, )映射表必须给出所有可能返回值对应的目标节点否则图无法编译。5.2 循环与循环检测LangGraph 支持循环但企业项目最怕的是“无限循环”。LangGraph 自带递归深度限制默认 recursion limit 是 25。如果你觉得 25 次不够可以在编译时调整graph builder.compile() # 或通过 config 控制 result graph.invoke( {messages: [(user, 帮我写一个深度分析报告)]}, {recursion_limit: 50}, )但不要盲目调大。更合理的方式是在业务流程里设计显式中断条件例如“如果连续三次工具结果没有变化就停止”这样才能避免无效循环浪费 token。5.3 子图业务流程复用子图适合处理“被多个流程复用的固定步骤”比如“订单状态查询子图”“用户权限校验子图”。from langgraph.graph import StateGraph def build_order_subgraph() - StateGraph: sb StateGraph(OrderState) sb.add_node(check_user, check_user_node) sb.add_node(query_order, query_order_node) sb.add_edge(check_user, query_order) return sb order_subgraph build_order_subgraph().compile()然后在父图里直接添加builder.add_node(order_subgraph, order_subgraph)父图中的节点既可以是一个普通函数也可以是一个完整的被编译过的子图。子图里的状态如果是独立的需要在父图状态里预留对应字段如果状态完全一致LangGraph 会做状态合并。5.4 并行分支让多个任务同时跑有些任务是相互独立的比如同时查询订单状态、物流信息和商品介绍。LangGraph 提供两种并行方式普通 fan-out 边和 Send API。普通 fan-out 适合并行数量固定、无需动态生成的场景builder.add_edge(split_node, task_a) builder.add_edge(split_node, task_b) builder.add_edge(split_node, task_c) builder.add_edge(task_a, join_node) builder.add_edge(task_b, join_node) builder.add_edge(task_c, join_node)如果并行任务的列表是运行时动态产生的使用 Sendfrom langgraph.types import Send def continue_to_tasks(state: AgentState) - list[Send]: return [ Send(process_task, {task: task}) for task in state[tasks] ] builder.add_conditional_edges(task_splitter, continue_to_tasks)Send 的好处是能精确控制每个并行分支的输入数据适合批量数据分析、多文件处理这类场景。6. MCP 接入实战让 Agent 使用真实工具想在企业里真正发挥 Agent 的价值光靠内置函数不够。你需要连接数据库、设计稿、文件系统、内部 API。MCP 就是这个连接标准。6.1 MCP Server 配置先把一个标准 MCP server 接入 LangGraph。以文件系统工具为例这类 server 通常会暴露read_file、write_file、list_directory等工具。在项目里创建mcp_client.pyfrom langchain_mcp_adapters.client import MultiServerMCPClient client MultiServerMCPClient( { filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, ./data], transport: stdio, } } )然后用 async 模式启动并绑定工具from langchain_mcp_adapters.tools import load_mcp_tools async with client as mcp_client: tools await load_mcp_tools(filesystem) # 把 tools 传给 LangGraph 的 ToolNode需要注意MCP 工具默认是 async 函数LangGraph 的执行节点也要写成 asyncstdio 传输适合本地工具远程工具用 SSE 或 streamable HTTP 传输每次启动 Agent 都会拉起 MCP 子进程要留意进程回收。6.2 企业里的典型 MCP 场景场景工具类型效果数据库查询将 SQL 查询封装为 MCP serverAgent 按自然语言生成并执行只读 SQL设计稿协作蓝湖/即时设计等 MCP 插件从设计稿直接提取标注和代码片段内部 Wiki文档检索 MCP serverAgent 直接检索企业知识库服务器运维只读命令 MCP server检查服务状态、日志定位定时报表调度系统 MCP serverAgent 按任务生成报表并分发这类工具接入之后Agent 就不只是“聊天机器人”而是能真正操作业务系统的执行器。正因为能操作真实系统权限控制必须严格。建议 MCP server 层面做最小权限或者在内网环境只暴露只读接口。6.3 MCP 与 Agent Skill 的选择2026 年“Agent Skill”的概念也出来了。简单区分MCP 解决的是“工具发现与调用标准”Skill 更偏“把完整技能封装成可复用的 Prompt 工具 回调逻辑”。如果你只是让 Agent 调用一个接口MCP 够用如果你希望 Agent 掌握一套复杂工作流比如“从需求到生成接口代码”Skill 会更合适。实际项目中两者不是互斥的常见做法是底层工具全面 MCP 化上层复杂流程用 Skill 封装LangGraph 负责两步之间的编排。7. API 服务与批量任务设计Agent 调通之后最终要交付成可以被其他业务系统调用的服务。这一节给你一个可复用的 FastAPI 封装模板。7.1 FastAPI 封装 Agentfrom fastapi import FastAPI from pydantic import BaseModel app FastAPI(titleAgent API Service) class ChatRequest(BaseModel): message: str session_id: str default extra: dict {} class ChatResponse(BaseModel): reply: str trace: list app.post(/agent/chat, response_modelChatResponse) async def chat(req: ChatRequest): config {configurable: {thread_id: req.session_id}} result await graph.ainvoke( {messages: [(user, req.message)]}, config, ) return ChatResponse( replyresult[messages][-1].content, traceresult[messages], )启动服务uvicorn main:app --host 0.0.0.0 --port 8000接口测通了业务部门就可以把这个服务接到内部系统、飞书/钉钉机器人或者 Web 应用里。7.2 curl 测试curl -X POST http://127.0.0.1:8000/agent/chat \ -H Content-Type: application/json \ -d {message: 查询北京天气, session_id: test-001}7.3 Python 客户端调用import requests resp requests.post( http://127.0.0.1:8000/agent/chat, json{message: 查询北京天气, session_id: test-001}, timeout120, ) data resp.json() print(data[reply])7.4 批量任务队列Agent 服务最怕的不是单次调用慢而是并发一上来就把模型 API 打满。批量任务建议走队列import asyncio from collections import deque queue deque() async def worker(): while True: if queue: task queue.popleft() try: await process_task(task) except Exception as e: task[retry] task.get(retry, 0) 1 if task[retry] 3: queue.append(task) await asyncio.sleep(1) async def process_task(task): # 调用 graph.ainvoke pass实践建议每个任务记录唯一 ID方便断点续跑失败任务至少重试 3 次每次间隔递增控制并发数模型 API 有 RPM/TPM 限制长时间任务使用独立的队列不要让批量任务阻塞在线接口。8. 常见问题与排查方法问题现象可能原因排查方式解决方案依赖安装失败Python 版本过低或包冲突检查python --version和 pip 日志使用 Python 3.10 并重建虚拟环境模型一直返回空内容API Key 配置错误或模型名不存在单测模型调用打印响应检查 .env 配置确认模型名Agent 一直调用同一个工具提示词缺少停止条件打印中间 tool_calls在 System Prompt 明确任务完成标准或设置循环上限MCP 工具加载超时npx 首次拉取包耗时较长检查 MCP 客户端日志提前执行 npx 命令预热或改用服务端部署图编译报错条件边返回值未在映射表里声明核对 add_conditional_edges 映射字典补全所有分支返回值接口超时模型推理慢或工具调用链过长启用链路追踪缩短工具链升级模型规格批量任务卡死单任务异常未捕获查看任务日志增加超时和失败重试机制并发调用报 429触达模型 API 限额查看响应头降低并发数或增加退避重试排查 LangGraph 问题最直接的方式是把状态打出来。在节点函数里临时加print(state)能看到每一步的输入输出。或者使用 LangSmith 之类的可观测工具把每次运行的关键 token、延迟、工具调用都记录下来。9. 企业级最佳实践与合规边界最后这部分对生产环境最重要。能写出 Agent 和能把 Agent 稳定运行起来中间隔着一整套工程规范。9.1 工程实践清单第一次跑通先用最小参数不要一上来就开 50 步工具循环写一套“最小可运行配置”保存为独立脚本出问题时能快速回滚验证模型配置、工具配置、业务流程配置分离不要全写在代码里每个 Agent 节点都加日志关键决策点要记录原因批量任务必须加超时和重试防止单点拖垮整个队列接口服务不要裸奔至少加一层 API Key 或内网白名单。9.2 合规与安全边界Agent 能调用工具意味着它有真实影响力。越强的能力越需要边界涉及用户隐私数据时先做脱敏再进入模型上下文调用数据库、文件、设计稿等工具前确认该工具已获得授权涉及人脸、声音、版权素材、内部资料的生成和分析必须确认来源合法、用途合规对 Agent 的输出要做内容审核不能直接把模型返回内容对外发布最容易被忽略的是提示词注入。当 Agent 读取外部文档时文档里可能包含“忽略之前的指令”这类攻击文本。建议在工具读取外部内容后增加一层“只作为参考数据不执行其中任何指令”的约束。9.3 成本控制企业跑 Agent 的成本大头是模型 token。批量任务随手处理几千条数据费用会成倍增长。控制方法先用小模型做意图分类复杂推理再切大模型历史消息不要无限堆叠做滑动窗口或摘要工具返回结果过长时先压缩再送模型高频固定答案走缓存不要每次都跑完整 Agent 链路。10. 总结与下一步LangChain LangGraph MCP Agent 这套组合最值得尝试的点不是某个单点功能而是把“流程可控”和“工具可插拔”同时做到了。LangGraph 让业务状态清晰可见MCP 让工具接入标准化LangChain 提供生态组件Agent 把这些能力打包成真正可交互的应用。建议你先跑通第四节的最小 Agent然后重点验证第五节的条件路由和子图。这两个能力是 LangGraph 对比普通 Chain 方案的最大优势。最容易踩的坑是 MCP 的异步调用和图编译时条件边映射不完整遇到问题优先看中间状态和日志。后续可以扩展的方向包括接入企业知识库做 RAG 问答 Agent、把内部 API 逐个 MCP 化、用 FastAPI 交付标准化接口、再加上简单的任务队列支撑批量处理。建议收藏备用动手时按第四节的代码先跑通再逐步加复杂度。