关注腾讯云开发者,一手技术干货提前解锁👇
在 ChatGPT 刚出现的时候,它聊起天来似乎无所不知,但一旦你问它:“明天的天气怎么样”,它会告诉你:它无法获得当前最新的信息。它很聪明,却像一个瞎子——你只能让它写写诗、和它聊聊天;想让它做实际的事,它却看不见,动不了。
而在几年后的今天,它已在我们工作的角角落落下场干活!它不再仅是聊天工具,而是真正帮我们解决实际问题。
它如何长出了眼睛和手脚?核心靠的是:Agent(智能体) 和 Skill(技能)。
简单来说:
Agent 是大脑,Skill 是手脚,大脑决定 “该干什么”,手脚负责 “去执行”。
但问题来了——
面对成千上万的 API 和工具:
今天,我们从 0 到 1 讲透这些问题,最后带你亲手写一个 Skill,掌握定制 AI 助手的核心流程。
如果说大模型(LLM)是聪明的“大脑”,Skill 是能干的“手脚”,那么将它们结合并赋予自主行动能力的生命体,就是 Agent(智能体)。在 AI 领域,经典公式:
Agent = LLM(大模型) + 记忆(Memory) + 规划(Planning) + 工具使用(Tools/Skills)。
对比:聊天机器人 vs 智能体
当你对一个聊天机器人说:“分析昨天苹果公司股价下跌的原因并画出走势图。” 它会像一个“纸上谈兵的顾问”,回答你:“苹果公司目前有一些可能存在的风险,比如垄断……”。它只能给你提供建议和可能性,剩下的所有活儿还得你自己去干。
但如果你把同样的任务交给一个 Agent,它就会化身为一个“雷厉风行的超级助理”。它不仅能听懂你的需求,还会自主完成一系列复杂的操作:
简而言之,Agent 的核心在于“自主性”。它不再是一个只会一问一答的被动工具,而是一个只要你给它设定一个“目标”,它就能自己思考路径、自己选择工具、自己纠正错误,直到把事情办成的“数字员工”。从大模型到 Agent,AI 真正完成了从“替你思考”到“替你干活”的跨越。
1.1 深入本质:Agent 的灵魂是“感知-思考-行动”闭环
如果我们再往深处探究,Agent 的本质究竟是什么?
很多人可能会误以为,Agent 只是程序员写了一堆复杂的“If-Else(如果-那么)”代码,把大模型和各种 API 强行拼接在一起。其实不然。传统软件是“死”的,一旦遇到程序员没有预设过的情况,程序就会崩溃报错;而 Agent 的本质是“活”的,它是一个能够与环境动态交互的“闭环系统(Closed-loop System)”。
支撑这种“活”的底层逻辑,是业界著名的 ReAct(Reasoning + Acting,即推理与行动)机制,或者我们可以称之为“感知-思考-行动”的无限循环。
当一个 Agent 接收到复杂任务时,它并不是一口气把所有步骤想完然后盲目执行,而是像人类一样“摸着石头过河”,在循环中不断推进:
最关键的魔法发生在这里:行动之后,Agent 不会停止,而是带着行动的结果,重新回到第 1 步(感知),开启新一轮的循环。

真实案例:分析苹果股价下跌
【循环 1】
【循环 2】
【循环 3】
【循环 4】(高光时刻:自我纠错)
【循环 5】

在这个过程中,Agent 展现出了传统软件绝对不具备的能力——自我纠错(Self-Correction)。
它不再是一条道走到黑的“单向执行器”,而是一个能够在复杂、未知的真实世界中,根据环境反馈不断调整策略、克服突发障碍,最终死磕到底完成目标的“智能生命”。这就是 Agent 真正的魅力所在,也是它被视为通往 AGI(通用人工智能)必经之路的原因。
如果说大模型是 AI 的大脑,负责思考、规划和决策;那么 Skill 就是 AI 的手、脚、眼睛和耳朵。
通过调用各种 Skill,AI 完成了从“被动回答问题的聊天机器人”到“主动解决问题的智能体(Agent)”的华丽蜕变。
在真实的数字世界里,AI 并没有物理意义上的肢体。那么,Skill 在代码层面到底长什么样?
2.1 Skill 的本质 = API 接口 + OpenAPI 描述文档
一句话揭开它的面纱:Skill 的本质 = API 接口 + OpenAPI 描述文档。这两个部分缺一不可,它们共同构成了大模型与外部世界沟通的桥梁。
API 接口:执行动作的“肌肉”
API(应用程序编程接口)大家并不陌生,它是现代软件工业的基石。无论是查询天气、发送邮件、还是获取股票数据,背后都是一个个 API 在默默工作。你可以把 API 看作是一台台功能强大的“机器”。但是,这些机器是冰冷的、由代码构成的,它们只认特定的计算机指令,根本听不懂人类的自然语言。如果只有 API,大模型(LLM)就像是一个面对着满屋子复杂机器,却不知道按哪个按钮的文科生。
OpenAPI 描述文档:大模型能读懂的“说明书”
这就是为什么我们需要 OpenAPI 描述文档(通常是 JSON 或 YAML 格式的文件)。如果说 API 是机器,那么 OpenAPI 文档就是这台机器的“使用说明书”。
大模型最擅长的是什么?是阅读理解!这份说明书用结构化的文本,向大模型详细解释了这台机器的方方面面:
这是一个标准的、现代化的 AI Skill(或 Tool/Plugin)项目结构图。

