摘要
去年在字节TRAE线下活动的一句提问,让我捕捉到SKILLS这个大模型新范式的苗头——它不是简单的工具调用,而是能让AI实现“按需加载能力”的渐进式革命。从CLAUDE率先提出,到字节TRAE的快速跟进,再到LangChain从“曲线适配”到Deep Agent原生支持,这半年,我完整见证了一个AI技术概念从圈内热议到全面落地的全过程,也读懂了技能模块化背后的行业趋势。
从TRAE线下到LangChain落地,我见证SKILLS从概念到普及的半年
最早接触SKILLS这个概念,是在2025年去字节参加TRAE线下活动的时候。活动现场有观众提问,说CLAUDE新推出的SKILLS机制特别实用,想问字节的TRAE什么时候会跟进这项功能。听到这个问题的瞬间,我心里就有了明确的预感:字节作为AI领域的风向标,大概率会快速布局跟进,而在智能体框架领域深耕的LangChain,必然也不会缺席这场技术浪潮。
今年早些时候,SKILLS在大模型圈彻底火了起来,成为大家热议的核心话题,但LangChain圈子里却依旧相对平静,没有掀起太多波澜。出于好奇,我特意去搜索“LangChain skills”,发现在B站上已经有了相关的教学视频,其核心思路是借助中间件(middleware)的拦截机制,来实现SKILLS的渐进式披露——这种方式更像是一种“曲线适配”,能勉强达成效果,却能明显感觉到,当时LangChain还未实现对SKILLS的原生完美支持。即便去LangChain官方网站搜索相关话题,得到的指引也依然是将SKILL拆分为Agent Tools来调用,与CLAUDE原生SKILLS的模块化、可复用特性相去甚远。
这种“慢半拍”的状态并没有持续太久,大概在今年春节前后,我身边突然涌现出大量跟进SKILLS的产品落地案例,其中就包括字节的TRAE,还有各种主打智能体功能的“龙虾”类产品,肉眼可见地感受到这项技术正在加速渗透。而就在我以为LangChain还会再酝酿一段时间时,惊喜地发现,LangChain Deep Agent已经悄悄上线了SKILLS原生支持功能,至此,从概念提出到主流平台全面落地,SKILLS终于完成了它的阶段性普及。
直接上代码
可以看到在早先create agent的基础之上,可以指定skills的目录了:
import os
from dotenv import load_dotenv
from deepagents import create_deep_agent
from deepagents.backends import LocalShellBackend
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import InMemorySaverload_dotenv()model = ChatOpenAI(api_key=os.getenv("OPENAI_API_KEY"),model_name="Doubao-Seed-2.0-pro", base_url="https://ark.cn-beijing.volces.com/api/coding/v3",temperature=0
)agent = create_deep_agent(model=model,backend=LocalShellBackend(root_dir=".",virtual_mode=True),skills=["./skills"],checkpointer=InMemorySaver(),system_prompt="你是一个智能助手,如果查询的结果是ID,那么就根据ID查询对应的名称。"
)while True:input_text=input("User message: ")if input_text.lower() in ("exit"):breakresults=agent.invoke({"messages":[{"role": "user", "content": input_text}]},config={"configurable": {"thread_id": "1"}})for message in results["messages"]:print(message.pretty_print())
细节和心得
在实际实操过程中,我也积累了一些细节心得,在这里和大家分享一下。
LLM层我选用的是豆包大模型,得益于它兼容OpenAI协议的特性,我直接采用了ChatOpenAI的调用方法,省去了额外适配的麻烦。
不过这里有个小坑需要提醒大家:如果在TRAE或者豆包平台内直接生成代码,系统大概率会提示导入豆包专属库,但后续让TRAE自主运行时,常会出现库找不到的问题。有意思的是,TRAE会自动检索豆包的官方文档,自行调整代码,最终切换到ChatOpenAI的调用方式,算是一个比较智能的适配小细节。
另外需要特别留意,由于我使用的是火山引擎的Coding Plan(火山引擎作为字节跳动旗下的云和AI服务平台,能提供稳定的大模型服务支持),因此调用时的base_url和默认配置会有所不同,具体可参考火山引擎的官方配置指引。
再说说Deep Agent的实操细节,它的写法和之前Create Agent的方式大同小异,上手难度不高,最实用的一点是,创建Deep Agent时可以直接指定SKILLS所在的目录。按照Deep Agents的设计逻辑,SKILL本质上就是包含SKILL.md文件的文件夹及相关脚本,只要将各类SKILL(包括从OpenClaw获取的SKILL)放入指定目录,就能被系统自动识别。但有一个关键细节需要重点注意:SKILL的文件夹名称必须是小写,目前Deep Agent暂不支持大写命名,否则会无法识别,这也是我实操中踩过的一个小坑。
还有一个必看要点:Deep Agent中的LocalShellBackend是加载本地SKILL的核心,没有它就无法正常调用本地的各类技能,这和Deep Agents依赖后端实现本地文件访问、技能加载的底层逻辑密切相关。另外,我通过checkpointer为智能体添加了记忆功能,Deep Agents本身封装了多种记忆保存方式,这次为了演示便捷,我选用了最基础的内存记忆。在智能体invoke调用时,需要指定config参数来标识不同的会话,我这里为了简化演示,直接设置为“1”,实际应用中可根据会话需求灵活调整。
环境配置方面也有一些差异需要注意:我使用的是MacOS系统,因此没有在Agent中额外指定Python环境变量;但如果是Windows系统,就必须手动配置,否则会影响技能的正常运行。关于Windows系统的具体配置方法,大家可以参考B站上的相关教学视频:【19-能执行 python 代码的技能-哔哩哔哩】https://b23.tv/aDDuAz7,这个视频属于“强哥学编程”的Deep Agents零基础教程合集,内容细致,小白也能轻松看懂。
跟其它智能体的对比
很多朋友可能会好奇,Deep Agent和OpenClaw这类“龙虾”产品到底有什么区别?结合我的实操体验,我用一个形象的比喻和大家说明:它们本质上都是Agent智能体,但OpenClaw就像一只成熟的龙虾,而Deep Agent则更像是一个虾卵——前者是开箱即用的成品,后者则需要我们自己打磨、配置,才能发挥出相应的功能,这也契合了Deep Agents作为“智能体脚手架”、需要开发者自行配置优化的定位。
我用QClaw(一款“龙虾”类产品)做了个直观测试:将本地系统接入QClaw后,我询问它“今天我系统里都有哪些课程”,QClaw会自动调用已配置的SKILL,通过接口获取学生ID和教练ID,之后还会自动关联人员表,将ID转换成对应的人名,整个过程无需手动干预。但同样的SKILL放到Deep Agent中,它只会直接返回原始的学生ID和教练ID,不会进行后续的转换操作。后来我在创建Deep Agent时添加了专属系统提示词,才实现了和QClaw类似的效果。这也恰恰体现了OpenClaw、Claude这类产品的优势——它们在基础Agent框架之上,额外做了大量的优化和封装工作,让用户无需关注底层细节,就能实现更便捷的操作,这也是它们能被更多小白用户接受的核心原因。
