LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

一、核心定位与哲学对比

两者的核心差异在于它们解决的核心问题不同,下表清晰地展示了它们的定位:

维度 LangChain LangGraph
核心理念 模块化集成与编排,将LLM视为众多工具之一进行链式调用。 状态驱动的图工作流,将应用逻辑建模为具有状态管理能力的有向图。
核心抽象 链(Chain)代理(Agent)检索器(Retriever) 等组件。 节点(Node)边(Edge) 构成的状态图(StateGraph)
状态管理 状态通常内嵌于链的调用序列中,跨轮次状态管理能力较弱。 内置、显式的状态管理,通过State对象贯穿整个图执行过程。
适用场景 单轮次、任务导向的自动化场景(如RAG问答、文本总结、数据提取)。 多轮次、有状态、复杂决策与多Agent协作场景(如复杂客服对话、游戏NPC、多步骤审批流)。
比喻 AI的“工具库与流水线调度系统”,或“基础框架”。 LangChain的“超级大脑”或“升级版”,专注于复杂流程控制的“扩展框架”。

简而言之,LangChain为LLM应用提供了丰富的“砖块”,而LangGraph则提供了构建复杂、有状态“建筑”的蓝图和施工方法。

二、LangChain 详解:模块化与编排的艺术

LangChain的核心价值在于其模块化设计,它将构建LLM应用所需的常见功能抽象为可复用的组件,并通过“链”将这些组件编排起来。

1. 核心组件:

  • 模型I/O(Models I/O): 提供与各种LLM(如OpenAI、Anthropic)和聊天模型交互的统一接口。
  • 检索(Retrieval): 核心是RAG(检索增强生成) 能力,包括文档加载、文本分割、向量化存储与检索。
  • 代理(Agents): LLM作为“大脑”,根据用户输入和工具描述动态决定执行步骤和调用工具。这是LangChain实现复杂推理的关键。
  • 链(Chains): 将多个组件(或多个LLM调用)按预定顺序组合成一个完整的工作流,例如 LLMChainSequentialChain
  • 记忆(Memory): 提供短期(如对话缓冲区)和长期记忆机制,用于在对话中保持上下文。

2. 应用场景与代码示例:
一个典型的应用是基于知识库的问答系统(RAG)。以下代码展示了使用LangChain快速构建一个RAG链的简化流程:

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

# 1. 加载并分割文档
loader = TextLoader("knowledge_base.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)

# 2. 创建向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents=docs, embedding=embeddings)
retriever = vectorstore.as_retriever()

# 3. 定义LLM和提示词
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("""
请基于以下上下文回答问题:
{context}
问题:{input}
""")

# 4. 组合成检索链
document_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, document_chain)

# 5. 执行查询
response = rag_chain.invoke({"input": "什么是LangChain的核心抽象?"})
print(response["answer"])

代码演示了LangChain通过链式组合加载器、分割器、向量库、检索器和LLM,快速构建一个功能完整的RAG应用,体现了其模块化集成的优势。

三、LangGraph 详解:基于状态图的工作流引擎

LangGraph是构建在LangChain之上的框架,引入了循环(cycles)和状态(state) 的概念,特别适合需要多步决策和长期记忆的复杂应用。其核心是定义一个StateGraph,它由处理节点和决定流向的边构成。

1. 核心概念:

  • 状态(State): 一个贯穿整个图执行的字典对象,所有节点都读取并更新这个共享状态。这是实现多轮对话和复杂流程的基石。
  • 节点(Node): 一个处理函数,接收当前State,执行任务(如调用LLM、运行工具),并返回更新后的State
  • 边(Edge): 定义节点之间的流转条件,可以是固定的(start -> node_a),也可以是由LLM或条件函数动态决定的(node_a -> node_bnode_a -> end)。

2. 应用场景与代码示例:
一个典型的场景是带工具的智能客服Agent,它需要根据用户意图动态决定调用查询、转人工或结束对话。以下是一个高度简化的示意图:

from typing import TypedDict, Annotated
import operator
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults

# 定义贯穿整个图的状态结构
class AgentState(TypedDict):
    question: str  # 用户问题
    intent: str    # 分析出的意图
    search_result: Annotated[list, operator.add]  # 累积的搜索结果
    answer: str    # 最终回复

# 初始化组件
llm = ChatOpenAI(model="gpt-4o")
search_tool = TavilySearchResults()

# 定义节点函数
def analyze_intent(state: AgentState):
    """节点1:分析用户意图"""
    analysis_prompt = f"分析用户问题'{state['question']}'的意图。如果是复杂查询或需要最新信息,返回'need_search',否则返回'direct_answer'。"
    msg = llm.invoke(analysis_prompt)
    state["intent"] = msg.content.strip()
    return state

def search_web(state: AgentState):
    """节点2:执行网络搜索"""
    result = search_tool.invoke({"query": state["question"]})
    state["search_result"].append(result)
    return state

def generate_answer(state: AgentState):
    """节点3:生成最终答案"""
    if state["intent"] == "need_search":
        context = "
".join(state["search_result"])
        answer_prompt = f"基于以下信息回答问题:{context}
问题:{state['question']}"
    else:
        answer_prompt = f"直接回答问题:{state['question']}"
    msg = llm.invoke(answer_prompt)
    state["answer"] = msg.content
    return state

def route_after_intent(state: AgentState):
    """条件边:根据意图路由"""
    if state["intent"] == "need_search":
        return "search_node"
    else:
        return "answer_node"

# 构建状态图
workflow = StateGraph(AgentState)
workflow.add_node("intent_node", analyze_intent)
workflow.add_node("search_node", search_web)
workflow.add_node("answer_node", generate_answer)

# 设置边
workflow.set_entry_point("intent_node")
workflow.add_conditional_edges(
    "intent_node",
    route_after_intent, # 这是一个条件判断函数
    {"search_node": "search_node", "answer_node": "answer_node"}
)
workflow.add_edge("search_node", "answer_node")
workflow.add_edge("answer_node", END)

# 编译并运行图
app = workflow.compile()
initial_state = {"question": "今天北京和上海的天气怎么样?", "intent": "", "search_result": [], "answer": ""}
result = app.invoke(initial_state)
print(result["answer"])

这段代码展示了LangGraph如何将复杂的、有条件分支的工作流建模为一个有状态图。AgentState定义了共享数据结构,conditional_edges允许LLM动态决定流程走向,这是LangChain标准代理能力的强化和显式化。

四、如何选择与协同使用

选择哪个框架取决于具体的应用需求:

  • 选择 LangChain 当:你需要快速集成各种外部工具和数据源,构建一个相对直接、线性的任务流水线。例如,构建一个文档总结工具、一个单次调用的数据提取脚本,或者一个基础的聊天机器人。
  • 选择 LangGraph 当:你的应用涉及多轮交互、复杂的状态维护、基于条件的流程分支或多Agent团队协作。例如,构建一个能处理复杂订票流程的对话机器人、一个模拟辩论的多Agent系统,或一个需要反复验证和纠错的数据分析管道。

在实际项目中,两者并非互斥,而是协同工作的理想组合。一种常见的混合架构模式是:使用LangGraph作为顶层的、宏观的工作流编排器和状态管理器,而在其每个图节点内部,则使用成熟的LangChain组件(如RAG链、工具调用等)来执行具体的子任务。这样既能利用LangChain丰富的生态和模块化能力,又能享受到LangGraph带来的强大流程控制和状态管理优势,共同构建下一代复杂、可靠的智能应用。


参考来源

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