理清 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 流程可编排、可控制、可扩展

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