DEV Community

llimage
llimage

Posted on

5分钟用FROST写一个任务Agent:从零到一的最小实战教程

5分钟用FROST写一个任务Agent:从零到一的最小实战教程

作者:神通说

日期:2026-07-30

主题:代码教程 | 周四轮换

阅读时间:10分钟


学框架最好的方式,不是读文档,而是写一个能跑的东西。

今天这篇文章,目标非常明确:用5分钟时间,基于FROST框架写一个能执行真实任务的Agent

不玩概念,不讲哲学,只写代码。


一、先搞清楚:我们在写什么?

FROST(Fractal Runtime of Orchestrated Skills & Tasks)的核心只有四个原子

原子 一句话解释 类比
Store 记忆容器,负责存取数据 细胞核
Skill 无状态的能力单元 蛋白质
Agent 拥有Store和Skills的执行体 细胞
SOP 有序步骤列表 操作手册

一个任务Agent,就是一个Agent按照SOP定义的步骤,依次调用Skill,中间结果存进Store。

就这么简单。

用户任务 -> Agent -> 按SOP执行Skill -> 结果存入Store -> 输出
Enter fullscreen mode Exit fullscreen mode

二、环境准备

FROST是纯Python项目,零外部依赖(核心代码不需要LLM API)。

# 克隆项目
git clone https://gitee.com/liao_liang_7514/frost.git
cd frost

# 验证环境(197个测试用例全绿即可)
python -m pytest

# 或者只安装核心依赖
pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

提示:FROST的核心代码只有约500行Python,建议clone下来后先翻一遍core.py,理解四个原子的接口设计。


三、第一个任务Agent:3步搞定

Step 1:定义Skill

Skill是FROST的最小能力单元。它无状态、无副作用,只接收参数,返回结果。

from core import Store, Agent

# ---- 定义两个简单的 Skill ----

def skill_uppercase(context: dict) -> dict:
    """将输入文本转为大写"""
    text = context.get("text", "")
    context["text"] = text.upper()
    return context

def skill_add_prefix(context: dict) -> dict:
    """给文本加上前缀"""
    prefix = context.get("prefix", "[FROST]")
    context["text"] = f"{prefix} {context['text']}"
    return context
Enter fullscreen mode Exit fullscreen mode

注意Skill的设计原则

  1. 输入是context字典,输出也是修改后的context字典
  2. 不持有任何内部状态(无self.xxx)
  3. 可以被任意Agent组合使用

这和函数式编程的思想一脉相承:纯函数,可组合,可测试

Step 2:组装Agent

有了Skill,接下来创建一个Agent,赋予它Store和Skills:

# 创建Store(记忆容器)
store = Store(storage_path="./my_agent_memory")

# 创建Agent,注册Skill
agent = Agent(
    name="text_processor",
    store=store,
    skills={
        "uppercase": skill_uppercase,
        "add_prefix": skill_add_prefix,
    }
)
Enter fullscreen mode Exit fullscreen mode

一个Agent就创建好了。它有两个能力:转大写、加前缀。它有自己的Store来保存中间状态。

Step 3:用SOP执行任务

SOP(Standard Operating Procedure)就是一个步骤列表,定义了Agent执行的顺序:

# 定义SOP步骤:先转大写,再加前缀
result = agent.run(
    sop_steps=["uppercase", "add_prefix"],
    initial_context={
        "text": "hello frost",
        "prefix": "[已处理]"
    }
)

print(result["text"])
# 输出: [已处理] HELLO FROST
Enter fullscreen mode Exit fullscreen mode

就这么简单。 3步完成:定义Skill -> 组装Agent -> 用SOP执行。


四、进阶:带记忆的任务Agent

上面的例子是最小版本。但FROST真正强大的地方在于记忆传承

让我展示一个更接近实战的场景:一个数据分析Agent,能够记住之前的分析结果,避免重复计算。

import json
from datetime import datetime
from core import Store, Agent

# ---- 定义带记忆能力的 Skill ----

def skill_analyze(context: dict) -> dict:
    """分析数据,但先检查是否已有缓存结果"""
    store = context["_store"]
    data_key = context.get("data_key", "default")

    # 检查Store中是否有历史分析结果
    cached = store.load(f"analysis_{data_key}")
    if cached:
        context["result"] = cached["value"]
        context["source"] = "cache"
        return context

    # 没有缓存,执行真实分析
    data = context.get("data", [])
    result = {
        "count": len(data),
        "sum": sum(data) if data else 0,
        "avg": sum(data) / len(data) if data else 0,
        "analyzed_at": datetime.now().isoformat()
    }

    # 将结果存入Store(下次执行时可以直接读取)
    store.save(f"analysis_{data_key}", result)

    context["result"] = result
    context["source"] = "computed"
    return context

def skill_report(context: dict) -> dict:
    """生成分析报告"""
    result = context.get("result", {})
    source = context.get("source", "unknown")

    report = f"=== 数据分析报告 ===\n"
    report += f"数据来源: {source}\n"
    report += f"数据量: {result.get('count', 0)}\n"
    report += f"总计: {result.get('sum', 0)}\n"
    report += f"平均值: {result.get('avg', 0):.2f}\n"

    context["report"] = report
    return context

