LangChain 和 LangGraph 是两个围绕语言模型(LLM)设计的开源框架,但聚焦于不同的核心目标。LangChain 由 Hugging Face 开发,旨在通过模块化组件链式组合(如 LLM、API、数据库)简化复杂工作流的构建,适合单次任务自动化场景(如数据处理、报告生成)。而 LangGraph 由 Stability AI 推出,专注于多轮对话的状态管理与流程建模,通过有向无环图(DAG)支持动态决策和上下文持久化,适用于客服、医疗问诊等需要长期交互的场景。
两者的协同价值显著:LangChain 可作为 LangGraph 的底层执行引擎,实现具体逻辑(如调用 LLM 或 API),而 LangGraph 则为 LangChain 提供对话状态管理能力,增强多轮交互支持。开发者需根据需求选择框架——简单自动化任务选 LangChain,复杂多轮对话系统选 LangGraph,混合场景则可结合二者优势。未来,LangChain 或向通用 AI Agent 框架演进,LangGraph 则可能强化实时事件驱动能力。
一、框架背景与开发动机
下面分别介绍LangChain 和 LangGraph ,包含背景、定义、目标、技术细节和完整代码示例,内容更加丰富且贴近实际场景。
LangChain
- 背景:
由 Hugging Face 团队于 2023 年开源,目标是解决复杂 AI 应用的模块化构建难题。随着 LLM 的普及,开发者需要将 LLM 与数据库、API、文件系统等组件无缝集成,但传统方法往往需要重复造轮子。 - 开发动机:
提供一套标准化接口(如Chain
、Runnable
),让开发者能够像搭积木一样组合工具链,降低开发复杂度。
LangGraph
- 背景:
由 Stability AI 团队(ChatGPT 开发方)于 2023 年推出,专注于对话系统的状态管理和流程建模。传统 LLM 在多轮对话中容易丢失上下文,导致逻辑断裂。 - 开发动机:
通过图结构建模对话流程,确保长期上下文的连贯性,支持动态调整任务路径(如用户中途改变需求)。
二、详细定义与核心目标
LangChain
- 定义:
模块化 AI 工程框架,提供标准化的组件接口(Runnable
),支持将 LLM、外部服务、文件系统等组件链式组合,构建端到端的应用。 - 核心目标:
- 简化复杂工作流:例如自动从 PDF 提取数据 → LLM 分析 → 生成报告。
- 复用现有工具:无需从头实现组件,直接集成开源库或 SaaS API。
LangGraph
-
定义:
基于图的对话管理框架,通过有向无环图(DAG)建模多轮对话的逻辑节点和状态转移,支持动态决策和上下文持久化。 -
核心目标:
- 解决上下文丢失问题:确保对话系统在多轮交互中保持一致性。
- 灵活的任务编排:根据用户输入动态切换流程分支(如医疗问诊的分诊路径)。
-
技术对比(补充细节)**
维度 | LangChain | LangGraph |
---|---|---|
核心抽象 | Chain (链式组合)、Runnable (可执行单元) | Node (图节点)、Edge (状态转移边)、State (全局对话状态) |
状态管理 | 仅传递单次调用上下文(如 LLM 的 prompt 和 output ) | 维护全局状态(如用户历史记录、流程执行进度) |
执行模式 | 线性执行链式任务(A→B→C),支持并行调用(如多 API 并发请求) | 支持条件分支、循环、子图嵌套,可动态修改流程图结构(热更新) |
调试与监控 | 提供链式调用的日志追踪和错误捕获 | 可视化流程图界面,实时监控节点执行状态和状态变化 |
三、实际场景案例实战
LangChain 示例:电商推荐系统
场景
用户输入商品关键词 → LLM 解析需求 → 调用数据库获取商品列表 → 根据用户评分生成推荐结果。
完整代码
from langchain import load_llm, Runnable, Chain
from langchain.tools import database_tool # 假设已定义数据库工具
# 1. 加载 LLM 模型
llm = load_llm("gpt-4o")
# 2. 定义数据库查询工具(模拟)
class ProductDatabaseTool:
def __init__(self):
self.db = {
"电子产品": [{"id": 1, "name": "iPhone 15", "rating": 4.8}, {"id": 2, "name": "MacBook Pro", "rating": 4.7}],
"服装": [{"id": 3, "name": "T-Shirt", "rating": 4.5}]
}
def query_products(self, category: str) -> list:
return self.db.get(category, [])
product_db = ProductDatabaseTool()
# 3. 构建链式流程
chain = (
Runnable([llm, product_db.query_products]) # LLM 解析需求并调用数据库
.add_link( # 过滤高评分商品
lambda x: [item for item in x if item["rating"] >= 4.6]
)
.add_link( # 生成推荐理由
lambda x: f"根据您的需求,推荐以下商品:{', '.join([item['name'] for item in x])}"
)
)
# 4. 执行链
input_text = "我需要一台高性能的笔记本电脑"
result = chain.invoke(input_text)
print(result) # 输出示例:"根据您的需求,推荐以下商品:MacBook Pro"
LangGraph 示例:医疗问诊助手
场景
用户描述症状 → 系统分诊 → 根据病情严重程度调用专科知识库或转诊医生。
完整代码
from langgraph import Graph, Node, State
from langchain import load_llm, Runnable
# 1. 加载 LLM 模型
symptom_checker = load_llm("gpt-4o")
# 2. 定义分诊节点
class TriageNode(Node):
def __init__(self):
self.llm = symptom_checker
def execute(self, state: State) -> dict:
prompt = f"用户症状:{state['history'][-1]['text']},需要分诊到哪个科室?"
return {"category": self.llm.invoke(prompt)}
# 3. 定义专科咨询节点
class SpecialtyNode(Node):
def __init__(self, specialty: str):
self.llm = load_llm(f"gpt-4o-specialty-{specialty}")
def execute(self, state: State) -> dict:
prompt = f"用户症状:{state['history'][-1]['text']},请提供专业建议。"
return {"advice": self.llm.invoke(prompt)}
# 4. 构建流程图
graph = Graph()
graph.add_node(TriageNode())
graph.add_node(SpecialtyNode("general"), SpecialtyNode("cardiology"))
graph.add_edge("TriageNode", "SpecialtyNode", condition=lambda x: x["category"] == "general")
graph.add_edge("TriageNode", "SpecialtyNode", condition=lambda x: x["category"] == "cardiology")
# 5. 初始化状态并运行
initial_state = State(history=[{"role": "user", "text": "我胸口疼痛"}])
result = graph.execute(initial_state)
print(result["advice"]) # 输出示例:"建议立即就诊心内科,可能存在心脏病风险。"
四、框架协同使用案例
场景
用户请求“帮我制定旅行计划”,系统需:
- 分析需求(城市、预算、天数)
- 调用天气 API 获取目的地天气
- 根据 LLM 建议生成行程
- 如果用户追问细节,保持上下文一致性。
混合代码示例
from langchain import load_llm, Runnable, Chain
from langgraph import Graph, Node, State
# LangChain 部分:构建行程生成链
llm = load_llm("gpt-4o")
weather_api = Runnable([lambda city: f"Weather in {city} is sunny."])
plan_chain = (
Runnable([llm, weather_api]) # 解析需求 + 查询天气
.add_link(lambda x: f"建议行程:第一天去{city},天气晴朗,适合户外活动。")
)
# LangGraph 部分:集成多轮对话
class TravelAssistantNode(Node):
def __init__(self):
self.plan_chain = plan_chain
def execute(self, state: State) -> dict:
user_query = state["history"][-1]["text"]
return {"plan": self.plan_chain.invoke(user_query)}
graph = Graph()
graph.add_node(TriageNode()) # 假设已有分诊节点
graph.add_node(TravelAssistantNode())
graph.add_edge("TriageNode", "TravelAssistantNode", condition=lambda x: x["category"] == "travel")
# 执行混合流程
initial_state = State(history=[{"role": "user", "text": "制定巴黎5天旅行计划"}])
final_result = graph.execute(initial_state)
print(final_result["plan"]) # 输出示例:"建议行程:第一天去巴黎,天气晴朗,适合户外活动。"
- 选择框架的关键考量
需求场景 | 推荐框架 | 理由 |
---|---|---|
单次任务自动化(数据清洗、报告生成) | LangChain | 模块化组合工具链,快速实现端到端流程 |
多轮对话系统(客服、医疗问诊) | LangGraph | 管理上下文状态,支持动态流程调整 |
需要同时处理单任务+多轮交互 | 混合使用两者 | LangChain 负责执行逻辑,LangGraph 维护对话状态 |
- 示例应用增强
- LangChain:
- 集成 Vector Databases(如 Pinecone),支持语义搜索增强检索能力。
- 推出 Agent 模板库(如“代码助手”、“数据分析员”),加速通用 AI Agent 开发。
- LangGraph:
- 增强 实时事件驱动支持(如实时传感器数据接入)。
- 开发 可视化流程设计器,降低非技术人员的使用门槛。
通过以上深入解析,开发者可以根据具体需求灵活选择或组合这两个框架,构建下一代智能应用。
五、最后总结
LangChain 和 LangGraph 分别解决了 AI 开发中的两大痛点:模块化集成与多轮对话管理。前者通过标准化接口简化工具链组合,后者通过图结构建模确保对话连贯性。二者的技术差异体现在架构设计(链式 vs. 图状)、状态管理方式(单次传递 vs. 全局维护)和适用场景(单任务流程 vs. 多轮交互)。实际开发中,开发者可根据需求单独使用或混合集成,例如用 LangChain 构建行程规划工具链,再通过 LangGraph 实现用户追问时的上下文延续。这一互补关系为构建下一代智能应用提供了灵活的技术基础。