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 Agent | LangGraph 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框架索引**