LangChain与LangGraph详解:用法、差异与实战指南
目录
一、框架核心定位:各司其职,相辅相成
1. LangChain:LLM应用的“模块化工具箱”
2. LangGraph:复杂工作流的“图结构编排引擎”
二、LangChain详解:核心用法与实操案例
(一)LangChain核心组件(必懂)
(二)LangChain基础用法:从环境搭建到核心实操
1. 环境搭建(Python 3.9+)
2. 基础实操:线性Chain调用(最简案例)
3. 进阶实操:轻量Agent(工具调用)
三、LangGraph详解:核心用法与实操案例
(一)LangGraph核心概念
(二)LangGraph基础用法:从环境搭建到图结构实现
1. 环境搭建
2. 基础实操:简单图结构(线性流程)
3. 进阶实操:复杂图结构(条件分支+循环)
四、LangChain与LangGraph核心差异(全方位对比)
补充:适配场景与组合用法
1. LangChain适配场景(占LLM应用需求的60%+)
2. LangGraph适配场景(聚焦高价值复杂需求)
3. 组合用法(1+1>2)
五、总结:如何选择与落地?
一、框架核心定位:各司其职,相辅相成
LangChain和LangGraph并非替代关系,而是LangChain生态中“基础工具”与“高级编排”的互补组合,共享LangChain Core基础组件和LangSmith调试平台,却面向不同复杂度的开发需求,核心定位差异显著:
1. LangChain:LLM应用的“模块化工具箱”
LangChain的核心定位是简化LLM应用开发的模块化抽象框架,它将复杂的AI应用拆解为可重用的组件,让开发者像搭积木一样组合功能,无需关注底层实现细节。其核心价值在于“连接”——连接LLM、外部工具、私有数据、对话记忆,快速实现从简单文本生成到轻量Agent的落地,主打“快速原型验证”,是LLM应用开发的“入门必备工具”。
LangChain的演进历程清晰体现了其定位变化:0.x版本以“Chain(链)”为核心,强调预定义线性流程;0.1版本实现模块化拆分,引入langchain-core等子包;0.2/1.0版本则彻底聚焦Agent能力,在LangGraph之上重构,仅保留create_agent核心函数,成为LangGraph的生态基础设施之一。
2. LangGraph:复杂工作流的“图结构编排引擎”
LangGraph是LangChain团队于2024年10月推出的状态驱动型图结构编排框架,定位为“智能体运行时”,专门解决LangChain在复杂流程控制上的不足。它以“图”为核心,将任务拆解为离散节点,通过边定义节点间的流转逻辑,支持循环、分支、并行等复杂流程,同时具备原生状态管理和断点续跑能力,主打“生产级复杂Agent落地”,是从原型走向生产的关键工具。
简单来说,LangChain帮你快速“搭好组件”,LangGraph帮你“管好流程”——当你的应用需要多步骤决策、多智能体协作或复杂逻辑循环时,LangGraph将成为核心支撑。
二、LangChain详解:核心用法与实操案例
LangChain的核心优势的是“组件化”和“易用性”,其所有功能都围绕五大核心组件展开,掌握这些组件,就能快速搭建90%以上的LLM应用。
(一)LangChain核心组件(必懂)
LangChain的组件可自由组合,核心组件包括5类,覆盖LLM应用开发的全流程:
Models(模型):LLM的核心推理引擎,支持所有主流开源和闭源模型(OpenAI、Anthropic、Qwen、GLM等),提供标准化调用接口,可轻松切换模型,同时支持工具调用、结构化输出、多模态等高级能力,是Agent的决策核心。
Prompts(提示词模板):统一格式化输入,可动态插入变量、对话历史等内容,避免重复编写提示词,同时支持提示词优化、批量生成,提升LLM输出的一致性。
Output Parsers(输出解析器):将LLM的自由文本输出,解析为JSON、列表、自定义对象等结构化数据,解决LLM输出“不可控”的问题,方便后续逻辑处理。
Memory(记忆):存储对话历史或任务中间结果,实现多轮对话上下文关联,支持短期内存存储和长期向量数据库检索,让LLM具备“记忆能力”。
Chains/Agent(链/智能体):串联所有组件的核心,其中Chain是“预定义线性流程”,Agent是“自主决策循环”,可根据任务需求自主调用工具、调整流程,实现复杂任务自动化。
(二)LangChain基础用法:从环境搭建到核心实操
1. 环境搭建(Python 3.9+)
LangChain采用“核心包+按需安装”策略,基础安装命令如下,同时需配置模型密钥(以DeepSeek为例,兼容OpenAI接口):
# 安装核心依赖 pip install langchain "langchain(openai)" langchain-community langchain-core python-dotenv # 配置.env文件(项目根目录) DEEPSEEK_API_KEY=你的密钥 OPENAI_API_BASE=https://api.deepseek.com/v12. 基础实操:线性Chain调用(最简案例)
新版LangChain采用管道符“|”链式写法,简洁易懂,适合实现无复杂分支的线性任务(如文本生成、简单问答):
import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser # 加载环境变量 load_dotenv() # 1. 初始化LLM(兼容DeepSeek/OpenAI/Qwen等) llm = ChatOpenAI( model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), openai_api_base=os.getenv("OPENAI_API_BASE"), temperature=0.7 # 随机性0-1,越低越严谨 ) # 2. 定义提示词模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是专业的Python技术助教,回答简洁易懂,适合新手"), ("human", "请讲解:{question}") ]) # 3. 定义输出解析器(统一输出字符串) parser = StrOutputParser() # 4. 链式组合:prompt → llm → parser chain = prompt | llm | parser # 5. 调用执行 if __name__ == "__main__": result = chain.invoke({"question": "LangChain的核心作用是什么?"}) print(result)执行逻辑:输入问题 → 模板格式化提示词 → LLM推理 → 解析输出,全程线性执行,无分支、无循环,适合快速验证想法。
3. 进阶实操:轻量Agent(工具调用)
LangChain的Agent具备自主决策能力,可根据任务需求调用外部工具(如搜索引擎、计算器),适合简单的工具集成场景:
from langchain.agents import create_openai_functions_agent, AgentExecutor from langchain_core.tools import tool # 1. 定义工具(示例:简单的加法工具) @tool def add(a: int, b: int) -> int: """计算两个整数的和,用于解决加法问题""" return a + b tools = [add] # 2. 定义Agent提示词 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个擅长解决数学问题的助手,可调用加法工具完成计算,无需多余解释"), ("human", "{input}"), ("agent_scratchpad", "{agent_scratchpad}") # 用于记录Agent思考过程 ]) # 3. 创建Agent并执行 agent = create_openai_functions_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # 调用Agent agent_executor.invoke({"input": "计算3+5的结果"})核心特点:Agent会自主判断是否需要调用工具,无需手动指定流程,适合1-2个工具的简单集成场景,但不支持复杂分支和循环。
三、LangGraph详解:核心用法与实操案例
LangGraph的核心是“图结构”和“状态管理”,其核心思想是:将复杂任务拆解为离散的“节点”,通过“边”定义节点间的流转规则,借助“全局状态”实现节点间的数据共享,支持循环、分支、并行等复杂流程,同时具备断点续跑和人机协作能力。
(一)LangGraph核心概念
节点(Nodes):执行具体任务的基本单元,可对应LLM调用、工具执行、人工审核、数据处理等任意功能,本质是可调用的函数。
边(Edges):定义节点间的流转逻辑,分为“固定边”(固定跳转至下一个节点)和“条件边”(根据状态判断跳转至不同节点),支持循环和分支。
状态(State):跨节点持久化的全局数据容器,可存储任务输入、中间结果、对话历史等,所有节点可读取和修改状态,是节点间协作的核心。
检查点(Checkpoint):自动保存每一步执行状态,支持暂停、恢复执行,实现错误恢复和“时间旅行”调试,提升复杂流程的韧性。
(二)LangGraph基础用法:从环境搭建到图结构实现
1. 环境搭建
LangGraph依赖LangChain核心组件,安装命令如下:
pip install langgraph langchain "langchain(openai)" python-dotenv2. 基础实操:简单图结构(线性流程)
先实现一个简单的线性图(节点1→节点2→节点3),理解LangGraph的核心流程,以“文本生成→内容审核→输出结果”为例:
import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langgraph.graph import Graph from langgraph.graph import StateGraph, END # 加载环境变量 load_dotenv() llm = ChatOpenAI( model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), openai_api_base=os.getenv("OPENAI_API_BASE"), temperature=0.7 ) # 1. 定义全局状态(存储输入、生成内容、审核结果) class State: input_text: str # 输入文本 generated_text: str # 生成的内容 review_result: str # 审核结果 # 2. 定义节点函数 def generate_content(state: State) -> State: """节点1:生成文本内容""" prompt = f"根据输入生成短文:{state.input_text}" response = llm.invoke(prompt) return State( input_text=state.input_text, generated_text=response.content, review_result=state.review_result ) def review_content(state: State) -> State: """节点2:审核文本内容""" prompt = f"审核以下内容是否合规,仅输出'合规'或'不合规':{state.generated_text}" response = llm.invoke(prompt) return State( input_text=state.input_text, generated_text=state.generated_text, review_result=response.content ) def output_result(state: State) -> State: """节点3:输出最终结果""" print(f"输入:{state.input_text}") print(f"生成内容:{state.generated_text}") print(f"审核结果:{state.review_result}") return state # 3. 构建图结构 graph = StateGraph(State) # 添加节点 graph.add_node("generate", generate_content) # 生成节点 graph.add_node("review", review_content) # 审核节点 graph.add_node("output", output_result) # 输出节点 # 定义边(线性流转:generate → review → output → 结束) graph.add_edge("generate", "review") graph.add_edge("review", "output") graph.add_edge("output", END) # 设置入口节点 graph.set_entry_point("generate") # 编译图 app = graph.compile() # 运行图 if __name__ == "__main__": app.invoke(State(input_text="介绍LangGraph的核心功能", generated_text="", review_result=""))3. 进阶实操:复杂图结构(条件分支+循环)
LangGraph的核心优势的是支持条件分支和循环,以“客服工单处理”为例,实现“读取工单→分类→处理→审核→循环/结束”的复杂流程:
from langgraph.graph import StateGraph, END # 1. 定义状态(扩展工单相关字段) class TicketState: ticket_content: str # 工单内容 ticket_type: str # 工单类型(咨询/投诉/报错) handle_result: str # 处理结果 review_pass: bool # 审核是否通过 # 2. 定义节点函数 def read_ticket(state: TicketState) -> TicketState: """节点1:读取工单内容(模拟输入)""" print(f"读取工单:{state.ticket_content}") return state def classify_ticket(state: TicketState) -> TicketState: """节点2:分类工单类型""" prompt = f"判断以下工单类型(仅输出咨询/投诉/报错):{state.ticket_content}" response = llm.invoke(prompt) return TicketState( ticket_content=state.ticket_content, ticket_type=response.content, handle_result=state.handle_result, review_pass=state.review_pass ) def handle_inquiry(state: TicketState) -> TicketState: """节点3:处理咨询类工单""" prompt = f"针对咨询工单给出简洁回复:{state.ticket_content}" response = llm.invoke(prompt) return TicketState( **state.__dict__, handle_result=response.content ) def handle_complaint(state: TicketState) -> TicketState: """节点4:处理投诉类工单""" prompt = f"针对投诉工单给出道歉+解决方案:{state.ticket_content}" response = llm.invoke(prompt) return TicketState( **state.__dict__, handle_result=response.content ) def review_result(state: TicketState) -> str: """节点5:审核处理结果(条件分支判断)""" prompt = f"判断以下处理结果是否合格(仅输出通过/不通过):{state.handle_result}" response = llm.invoke(prompt) if response.content == "通过": return "end" # 跳转至结束 else: return "rehandle" # 跳转至重新处理(循环) # 3. 构建复杂图结构 graph = StateGraph(TicketState) # 添加节点 graph.add_node("read", read_ticket) graph.add_node("classify", classify_ticket) graph.add_node("handle_inquiry", handle_inquiry) graph.add_node("handle_complaint", handle_complaint) graph.add_node("review", review_result) # 定义边(条件分支+循环) graph.add_edge("read", "classify") # 条件分支:根据工单类型跳转至不同处理节点 graph.add_conditional_edges( "classify", lambda state: state.ticket_type, # 分支判断依据 { "咨询": "handle_inquiry", "投诉": "handle_complaint", "报错": END # 报错工单暂不处理,直接结束 } ) # 处理节点统一跳转至审核节点 graph.add_edge("handle_inquiry", "review") graph.add_edge("handle_complaint", "review") # 审核节点条件分支:通过则结束,不通过则重新处理(循环) graph.add_conditional_edges( "review", lambda state: state.review_pass, { "end": END, "rehandle": "classify" # 重新分类,进入循环 } ) # 设置入口节点 graph.set_entry_point("read") # 编译并运行 app = graph.compile() app.invoke(TicketState( ticket_content="我的账号无法登录,麻烦解决一下", ticket_type="", handle_result="", review_pass=False ))核心特点:支持条件分支(根据工单类型跳转)和循环(审核不通过重新处理),具备状态持久化能力,可应对复杂的业务流程,这是LangChain无法实现的核心功能。
开启 LangGraph 的「检查点(Checkpoint)」功能 —— 默认情况下不自动存储,仅在内存中流转;开启检查点后,每一步的state(节点执行后的完整状态)会被持久化存储,支持断点续跑、回溯和 “时间旅行” 调试。
from langgraph.checkpoint.memory import MemorySaver # 初始化检查点(存储在内存中,也可配置存到本地文件/数据库) memory = MemorySaver() # 编译图,开启检查点,每一步state都会被存储 app = graph.compile(checkpointer=memory)- 存储的内容:开启检查点后,每一步节点执行后的完整 state都会被存储(包括所有字段,如
ticket_content、ticket_type、handle_result等),不是只存某一个字段。 - 存储位置:默认用
MemorySaver是存在内存中(程序重启后丢失),适合调试;生产环境可换成FileCheckpointer(存本地文件)、SQLCheckpointer(存数据库),确保 state 永久存储。 - 与文档代码的兼容:文档中所有节点函数(
classify_ticket、handle_inquiry等)无需修改,只要开启检查点,就能自动存储每一步的返回值(state),无需额外编写存储逻辑。
四、LangChain与LangGraph核心差异(全方位对比)
为了更清晰地展示两者的区别,从抽象层级、流程控制、状态管理等10个核心维度进行对比,同时补充适配场景和开发建议:
对比维度 | LangChain | LangGraph |
|---|---|---|
核心定位 | 模块化工具箱,快速搭建LLM应用 | 图结构编排引擎,管理复杂流程 |
抽象层级 | 高层封装(预制组件、模板),隐藏底层细节 | 底层编排(节点、边、状态),完全可控 |
流程控制 | 线性Chain或简单Agent循环,不支持复杂分支/循环 | 任意图结构(分支、循环、并行),动态流转 |
状态管理 | 简单内存或外部存储,无原生全局状态 | 原生状态图,自动持久化,支持断点续跑 |
核心组件 | Models、Prompts、Memory、Chains、Agent | Nodes、Edges、State、Checkpoint |
开发效率 | 高,预制组件开箱即用,新手1天上手 | 低,需设计图结构,学习周期1-2周 |
运行性能 | 简单场景快(启动快、资源占用低) | 复杂场景优(并发能力高,流程韧性强) |
维护成本 | 线性流程易维护,复杂流程难迭代 | 图结构逻辑清晰,后期迭代成本低 |
人机协作 | 有限支持,需手动实现中断逻辑 | 内置中断、审批能力,支持人机协同 |
适用团队 | 无复杂系统开发经验的小团队、新手 | 有状态机/工作流经验的中大型团队 |
补充:适配场景与组合用法
1. LangChain适配场景(占LLM应用需求的60%+)
快速原型验证:5分钟内通过组件拼接验证AI想法(如简单问答、文本摘要);
线性标准化任务:无复杂分支的单次触发型需求(文档总结、数据报表生成、基础RAG问答);
轻量工具集成:需调用1-2个外部工具的简单场景(如“查询天气+生成提醒”)。
2. LangGraph适配场景(聚焦高价值复杂需求)
多步骤自治任务:需动态决策的长流程需求(如企业级报告生成、金融风控审核);
多智能体协作:多角色分工的复杂系统(规划Agent+检索Agent+写作Agent协同);
高韧性业务场景:需频繁错误处理、重试的核心业务(智能客服工单闭环、医疗诊断流程)。
3. 组合用法(1+1>2)
LangChain和LangGraph的最佳实践是“组合使用”:用LangChain的预制组件(如RAG工具链、对话记忆、模型接口)作为LangGraph的“节点功能模块”,再通过LangGraph的图结构管理整体流程,适配中大型项目。例如:电商智能导购系统,用LangChain实现商品检索和用户意图识别,用LangGraph管理“咨询→推荐→异议处理→下单”的全流程。
五、总结:如何选择与落地?
LangChain和LangGraph的选择,核心取决于任务复杂度和开发需求,无需纠结“谁更好”,只需匹配自身场景:
若你是新手,或需求是“快速落地简单LLM应用”(如简单问答、文本生成),优先用LangChain,低成本、高效率完成原型验证;
若你需要开发“复杂自治型Agent”(如多步骤决策、多智能体协作),或需求从原型走向生产,必须用LangGraph,解决流程控制和状态管理问题;
若你开发中大型项目,优先采用“LangChain+LangGraph”组合,用LangChain搭组件、LangGraph管流程,兼顾开发效率和生产韧性。
两者作为LangChain生态的核心框架,共享基础组件和调试平台,掌握其核心用法和差异,能让你在LLM应用开发中少走弯路,精准落地从简单原型到生产级复杂系统的各类需求。
