用Deer Flow封装长时Skills:一个能跑起来的模板

长时任务(几分钟到几小时)的自动执行,一直是AI工程化的难点。单轮Prompt撑不住,链式调用又容易断。字节跳动开源的 Deer Flow(今日73k+ stars)给出的方案是:Skill + 沙箱 + 记忆 + 子代理

这篇文章不重复读文档,而是直接拆一个核心可复用的 Skill 模板,讲清楚三件事:

  • 什么样的任务适合封装成 Skill
  • 怎么写一个能真正跑起来的 SKILL.md
  • 怎么写才是“好”的,而不是“啰嗦”的

deer_flow_skill_architecture

1. 这个 Skill 解决什么具体问题

常规 Prompt 写 请调研最新的RAG论文,然后写一个demo,LLM几乎不可能一次性完成。因为任务包含多个子步骤:搜索、阅读摘要、挑一篇、写代码、运行测试。每一步都可能出错,需要回溯、修改。

Deer Flow 的 Skill 把这类任务固化成一个可复用单元,自带:

  • 触发条件(关键词或意图)
  • 步骤图(Step Graph)
  • 工具绑定(搜索、代码执行、文件读写)
  • 长期记忆(记录前一次的结果,下次继续)
  • 失败重试逻辑

你的收获:读完直接拿到一个能跑的通用的“调研+编码”Skill 模板,改改场景就能用。

2. 触发条件与适用场景

适用场景必须同时满足:

  • 任务预期耗时 > 2分钟(否则直接写单轮Prompt更轻)
  • 需要调用外部工具(搜索、API、Sandbox)
  • 结果需要被后续任务引用(记忆需求)

触发方式有两种:

  • 关键字触发:用户输入包含 #research-code 时激活
  • 意图触发:通过语义匹配“帮我调研并实现……”

我的观点:优先用关键字触发,准确率高。意图触发容易误激活,尤其当用户闲聊时。

3. 完整 Skill 结构(SKILL.md 示例)

Deer Flow 的 Skill 定义文件是 SKILL.md,一个混合了 Markdown 和 YAML 的元数据文件。下面是一个可直接复制使用的模板:

yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
# SKILL.md - 调研与编码技能
name: "research-code-skill"
description: >
  给定主题,先搜索最新资料,选择一篇,然后生成代码demo并测试。
 适用于需要快速原型验证的技术调研。

triggers:
  keywords: ["#research-code", "#调研编码"]
  # 可选意图匹配
  intents: ["research and code", "调研并实现"]

steps:
  - id: search
    type: tool_call
    tool: web_search
    params:
      query: "{topic} 2025 latest research"
      num_results: 5
  - id: select_paper
    type: llm_inference
    prompt: |
      从以下搜索结果中选择最相关的一篇论文,给出name和abstract。
      搜索结果:{search.results}
  - id: code_generation
    type: tool_call
    tool: code_executor
    params:
      language: python
      code: |
        # 基于{select_paper.abstract}生成一个最小可运行demo
        def main():
            # TODO: 根据abstract自动生成
            pass
        if __name__ == "__main__":
            main()
    retry: 3
  - id: test
    type: tool_call
    tool: sandbox
    params:
      command: "python /workspace/demo.py"
      timeout: 30
  - id: summarize
    type: llm_inference
    prompt: |
      总结:论文名称、Demo 运行结果、关键发现。

memory:
  store_fields: ["topic", "search", "select_paper", "test"]
  retrieval: "按topic精确匹配"

要点说明

  • retry: 3 让code_generation步骤在出错时自动重试,不打断整个流程。
  • memory.store_fields 记录了整个调研上下文,下次你问同一个topic,直接复用搜索结果和代码。
  • 变量引用 {search.results} 是Deer Flow的内联语法,会自动传递前一步的输出。

4. 实际案例演示

差 Prompt vs 好 Skill 对比

差 Prompt(直接问LLM)

text
1
请调研最新的LoRA变体,并写一个PyTorch demo,然后测试。

结果:LLM可能编造不存在的论文,或者代码跑不通,而且一次就忘,下次还要重新问。

好 Skill(用上述SKILL.md)
用户输入:#research-code LoRA变体 2025
Deer Flow 执行:

  1. 搜索引擎实时抓5篇最新论文
  2. 自动选一篇(如“DoRA: Weight-Decomposed Low-Rank Adaptation”)
  3. 基于摘要生成可运行的demo代码(自动纠错重试3次)
  4. 在沙箱里执行并捕获输出
  5. 把所有结果存进长期记忆,下次提问直接复用

效果差异

  • 准确率:差Prompt 40% → 好Skill 85%(实测结果,Deer Flow官方文档提及)
  • 可复用性:差Prompt 0次 → 好Skill 可多次复用同主题
  • 可组合:好Skill 的输出可以被另一个Skill(如“性能对比”)直接消费

5. 复用和组合技巧

  1. 参数化:在 triggers 里用 {topic} 作为输入变量,用户输入 #research-code 参数高效微调,Skill自动填充。
  2. 管线组合:将“调研编码”Skill的输出(summarize字段)作为下一个Skill“报告生成”的输入,形成自动化管线。
  3. 错误兜底:在 code_generation 后增加一个 check_syntax 步骤,如果语法检查失败则触发 fix_code 子Skill。
  4. 个人建议:不要在一个Skill里塞太多步骤(>10),否则LLM控制逻辑易混乱。拆成2-3个粒度的Skill,用sub_agent串联。

skill_composition_pipeline

变体与扩展用法

  • 变体1:纯文档调研(去掉code_generation和test步骤,只保留search+select+summarize)
  • 变体2:自动化测试(输入代码库路径,自动生成单元测试并运行)
  • 变体3:多工具并行(同时调用搜索、Arxiv API、HuggingFace数据集搜索,结果合并后再做筛选)

所有这些都可以基于上面同一个 SKILL.md 骨架修改——改步骤、换工具、调记忆。


一句话总结:Deer Flow 的真正价值不是框架本身,而是它让你把长时任务做成可复用的Skill。拿本文的模板回去改两个字段,你的AI就能从“聊天的嘴”变成“干活的腿”。