2.2 Skill 是如何运作的?(一次完美的翻译过程)
当我们将“API + 说明书”打包成一个 Skill 交给 Agent 时,奇妙的化学反应就发生了。
当你说:“帮我查一下北京的天气。”
总结来说,Skill 的本质就是一个“翻译枢纽”。OpenAPI 描述文档让大模型“知道怎么用”,API 接口让系统“真正去执行”。正是这种标准化的组合,让原本只能在文本世界里“纸上谈兵”的大模型,拥有了操纵万物、改变现实的超能力。
AI 决定调用工具,通常是因为它在处理用户问题时,触发了以下三种机制之一:
A. “无知”机制(不得不查)
这是最硬性的触发条件。
B. “省力/准确”机制(怕算错)
这是基于模型对自己能力的认知。
C. “副作用”机制(必须动手)
什么时候 AI 决定“自己处理”?
当满足以下条件时,AI 会忽略工具,直接回答:
目前的 AI 生态正在疯狂爆发,“Skill”(在不同平台也叫 Plugin、Action、Tool)的发布和获取方式已经形成了一套标准。
平台 | 特点 | 适合人群 |
|---|---|---|
OpenAI GPT Store | 最大 C 端市场(Kayak/Canva 等 Action) | 普通用户 |
Zapier | 连接器之王(6000+ 应用封装) | 企业用户 |
LangChain Hub | 程序员的军火库(pip install 即用) | 开发者 |
Coze/Dify 插件市场 | 低代码拖拽(谷歌搜索/PDF解析等) | 无代码用户 |
假设你是一个主厨,走进了一家巨大的食材超市。货架上摆着几万种食材——你不可能全买回去。那你怎么挑?同样的道理,AI 的世界里有上万个可用的 API(Skill),全给 AI 用显然不现实。这里有两种主流策略:
策略一:做“专才”(Vertical Agent)
选 Skill 的黄金原则:Less is More
不要给它 100 个工具,只精选 2-3 个最强的:一个查股价的、一个看财报的、一个算技术指标的,就够了。因为大模型的注意力是有限的。你给它塞 100 个工具的说明书,它反而会「走神」——不知道该调用哪个,或者调用错了。
策略二:让 AI 自己找工具
这就用到我们下一章的 FindSkill 了。
假设你的 Agent 背后有一个巨大的数据库,里面存了 10,000 个 API 工具(查天气、订机票、查股票、画图、发邮件……)。
问题: 大模型(LLM)的上下文窗口(Context Window)是有限的。你不能把这 10,000 个工具的说明书一次性全塞给它,那样会:
解决方案: 给 Agent 默认只装 1 个核心技能,就是 find_skill。当用户提问时,Agent 先用这个技能去“图书馆”找书,找到后再读。
5.1 什么是 FindSkill?
它是一个元技能 (Meta-Skill)。它的功能不是查天气,也不是写代码,而是去数据库里找“谁能干这活”。
这是一个极其精妙的“即时学习”过程:

