欢迎光临
我们一直在努力

别再只玩Prompt了,Agent Skills才是大模型的“手”和“脚”

写在前面:

周末本来打算躺平,结果对着电脑又折腾了两天Agent。说实话,这半年来,大模型(LLM)的热度确实有点让人焦虑。从最开始的ChatGPT惊艳全场,到后来满大街的RAG(检索增强生成),大家似乎都在卷模型的“脑子”。

但最近在做一个企业级项目时,我深刻意识到:光有一个智商爆表的脑子(LLM),如果它是个高位截瘫,那在实际业务里也基本没用。

真正让大模型落地的,不是它能写多好的诗,而是它能不能帮我查库、调接口、发邮件、甚至写代码执行。这就是今天想和兄弟们聊的——Agent Skills(智能体技能)。

01. 从“聊天机器人”到“数字员工”的鸿沟

记得刚开始接触LangChain的时候,我天真地以为给模型挂一个 Search Tool 就万事大吉了。

结果呢?

用户问:“帮我查一下杭州明天的天气,顺便发给老张。” 模型回:“好的,我已经查到了,但我发不了邮件。”

那一刻我挺崩溃的。这就好比你招了个哈佛毕业的助理,由于没有手,他只能坐在那里动嘴皮子指挥你干活。

所谓的Agent Skills,本质上就是我们赋予大模型的“手”和“脚”。 它是大模型与物理世界(或者数字世界)交互的桥梁。没有Skills,Agent就是个“缸中之脑”;有了Skills,它才能从Chatbot进化成真正的Copilot。

02. 技术祛魅:Skill的本质是定义,不是代码

很多刚入坑的朋友(包括之前的我)容易陷入一个误区:觉得写Skill就是写Python函数。

def get_current_weather(location): …写一堆API调用…

但这只是冰山一角。在Agent的世界里,写好函数只是基本功,写好“函数的说明书”才是核心技能。

为什么这么说?因为大模型看不懂你的Python字节码,它看懂的是你喂给它的Schema(描述)。

我在调试Function Calling的时候发现一个巨坑:模型经常幻觉参数。 比如我定义的函数需要 {"city": "Beijing", "date": "2023-10-01"},模型有时候抽风,非要传个 {"location": "Beijing", "time": "tomorrow"}。

后来我悟了,写Agent Skills其实是在做“面向自然语言的接口编程”。你需要把每一个Skill的描述(Description)写得像教小学生一样清楚:

  • ❌ 烂的描述:获取天气信息

  • ✅ 好的描述:当用户询问天气时调用此工具。必须传入标准的城市名称(如Beijing,而非Peking)。如果用户没有指定日期,默认使用当前日期。

Prompt Engineering并没有消失,它只是下沉到了Skill的定义层。

03. 避坑指南:由简入繁的设计哲学

在重构了两个版本的Agent后,我总结了几条关于Skills设计的血泪教训,希望能帮大家少掉几根头发:

1. 原子化原则(Atomic)

千万不要写一个万能函数 do_everything()。 我之前试图写一个Skill叫“处理订单”,里面包含了查询、修改、通知。结果模型经常在中间步骤断掉,或者参数乱填。 正确做法:拆解成 query_order,update_order_status,send_notification。让Agent自己去规划(Planning)调用顺序。相信我,现在的GPT-4o或者Qwen-Max具备这个规划能力,前提是你给的积木块要够小、够清晰。

2. 容错性(Error Handling)是给模型看的

当Skill执行报错时(比如API超时,或者查无此人),你的返回值非常重要! 不要只返回 None 或者抛出异常。 你要返回一段话给模型看:Error: 未找到该订单号,请询问用户是否输错了号码。 把错误信息当成Conversation的一部分,模型看到这个Error后,会自愈,会去反问用户,这才是Agent的智能之处。

3. 这里的Context Window很贵

不要把所有的Skills一股脑塞给模型。如果你有100个工具,每次对话都把100个工具的定义塞进Prompt里,Token费用能让你破产,而且模型会迷糊。 动态挂载才是正解。根据用户的意图分类,动态加载相关的Skills集合。

04. 简单的代码示例(Python伪代码)

为了不让文章太水,放一段我目前觉得比较舒适的Skill定义结构(基于Pydantic,配合LangChain或原生OpenAI SDK都很舒服):

from pydantic import BaseModel, Field
from typing import Optional

# 定义参数结构,这会被自动转换成JSON Schema给模型看
class GetWeatherInput(BaseModel):
city: str = Field(description="城市名称,例如:Shanghai, Beijing")
unit: Optional[str] = Field(default="celsius", description="温度单位,可选 'celsius' 或 'fahrenheit'")

# 真正的执行逻辑
def get_weather(city: str, unit: str = "celsius"):
"""
实际调用天气API的函数
"""
# 模拟API调用
print(f"正在查询 {city} 的天气…")
return f"{city} current temperature is 25 {unit}"

# 这种结构化的定义,能最大程度减少模型的“幻觉”

05. 写在最后:我们是“牧羊人”

折腾Agent Skills的过程,让我感觉自己不像个程序员,更像个老师或者牧羊人。

我们在教一个智商极高但缺乏常识的“硅基生物”如何使用人类的工具。当你第一次看到Agent自己分析出“应该先查数据库,发现数据不对,然后调用Google搜索,最后汇总发给我”这一整套连贯动作时,那种成就感真的难以言喻。

真香是真香,难也是真难。

现在的Agent还处于早期阶段,稳定性依然是最大的痛点。但毫无疑问,拥有丰富Skills库的Agent,将是未来软件交互的主流形态。

兄弟们,如果你也在搞Agent,欢迎在评论区聊聊你们遇到的坑。究竟是Prompt难调,还是模型太笨?咱们评论区见!

赞(0)
未经允许不得转载:171主机测评 » 别再只玩Prompt了,Agent Skills才是大模型的“手”和“脚”
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址