这次,就做一件事:

用「配置 + 约定」的方式,让你的 Agent 一次性掌握 3 个小技能:

  • 生成今天待办
  • 生成日报
  • 生成 30 天学习计划

不引入复杂框架,只用 3 个 Skill 文件 + 一点点路由逻辑,
就能搭出一个“小型技能库版的 AI 小助理”。


一、目标长什么样?

我们想要的效果是这样的:

在命令行里跟小助手聊时:

你:帮我规划一下今天的工作,我要写周报、开会、学习。

→ 触发「待办清单 Skill」,输出表格版今日待办

你:顺便帮我整理一下今天的日报。

→ 触发「日报 Skill」,按统一模板帮你写日报

你:接下来 30 天我想系统学一下 Python,给我一个计划。

→ 触发「学习计划 Skill」,按 30 天节奏输出计划表

而对你来说:

  • 每个 Skill 就是一个独立的 .md 文件
  • 加新技能 = 新建一个 .md + 在配置里写几行关键字;
  • 主代码几乎不用动。

二、设计一个「极简 Skill 规范」

我们先约定,每个 Skill 只包含 4 部分信息:

  1. 名字(英文 ID)
  2. 适用场景说明
  3. 触发关键词(用配置文件来写)
  4. 步骤 + 输出格式要求(写在 .md 里)

