用Deer Flow封装长时Skills:一个能跑起来的模板
长时任务(几分钟到几小时)的自动执行,一直是AI工程化的难点。单轮Prompt撑不住,链式调用又容易断。字节跳动开源的 Deer Flow(今日73k+ stars)给出的方案是:Skill + 沙箱 + 记忆 + 子代理。
这篇文章不重复读文档,而是直接拆一个核心可复用的 Skill 模板,讲清楚三件事:
- 什么样的任务适合封装成 Skill
- 怎么写一个能真正跑起来的 SKILL.md
- 怎么写才是“好”的,而不是“啰嗦”的

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 执行:
- 搜索引擎实时抓5篇最新论文
- 自动选一篇(如“DoRA: Weight-Decomposed Low-Rank Adaptation”)
- 基于摘要生成可运行的demo代码(自动纠错重试3次)
- 在沙箱里执行并捕获输出
- 把所有结果存进长期记忆,下次提问直接复用
效果差异:
- 准确率:差Prompt 40% → 好Skill 85%(实测结果,Deer Flow官方文档提及)
- 可复用性:差Prompt 0次 → 好Skill 可多次复用同主题
- 可组合:好Skill 的输出可以被另一个Skill(如“性能对比”)直接消费
5. 复用和组合技巧
- 参数化:在
triggers里用{topic}作为输入变量,用户输入#research-code 参数高效微调,Skill自动填充。 - 管线组合:将“调研编码”Skill的输出(summarize字段)作为下一个Skill“报告生成”的输入,形成自动化管线。
- 错误兜底:在
code_generation后增加一个check_syntax步骤,如果语法检查失败则触发fix_code子Skill。 - 个人建议:不要在一个Skill里塞太多步骤(>10),否则LLM控制逻辑易混乱。拆成2-3个粒度的Skill,用
sub_agent串联。

变体与扩展用法
- 变体1:纯文档调研(去掉code_generation和test步骤,只保留search+select+summarize)
- 变体2:自动化测试(输入代码库路径,自动生成单元测试并运行)
- 变体3:多工具并行(同时调用搜索、Arxiv API、HuggingFace数据集搜索,结果合并后再做筛选)
所有这些都可以基于上面同一个 SKILL.md 骨架修改——改步骤、换工具、调记忆。
一句话总结:Deer Flow 的真正价值不是框架本身,而是它让你把长时任务做成可复用的Skill。拿本文的模板回去改两个字段,你的AI就能从“聊天的嘴”变成“干活的腿”。