
企业微信

飞书
选择您喜欢的方式加入群聊

扫码添加咨询专家
AskTable 正在重新定义 AI Agent 的能力边界。最新引入的 Skill 系统,让 Agent 不再是固定能力的集合,而是可以根据场景动态调用专业技能的智能体。本文将深入解析这一系统的架构设计与实现原理。
传统的 AI Agent 通常将所有能力编译进系统提示词或工具列表:
┌─────────────────────────────────────────────────────────────┐
│ AskTable Skill 系统 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Skill 1 │ │ Skill 2 │ │ Skill N │ ← 项目级技能库 │
│ │ 销售分析│ │ 财务报告│ │ 用户画像│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Skill Loader │ ← 三层加载机制 │
│ │ explicit > agent > project │
│ └─────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ activate_skill() │ ← 按需激活 │
│ │ 工具动态注册 │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
核心思路:将技能从编译时决策转变为运行时选择。
Skill 的数据模型简洁而高效:
class SkillModel(Base):
id: UUID # 技能唯一标识
project_id: str # 所属项目
name: str # 技能名称
description: str # 技能描述(供 Agent 理解)
content: str # 技能指令内容
created_at: datetime
modified_at: datetime
设计要点:
project_id 实现项目级隔离content 是纯文本,存储技能指令(类似系统提示词片段)Skill 通过
skill_ids 与 Data Agent 和 Conversation 关联:
# Data Agent 关联
class DataAgentModel:
skill_ids: list[str] # 该 Agent 可用的技能列表
# Conversation 关联
class ConversationModel:
skill_ids: list[str] # 该会话可用的技能列表
Skill 的加载遵循优先级顺序:
| 优先级 | 来源 | 说明 |
|---|---|---|
| 1 | | 显式传入的技能 |
| 2 | | Conversation 关联的 Data Agent 技能 |
| 3 | | 项目级别的默认技能 |
核心是
activate_skill 工具,它允许 Agent 在对话过程中按需激活技能:
async def activate_skill(
skill_name: Annotated[str, Field(description="要激活的技能名称")]
) -> str:
"""激活指定技能,返回完整的技能指令。"""
if skill_name not in skill_map:
return f"技能 '{skill_name}' 不存在。可用: {available_skills}"
return skill_map[skill_name]
工作流程:
用户提问 → Agent 推理 → 判断需要专业能力 → 调用 activate_skill → 获得技能指令 → 继续执行
当 Agent 加载了技能后,系统提示词会包含可用技能目录:
可用技能:
- 销售分析: 分析销售数据,识别趋势和异常
- 财务报告: 生成标准财务报表和分析
- 用户画像: 构建用户特征和行为分析
这样 Agent 能够理解何时应该调用技能,而不只是被动响应。
系统引入了
skill_editor 对话类型:
class ConversationType(str, Enum):
chat = "chat" # 普通数据分析对话
skill_editor = "skill_editor" # 技能编辑对话
Skill Editor 配备了专属工具:
| 工具 | 功能 |
|---|---|
| 读取技能内容 |
| 更新技能描述 |
| 更新技能指令 |
| AI 辅助编辑技能内容 |
Skill Editor 的亮点是 AI 辅助优化能力:
用户: 这是一个销售数据分析的技能,帮我完善一下
AI: [分析现有技能内容] →
[识别缺失场景] →
[生成增强建议] →
[更新技能内容]
Agent 可以通过对话来优化技能,而不是直接编辑 JSON 或文本。
需求:让 AI Agent 具备金融行业专业术语和报告规范。
解决方案:
# 金融报告技能
## 报告规范
- 使用标准财务术语(EBITDA, ROE, ROA 等)
- 遵循监管要求的披露格式
- 自动计算同比、环比增长率
## 分析框架
1. 盈利能力分析
2. 偿债能力分析
3. 运营效率分析
需求:不同客户对同一数据有不同的分析需求。
解决方案:
skill_ids 组合实现差异化# 项目 A 的 Agent
skill_ids = ["sales通用分析", "retail客户A专属"]
# 项目 B 的 Agent
skill_ids = ["sales通用分析", "manufacturing客户B专属"]
技能内容存储在数据库中,支持:
modified_at 追踪)Skill 加载逻辑通过三层分离:
视图层 → Service 层 → Repository 层 → 数据库
便于后续扩展(如 Git 存储、外部技能市场)。
type 字段有默认值 "chat",存量对话不受影响:
type: Mapped[str] = mapped_column(String(50), nullable=False, default="chat")
Skills 通过
project_id 实现完全隔离:
AskTable Skill 系统与 MCP (Model Context Protocol) 有相似之处,但定位不同:
| 维度 | MCP | AskTable Skill |
|---|---|---|
| 定位 | 协议层标准 | 应用层实现 |
| 颗粒度 | 工具/API | 自然语言指令 |
| 管理 | 外部服务 | 内置数据库 |
| 使用方式 | 静态注册 | 动态激活 |
| 适用场景 | 系统集成 | 领域知识 |
简单来说:
AskTable Skill 系统代表了一种新的 Agent 能力扩展范式:
核心理念:能力不是固定的,而是按需组装的。
三大特性:
适用场景:
随着 Skill 系统的成熟,AskTable 正从"通用数据分析工具"进化为"可定制领域专家平台"。