整个设计拆成两类文件:

  1. 配置文件skills_config.json

    • 告诉 Agent:有哪些技能、每个技能的 id、技能文件路径、触发关键词。
  2. Skill 文件skills/*.md

    • 每个技能一个 .md,写清楚这个技能该怎么干活。

这样做的好处:

  • 以后加删技能,只改“数据”(配置 + md),不用改“代码”。

三、先写好 3 个 Skill 文件

1. 待办清单 Skill(复用你之前的)

skills/daily_todo.md

# 日常待办清单生成技能

## 适用场景
当用户想要规划当天的工作或任务时,例如:
- “帮我规划一下今天的工作”
- “今天需要哪些待办事项?”
- “请为我列出 3 个优先任务”

## 步骤流程
1. 先向用户确认今天的核心目标(最多 3 个),如:项目进展、学习任务、生活安排;
2. 将这些目标合理分配到:上午、下午、晚上三个时间段;
3. 优先级高的任务安排在精力最充沛的时间段(通常是上午和下午);
4. 用 Markdown 表格输出最终的待办清单。

## 输出格式
请用 Markdown 表格输出:

| 时间段 | 任务 |
|--------|------|
| 上午   | 1. ... |
| 下午   | 2. ... |
| 晚上   | 3. ... |

2. 日报 Skill

skills/daily_report.md

# 日报生成技能

## 适用场景
当用户希望根据当天完成的工作,快速生成一份工作日报时,例如:
- “帮我写一下今天的日报”
- “根据我今天做的事整理一份日报”
- “生成一份标准格式的工作日报”

## 步骤流程
1. 询问用户今天完成的主要事项(3–6 条),包括:开发、沟通、Bug 修复、学习等;
2. 询问今天遇到的主要问题或风险点(1–3 条);
3. 询问明天的计划(2–4 条);
4. 将上述信息整理为一个标准模板的日报。

## 输出格式
请用如下 Markdown 结构输出:

**今日完成:​**
- ...

**问题与风险:​**
- ...

**明日计划:​**
- ...

3. 30 天学习计划 Skill

skills/learning_plan_30d.md

# 30 天学习计划生成技能

## 适用场景
当用户想在 30 天内系统学习某项技能时,例如:
- “给我一个 30 天的 Python 学习计划”
- “帮我规划 30 天强化前端基础”
- “设计一个 30 天的英语学习打卡计划”

## 步骤流程
1. 确认用户要学习的主题(如 Python / 前端 / 英语);
2. 询问用户每天大概能投入的学习时间(如 1 小时 / 2 小时);
3. 将 30 天划分为 4 个阶段:入门、进阶、巩固、实战;
4. 根据主题和时间,将每一周的重点和每日任务简要写出。

## 输出格式示例
请按「周」来组织内容,例如:

**第 1 周:入门阶段**
- 目标:...
- 每日安排:
  - Day 1:...
  - Day 2:...
  - ...

**第 2 周:进阶阶段**
- 目标:...
- 每日安排:
  - Day 8:...
  - ...

四、用一个 JSON 配置管理所有 Skill

新建 skills_config.json

{
  "daily_todo": {
    "file": "skills/daily_todo.md",
    "keywords": ["待办", "今天计划", "今日计划", "规划今天", "todo"]
  },
  "daily_report": {
    "file": "skills/daily_report.md",
    "keywords": ["日报", "写日报", "工作总结", "今天总结"]
  },
  "learning_plan_30d": {
    "file": "skills/learning_plan_30d.md",
    "keywords": ["30天学习", "学习计划", "30 天学习", "一个月学习"]
  }
}

含义很直观:

  • daily_todo / daily_report / learning_plan_30d 是三个技能 ID;
  • file 指向对应的 .md 文件;
  • keywords 是该技能的触发关键词列表。

五、写一个「多 Skill 版」 Agent 主程序

新建 multi_skill_agent.py,代码如下(可直接复制):

#!/usr/bin/env python3
# multi_skill_agent.py

import os
import json
from typing import Optional, Tuple
from openai import OpenAI

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# 基础角色设定
base_system_prompt = """
你是公司内部的智能助手,名字叫「小助手」。
你的目标是帮助同事解答问题、整理思路、提供简单建议。

说话风格要求:
- 语气友好、简洁,不要长篇大论;
- 尽量用条目、列表的形式回答,方便阅读;
- 如果你不确定答案,就明确说「我不太确定」或者「我不知道」,不要瞎编。
"""

# 对话历史(可以后续扩展多轮)
messages = [
    {"role": "system", "content": base_system_prompt}
]

# 加载所有 Skill 配置
with open("skills_config.json", "r", encoding="utf-8") as f:
    SKILL_CONFIG = json.load(f)


def load_skill_content(skill_id: str) -> Optional[str]:
    """根据 skill_id 加载对应的 .md 内容"""
    info = SKILL_CONFIG.get(skill_id)
    if not info:
        return None
    path = info["file"]
    if not os.path.exists(path):
        return None
    with open(path, "r", encoding="utf-8") as f:
        return f.read()


def match_skill(question: str) -> Optional[str]:
    """
    根据用户问题里的关键词,匹配最合适的 skill_id。
    简单策略:谁的关键词先命中就用谁。
    """
    q = question.lower()
    for skill_id, conf in SKILL_CONFIG.items():
        for kw in conf.get("keywords", []):
            if kw.lower() in q:
                return skill_id
    return None


def build_messages_with_skill(question: str) -> Tuple[str, list]:
    """
    根据问题选择 Skill,并构造要发给模型的 messages 列表。
    返回:skill_id, messages
    """
    skill_id = match_skill(question)

    msgs = [
        {"role": "system", "content": base_system_prompt}
    ]

    if skill_id:
        skill_content = load_skill_content(skill_id)
        if skill_content:
            # 把 skill 描述作为额外的 system 消息
            msgs.append({
                "role": "system",
                "content": f"下面是一段『技能说明』,请严格按照说明中的步骤流程和输出格式来回答:\n\n{skill_content}"
            })

    # 用户问题
    msgs.append({"role": "user", "content": question})
    return skill_id, msgs


def ask(question: str) -> str:
    """总入口:自动选择 skill + 调用模型"""
    global messages

    skill_id, msgs = build_messages_with_skill(question)

    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=msgs,
        temperature=0.3,
        max_tokens=800,
    )
    answer = response.choices[0].message.content.strip()

    # 简单记录历史(可后续扩展)
    messages.append({"role": "user", "content": question})
    messages.append({"role": "assistant", "content": answer})

    # 在命令行上提示一下是哪个 skill 在工作,方便你调试(也可去掉)
    if skill_id:
        prefix = f"[使用技能:{skill_id}] "
    else:
        prefix = ""
    return prefix + answer


if __name__ == "__main__":
    print("=== 多技能小助手(命令行版) ===")
    print("当前已内置技能:待办清单 / 日报 / 30 天学习计划")
    print("直接输入问题,例如:")
    print("- 帮我规划一下今天的工作…")
    print("- 帮我写下今天的日报…")
    print("- 给我一个 30 天的 Python 学习计划…")
    print("输入 q / quit / exit 退出。\n")

    while True:
        try:
            user_input = input("你:").strip()
        except (EOFError, KeyboardInterrupt):
            print("\n再见~")
            break

        if not user_input:
            continue
        if user_input.lower() in ["q", "quit", "exit"]:
            print("已退出。")
            break

        answer = ask(user_input)
        print(f"\n小助手:\n{answer}\n")

六、跑起来,感受一下「多技能」的味道

在项目目录保证有:

  • multi_skill_agent.py
  • skills_config.json
  • skills/daily_todo.md
  • skills/daily_report.md
  • skills/learning_plan_30d.md

然后执行:

python multi_skill_agent.py

示例 1:待办 Skill

你:帮我规划一下今天的工作,我要写周报、改代码、看两篇技术文章。

小助手:
[使用技能:daily_todo]
| 时间段 | 任务 |
|--------|------|
| 上午   | 1. 撰写并完善本周工作周报 |
| 下午   | 2. 处理和优化现有代码,修复已知问题 |
| 晚上   | 3. 阅读两篇技术文章,并记录 3 条收获 |

示例 2:日报 Skill

你:根据我今天做的事帮我写一份日报:早上开了需求评审会,下午修了两个 bug,晚上看了下技术文档。

小助手:
[使用技能:daily_report]
**今日完成:​**
- 参加需求评审会,明确本周迭代范围
- 修复 2 个线上 bug
- 阅读相关技术文档,梳理实现方案

**问题与风险:​**
- 需求评审中提到的新需求存在范围扩大风险
- 线上 bug 涉及的模块测试覆盖度不足

**明日计划:​**
- 根据评审结果更新需求文档
- 增补相关模块的自动化用例
- 继续阅读技术文档,完成方案细化

示例 3:学习计划 Skill

你:给我一个 30 天的 Python 学习计划,我每天大概能学 1 小时。

小助手:
[使用技能:learning_plan_30d]
**第 1 周:入门阶段**
- 目标:熟悉 Python 基本语法和常用数据类型
- 每日安排:
  - Day 1:了解 Python 基本语法,变量、基本输入输出
  - Day 2:学习数字、字符串操作
  - Day 3:列表、元组基础
  ...

**第 2 周:进阶阶段**
...

七、这样设计「多 Skill 小助理」的意义

  1. 技能完全数据化

    • 新技能 = 新建一个 .md + 在 skills_config.json 注册;
    • 代码逻辑几乎不用改。
  2. 模型行为可控、可调

    • 需要调整输出格式?改 Skill 文件;
    • 需要更改触发条件?改配置里的关键词。
  3. 为后续 MCP / 工具调用打好基础

    • 现在的 Skill 是“纯提示词技能”;
    • 后面很容易把其中一个 Skill 升级为“会调外部接口 / MCP 工具的技能”。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