1. 从零构建多技能AI助理:极简架构设计实战
在AI应用开发领域,我们常常面临一个矛盾:既希望AI助手功能丰富,又不想让代码变得臃肿复杂。今天我要分享的这套方案,用最简单的技术栈(Python+Markdown+JSON)实现了可扩展的多技能AI助理。这个项目最初源于我团队内部的效率工具需求,经过三个迭代版本后,最终形成了现在这个优雅的解决方案。
核心设计哲学是:将技能实现与调度逻辑彻底解耦。每个技能都是独立的Markdown文件,包含完整的场景说明和输出规范;而主程序仅负责路由和调度。这种架构带来的直接好处是:
- 新增技能只需5分钟(1个.md文件+几行JSON配置)
- 技能迭代不影响主程序稳定性
- 非技术人员也能参与技能维护
2. 核心架构解析
2.1 文件结构设计
整个项目仅包含两种核心文件:
code复制project_root/
├── skills_config.json # 技能注册中心
├── multi_skill_agent.py # 主程序
└── skills/ # 技能库目录
├── daily_todo.md
├── daily_report.md
└── learning_plan_30d.md
这种极简结构背后是经过深思熟虑的:
- skills目录:每个.md文件都是一个独立技能包,采用人类可读的自然语言编写
- config文件:作为技能索引,建立用户关键词到技能文件的映射关系
- 主程序:保持稳定,仅处理通用逻辑(路由、API调用、会话管理)
2.2 技能定义规范
每个技能Markdown文件遵循统一模板:
markdown复制# 技能名称
## 适用场景
[描述该技能的触发场景和典型用例]
## 步骤流程
1. 第一步操作说明
2. 第二步操作说明
...
## 输出格式
[明确要求模型输出的格式规范]
这种结构化文档同时服务于两个目的:
- 开发文档:记录技能的设计思路和使用方法
- 提示词模板:直接作为system prompt注入到AI模型中
实践心得:在步骤流程部分使用明确的序数词(如"首先"、"然后")能显著提升模型执行的一致性。避免使用模糊的时间副词(如"之后"、"接下来")。
3. 关键技术实现
3.1 智能路由系统
主程序的核心是match_skill()函数,实现基于关键词的轻量级路由:
python复制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
这个朴素算法在实际应用中表现出色,因为:
- 关键词匹配在有限技能场景下足够精准
- 小写化处理提升容错能力
- 遍历顺序即优先级(配置中靠前的技能优先匹配)
3.2 动态提示词构建
当匹配到技能时,系统会动态组装提示词:
python复制def build_messages_with_skill(question: str):
skill_id = match_skill(question)
msgs = [{"role": "system", "content": base_system_prompt}]
if skill_id:
skill_content = load_skill_content(skill_id)
msgs.append({
"role": "system",
"content": f"技能说明:\n\n{skill_content}"
})
msgs.append({"role": "user", "content": question})
return skill_id, msgs
这种分层提示词设计(基础角色设定+技能说明+用户问题)在实践中验证了其有效性:
- 基础设定确保AI行为一致性
- 技能说明提供具体约束
- 用户问题保持原始意图
4. 技能开发实战
4.1 待办清单技能优化
原始daily_todo.md可以进一步优化为:
markdown复制## 步骤流程
1. 目标确认阶段:
- 询问用户今日核心目标(不超过3个)
- 确认各目标的优先级(高/中/低)
2. 时间分配阶段:
- 将高优先级任务安排在认知高峰期(通常上午9-11点)
- 中等优先级放在下午常规时段
- 低优先级安排在碎片时间
3. 缓冲设计:
- 每个时间段预留20%缓冲时间
- 明确标注可延期任务
## 输出格式
```markdown
### 今日待办 | {日期}
**核心目标**
1. {高优先级目标}
2. {中优先级目标}
...
| 时间段 | 主要任务 | 预期耗时 | 弹性空间 |
|--------|----------|----------|----------|
| 9:00-11:00 | {任务} | 1.5h | 0.3h |
...
code复制
这种增强版技能考虑了实际工作场景中的时间管理原则,输出也更专业。
### 4.2 日报生成技能增强
对于daily_report.md,建议增加:
```markdown
## 进阶功能
1. 自动提取关键数据:
- 识别"修复3个bug"中的数字指标
- 捕捉"完成90%"等进度表述
2. 风险评级:
- 根据问题描述自动标注风险等级
- 对高频出现的问题类型进行归类
## 输出示例
```markdown
**今日成果** (共完成5项)
✓ 修复3个P1级bug [研发]
✓ 完成需求文档80% [文档]
...
**风险雷达** (新增2项)
❗ 模块耦合度高 (影响度: 高)
⚠️ 测试覆盖率不足 (影响度: 中)
code复制
## 5. 生产环境部署建议
### 5.1 性能优化方案
虽然原型使用[GPT-3](https://taotoken.net?utm_source=ai).5,但在生产环境建议:
1. 为每个技能创建专用微调模型
2. 实现技能缓存机制:
```python
skill_cache = {}
def load_skill_content(skill_id: str):
if skill_id in skill_cache:
return skill_cache[skill_id]
content = _load_from_file(skill_id)
skill_cache[skill_id] = content
return content
5.2 监控与迭代
建议添加以下维度的监控:
python复制class SkillMetrics:
def __init__(self):
self.skill_counts = defaultdict(int)
self.response_times = []
def record_usage(self, skill_id):
self.skill_counts[skill_id] += 1
def analyze_hot_skills(self):
return sorted(self.skill_counts.items(),
key=lambda x: x[1], reverse=True)
6. 扩展与进阶
6.1 技能组合模式
通过简单的语法解析,可以实现技能组合:
code复制用户输入:"先帮我列今日待办,再根据这个生成日报模板"
处理逻辑:
1. 识别"待办"触发daily_todo
2. 识别"日报"触发daily_report
3. 按顺序执行两个技能
6.2 外部工具集成
将某个技能升级为工具调用型:
- 在.md文件中增加工具说明段:
markdown复制## 所需工具 - 日历API:查询用户日程 - 项目管理系统:获取任务列表 - 在主程序中添加工具调用逻辑
7. 避坑指南
-
关键词冲突:当两个技能的关键词重叠时,解决方案:
- 为更常用的技能添加独占前缀(如"精确:")
- 实现优先级评分机制
-
技能失效:典型排查步骤:
bash复制
1. 检查config中路径是否正确 2. 确认.md文件编码为UTF-8 3. 验证关键词是否包含常见错别字 -
输出不一致:优化方法:
- 在.md中提供更详细的示例
- 降低temperature参数(建议0.2-0.5)
- 添加输出校验规则
这套架构我已经在三个不同团队落地,最长稳定运行8个月。它的优雅之处在于用最简单的技术解决了实际问题,而且为未来扩展留足了空间。对于想快速搭建AI助手的开发者,这可能是性价比最高的入门方案。
