一、概述
新版 LangChain 已经废弃旧版 initialize_agent、create_react_agent,推荐使用 create_agent 构建智能体。LangChain 1.0 的智能体运行时已经可以直接用于生产:多步工具调用、结构化输出、流式返回、中间件、状态持久化和人工确认都在这一层完成。
核心结论:create_agent 底层就是基于 LangGraph 封装的标准工具调用图,这张图本身就是生产级 Agent 的运行时。
create_agent:LangChain 1.0 推荐的智能体入口。图结构是标准工具循环,通过中间件、checkpointer、interrupt扩展重试、摘要、调用上限、人工审核和会话续跑,开发速度快,也能承担生产级复杂智能体- 原生 LangGraph:同一套底层图编排框架。节点、边、条件分支、终止逻辑全部自定义,适合流程拓扑本身必须定制的场景,例如多分支工作流、子图和并行编排
二、环境依赖
bash
pip install langchain langgraph langchain-openai python-dotenv
.env 配置文件:
env
OPENAI_API_KEY=你的阿里百炼密钥
OPENAI_BASE_URL=你的阿里百炼命名空间)
三、create_agent 封装版 Agent
3.1 实现原理
内部自动构建 LLM 节点 -> Tool 节点 的循环图,内置工具调用判断、消息流转、循环终止逻辑,开发者不需要手动定义 StateGraph、节点与条件边。需要持久化、重试、限流或人工确认时,在 create_agent 上加 checkpointer 和中间件即可,不必先手写一张图。
3.2 完整可运行代码
python
from dotenv import load_dotenv
import os
load_dotenv()
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool
# 初始化大模型
llm = ChatOpenAI(
model="qwen3.5-flash",
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL"),
temperature=0
)
# 自定义工具
@tool
def add_num(a: int, b: int) -> int:
"""计算两个整数相加"""
return a + b
@tool
def get_current_time():
"""获取当前时间"""
import datetime
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 一键构建智能体,底层自动生成 LangGraph
agent = create_agent(
model=llm,
tools=[add_num, get_current_time]
)
# 可视化
png = agent.get_graph().draw_mermaid_png()
#保存图
path = os.path.join(os.path.dirname(__file__), "agent_create.png")
with open(path, "wb+") as f:
f.write(png)
if __name__ == "__main__":
result = agent.invoke({"messages": [{"role": "user", "content": "计算 77 + 23"}]})
print(result["messages"][-1].content)
print("="*50)
result = agent.invoke({"messages": [{"role": "user", "content": "现在是什么时间?"}]})
print(result["messages"][-1].content)
3.3 特点
✅ 优点:代码简洁,开箱即用,自动处理工具调用循环。中间件可加上下文摘要、工具重试、报错兜底和调用次数上限;配合 checkpointer 持久化状态,配合 interrupt 做人工确认,足以支撑生产级复杂智能体
❌ 缺点:默认拓扑是标准工具循环。业务要改成完全不同的节点和路由时,再落到原生 LangGraph
四、原生 LangGraph 自定义图
4.1 实现原理
手动复刻标准 ReAct Agent 闭环:
START -> model 节点 -> 条件路由(调用工具 / 结束) -> tools 节点 -> 回到 model 节点
使用 MessagesState 维护消息状态,ToolNode 执行工具,tools_condition 做条件分支判断。
4.2 完整可运行代码
python
from dotenv import load_dotenv
import os
load_dotenv()
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import MessagesState
from langgraph.prebuilt import ToolNode, tools_condition
from langchain_openai import ChatOpenAI
from langchain.tools import tool
# 初始化大模型
llm = ChatOpenAI(
model="qwen3.5-flash",
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_BASE_URL"),
temperature=0
)
# 自定义工具
@tool
def add_num(a: int, b: int) -> int:
"""计算两个整数相加"""
return a + b
@tool
def get_current_time():
"""获取当前时间"""
import datetime
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 工具列表
tools = [add_num, get_current_time]
# 绑定工具
llm_with_tools = llm.bind_tools(tools)
# 大模型推理节点
def model_node(state: MessagesState):
response = llm_with_tools.invoke(state["messages"])
return {"messages": [response]}
# 构建状态图
workflow = StateGraph(MessagesState)
# 注册节点
workflow.add_node("model", model_node)
workflow.add_node("tools", ToolNode(tools))
# 图流转逻辑
workflow.add_edge(START, "model")
# 条件分支:有工具调用进入工具节点,否则结束
workflow.add_conditional_edges(
"model",
tools_condition,
{"tools": "tools", END: END},
)
# 工具执行完成后,重新回到模型节点继续推理
workflow.add_edge("tools", "model")
# 编译图
graph = workflow.compile()
png = graph.get_graph().draw_mermaid_png()
#保存图
path = os.path.join(os.path.dirname(__file__), "agent_langgraph.png")
with open(path, "wb+") as f:
f.write(png)
if __name__ == "__main__":
res = graph.invoke({"messages": [("user", "计算 77 + 23")]})
print(res["messages"][-1].content)
print("="*50)
res = graph.invoke({"messages": [("user", "现在是什么时间?")]})
print(res["messages"][-1].content)
4.3 特点
✅ 优点:节点、分支、状态、终止条件完全可控,流程拓扑可以按业务重画
❌ 缺点:需要理解图编排概念,代码量略多。标准工具循环用 create_agent 就能覆盖,手写这张图主要是为了看清底层,或在拓扑必须定制时使用
五、技术对比
| 对比项 | create_agent | 原生 LangGraph |
|---|---|---|
| 底层实现 | 封装好的 LangGraph | 手动构建 StateGraph |
| 图结构 | 标准工具循环,可挂中间件与持久化 | 完全自定义 |
| 节点与分支 | 循环固定,行为用中间件扩展 | 自由新增、自定义路由 |
| 适用场景 | 生产级工具智能体、多步调用、需重试/审核/续跑的 Agent | 自定义流程拓扑、子图、并行和多分支工作流 |
| 可控性 | 高,控制点在中间件、状态和中断 | 高,控制点在图本身 |
六、总结
create_agent本质就是官方封装好的 LangGraph 标准 Agent 图,LangChain 1.0 推荐用它做智能体- 工具调用类智能体,包括要上线的复杂场景,优先使用
create_agent,再用中间件、checkpointer 和interrupt补齐重试、限流、持久化和人工确认 - 只有流程拓扑本身要改成自定义节点和路由时,再用原生 LangGraph 手动编排
- 手写 LangGraph 图有助于看清
create_agent的底层循环,但上线并不依赖先手写这张图