PocketFlow Agent Skills 实战:用 Markdown 技能文件在 Graph 中构建可路由的 LLM Agent

发布时间:2026/9/24 9:51:42
PocketFlow Agent Skills 实战:用 Markdown 技能文件在 Graph 中构建可路由的 LLM Agent 人工智能大模型AI Agent工作流自动化RAG【免费下载链接】PocketFlowPocket Flow: 100-line LLM framework. Let Agents build Agents!项目地址https://gitcode.com/gh_mirrors/poc/PocketFlow点击查看免费下载本指南基于 PocketFlow 官方 cookbook 中的pocketflow-agent-skills示例讲解如何在 PocketFlow 图Graph中以最轻量的方式集成Agent Skills把技能写成可复用的 Markdown 指令文件运行时按用户请求动态选择技能并注入最终 LLM Prompt。读完本文你将掌握技能文件的路由、注入与执行全流程并能基于 flow.py、nodes.py、utils.py 的源码级实现在自己的 PocketFlow 应用中落地这套模式。什么是 Agent Skills在 PocketFlow 的语境中Agent Skills 就是可复用的指令文件Markdown。它们不绑定任何特定任务而是封装一类任务该怎么做的专家指令——例如写给高管看的简报该怎么写、如何把需求拆成可执行的清单。真正的任务文本在运行时才被传入两者在 Graph 中汇合。这种设计的核心价值在于技能与代码解耦新增或调整一种能力只需增删/编辑一个.md文件无需改动 Python 逻辑运行时路由同一个 Graph 可以服务多种任务由路由节点根据用户请求挑选最合适的技能Prompt 工程可维护长指令从代码中剥离集中存放在skills/目录便于非工程师协作维护。示例仓库把技能保存在本地skills/*.md文件里整个演示只做三件事选择技能 → 注入 Prompt → 执行任务。整体流程两个节点的微型 Graph示例的完整流程是一个只有两个节点的有向图SelectSkill根据用户请求挑选技能文件例如executive_brief还是checklist_writerApplySkill读取该技能携带技能指令执行 LLM 任务。图的装配代码在 flow.py 中只有寥寥几行from pocketflow import Flow from nodes import SelectSkill, ApplySkill def create_flow(): select_skill SelectSkill() apply_skill ApplySkill() select_skill apply_skill return Flow(startselect_skill)这里的是 PocketFlow 提供的**默认转移default transition**操作符SelectSkill执行完毕后自动进入ApplySkillFlow(startselect_skill)则声明了入口节点。从 pocketflow/init.py 的源码可以看到__rshift__底层等价于next(other)即在successors字典中注册default动作对应的后继节点Flow 的_orch编排循环会不断执行当前节点、读取其post返回值作为动作、再查找后继节点直到没有后继为止。SelectSkill确定性的技能路由SelectSkill 节点 遵循 PocketFlow 标准的prep → exec → post三阶段生命周期class SelectSkill(Node): def prep(self, shared): return { task: shared[task], skills: load_skills(shared[skills_dir]), } def exec(self, prep_res): task prep_res[task].lower() skills prep_res[skills] # Tiny deterministic router for demo purposes. if checklist in task or steps in task: preferred checklist_writer else: preferred executive_brief if preferred in skills: return preferred, skills[preferred] # fallback: first available skill name, content next(iter(skills.items())) return name, content def post(self, shared, prep_res, exec_res): skill_name, skill_content exec_res shared[selected_skill] skill_name shared[selected_skill_content] skill_content return default三个阶段的职责分工清晰prep准备只做纯数据读取——从shared共享存储取出任务文本并调用load_skills加载全部技能。shared是贯穿整个 Graph 的共享字典由入口 main.py 初始化包含task与skills_dir两个键。exec执行实现路由逻辑。示例刻意保持确定性路由demo 级实现无需 LLM 参与任务文本中包含checklist或steps关键词时选择checklist_writer否则默认选择executive_brief若首选技能不存在则回退到第一个可用技能。该函数只依赖入参、无副作用便于单测。post后处理把exec的结果技能名 技能内容写回shared并返回动作字符串default驱动 Flow 沿默认边进入下一个节点。这种数据在 prep 取、逻辑在 exec 算、状态在 post 存的划分正是 PocketFlow 设计哲学——prep/exec/post的解耦让exec可以被独立重试见下文底层机制也让路由这类逻辑可以脱离 LLM 单独验证。ApplySkill把技能注入 Prompt 并执行ApplySkill 节点 负责真正干活把选中的技能指令与用户任务拼接成一个结构化 Prompt交给 LLMclass ApplySkill(Node): def prep(self, shared): return { task: shared[task], skill_name: shared[selected_skill], skill_content: shared[selected_skill_content], } def exec(self, prep_res): prompt f You are running an Agent Skill. Skill name: {prep_res[skill_name]} Skill instructions: --- {prep_res[skill_content]} --- User task: {prep_res[task]} Follow the skill instructions exactly and return the final result only. .strip() return call_llm(prompt) def post(self, shared, prep_res, exec_res): shared[result] exec_res return defaultPrompt 模板在prep阶段从shared中读取技能名、技能正文与用户任务然后按技能身份声明 → 指令边界用---分隔→ 用户任务 → 输出约束的结构组装。其中Follow the skill instructions exactly and return the final result only.是关键的输出约束指令要求模型严格遵循技能规则且只返回最终结果避免模型输出解释性杂音。LLM 调用封装在 utils.py 的 call_llm 中默认使用 OpenAI SDK 与gpt-4o模型API Key 从环境变量OPENAI_API_KEY读取def call_llm(prompt: str) - str: client OpenAI(api_keyos.environ.get(OPENAI_API_KEY, your-api-key)) response client.chat.completions.create( modelgpt-4o, messages[{role: user, content: prompt}], ) return response.choices[0].message.content最终生成结果写入shared[result]由入口程序打印输出。技能加载utils.py 的 load_skillsload_skills 是整个技能机制的仓储层实现极其轻量def load_skills(skills_dir: str) - dict[str, str]: skills {} for md_file in sorted(Path(skills_dir).glob(*.md)): skills[md_file.stem] md_file.read_text(encodingutf-8) if not skills: raise ValueError(fNo skill files found in {skills_dir}) return skills要点用Path.glob(*.md)扫描技能目录下所有 Markdown 文件文件名去掉.md后缀即技能 ID例如checklist_writer.md→checklist_writer按文件名排序后返回{技能ID: 文件全文}字典保证路由结果可复现目录为空时抛出ValueError快速失败避免下游拿到空技能集静默出错。技能目录路径通过shared[skills_dir]传入入口默认值为skills见 main.py因此你可以自由替换为任意目录而不改任何节点代码。编写自己的 Agent Skills技能文件本质是写给 LLM 的指令模板。示例自带两个技能展示了两种风格executive_brief.md——面向高管的简报技能# Executive Brief Skill You are writing for senior leaders. ## Rules - Keep it concise and decision-oriented. - Start with 3 bullet point summary. - Include risks and recommended next action. - Avoid implementation-level details unless critical.checklist_writer.md——面向任务拆解的清单技能# Checklist Writer Skill Convert requests into clear, actionable checklists. ## Rules - Use numbered steps. - Keep each step short and verifiable. - Highlight dependencies and blockers. - End with a Definition of Done section.编写技能文件的实践建议第一行用标题声明技能身份与适用场景让模型和未来的你快速理解这个技能是干嘛的用## Rules小节收敛规则规则条目要具体、可验证避免写得好一点这类模糊表述针对受众或输出形态给出强约束如面向高管、省略实现细节以 Definition of Done 结尾这是技能与普通 Prompt 的最大差异——它固化的是专业角色的行为准则新增技能只需在skills/下添加一个.md文件并同步更新路由节点或改用下文介绍的 LLM 路由。运行与命令行用法运行依赖在 requirements.txt 中声明pocketflow0.0.1 openai1.0.0完整启动步骤以 Bash 为例pip install -r requirements.txt export OPENAI_API_KEYyour-key python main.py --Summarize this launch plan for a VP audience命令行入口解析逻辑见 main.py 的 parse_task扫描sys.argv[1:]取第一个以--开头的参数、去掉前缀后作为任务文本若未提供任何--参数则使用默认任务Summarize this launch plan for a VP audience。换一个任务测试清单路由分支python main.py --Turn this into an implementation checklist程序运行后会依次打印任务文本、选中的技能名 Skill Used 以及 LLM 生成结果 Output 。第一个任务因不含checklist/steps关键词会路由到executive_brief第二个任务则会命中checklist_writer——你可以据此直观验证路由行为。底层机制PocketFlow 的 prep/exec/post 生命周期技能路由之所以能写得如此简洁得益于 PocketFlow 极简的图抽象。核心实现在 pocketflow/init.pyNode三阶段协议prep(shared)从共享存储准备数据 →exec(prep_res)执行纯逻辑 →post(shared, prep_res, exec_res)回写状态并返回动作字符串。prep返回什么exec就接收什么exec返回什么post就接收什么——类型与数据流完全由开发者掌控默认转移与条件转移-a b注册 default 后继a - action b则按动作名注册post返回的动作字符串决定走向哪条边。Flow 的_orch循环据此持续推进直到get_next_node找不到后继为止Node的容错Node(max_retries1, wait0)支持对exec的自动重试exec_fallback可自定义兜底逻辑——这对 ApplySkill 这类包含不稳定 LLM 调用的节点尤其有用可以显著提升健壮性shared共享存储全 Graph 共享一个字典正是 SelectSkill 写入selected_skill、ApplySkill 读取它的通道。从 tests/test_flow_basic.py 可以印证这套约定设计用于默认转移的节点其post应返回None不指定动作设计用于条件转移-的节点则必须返回动作字符串。示例中两个节点的post都显式返回default与连接方式完全对应。从 Demo 到生产可扩展方向示例刻意保持了最小化但从源码结构看向生产环境演进有清晰的路径把确定性路由换成 LLM 路由在 SelectSkill 的exec中调用call_llm让模型根据任务语义打分选技能即可支持更复杂的任务语义匹配确定性路由则保留作为快速回退。技能数量规模化load_skills返回的字典天然支持任意数量技能当技能较多时可引入技能描述清单每个技能配一行摘要辅助路由避免把全部技能正文塞进路由 Prompt。Batch 化处理若一批任务需要套用同一技能可将 SelectSkill 换成BatchNode或利用 PocketFlow 的 BatchFlow/AsyncFlow 做并行批量执行。技能版本与校验由于技能即文件可以接合 Git 做版本管理在load_skills中增加前置校验如必含## Rules小节即可防止劣质技能进入 Prompt。小结Agent Skills 与 PocketFlow 的组合本质上是一种指令即数据的架构模式Graph 负责流程技能文件负责专业知识LLM 负责执行。pocketflow-agent-skills示例用两个节点、一个目录加一个 CLI 入口就把按需路由技能 → 注入 Prompt → 生成结果的完整链路跑通。这种模式几乎不引入框架负担核心库仅约 100 行却能让你的 Agent 能力按文件粒度无限扩展——这正是 PocketFlow轻量、表达力强设计理念的最佳注脚。赞分享人工智能大模型AI Agent工作流自动化RAG【免费下载链接】PocketFlowPocket Flow: 100-line LLM framework. Let Agents build Agents!项目地址https://gitcode.com/gh_mirrors/poc/PocketFlow点击查看免费下载相关推荐PocketFlow Agent Skills 实战用 Executive Brief 技能文件让 LLM 输出高管级决策简报PocketFlow Agent Skills 实战用 Executive Brief 技能文件让 LLM 输出高管级决策简报 本指南聚焦 PocketFlo人工智能大模型AI Agent工作流自动化RAGAgno Agent Skills 实战指南用 SKILL.md、脚本与参考文档为 Agent 构建可复用的领域技能Agno Agent Skills 实战指南用 SKILL.md、脚本与参考文档为 Agent 构建可复用的领域技能 本篇技术指南以 agno 仓库的 coo人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆Agent 技能路由基准测试Agent-Skills-for-Context-Engineering 的 Router Benchmark 实战与源码解析Agent 技能路由基准测试Agent Skills for Context Engineering 的 Router Benchmark 实战与源码解析 本人工智能AI 技能提示工程AI 评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考