# ---- 组装并执行 ----

store = Store(storage_path="./analytics_memory")
agent = Agent(
    name="data_analyst",
    store=store,
    skills={
        "analyze": skill_analyze,
        "report": skill_report,
    }
)

# 第一次执行(需要计算)
result1 = agent.run(
    sop_steps=["analyze", "report"],
    initial_context={
        "data_key": "sales_2026q2",
        "data": [100, 200, 150, 300, 250]
    }
)
print(result1["report"])
# 输出: source = "computed"

# 第二次执行相同任务(命中缓存!)
result2 = agent.run(
    sop_steps=["analyze", "report"],
    initial_context={
        "data_key": "sales_2026q2",
        "data": [100, 200, 150, 300, 250]
    }
)
print(result2["report"])
# 输出: source = "cache"  <-- 直接从Store读取,跳过计算
Enter fullscreen mode Exit fullscreen mode

这个例子展示了FROST的核心优势:Agent通过Store实现跨任务记忆

传统的Agent框架每次执行都从零开始,而FROST的Agent会:

  1. 先查Store有没有历史结果
  2. 有则直接用,避免重复计算
  3. 没有则计算,并将结果存入Store

这不就是"复利效应"的代码实现吗?


五、从FROST到FROST-SOP:生产级升级

上面的代码是FROST教学框架的写法,清晰、简洁、易理解。但如果你要在生产环境运行Agent系统,还需要解决:

  • 错误处理和重试策略
  • 并发执行和异步调度
  • 权限控制和安全沙箱
  • 日志审计和可观测性
  • 成本追踪和资源管理

这就是 FROST-SOP 要解决的问题。

FROST-SOP(https://gitee.com/liao_liang_7514/frost-sop)是FROST的工程化实现,用事件驱动架构把教学框架升级为生产级平台:

# FROST-SOP 的任务Agent(概念示例)

# 教学版 FROST:同步、单步
agent.run(sop_steps=["analyze", "report"])

# 工程版 FROST-SOP:异步、DAG编排、带审计
from frost_sop.core import SOPEngine, EventBus

engine = SOPEngine(event_bus=EventBus())
task = engine.create_task(
    name="quarterly_analysis",
    dag={
        "fetch_data": {"skill": "data_fetcher", "deps": []},
        "analyze": {"skill": "data_analyzer", "deps": ["fetch_data"]},
        "report": {"skill": "report_generator", "deps": ["analyze"]},
        "notify": {"skill": "notification", "deps": ["report"]}
    },
    permission="P2"  # 权限等级
)

# 异步执行,自动审计
result = await engine.execute(task)
Enter fullscreen mode Exit fullscreen mode

从教学到生产,FROST和FROST-SOP形成了一条完整的成长路径:

学习理解 -> FROST(500行Python,4个原子)
    |
工程落地 -> FROST-SOP(事件驱动、DAG编排、权限控制)
    |
规模化运行 -> 多Agent家族治理(祖辈协调、父辈调度、孙辈执行)
Enter fullscreen mode Exit fullscreen mode

六、动手练习

如果5分钟不够,那给你留3个递进式练习:

入门:跑通上面的3步示例,理解Skill -> Agent -> SOP的执行流

进阶:给skill_analyze添加错误处理(数据为空、类型错误等),理解Skill的纯函数约束

挑战:克隆FROST-SOP,用SOPEngine重写上面的数据分析任务,对比教学版和工程版的差异

# FROST 教学框架
git clone https://gitee.com/liao_liang_7514/frost.git

# FROST-SOP 工程平台
git clone https://gitee.com/liao_liang_7514/frost-sop.git
Enter fullscreen mode Exit fullscreen mode

七、总结

用一张图回顾今天的核心内容:

+---------------------------------------------+
|           FROST 任务Agent模型                |
+---------------------------------------------+
|                                             |
|   +--------+     +--------+     +--------+ |
|   | Skill  |---->| Skill  |---->| Skill  | |
|   |   A    |     |   B    |     |   C    | |
|   +---+----+     +---+----+     +---+----+ |
|       |              |              |      |
|       v              v              v      |
|   +-------------------------------------+  |
|   |         Store (记忆)                |  |
|   +-------------------------------------+  |
|                                             |
|   SOP: A -> B -> C (有序步骤列表)          |
|                                             |
+---------------------------------------------+
Enter fullscreen mode Exit fullscreen mode

记住这3个核心原则

  1. Skill是无状态的:纯函数,输入context,输出context
  2. Store是有状态的:Agent的记忆,跨任务传承
  3. SOP是可组合的:步骤可以任意编排,形成不同的任务流

5分钟,你拥有了一个具备记忆能力的任务Agent。

下一步?去看看FROST-SOP如何把这个模型升级为生产级系统。


项目链接


本文是 FROST 双项目每日推广系列 | 周四代码教程轮换主题

FROST:让智能体拥有谱系、记忆和荣誉感。

Top comments (0)