用 3 个文件搞定多技能 AI 小助理:从 Skill 到小型工具库实战
本文介绍了一种通过"配置+约定"方式构建多技能AI助理的方法。该系统包含三个核心功能:生成待办清单、撰写日报和制定30天学习计划。实现方式采用极简设计:每个技能对应一个Markdown文件描述使用场景和输出格式,通过JSON配置文件管理技能ID和触发关键词。主程序自动匹配用户输入中的关键词,调用相应技能模板与GPT模型交互。这种架构优势在于:1)新增技能只需添加文件+配置,无需
·
这次,就做一件事:
用「配置 + 约定」的方式,让你的 Agent 一次性掌握 3 个小技能:
- 生成今天待办
- 生成日报
- 生成 30 天学习计划
不引入复杂框架,只用 3 个 Skill 文件 + 一点点路由逻辑,
就能搭出一个“小型技能库版的 AI 小助理”。
一、目标长什么样?
我们想要的效果是这样的:
在命令行里跟小助手聊时:
你:帮我规划一下今天的工作,我要写周报、开会、学习。
→ 触发「待办清单 Skill」,输出表格版今日待办
你:顺便帮我整理一下今天的日报。
→ 触发「日报 Skill」,按统一模板帮你写日报
你:接下来 30 天我想系统学一下 Python,给我一个计划。
→ 触发「学习计划 Skill」,按 30 天节奏输出计划表
而对你来说:
- 每个 Skill 就是一个独立的
.md文件; - 加新技能 = 新建一个
.md+ 在配置里写几行关键字; - 主代码几乎不用动。
二、设计一个「极简 Skill 规范」
我们先约定,每个 Skill 只包含 4 部分信息:
- 名字(英文 ID)
- 适用场景说明
- 触发关键词(用配置文件来写)
- 步骤 + 输出格式要求(写在
.md里)
整个设计拆成两类文件:
-
配置文件:
skills_config.json- 告诉 Agent:有哪些技能、每个技能的 id、技能文件路径、触发关键词。
-
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.pyskills_config.jsonskills/daily_todo.mdskills/daily_report.mdskills/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 小助理」的意义
-
技能完全数据化
- 新技能 = 新建一个
.md+ 在skills_config.json注册; - 代码逻辑几乎不用改。
- 新技能 = 新建一个
-
模型行为可控、可调
- 需要调整输出格式?改 Skill 文件;
- 需要更改触发条件?改配置里的关键词。
-
为后续 MCP / 工具调用打好基础
- 现在的 Skill 是“纯提示词技能”;
- 后面很容易把其中一个 Skill 升级为“会调外部接口 / MCP 工具的技能”。
更多推荐




所有评论(0)