LangChain vs LangGraph:如何选择合适的 AI 框架!

发布: (2025年12月4日 GMT+8 16:07)
7 min read
原文: Dev.to

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。

实用比较检查表

方面LangChainLangGraph
工作流风格线性且顺序循环的、基于图的并带有循环
记忆受限的对话记忆丰富的、跨节点和会话的持久状态
分支简单分支,一次性工具调用内置条件边、循环、检查点
理想使用场景简单聊天机器人、RAG、类似 ETL 的 LLM 流水线多代理系统、自治代理行为、长期运行的工作流
人类在环可能,但非原生一流的检查点和人类在环模式

在权衡“LangChain vs LangGraph”时,需考虑的不仅是当前需求,还要预估未来的复杂度。如果应用可能演化为多代理编排或需要持久状态与重试,从 LangGraph 起步可以避免后期重构。

示例:使用 LangChain 的 RAG(线性)

  1. 安装所需的包并配置 API 密钥。
  2. 创建接受 objectivetopic 等变量的提示模板。
  3. 通过 Hugging Face、OpenAI 或其他提供商初始化 LLM 或本地模型连接器。
  4. 将文档存入向量数据库并创建检索器。
  5. 构建检索增强生成链,检索上下文并合成答案。

这种模式保持线性:检索相关文档 → 生成答案。它适用于多数 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(基于图)

  1. 从 URL 或文档加载静态内容到向量库。
  2. 创建图节点:retrieveweb_searchdecisiongenerate
  3. 定义状态:跟踪检索结果是否已回答用户、存储中间摘要、记录工具输出。
  4. 用条件边连接节点:
    • 若本地检索失败 → 跳转到网页搜索。
    • 若网页搜索结果噪声大 → 提出澄清问题。
    • 根据需要回环。
  5. 运行图直至满足停止条件,然后返回最终合成。

这种模式支持多轮工具使用和代理式推理。测试中,询问 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"] =
Back to Blog

相关文章

阅读更多 »