Skip to content

07.1 — LangChain 与 LangGraph

定位: 生态最丰富的 Agent 框架——深入理解 LangChain 的 Agent 系统和 LangGraph 的状态图 Agent 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 实现题(用 LangChain 构建 Agent)、对比题(LangChain vs LangGraph)、框架理解题


一、这是什么?为什么需要它?

是什么

LangChain 是一个构建 LLM 应用的框架,提供了一套完整的 Agent 构建工具。LangGraph 是 LangChain 的子框架,用状态图(StateGraph)来构建可控的 Agent 工作流。

为什么需要 LangChain/LangGraph?

不造轮子直接用框架的好处:
  700+ 工具集成(搜索、数据库、API...)
  标准化的 Agent 接口
  丰富的 Streamlit/回调支持
  社区成熟,问题容易查到

LangGraph 解决了 LangChain 的问题:
  LangChain Agent 是"循环调用",难以精细控制
  LangGraph 用状态图让 Agent 行为可预测、可调试

二、原理拆解

2.1 LangChain Agent 系统

python
from langchain.agents import create_react_agent, AgentExecutor
from langchain.tools import Tool

# 1. 定义工具
tools = [
    Tool(
        name="search",
        func=search_function,
        description="搜索知识库"
    ),
    Tool(
        name="calculator",
        func=lambda x: eval(x),
        description="执行数学计算"
    ),
]

# 2. 创建 Agent
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=5,
    handle_parsing_errors=True,  # LLM 输出格式错误时自动处理
)

# 3. 运行
result = agent_executor.invoke({"input": "搜索 AI Agent 的最新进展"})

核心组件

组件作用说明
Tool工具封装统一的工具接口(name + func + description)
Agent决策引擎决定调用什么工具、何时结束
AgentExecutor执行器管理 Agent 的循环执行
Memory记忆对话历史管理
Callback回调监控、日志、流式输出

2.2 LangGraph 状态图 Agent

LangGraph 将 Agent 建模为有向图,节点是操作,边是状态转移:

python
from langgraph.graph import StateGraph, State
from typing import TypedDict, Literal

# 1. 定义状态
class AgentState(TypedDict):
    messages: list
    next_step: str
    tool_calls: list

# 2. 定义图中的节点(操作)
def call_llm(state: AgentState) -> AgentState:
    """LLM 推理节点"""
    response = llm.invoke(state["messages"])
    state["messages"].append(response)
    # 判断是否需要调用工具
    if response.tool_calls:
        state["next_step"] = "tools"
    else:
        state["next_step"] = "end"
    return state

def call_tool(state: AgentState) -> AgentState:
    """工具执行节点"""
    for tool_call in state["messages"][-1].tool_calls:
        result = execute_tool(tool_call)
        state["messages"].append({"role": "tool", "content": result})
    state["next_step"] = "continue"
    return state

# 3. 构建图
graph = StateGraph(AgentState)

# 添加节点
graph.add_node("llm", call_llm)
graph.add_node("tools", call_tool)

# 添加边——条件边让控制流可预测
graph.add_conditional_edges(
    "llm",
    lambda state: state["next_step"],
    {
        "tools": "tools",  # 需要调用工具 → 去工具节点
        "end": "__end__"   # 不需要 → 结束
    }
)
graph.add_edge("tools", "llm")  # 工具执行完回到 LLM

# 4. 编译和运行
app = graph.compile()
result = app.invoke({
    "messages": [{"role": "user", "content": "分析特斯拉2025年财报"}],
    "next_step": "continue",
    "tool_calls": []
})

2.3 LangGraph 核心优势

特性LangChain AgentLangGraph Agent
控制流LLM 完全自主开发者可干预
循环控制固定 max_iterations自定义循环条件
状态可见黑盒每步状态可见
分支逻辑条件边支持复杂分支
多 Agent有限原生支持

三、图解全景

┌─────────────────────────────────────────────────────────┐
│          LangGraph Agent 状态图                          │
│                                                        │
│                 ┌──────────┐                           │
│                 │  开始     │                           │
│                 └────┬─────┘                           │
│                      │                                 │
│                      ▼                                 │
│                 ┌──────────┐                           │
│          ┌──────│ LLM 推理  │──────┐                   │
│          │      └────┬─────┘      │                   │
│          │           │            │                   │
│    需要工具      ┌────┴────┐  不需要工具               │
│          │       │         │        │                 │
│          ▼       ▼         ▼        ▼                 │
│    ┌──────────┐            ┌──────────┐               │
│    │ 执行工具  │            │  结束     │               │
│    └────┬─────┘            └──────────┘               │
│         │                                             │
│         └────────── 回到 LLM ──────────→               │
│                                                        │
│  关键特性:                                              │
│  - 每个节点都被检查                                    │
│  - 边可以有条件                                        │
│  - 状态可序列化                                        │
│  - 支持人机交互节点                                    │
└─────────────────────────────────────────────────────────┘

四、实战验证

python
# LangGraph 实现带人工审核的 Agent

from langgraph.graph import StateGraph
from typing import TypedDict

class ApprovalState(TypedDict):
    user_input: str
    llm_output: str
    approved: bool

def generate(state: ApprovalState) -> ApprovalState:
    """生成——Agent 的输出"""
    state["llm_output"] = llm.invoke(state["user_input"])
    return state

def need_approval(state: ApprovalState) -> bool:
    """判断是否需要人工审核"""
    return search_tool.has_sensitive_content(state["llm_output"])

def human_approval(state: ApprovalState) -> ApprovalState:
    """人工审核节点"""
    print(f"需要审核: {state['llm_output']}")
    state["approved"] = input("批准?(y/n): ") == "y"
    return state

graph = StateGraph(ApprovalState)
graph.add_node("generate", generate)
graph.add_node("approve", human_approval)

graph.add_conditional_edges(
    "generate",
    need_approval,
    {True: "approve", False: "__end__"}
)
graph.set_entry_point("generate")

app = graph.compile()
app.invoke({"user_input": "生成一份报告"})

五、面试视角

追问答案要点
LangChain 和 LangGraph 的关系?LangChain 是基础框架(工具、LLM 封装、链),LangGraph 是它的子框架,用状态图构建 Agent,提供更精细的控制。可以理解为 LangGraph 是 LangChain Agent 的升级版
LangGraph 状态图的优势?可控性(开发者可以干预 Agent 的决策)、可观察性(每步状态可见)、灵活性(条件边支持复杂分支)、可序列化(状态可保存和恢复)
LangChain Agent 的局限性?循环控制简单(只能设 max_iterations)、行为黑盒(很难调试为什么走到某一步)、分支逻辑弱(只能 linear 或简单的 if-else)
什么时候用 LangChain Agent,什么时候用 LangGraph?简单场景用 LangChain Agent(3 步以内的工具调用),复杂场景用 LangGraph(需要多步推理、条件分支、人工审核)

📚 相关链接

  • **AutoGen** — 多 Agent 框架
  • **CoT 与 ReAct** — LangChain Agent 的默认模式
  • ← 返回 **Agent框架索引**

Knowledge4J — Java 知识库