LangChain 与 LangGraph 在 MCP 场景下的核心差异
摘要: LangChain是通用AI Agent开发框架,提供工具调用、RAG等基础能力;LangGraph是其子框架,专注多Agent协作与复杂工作流编排(如分支、循环、状态管理)。两者关系互补:LangChain解决“单个Agent做什么”,LangGraph解决“多个Agent如何协同”。在医疗MCP服务场景中,简单查询用LangChain即可,而批量处理、异常审核等复杂流程需结合LangG
理清 LangChain 和 LangGraph 的核心区别,本质是要分清「通用 Agent 框架」和「专注 Agent 工作流/多智能体协作的子框架」的关系——LangGraph 是 LangChain 生态的核心组件,而非竞品,两者结合使用能覆盖从“简单工具调用”到“复杂多 Agent 协作”的全场景,下面结合医院 MCP 服务场景拆解,帮你明确各自定位和使用方式:
一、核心定位(
|
框架 |
核心定位 |
类比(贴合你的场景) |
|
LangChain |
「通用 AI Agent 开发框架」:提供 Agent 开发的全栈能力(工具调用、RAG、Prompt 管理、模型对接),是基础底座 |
医院的「综合业务系统」(覆盖挂号、诊疗、检验全流程) |
|
LangGraph |
「LangChain 生态的工作流/多 Agent 协作框架」:专注于有状态、多轮、多角色的 Agent 工作流编排,是 LangChain 的“协作扩展模块” |
医院综合系统中的「多科室协作流程引擎」(比如“检验科→内科→药房”的诊疗流程编排) |
二、核心区别拆解(从你的 MCP 服务场景出发)
1. 核心能力:“全栈基础能力” vs “专精工作流协作”
-
LangChain 核心能力:
覆盖 Agent 开发的“基础层”,解决「AI 怎么调用工具、怎么对接数据、怎么和大模型交互」的问题:
-
工具封装:把你的 MCP-LabExam、MCP-MedicalOrder 服务封装为 Custom Tool;
-
数据交互:对接医院数据库做 RAG 检索(比如患者历史检验数据);
-
模型对接:适配 OpenAI/本地 Ollama 模型,管理 Prompt/上下文;
-
简单链编排:用
SequentialChain实现“查检验数据→查医嘱”的线性流程(无状态、无分支)。
👉 适合:单一 Agent 完成简单、线性的任务(比如“调用 MCP 服务查单个患者的异常检验数据”)。
-
LangGraph 核心能力:
聚焦 Agent 开发的“流程层”,解决「多 Agent 怎么分工、任务怎么分支/循环、状态怎么保存」的问题:
-
有状态工作流:记住上一轮调用 MCP 服务的结果(比如“患者血常规异常”),决定下一轮是否调用医嘱服务;
-
分支/循环逻辑:支持 if-else(比如“异常数据>3 项则调用审核 Agent,否则直接返回”)、循环(比如“重试调用 MCP 服务直到成功”);
-
多 Agent 协作:定义角色(检验 Agent/医嘱 Agent/审核 Agent),指定任务分发规则(比如检验 Agent 查完数据后,把结果传给审核 Agent);
-
人机交互节点:支持流程中插入人工确认(比如“异常数据需医生确认后再生成报告”)。
👉 适合:多 Agent 完成复杂、有分支/状态的任务(比如“批量查询患者数据→异常数据审核→生成报告→对接医嘱服务”)。
2. 使用关系:LangGraph 依赖 LangChain,而非替代
LangGraph 是 LangChain 生态的一部分,不能脱离 LangChain 单独使用:
-
LangChain 提供“工具、模型、数据”等基础能力;
-
LangGraph 基于这些基础能力,做“流程编排、多 Agent 协作”;
-
比如:你先在 LangChain 中封装好 MCP 服务的 Tool,再在 LangGraph 中定义“什么时候调用这个 Tool、哪个 Agent 调用、调用失败后怎么重试”。
3. 代码示例对比(对接你的 MCP 服务)
示例 1:LangChain 实现简单线性调用(单一 Agent)
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain.tools import tool
import requests
# 1. LangChain 封装 MCP 服务工具
@tool
def mcp_labexam_tool(patient_id: str) -> str:
"""调用 MCP-LabExam 服务查询患者异常检验数据"""
res = requests.post(
"http://你的 MCP 地址:8081/mcp/labexam",
json={"patient_id": patient_id, "data_filter": "ABNORMAL"}
)
return res.json()
# 2. 简单线性调用(无分支、无状态)
llm = ChatOpenAI(model="gpt-3.5-turbo")
agent = create_openai_tools_agent(llm, [mcp_labexam_tool], prompt="你是检验数据查询 Agent,调用工具查患者异常数据")
agent_executor = AgentExecutor(agent=agent, tools=[mcp_labexam_tool])
# 3. 执行(单次调用,无状态)
result = agent_executor.invoke({"input": "查询患者 P123456 的异常检验数据"})
print(result)
示例 2:LangGraph 实现多 Agent 协作(有分支、有状态)
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode, HumanNode
from langchain.tools import tool
import requests
# 1. 先在 LangChain 中封装 MCP 工具(基础能力)
@tool
def mcp_labexam_tool(patient_id: str) -> str:
"""调用 MCP-LabExam 服务查询患者异常检验数据"""
res = requests.post("http://你的 MCP 地址:8081/mcp/labexam", json={"patient_id": patient_id})
return res.json()
@tool
def mcp_medicalorder_tool(patient_id: str) -> str:
"""调用 MCP-MedicalOrder 服务查询患者固定医嘱"""
res = requests.post("http://你的 MCP 地址:8082/mcp/medicalorder", json={"patient_id": patient_id})
return res.json()
# 2. 定义工作流状态(保存任务上下文)
class State:
patient_id: str
labexam_result: str = ""
medicalorder_result: str = ""
need_review: bool = False
# 3. 定义节点(Agent 角色)
llm = ChatOpenAI(model="gpt-3.5-turbo")
# 检验 Agent 节点:调用检验工具
def labexam_agent(state: State):
tool_node = ToolNode([mcp_labexam_tool])
result = tool_node.invoke({"input": state.patient_id, "tools": [mcp_labexam_tool.name]})
state.labexam_result = result["output"]
# 异常数据>2 项则需要审核
state.need_review = len(state.labexam_result.get("异常项", [])) > 2
return state
# 医嘱 Agent 节点:调用医嘱工具
def medicalorder_agent(state: State):
tool_node = ToolNode([mcp_medicalorder_tool])
result = tool_node.invoke({"input": state.patient_id, "tools": [mcp_medicalorder_tool.name]})
state.medicalorder_result = result["output"]
return state
# 审核节点(人工确认)
human_node = HumanNode()
# 4. 定义工作流(分支逻辑)
graph = StateGraph(State)
# 添加节点
graph.add_node("labexam_agent", labexam_agent)
graph.add_node("medicalorder_agent", medicalorder_agent)
graph.add_node("human_review", human_node)
# 定义流程:检验 Agent → 判断是否需要审核 → 医嘱 Agent/人工审核 → 结束
graph.set_entry_point("labexam_agent")
# 分支逻辑:need_review 为 True 则走人工审核,否则直接调用医嘱 Agent
graph.add_conditional_edges(
"labexam_agent",
lambda state: "human_review" if state.need_review else "medicalorder_agent",
{"human_review": "medicalorder_agent", "medicalorder_agent": END}
)
graph.add_edge("human_review", "medicalorder_agent")
# 5. 执行工作流(有状态、多分支)
app = graph.compile()
result = app.invoke({"patient_id": "P123456"})
print(f"检验结果:{result['labexam_result']}")
print(f"医嘱结果:{result['medicalorder_result']}")
4. 适配医院 MCP 服务场景:什么时候用哪个?
|
场景类型 |
选 LangChain 还是 LangGraph? |
核心原因 |
|
单一 Agent 调用 MCP 服务查单条数据 |
仅用 LangChain |
线性流程,无分支/状态,LangChain 足够,无需引入复杂的工作流 |
|
多 Agent 协作(检验+医嘱+审核) |
LangChain + LangGraph |
需要角色分工、分支逻辑(异常数据审核)、状态保存,LangGraph 负责流程编排 |
|
批量查询患者数据(循环调用 MCP) |
LangChain + LangGraph |
需要循环逻辑(遍历患者列表)、失败重试,LangGraph 支持循环节点 |
|
流程中需要人工确认 |
LangChain + LangGraph |
LangGraph 内置 HumanNode,可插入人工交互节点,适配医院审核流程 |
|
简单 RAG 检索+MCP 调用 |
仅用 LangChain |
LangChain 内置 RAG 模块,线性流程即可完成“检索历史数据+调用实时 MCP 数据” |
三、核心总结
1. 核心关系
-
LangGraph 是 LangChain 的子框架/扩展,依赖 LangChain 提供的工具、模型、数据能力;
-
LangChain 解决“Agent 能做事”,LangGraph 解决“Agent 怎么有逻辑地、多角色地做事”。
2. 选型关键点
-
简单线性任务(单一 Agent、无分支)→ 仅用 LangChain;
-
复杂流程任务(多 Agent、分支/循环/状态/人工交互)→ LangChain + LangGraph;
-
你的医院 MCP 服务场景:
-
基础场景(单患者数据查询):仅用 LangChain;
-
进阶场景(批量查询、异常审核、多 Agent 协作):LangChain 封装 MCP 工具 + LangGraph 编排流程。
-
3. 优势对比
|
维度 |
LangChain |
LangGraph |
|
学习成本 |
中等(概念多但基础) |
偏高(需理解状态、节点、边、分支) |
|
适用场景 |
简单线性任务、单 Agent 操作 |
复杂流程、多 Agent 协作、有状态任务 |
|
核心价值 |
快速落地基础 Agent 能力 |
让 Agent 流程可编排、可控制、可扩展 |
更多推荐

所有评论(0)