LangChain vs LangGraph:如何选择合适的 AI 框架!
Source: Dev.to
为什么此比较重要 – LangChain vs LangGraph
我构建实用的 LLM 驱动软件,看到出现了两种模式:直接的线性流水线和有状态的代理式工作流。问题“LangChain vs LangGraph”并非学术探讨;它决定了架构、维护方式以及系统随时间的推理方式。
当我说“LangChain vs LangGraph”时,我指的是比较两种不同的设计哲学:
- LangChain – 为线性序列优化:接受输入,按顺序运行一次或多次 LLM 调用,存储或返回结果。
- LangGraph – 为图结构优化:节点、边、循环,以及跨多步的持久状态。
LangChain
核心概念
- Prompt templates – 可复用的模板,接受变量并生成一致的 LLM 输入。
- LLM‑agnostic connectors – 可轻松在 OpenAI、Anthropic、Mistral、Hugging Face 等模型之间切换。
- Chains – 核心抽象:组合多个步骤,使每个输出喂给下一个。
- Memory – 短期或长期的对话上下文,对有状态聊天有用,但相较完整状态机仍受限。
- Agents and tools – 让模型以结构化方式调用 API、计算器或外部服务。
何时使用 LangChain
- 原型化提示、构建简单的 RAG 系统,或创建从向量库读取并返回单一响应的问答流水线。
- 文本转换流水线(摘要、翻译、信息抽取)。
- 单轮用户交互,如客服回复。
- 执行向量库检索并返回单一合成答案的基础 RAG 系统。
LangChain 让开发者快速提升生产力。它提供即插即用的组件——提示模板、检索器和链组合器——让你无需自行构建编排原语即可快速交付。
LangGraph
核心概念
- Nodes – 离散任务:调用 LLM、从数据库获取、执行网页搜索或调用摘要器。
- Edges – 定义条件转移、并行分支或回环路径。
- State – 在节点之间演化的动态上下文:消息、情景记忆和检查点。
- Decision nodes – 原生支持条件逻辑和路由到专门的代理。
LangGraph 将应用视为状态机。节点可以循环、回访早前步骤,并执行多轮工具调用。这使得反思、迭代检索或逐步细化答案等代理行为成为可能。
何时使用 LangGraph
- 可循环直至满足退出条件的多步决策。
- 根据上下文将查询路由到专门的代理。
- 跨多次 LLM 调用和用户交互的持久状态。
- 复杂的工具使用,包括多轮网页搜索、摘要以及外部来源的聚合。
示例:一个邮件草稿代理会检索用户偏好、查询日历、起草邮件、请求澄清并迭代细化草稿,这自然映射到 LangGraph。
实用比较检查表
| 方面 | LangChain | LangGraph |
|---|---|---|
| 工作流风格 | 线性且顺序 | 循环的、基于图的并带有循环 |
| 记忆 | 受限的对话记忆 | 丰富的、跨节点和会话的持久状态 |
| 分支 | 简单分支,一次性工具调用 | 内置条件边、循环、检查点 |
| 理想使用场景 | 简单聊天机器人、RAG、类似 ETL 的 LLM 流水线 | 多代理系统、自治代理行为、长期运行的工作流 |
| 人类在环 | 可能,但非原生 | 一流的检查点和人类在环模式 |
在权衡“LangChain vs LangGraph”时,需考虑的不仅是当前需求,还要预估未来的复杂度。如果应用可能演化为多代理编排或需要持久状态与重试,从 LangGraph 起步可以避免后期重构。
示例:使用 LangChain 的 RAG(线性)
- 安装所需的包并配置 API 密钥。
- 创建接受
objective、topic等变量的提示模板。 - 通过 Hugging Face、OpenAI 或其他提供商初始化 LLM 或本地模型连接器。
- 将文档存入向量数据库并创建检索器。
- 构建检索增强生成链,检索上下文并合成答案。
这种模式保持线性:检索相关文档 → 生成答案。它适用于多数 FAQ 机器人、文档助理和单通道流水线。代码简洁,易于迭代。
# Example LangChain RAG pipeline
from langchain import PromptTemplate, LLMChain
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
# 1. Prompt template
prompt = PromptTemplate(
input_variables=["question", "context"],
template="Answer the question based on the context:\n\nContext: {context}\n\nQuestion: {question}"
)
# 2. LLM
llm = OpenAI(model_name="gpt-4")
# 3. Chain
chain = LLMChain(llm=llm, prompt=prompt)
# 4. Retrieval
vector_store = FAISS.load_local("my_index")
retriever = vector_store.as_retriever()
def answer_question(question: str):
docs = retriever.get_relevant_documents(question)
context = "\n".join([doc.page_content for doc in docs])
return chain.run({"question": question, "context": context})
示例:使用 LangGraph 的 RAG(基于图)
- 从 URL 或文档加载静态内容到向量库。
- 创建图节点:
retrieve、web_search、decision、generate。 - 定义状态:跟踪检索结果是否已回答用户、存储中间摘要、记录工具输出。
- 用条件边连接节点:
- 若本地检索失败 → 跳转到网页搜索。
- 若网页搜索结果噪声大 → 提出澄清问题。
- 根据需要回环。
- 运行图直至满足停止条件,然后返回最终合成。
这种模式支持多轮工具使用和代理式推理。测试中,询问 LangGraph 代理“本月最新的 AI 发展”时,如果本地知识陈旧,会触发网页搜索节点,获取、摘要并在确认足够后返回答案。
# Example LangGraph workflow (pseudo‑code)
from langgraph import Graph, Node, Edge, State
# Nodes
def retrieve(state: State):
docs = vector_store.as_retriever().get_relevant_documents(state["question"])
state["retrieved"] =