向量匹配
5.2 那么多相同功能的 Skill,AI 怎么决定调用哪个?
结论:靠“描述(Description)”的精准度和上下文匹配。
假设你有三个 Skill,都叫“查天气”,AI 会根据你写的 description 的细微差别来做选择。这被称为 Description Engineering(描述工程)。
如果描述完全一样怎么办?
AI 可能会随机选一个。或者 AI 会产生幻觉,不知道该用哪个,甚至可能拒绝回答。
5.3 当描述(Description)和实际代码不符怎么办?
结论:AI 会被“坑”死,因为它只看描述。
AI 根本看不到你的代码逻辑,它只能看到你写的 description(说明书)。
这就好比你去餐厅点菜。菜单上写着“红烧肉”(Description),但厨师实际端上来的是“臭豆腐”(Implementation)。
AI 的反应: AI 看了菜单,自信地告诉用户:“好的,我这就为您上红烧肉。”
实际结果: 程序运行了代码,端上来臭豆腐。
后果: AI 拿到臭豆腐(返回值)后会非常困惑。AI 可能会胡说八道:“这是特制的红烧肉,闻起来像臭豆腐”。 如果返回值格式完全对不上(比如 AI 想要天气温度数字,代码返回了一张图片),AI 可能会崩溃或告诉用户“工具调用失败”。
所以: 开发者必须保证“说明书”和“产品”是一致的。这是开发者的责任,不是 AI 的责任。
5.4 AI 怎么判断实现逻辑有没有问题?
结论:AI 判断不了逻辑,它只能判断“结果”是否合理(而且经常被骗)。
AI 把 Skill 当作一个黑盒(Black Box)。
AI 无法做的事情:
一句话总结: Skill 是 AI 的手。如果手(代码)坏了,大脑(AI)控制不了,只能看到手做出了错误的动作。保证代码逻辑正确,是程序员的事。
6.1 Skill 的两大模式
A. API 模式 (远程外卖)
B. 本地模式 (私家厨师)
6.2 本地 Skill 的安全隐患 (为什么会出事?)
如果你的 Skill 允许 AI 在本地执行代码(比如 os.system 或 subprocess),你会面临三大风险:
风险一:AI 的“幻觉”与“手滑” (蠢)
AI 不是神,它会犯错。
风险二:提示词注入攻击 (坏)
这是最可怕的。如果你的 AI 是对外服务的(比如做成网页给别人用)。
风险三:恶意代码下载 (毒)
如果你的 Skill 允许 AI “下载代码并运行”。
6.3 如何防御?(安全最佳实践)
如果你必须使用本地 Skill(比如做数据分析、文件处理),你必须给 AI 戴上“镣铐”。
A. 沙箱环境 (Sandbox) —— 最重要
永远不要让 AI 直接在你的宿主机(Host)上跑代码。
B. 人类介入 (Human-in-the-loop) —— 核按钮
在执行任何敏感操作(删除、修改、发送邮件、转账)之前,强制暂停。
C. 最小权限原则 (Least Privilege)
Skill vs Sub-Agent
Skill(工具) | Sub-Agent(子智能体) | |
|---|---|---|
本质 | 死工具(计算器/搜索引擎) | 活助理(部门经理) |
工作流 | 线性执行:<br>搜新闻 → 总结 → 生成 PPT | 自主循环:<br>观察 → 思考 → 行动 → 修正 |
容错性 | 第一步失败 → 后续全崩 | 自动重试/换策略:<br>“没搜到新闻?换个关键词再试!” |
Skill 就像“全自动炒菜机”
你(程序员)把程序写成了流水线:
代码逻辑是线性的,比较死板。
Sub-Agent就像“雇了一个真人厨师”
你不再写 A -> B -> C 的顺序了。你只给 AI 一个目标和工具箱。代码逻辑是循环的(Loop):
def run_agent():
goal = "做一份完美的晨报"
tools = [search_tool, summarize_tool, ppt_tool] # 工具箱
while True:
# 1. AI 观察现状
status = check_status()
# 2. AI 自己决定下一步用什么工具
action = llm.think(goal, status, tools)
# 3. 执行 AI 决定的动作
if action == "search":
result = search_tool()
elif action == "retry_search": # AI 发现第一次搜的不行,决定重搜
result = search_tool(keyword="换个词")
elif action == "finish":
break它的特征(灵活):
现在我们来动手——写一个真正能用的 Skill,让你的 AI 助手每天自动生成一份行业早报。
这个 Skill 叫做 AI Morning Brief。 它能做什么?
最关键的是:零 API 配置,开箱即用。AI 分析由智能体自身完成,不依赖任何第三方 AI 接口。
8.1 架构设计:大脑与手脚分离
还记得我们前面说的吗?Agent 是大脑,Skill 是手脚。这个早报工具完美诠释了这个理念:

脚本只做「手脚」——搜索新闻、抓正文、生成文档、发邮件。
智能体自己做「大脑」——分析、打分、总结。
这种设计的好处是:分析工作由 AI 自身的推理能力完成,不需要再额外调用 GPT、DeepSeek 等 API,真正做到零 Token 消耗。
8.2 项目结构
ai-morning-brief/
├── config.yaml # 配置文件
├── main.py # 主程序入口
├── requirements.txt # Python 依赖
├── src/skills/morning_brief/ # Skill 核心代码
│ ├── __init__.py # 双模式自动切换
│ ├── agent_mode_helpers.py # 智能体模式:脚本只做手脚
│ ├── searcher.py # 新闻搜索引擎
│ ├── brain.py # LLM 分析引擎(Skill 模式用)
│ ├── ppt_generator.py # PPT 生成器
│ ├── word_generator.py # Word 生成器
│ ├── notifier.py # 邮件推送
│ ├── memory.py # 历史数据持久化
│ ├── models.py # 数据模型
│ └── config_loader.py # 配置加载器
├── data/output/ # 生成的文档
├── data/history/ # 历史数据
└── SKILL.md # Skill 说明书最重要的文件——SKILL.md:
SKILL.md 就是 Skill 的"使用说明书",是整个系统最核心的文件。它告诉 AI「你能做什么、怎么做、按什么顺序做」。
来看一个精简版:
---
name: ai-morning-brief
description: 搜索新闻、生成早报、新闻分析总结。零 API Token 配置。
---
# AI Morning Brief Skill
## 工作流程
### Step 1: 搜索新闻(脚本执行)
运行 search_news(topic='AI') 获取新闻列表
### Step 2: 打分筛选(你自己思考,不调用任何 API!)
拿到新闻后,你自己打分,淘汰 score < 60 的
### Step 3: 抓取完整正文(脚本执行)
对入选新闻调用 fetch_full_content(urls)
### Step 4: 深度分析(你自己思考)
结合完整正文,生成 summary_deep 和 summary_public
### Step 5: 在对话中输出公众号草稿
让用户第一时间阅读,无需等文件生成
### Step 6: 生成文档(脚本执行)
调用 generate_documents_from_file() 生成 PPT + Word
### Step 7: 邮件推送(可选,脚本执行)
### Step 8: 汇报结果搜索模块 searcher.py ,给 AI 装上眼睛;智能打分模块,AI 自己当编辑;深度分析,从摘要到洞察;自动生成文档模块 ppt_generator.py,生成PPT + Word;
支持两种模式:
具体的代码,可以让AI帮你实现啦~
8.3 发布整合 Skill,让它每天早上定时推送
做好了 Skill,下一步就是让它自动跑起来——每天早上 8 点准时帮你生成早报、发到邮箱。
方案一:在 AI 平台上使用(最简单)
如果你使用的是 Knot、ChatGPT 等支持 Skill 的平台:
平台会自动识别 SKILL.md,按照里面的流程执行。用户什么都不用配置,上传即用。
方案二:定时任务(服务器部署)
如果你想完全自动化、无需人工触发,可以用 cron 定时任务:
cd /path/to/ai-morning-brief && python main.py --topic "AI"main.py 是全自动模式的入口,它会依次完成搜索、分析、生成、推送的全部流程:
你甚至可以配置多个定时任务,追踪不同行业:
# 8:00 AI 早报
python main.py --topic "AI"
# 8:30 半导体早报
python main.py --topic "半导体"
# 9:00 新能源早报
python main.py --topic "新能源"邮件配置
想要自动发到邮箱?只需要设置 4 个环境变量:
export EMAIL_SENDER="your_email@qq.com"
export EMAIL_PASSWORD="your_smtp_auth_code" # 注意是授权码,不是密码
export EMAIL_RECIPIENT="team@company.com"
export EMAIL_SMTP_HOST="smtp.qq.com"配好之后,每次生成早报都会自动附带 PPT 和 Word 发送到指定邮箱。
8.4 API Key
如果你做了一个很牛的 Skill(比如“超精准股票预测”),你肯定不希望全世界免费白嫖,把你的服务器挤爆。所以,你会要求用户:
用户痛点:我要用 10 个 Skill,难道要注册 10 个账号?这就是为什么早期的开源 Agent(比如 AutoGPT)很难用:你下载下来,打开配置文件,发现里面有 20 行空缺:
用户直接崩溃:“我就想查个天气发个推特,还得去 Google 和 Twitter 申请开发者账号?”
为了不让用户跑断腿,现在有三种主流的解决方案:
方案一:OAuth 授权(推荐)
就像你用微信登录其他 App 一样——不用注册新账号,微信帮你「担保」就行了。
AI 平台可以用 OAuth 让你一键授权多个服务,免去逐个注册的麻烦。
方案二:平台打包
类似 ChatGPT Plus 或 Knot 平台的模式——你交一份月费,平台帮你搞定所有工具的"门票"。你只管用,不用管鉴权的事。
方案三:环境变量注入
这是开发者最常用的方式。把密钥写在 .env 文件里,程序启动时自动读取:
OPENAI_API_KEY=sk-xxxx
EMAIL_PASSWORD=your_smtp_password安全原则:永远不要把 Key 写死在代码里,而是用环境变量注入。

-End-
原创作者|陈菁