菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > LangGraph项目集成开源Skills精选指南:权威榜单与实战教程
进阶教程

LangGraph项目集成开源Skills精选指南:权威榜单与实战教程

2026-05-28
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

将开源技能集成到LangGraph项目,需先根据技能类型封装为工具或子图,再利用状态机编排调

将开源技能整合进LangGraph项目,核心在于标准化封装与流程编排。关键在于将各类开源技能统一封装为LangGraph可调用的“工具”或“子图”,再利用其状态机模型来调度执行逻辑。下面这套从分类到实施的完整流程与代码示例,将为你提供清晰的实现路径。

把开源 Skills 集成到 LangGraph 项目

一、集成前的核心准备

在开始编码前,明确以下两点能显著提升集成效率,避免后续返工。

1. 明确开源 Skill 的类型(先分类,再适配)

开源技能的实现方式多样,需根据其行为模式进行分类,以确定最合适的集成策略:

Skill 类型 典型示例 集成形式
原子函数型 Anthropic 官方技能库中的“文档解析”“代码生成” 封装为 LangChain Tool
流程任务型 Superpowers 中的“TDD 开发流程”“Git 工作流” 封装为 LangGraph 子图(Subgraph)
浏览器自动化型 Vercel Agent Browser、Qoder 的 /browser 技能 封装为带外部依赖的 Tool
数据处理型 Awesome Agent Skills 中的“结构化数据汇总” 封装为 Tool + 状态处理函数

2. 环境依赖安装

确保基础环境配置到位,这是后续所有操作的前提。

# 核心依赖
pip install langgraph langchain langchain-core langchain-community
# 可选:浏览器自动化/工具调用依赖
pip install playwright python-dotenv
# 浏览器操作
playwright install chrome # 安装浏览器驱动

二、通用集成流程(以 Anthropic 开源 Skill 为例)

我们以Anthropic技能库中的一个浏览器测试技能为例,演示最通用的集成路径。

步骤 1:下载并解析开源 Skill

首先获取技能源码,并分析其核心功能接口。

# 克隆开源技能库
git clone https://github.com/anthropics/skills.git
cd skills

技能目录通常包含 SKILL.md(技能元数据)和 main.py(核心逻辑)。你需要从中提取关键功能函数,例如“浏览器自动化测试”的核心操作逻辑。

步骤 2:封装开源 Skill 为 LangChain Tool

这是最基础的集成方式。将技能的核心函数包装成标准的LangChain Tool,使其能被LangGraph直接调用。

from langchain.tools import tool
from typing import Optional

# 1. 引入开源 Skill 的核心逻辑(这里模拟 Anthropic 的浏览器测试 Skill)
# 实际使用时替换为你下载的开源 Skill 代码
def run_browser_test(task: str, screenshot: bool = True) -> str:
    """开源 Skill 核心逻辑:执行浏览器自动化测试
    :param task: 自然语言测试指令(如“添加2个商品到购物车并验证数量”)
    :param screenshot: 是否生成截图
    :return: 测试结果 + 截图路径(如有)
    """
    from playwright.sync_api import sync_playwright
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        page.goto("https://你的测试网站.com")
        # 这里是开源 Skill 的核心操作逻辑(省略具体步骤)
        result = f"测试完成:{task},截图已保存至 ./test-screenshot.png"
        browser.close()
    return result

# 2. 封装为 LangChain Tool(LangGraph 可直接调用)
@tool
def anthropic_browser_test_skill(task: str,
                                 screenshot: Optional[bool] = True) -> str:
    """封装后的开源 Skill:浏览器自动化测试
    参数说明:
    - task: 自然语言测试指令(必填)
    - screenshot: 是否生成测试截图(默认True)
    """
    try:
        return run_browser_test(task, screenshot)
    except Exception as e:
        return f"技能执行失败:{str(e)}"

步骤 3:定义 LangGraph 状态与智能体节点

状态(State)是LangGraph数据流转的核心。接下来定义状态结构并设置决策逻辑。

from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from typing import List, TypedDict

# 1. 定义智能体状态(必须包含 messages,其他字段按需扩展)
class AgentState(TypedDict):
    messages: List[HumanMessage | AIMessage | ToolMessage]  # 消息流(核心)
    skill_output: Optional[str]  # 存储 Skill 执行结果
    next_node: str  # 控制流程跳转

# 2. 定义智能体决策节点(决定是否调用 Skill)
def agent_decision_node(state: AgentState) -> AgentState:
    """智能体决策逻辑:根据用户输入判断是否调用开源 Skill"""
    # 获取最后一条用户消息
    last_message = state["messages"][-1]
    user_input = last_message.content.lower()
    # 触发条件:包含“浏览器测试”“购物车测试”等关键词时调用 Skill
    if any(keyword in user_input for keyword in ["浏览器测试", "购物车测试", "e2e测试"]):
        # 告诉智能体下一步调用 Tool 节点
        state["next_node"] = "tool_node"
        # 追加调用指令到消息流
        state["messages"].append(AIMessage(content="将调用浏览器测试技能执行你的指令"))
    else:
        # 不调用 Skill,直接结束
        state["next_node"] = END
        state["messages"].append(AIMessage(content="你的指令无需调用技能,任务完成"))
    return state

# 3. 注册封装好的开源 Skill 为 ToolNode
# 把所有封装的开源 Skill 放入工具列表
tools = [anthropic_browser_test_skill]
# 创建 LangGraph 工具节点(自动处理 Tool 调用)
tool_node = ToolNode(tools)

# 4. 定义 Tool 执行后的结果处理节点
def tool_result_node(state: AgentState) -> AgentState:
    """处理 Skill 执行结果,更新状态"""
    # 获取 Tool 执行结果
    tool_result = state["messages"][-1].content
    # 保存结果到状态
    state["skill_output"] = tool_result
    # 处理完成后返回给智能体,结束流程
    state["next_node"] = END
    state["messages"].append(AIMessage(content=f"技能执行结果:{tool_result}"))
    return state

