在 LangGraph 中集成 Skills 增强智能体能力

0 阅读3分钟

LangGraph 的核心是通过**状态机 + 节点(Node) + 工具(Tool)**来编排智能体流程,你可以把 Skills 理解为“封装好的工具或可复用的任务流”,下面是一套可落地的集成方案。


一、核心思路:Skill → LangGraph 可调用单元

在 LangGraph 中,一个 Skill 通常可以转化为以下几种形式:

  1. 工具(Tool):独立函数,比如“网页信息提取”“代码生成”等原子能力。
  2. 子图(Subgraph):多步任务流,比如“E2E 测试全流程”“技术调研报告生成”。
  3. 状态更新函数:修改智能体状态,比如“保存中间结果”“切换任务优先级”。

二、标准集成步骤(以 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"]}

四、关键技巧与避坑

  1. Skill 标准化:遵循 Agent Skills 规范(SKILL.md + 脚本),让 Skill 可以跨框架复用。
  2. 状态管理:确保 Skill 的输入/输出都通过 LangGraph 的状态传递,避免全局变量。
  3. 错误处理:在工具节点中加入异常捕获,避免单个 Skill 崩溃导致整个智能体挂掉。
  4. 调试与监控:用 LangSmith 跟踪 Skill 的调用链路,定位性能瓶颈。