LangChain与LangGraph:链式结构与有状态图结构的抉择
LangChain 提供线性流程链;LangGraph 则支持带状态的分支工作流。文中给出了两者的简单示例,以及帮助你判断应用所需类型的简易方法。
如果你正在涉足人工智能开发,有两个名字随处可见:
LangChain 和 LangGraph。
乍看之下,它们似乎可以互换使用。它们是相同的工具吗?需要同时学习这两个吗?又该如何决定哪个更适合你的项目呢?
让我们通过一个简单的例子来分析。
什么是 LangChain?
可以把LangChain 想象成用于构建人工智能应用程序的工具箱。
它提供了现成的组件,帮助你使用大语言模型,并将它们与其他资源连接起来,比如:
- 提示词
- 大语言模型
- 工具
- API
- 文档
- 向量数据库
- 检索工具
假设你想打造一个基础的人工智能辅导系统。
其工作流程可能如下所示:
Student Question
↓
Prompt
↓
LLM
↓
Answer
LangChain 让构建这类流程变得相当简单。
简单的 LangChain 示例
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini")prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful programming teacher."),
("human", "{question}")
])chain = prompt | llmresponse = chain.invoke({
"question": "What is recursion?"
})print(response.content)
这里的逻辑简单且线性:
问题 → 提示词 → 大语言模型 → 答案
正是这类直线型流程,LangChain 才能表现出色。
什么是 LangGraph?
现在假设你的智能辅导系统需要处理多轮交互。
你不仅希望它给出答案,还希望它:
- 回答学生的提问。
- 评估该答案是否合格。
- 如果合格,则停止。
- 如果不合格,则进行修改。
- 重新检查修改后的答案。
现在的流程更像是这样:
Student Question
↓
Generate Answer
↓
Check Answer
↙ ↘
Good Bad
↓ ↓
Finish Improve
↓
Check Again
这正是LangGraph被设计用来处理的场景。
LangGraph 允许你设计包含以下元素的工作流:
- 多个步骤
- 条件分支
- 循环结构
- 共享状态
- 决策点
- 人工介入审批流程
- 更复杂的智能体行为
一个简单的 LangGraph 示例
首先,你需要定义应用程序需要跟踪的状态。
from typing import TypedDict
class State(TypedDict):
question: str
answer: str
good: bool
该状态用于记录三类信息:
question
answer
good
之后,你可以在图中构建各个步骤,即所谓的节点。
生成答案
def generate_answer(state):
response = llm.invoke(
f"Answer this question simply:\n{state['question']}"
) return {
"answer": response.content
}
检查答案
def check_answer(state):
response = llm.invoke(
f"""
Is this answer good? Question:
{state['question']} Answer:
{state['answer']} Reply only YES or NO.
"""
) return {
"good": response.content.strip().upper() == "YES"
}
接着,你需要定义一个决策函数:
def decision(state):
if state["good"]:
return "finish" return "improve"
关键在于,LangGraph 负责将这些节点连接起来,并决定下一个要运行的节点是哪个。
如果检查失败,流程可以回到优化节点并重新执行该检查。
那么主要区别是什么?
最简单的区分方式如下:
LangChain = 构建模块
LangChain提供了用于组装AI应用程序的各个组件。
例如:
LLM
Prompt
Retriever
Tool
Vector Database
↓
LangChain
LangGraph = 工作流
LangGraph负责管理这些组件之间的交互方式及顺序。
Start
↓
Generate
↓
Check
↙ ↘
Good Bad
↓ ↓
Finish Improve
↓
Check
LangChain和LangGraph是竞争对手吗?
并非如此。
它们被设计为可以并行使用。
例如:
LangGraph
↓
┌──────────┴──────────┐
↓ ↓
LangChain LangChain
Retriever Tools
↓ ↓
└──────────┬──────────┘
↓
LLM
LangChain提供构建模块和工具,而LangGraph则负责协调围绕这些模块的整个工作流。
何时应该使用LangChain?
当您的应用程序遵循相对线性的流程时,LangChain是理想的选择。
典型应用场景包括:
- 基础聊天机器人
- 基于RAG的应用程序
- 回答PDF中的问题
- 在文档中搜索内容
- 由大语言模型驱动的简单应用
- 调用简单工具的功能
此类应用的基本流程可能如下所示:
User
↓
Retrieve Information
↓
LLM
↓
Answer
对于这类架构,构建完整的图结构通常属于过度设计。
何时应该使用LangGraph?
当您的应用程序需要分支逻辑和决策能力,而不仅仅是固定的步骤序列时,LangGraph才显得十分有用。
具体应用场景包括:
- 自主型AI智能体
- 包含多个步骤的工作流
- 由多个智能体协同工作的系统
- 需要人类介入的流程
举个例子,想象一个结构如下的AI辅导系统:
Student asks question
↓
Analyze level
↓
Generate explanation
↓
Give quiz
↓
Check answer
↓
Correct?
↙ ↘
YES NO
↓ ↓
Next topic Explain again
正是这种分支处理和状态保持能力,让LangGraph展现出独特优势。
最简单的类比
想象在建造房屋。
LangChain相当于你的工具箱。
它会提供以下物品:
砖块、工具、材料以及各种组件。
LangGraph则相当于建筑蓝图。
它规定了施工顺序:
打地基 → 筑墙壁 → 安装屋顶 → 检查成果 → 若有问题则返回修正。
简而言之:
LangChain帮助你收集并组装各个部分。
LangGraph 能帮助你管理这一流程。
核心总结
不应将 LangChain 和 LangGraph 视为互不相关的工具,而应将其视为同一技术框架中的两层结构。
AI Application
↓
LangGraph
(Workflow / Logic)
↓
LangChain
(Tools / Components)
↓
LLM
如果你的使用场景较为简单,仅使用 LangChain 就很可能满足需求。
一旦你的应用需要状态跟踪、条件逻辑、循环处理或复杂的智能体行为,LangGraph 才是更合适的选择。
不过在许多实际生产系统中,这两者会被结合使用。
需要记住的规则是:
LangChain 负责构建各个组件,而 LangGraph 则负责连接这些组件并控制整体流程。