LangGraph 的核心是通过**状态机 + 节点(Node) + 工具(Tool)**来编排智能体流程,你可以把 Skills 理解为“封装好的工具或可复用的任务流”,下面是一套可落地的集成方案。
一、核心思路:Skill → LangGraph 可调用单元
在 LangGraph 中,一个 Skill 通常可以转化为以下几种形式:
- 工具(Tool):独立函数,比如“网页信息提取”“代码生成”等原子能力。
- 子图(Subgraph):多步任务流,比如“E2E 测试全流程”“技术调研报告生成”。
- 状态更新函数:修改智能体状态,比如“保存中间结果”“切换任务优先级”。
二、标准集成步骤(以 Browser Agent Skill 为例)
1. 封装 Skill 为 LangGraph Tool
把 Skill 的逻辑包装成 @tool 装饰的函数,让智能体可以直接调用。
from langchain.tools import tool
@tool
def browser_agent_skill(task: str) -> str:
"""
浏览器代理技能:根据自然语言指令操作浏览器
示例:"测试结账流程,添加2个商品到购物车并验证数量"
"""
# 这里接入开源 Browser Agent Skill 的实现(如 Vercel Agent Browser)
from agent_browser import run_browser_task
return run_browser_task(task)
2. 在 LangGraph 中注册工具
将封装好的 Tool 注入智能体的工具集,让它在决策时可以选择使用。
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
# 定义状态结构
class AgentState:
messages: list
next_step: str
# 注册工具
tools = [browser_agent_skill]
tool_node = ToolNode(tools)
# 构建图
graph = StateGraph(AgentState)
graph.add_node("agent", agent_node) # 你的核心智能体节点
graph.add_node("tools", tool_node)
3. 设计 Skill 触发逻辑
在智能体的决策节点中,根据当前任务的意图,决定是否调用对应的 Skill。
def agent_node(state: AgentState):
messages = state.messages
last_message = messages[-1].content
# 检测是否需要调用浏览器代理技能
if "测试结账流程" in last_message or "网页操作" in last_message:
return {"next_step": "tools", "messages": messages + [{"role": "system", "content": "调用 browser_agent_skill"}]}
# 其他逻辑
return {"next_step": END, "messages": messages + [{"role": "assistant", "content": "任务完成"}]}
4. 处理 Skill 返回结果
工具节点执行后,将结果回写到状态中,让智能体继续后续流程。
def tool_node(state: AgentState):
tool_output = state["messages"][-1]["content"]
return {"messages": state["messages"] + [{"role": "tool", "content": tool_output}], "next_step": "agent"}
三、高级集成:Skill 作为子图(Subgraph)
对于复杂的多步 Skill(如技术调研全流程),可以把它封装成一个子图,再嵌入主图。
# 定义子图:技术调研 Skill
research_subgraph = StateGraph(AgentState)
research_subgraph.add_node("search", search_node) # 多源搜索
research_subgraph.add_node("summarize", summarize_node) # 结果汇总
research_subgraph.add_edge("search", "summarize")
research_subgraph.add_edge("summarize", END)
# 在主图中注册子图
graph.add_node("research_skill", research_subgraph.compile())
# 触发逻辑
def agent_node(state: AgentState):
if "调研 AI 客服框架" in state["messages"][-1].content:
return {"next_step": "research_skill", "messages": state["messages"]}
return {"next_step": END, "messages": state["messages"]}
四、关键技巧与避坑
- Skill 标准化:遵循 Agent Skills 规范(
SKILL.md+ 脚本),让 Skill 可以跨框架复用。 - 状态管理:确保 Skill 的输入/输出都通过 LangGraph 的状态传递,避免全局变量。
- 错误处理:在工具节点中加入异常捕获,避免单个 Skill 崩溃导致整个智能体挂掉。
- 调试与监控:用 LangSmith 跟踪 Skill 的调用链路,定位性能瓶颈。