步骤 4:编排 LangGraph 并运行

最后,将各个节点连接成完整的工作流。

# 1. 创建状态机图
graph = StateGraph(AgentState)

# 2. 添加节点
graph.add_node("agent_decision", agent_decision_node)  # 决策节点
graph.add_node("tool_node", tool_node)  # Skill 执行节点
graph.add_node("tool_result", tool_result_node)  # 结果处理节点

# 3. 定义边(流程跳转规则)
# 起始节点 → 决策节点
graph.set_entry_point("agent_decision")
# 决策节点 → Tool 节点(需要调用 Skill 时)
graph.add_conditional_edges("agent_decision",
                            lambda x: x["next_node"],  # 根据 next_node 决定跳转
                            {"tool_node": "tool_node", END: END})
# Tool 节点 → 结果处理节点
graph.add_edge("tool_node", "tool_result")
# 结果处理节点 → 结束
graph.add_edge("tool_result", END)

# 4. 编译图(核心步骤)
app = graph.compile()

# 5. 测试运行(调用集成的开源 Skill)
if __name__ == "__main__":
    # 输入:触发开源 Skill 的用户指令
    initial_state = AgentState(
        messages=[HumanMessage(content="用浏览器测试购物车流程:添加2个商品并验证数量")],
        skill_output=None,
        next_node=""
    )
    # 运行图
    result = app.invoke(initial_state)
    # 输出结果
    print("=== 最终结果 ===")
    print(result["skill_output"])
    print("=== 消息流 ===")
    for msg in result["messages"]:
        print(f"{msg.type}: {msg.content}")

三、进阶:集成流程型开源 Skill 为子图

对于Superpowers中“TDD开发流程”这类多步骤、有固定顺序的流程型技能,更适合封装为独立的子图(Subgraph),再嵌入主图。

from langgraph.graph import StateGraph

# 1. 定义子图(封装流程型开源 Skill)
def create_tdd_skill_subgraph():
    """封装 Superpowers 的 TDD 开发流程 Skill 为子图
    流程:需求分析 → 编写测试用例 → 编写代码 → 运行测试 → 总结
    """
    subgraph = StateGraph(AgentState)

    # 子图节点:对应开源 Skill 的每一步
    def tdd_analysis_node(state: AgentState) -> AgentState:
        # 开源 Skill 逻辑:需求分析
        state["messages"].append(AIMessage(content="TDD 第一步:需求分析完成"))
        state["next_node"] = "tdd_write_test"
        return state

    def tdd_write_test_node(state: AgentState) -> AgentState:
        # 开源 Skill 逻辑:编写测试用例
        state["messages"].append(AIMessage(content="TDD 第二步:测试用例编写完成"))
        state["next_node"] = "tdd_write_code"
        return state
    # 省略其他节点(编写代码、运行测试)...

    # 添加子图节点并编排流程
    subgraph.add_node("tdd_analysis", tdd_analysis_node)
    subgraph.add_node("tdd_write_test", tdd_write_test_node)
    # ... 其他节点
    subgraph.set_entry_point("tdd_analysis")
    subgraph.add_edge("tdd_analysis", "tdd_write_test")
    # ... 其他边
    subgraph.add_edge("tdd_run_test", END)
    return subgraph.compile()

# 2. 在主图中集成子图
if __name__ == "__main__":
    # 创建主图
    main_graph = StateGraph(AgentState)
    # 注册子图(流程型开源 Skill)
    tdd_subgraph = create_tdd_skill_subgraph()
    main_graph.add_node("tdd_skill", tdd_subgraph)

    # 主图决策节点:触发子图
    def main_decision_node(state: AgentState) -> AgentState:
        if "TDD 开发" in state["messages"][-1].content:
            state["next_node"] = "tdd_skill"
        else:
            state["next_node"] = END
        return state

    # 编排主图
    main_graph.add_node("main_decision", main_decision_node)
    main_graph.set_entry_point("main_decision")
    main_graph.add_conditional_edges("main_decision",
                                     lambda x: x["next_node"],
                                     {"tdd_skill": "tdd_skill", END: END})
    main_graph.add_edge("tdd_skill", END)

    # 编译并运行
    main_app = main_graph.compile()
    initial_state = AgentState(
        messages=[HumanMessage(content="用 TDD 流程开发一个加法函数")],
        skill_output=None,
        next_node=""
    )
    result = main_app.invoke(initial_state)
    print(result["messages"])

四、关键避坑与优化技巧

  1. 状态传递要规范:所有 Skill 的输入/输出必须通过 AgentState 传递,禁止使用全局变量,否则多轮调用会出错。
  2. 异常处理不可少:在 Tool 封装时加入 try-except,避免单个开源 Skill 崩溃导致整个智能体挂掉。
  3. 技能触发条件要明确:通过关键词、意图识别(如用 LLM 解析用户输入)触发 Skill,避免误调用。
  4. 依赖隔离:不同开源 Skill 的依赖可能冲突,建议用虚拟环境(venv)或 Docker 隔离。
  5. 调试用 LangSmith:开启 LangSmith 跟踪 Skill 调用链路,定位执行中的问题:
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "你的 LangSmith API 密钥"

总结

  1. 开源 Skill 集成到 LangGraph 的核心是分类封装:原子技能→Tool,流程技能→子图。
  2. 所有 Skill 的输入/输出必须通过 LangGraph 的 State 传递,确保流程可追溯。
  3. 关键步骤:下载解析 Skill → 封装为 Tool/子图 → 编排状态机 → 测试运行。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多