不用急着囤一堆课程。让大模型真正帮你干活的钥匙,其实藏在一个叫 Agent Skills 的概念里。这一篇不整虚的,直接拆开揉碎讲清楚:它到底是什么,为什么能把“陪聊”变成“专家”,以及小白程序员怎么一步步上手落地。
我一直有个感受:很多人在大模型上花了大量时间,结果只是把它当成一个更聪明的搜索引擎。问两句天气、让写个周报、再生成一段代码,没了。这不叫用大模型,这叫围观大模型。真正的用法,是让它带着“手艺”进场——不只是回答你,而是直接把你手里的活儿接过去,做完,再交付给你。Agent Skills 就是这个“手艺”的载体。
这篇文章适合谁?适合刚接触大模型开发、想用 RAG(检索增强生成)、Prompt Engineering、Function Calling 这些技术做点真实东西的程序员。也适合那些已经试过 API、但总觉得差点意思——模型不够懂你的业务、回答太泛、没法真正解决具体问题的朋友。你不需要有深厚的机器学习背景,但最好熟悉 Python 基础语法,毕竟后面会有实战代码。如果你连 Python 也不熟,也别急着关页面,把概念部分看懂,把代码部分当成模板抄,一样能跑起来。
1. 项目整体拆解:Agent Skills 到底解决了什么问题
1.1 “陪聊”和“专家”的本质差距在哪
先做一个思想实验。你对着大模型说:“帮我写一个 Python 脚本,把某个目录下的 CSV 文件合并成一个。”普通模式下的结果是:模型给你一段代码,然后你自己复制、保存、装依赖、改路径、跑起来、修报错。折腾半小时,终于跑通了。这不是助手,这是出题老师。
专家模式下的结果是:你告诉模型“合并 /data 目录下所有 CSV,按日期排序,把重复行去掉”,它自己调用文件系统工具、检查目录内容、完成合并、处理异常、输出结果文件,然后告诉你它做了什么、有哪些注意事项。这才叫专家。
差别不在模型本身,而在模型有没有工具、有没有流程、有没有对结果的评估能力。Agent Skills 要做的,就是把“我知道怎么做”变成“我直接来做”。
我从这个项目里得到的第一个核心认知是:大模型的能力边界,不是由参数规模决定的,而是由它能不能调用外部工具决定的。模型再聪明,算不出文件大小;模型再博学,不知道你服务器上现在跑着什么服务。但给了它工具,它就能看、能算、能操作。Agent Skills 的本质,就是把模型的“语言能力”和工具的“执行能力”焊在一起。
1.2 当“会说话”遇上“会干活”
为了把这个项目做扎实,我把整个系统分成四层:
- 第一层是模型层。负责理解意图、生成回复、拆解任务。这是大脑。
- 第二层是技能层。就是今天的主角 Agent Skills,以一段结构化的指令加元数据描述存在。每个 Skill 负责一个具体领域,比如 CSV 处理、数据分析、代码审查。
- 第三层是工具层。真正干活的函数、API、命令行工具。比如读文件的函数、执行 Python 的接口、访问数据库的连接器。
- 第四层是记忆层。记录用户偏好、历史决策、之前犯过的错,让模型在多次对话中越用越顺手。
传统 RAG 解决的是“模型不知道”的问题——把知识喂给它。Agent Skills 解决的是“模型不会做”的问题——把技能教给它。两者互补,不冲突。我在这套系统里同时用了两种:RAG 负责提供业务上下文,Skills 负责执行操作,效果比单用任何一种都明显。
1.3 为什么需要“技能”而不是“更好的 Prompt”
有人会问:那我写个超长 Prompt,把所有步骤都写在里面,不也行吗?
诚实地讲,行,但效果差很多。超长 Prompt 有四个要命的问题:
第一,Token 开销大。每请求一次都要带上这堆指令,成本翻倍往上走。
第二,上下文稀释。模型会被无关信息干扰,反而抓不住重点。
第三,维护性差。命令稍微改一点,就要去翻那个几千字的大 Prompt,删改还容易漏。
第四,无法复用。你在项目 A 里写了一堆 CSV 处理指令,项目 B 里又要复制一份。改了一处忘了另一处,最后两个行为不一致。
Agent Skills 的解决方案是模块化。把某个能力封装成一个独立的 Skill 文件,有名字、有描述、有指令、有示例。模型根据用户请求自动判断该调用哪个 Skill,就像你家里电器多,总不能把所有说明书贴墙上,而是要用哪个查哪个。这是工程化的思维——跟写代码做抽象是一个道理。
从投入产出比来看,Agent Skills 绝对是小白能接触到最划算的技术方向。前期多花几个小时定义好 Skill 的结构和边界,后面每次调用的稳定性都会好很多,维护成本直线下降。
2. 核心细节解析:手把手把 Agent Skills 拆开看
2.1 Skill 文件里到底应该写什么
我把一个成熟的 Skill 拆成五个要素,没有一个是多余的:
作用域描述(Scope)。它必须在什么场景下被调用。写得太宽,模型就会乱调;写得太窄,模型就永远想不到用它。典型写法是“仅当用户需要处理表格数据时使用,包括但不限于读取、筛选、合并、清洗”。
执行指令(Instructions)。这是给模型看的行为准则,不是给用户看的。要明确步骤顺序、判断条件、输出格式。比如“先检查文件编码,若为非 UTF-8 则尝试转换再继续”。
示例(Examples)。给模型一到两个完整的输入输出对,比写一百句抽象描述都管用。模型在小样本条件下特别吃这一套。
边界声明(Boundaries)。明确什么情况不要用这个 Skill。比如“当用户需要处理的是 JSON 数据而非表格时,不要调用此 Skill”。这能显著减少误调用。
依赖工具列表(Dependencies)。声明这个 Skill 需要哪些内部工具函数。比如 list_files、read_csv、write_csv。模型知道了工具清单,就不会自己瞎编函数名。
在格式上,我用的是 Markdown 文件,头部带 YAML 元数据。大致长这样:
--- name: csv_processor description: 处理 CSV 表格数据的技能,包括合并、清洗、格式转换 when_to_use: 用户提出任何关于表格文件的读取、合并、清洗、转换需求时 when_not_to_use: 用户需要处理的是 JSON、Excel 或其他非 CSV 格式数据时 dependencies: [list_files, read_file, write_file, run_python_code] ---下面接正文指令。注意,这里的 YAML 不是摆设,而是要给外部分发器(dispatcher)解析用的。模型读取全文,分发器只看元数据,双层配合。
提示:小白最容易犯的错就是把描述写得模棱两可。记住一个原则——描述是写给“阅读理解能力不强但推理能力很强”的模型看的,越具体越好。
2.2 模型的“能力增强回路”和工具注册表
光有 Skill 文件不行,还要有能调用它的机制。我用了一个极简但好扩展的思路:工具注册表 + 技能分发器。
工具注册表是一个 Python 字典,key 是工具名称,value 是真实函数。模型请求调用时,先查注册表,存在才放行。
技能分发器的职责是:解析用户消息 -> 提取潜在技能意图 -> 列出匹配的 Skill -> 把对应 Skill 的指令和工具注入本次会话的上下文 -> 交给模型做下一步规划。
这里要澄清一个容易混淆的点:Agent Skills 跟 Function Calling 是什么关系。通俗地讲,Agent Skills 是“策略层”,决定做什么;Function Calling 是“执行层”,决定怎么调。Skill 是兵法,Function 是兵器。很多开源框架把这两者混为一谈,导致 Skill 越写越厚、执行越来越乱。我建议从一开始就把它们分在两个目录里,思路会清晰很多。
给个最小可运行的分发逻辑示例:
def dispatch(session_state, user_message): query_vector = embed(user_message) skill_scores = {} for skill_name, skill_meta in SKILL_INDEX.items(): meta_vector = embed(skill_meta["description"] + skill_meta["when_to_use"]) skill_scores[skill_name] = cosine_similarity(query_vector, meta_vector) best_skill = max(skill_scores, key=skill_scores.get) if skill_scores[best_skill] < TRIGGER_THRESHOLD: return None return best_skill这个思路特别适合小白理解:它不是“硬编码”,而是“先匹配再执行”。匹配不中就回到普通聊天模式,匹配中了才进入技能模式。这样既保证灵活性,又能兜底。
2.3 配置清单和模型选型的心得
Skill 文件写好之后,真正干活的是“模型 + 工具”。我把这一层的选型心得收敛成了一张清单:
优先选择支持工具调用的模型,别在纯文本模型上硬造轮子。支持原生 Function Calling 的模型会减少很多解析上的麻烦。
给每个工具函数加类型注解和异常捕获。模型拿到的工具说明里如果有类型信息,生成参数时的准确率会高不少。别小看这个细节,我实测过,带上类型注解后参数格式错误率能降三成左右。
工具的返回结果要尽量结构化。纯文本返回会让模型二次解析,加时间也加出错概率。JSON 返回是最稳的。比如读取 CSV 工具,返回{"row_count": 100, "columns": ["a", "b"], "first_rows": [...]},模型一眼就能看清局面。
超时和重试逻辑必不可少。大模型调用外部工具的耗时很不稳定,必须给每个工具执行设置合理超时(我常用 10 秒)。超时后由模型决定是重试还是改用方案 B。
我在实际操作里,把配置参数放进了.env文件里管理:
MODEL_NAME=your-model-name MODEL_API_BASE=https://api.example.com/v1 SKILL_DIR=./skills TOOL_TIMEOUT_SECONDS=10 MAX_ITERATIONS=8尤其是MAX_ITERATIONS,这个参数很多人忽略,但它就是防呆开关——防止模型在复杂任务里陷入死循环反复调用工具。我通常会设成 8 步,超过就强制让模型输出阶段总结并停下来问用户。
3. 实操过程:从空项目到一个完整技能
3.1 搭起骨架
我直接从代码层面带你过一遍。这是一个最小但五脏俱全的工程结构:
agent_skill_demo/ ├── main.py # 入口,负责交互循环 ├── dispatcher.py # 技能分发器 ├── tools/ │ ├── __init__.py │ ├── file_ops.py # 文件相关工具 │ └── data_ops.py # 数据处理相关工具 ├── skills/ │ ├── csv_processor.md │ └── code_reviewer.md └── memory/ └── session_store.json # 简易记忆存储记住一个原则:Skill 是配置,不是代码。这句话能让工程结构干净很多。Skill 文件里写的是给模型看的自然语言指令,代码里只保留加载和分发逻辑。将来换 Skill 内容,不用动代码,热更新都行。
3.2 手写一个真正有用的 Skill
这里写一个“代码审查员”的技能文件,作为第二个示例。很多小白项目里代码质量是大问题,让大模型当审查员其实特别实用。
--- name: code_reviewer description: 对 Python 代码进行审查,找出潜在 bug、风格问题和安全隐患 when_to_use: 用户提供了代码片段或文件路径,并要求检查或改错时 when_not_to_use: 用户只要求解释代码含义而不是评价代码质量时 dependencies: [read_file, run_python_code, list_files] ---你的任务:
- 先读取指定文件或接收代码片段。
- 检查以下方面:语法风险、潜在运行时异常、PEP8 风格偏差、安全隐患(如 SQL 注入、命令执行、敏感信息硬编码)、明显逻辑错误。
- 按严重级别输出结果,从高到低分为 Critical、Major、Minor、Nit。
- 每个问题必须附上定位到行号的建议修复方案。
- 如果代码不能运行,尝试用 run_python_code 执行并反馈报错信息。
示例输入:请帮我审查 main.py
示例输出:
- Critical:第 12 行,未处理文件不存在异常,可能导致程序崩溃。建议用
try-except包裹或先用os.path.exists检查。 - Major:第 18 行,SQL 查询使用字符串拼接,存在注入风险。建议改用参数化查询。
把这个文件丢进 skills 目录,然后在主程序里让模型在响应代码审查类请求时自动加载它。我在实践中的体会是:给多一些类似上面的具体示例,比给它十条抽象规则要好得多。模型的 few-shot 能力在这种场景下真是发挥得淋漓尽致。
3.3 主程序把一切都串起来
主程序的核心是一个循环:接收输入 -> 分发 -> 装配上下文 -> 调用模型 -> 执行工具 -> 返回结果。
import os from dispatcher import dispatch from skills_loader import load_skill from llm_client import chat_completion, execute_tool_calls def main(): history = [] skill_dir = os.getenv("SKILL_DIR", "./skills") skill_cache = load_all_skills(skill_dir) print("Agent initialized. Type 'exit' to quit.") while True: user_input = input("You: ") if user_input.strip().lower() == "exit": break skill_name = dispatch(skill_cache, user_input) active_skill = skill_cache.get(skill_name) if active_skill: system_prompt = ( "你现在是一个具备专业技能的专家。\n" f"请严格遵循以下技能指令:\n{active_skill.content}" ) else: system_prompt = "你是一个乐于助人的智能助手。" history.append({"role": "user", "content": user_input}) response = chat_completion(system_prompt, history) history.append({"role": "assistant", "content": response}) while response.get("tool_calls"): response = execute_tool_calls(response["tool_calls"], history) print("Agent:", response["content"])这个循环最核心的就是中间那个内层while:模型要求调工具 -> 执行 -> 把结果喂回去 -> 模型再决策。循环直到模型不再请求调工具为止。每一步的对话历史都保留,这样模型能参照之前的执行结果做下一步判断。
3.4 实操中必踩的四个坑
下面是真实开发中我一定绕不开的坑,提前跟你说清楚:
第一个坑是模型“把工具当聊天对象”。有时候模型会调用了工具之后,不把结果当回事,直接就回复用户说“我已经做了”。解决方案是在 System Prompt 里加一句“所有工具返回结果必须被纳入你的判断依据,如果返回结果为空请复述错误或请求用户补充信息”。这句话很管用。
第二个坑是“技能匹配过于自信”。我一开始用的余弦相似度阈值设得太低,导致用户问一句“这个文件怎么打不开”,模型都想去调用 CSVParser,结果驴唇不对马嘴。后来我把阈值调高,再往前走一步——让模型自己确认“是否需要使用该技能处理”。别看这一步简单,误调率直接降了一半多。
第三个坑是“工具之间缺少状态”。比如第一个工具把 CSV 清洗完了,第二个工具要基于清洗后的结果去统计,结果它又去读原始文件。最省事的解法是给工具加一个“中间产物”约定:数据转换工具把结果写到指定临时目录,并返回一个新的文件路径,后续工具都优先读取该路径。
第四个坑是“无限递归和会话膨胀”。模型调用工具回来后,历史记录越积越长,有时候下一次请求直接把上下文塞爆。对策是引入简单的滑动窗口,只保留最近的 N 条消息,同时把关键状态单独存到session_store.json里。
我实测踩坑之后发现一个规律:Agent 系统的大多数问题不是模型笨,而是上下文管理不到位。工具返回的结果太杂、历史太臃肿、指令和结果混在一起,模型自然抓不住重点。把上下文收拾干净,模型的智商立刻“恢复上线”。
4. 从“单技能”到“多技能协同”:如何让 Agent 更像一个团队
4.1 技能不是越多越好,而是越“隔”越好
很多人看到 Agent Skills 的概念很兴奋,一口气写了十几个技能文件,每个都洋洋洒洒上千字。结果模型每次匹配都犹豫半天,不知道用哪个,最后干脆全塞进上下文。这不是增强,这是精神分裂。
我的经验是:技能之间要尽量“正交”。所谓正交,就是每个技能只负责一个清晰的领域,技能之间的职责范围尽量少重叠。比如“CSV 处理”和“Excel 处理”在功能上高度重叠,合并成一个“表格数据处理”比拆成两个明智得多。重叠意味着歧义,歧义意味着模型要猜,猜就有概率出错。
我一个项目里最多同时维持五个技能,再多的需求就通过让技能内部调用工具来扩展。这就像带团队,不是人越多越好,而是每个成员边界清楚、指令明确、能协同干活。
4.2 技能间通信的极简方案
多技能协同有一个绕不开的问题:技能 A 的处理结果,技能 B 怎么拿到?
基于共享文件的通信是最容易上手的方式。技能 A 把结果写成 JSON 存到指定工作目录,技能 B 启动时先读取该文件。缺点是磁盘 IO 略慢,但对于小白项目足够了。
更轻量一点,可以在会话内存里维护一个全局的shared_state字典。每个技能在执行前后可以更新它。下面是一个简化示例:
shared_state = {} def run_csv_cleaner(state): file_path = state.get("current_file") cleaned_path = clean(file_path) state["current_file"] = cleaned_path state["last_op"] = "clean" return state这个方式最大的优点是调试方便。你把shared_state打印出来,一眼就能看清“模型在哪个节点做了什么决策”,排查问题非常直接。
4.3 防冲突和优先级规则
多技能还有一个隐患:两个技能的指令冲突。比如“代码审查员”要求严格执行 PEP8,“性能优化器”要求写紧凑代码减少循环开销。当用户同时要求“优化并审查这段代码”时,到底听谁的?
我在 Skill 文件里加了一个字段叫priority_offset,用来声明该技能在冲突时的优先级权重。代码审查的优先级高于性能优化。然后在分发器里做一个简单裁决:
def resolve_skill_conflict(candidates): return sorted(candidates, key=lambda s: s.priority_offset, reverse=True)[0]当然,最高效的做法还是让模型自己判断,因为它能理解上下文。但这个兜底规则是给模型兜底的,防止它给出极端决定。
4.4 一套好用的评估方式
没有评估就没有进步。Agent Skills 跟普通函数不一样,它的输出正确性没有标准断言。但我调试出了一套特别实用的评估方法:
单测法。把技能固定下来,用一批固定的测试输入跑,人工检查输出质量,记录下来。以后改了 Prompt 或工具,再跑同一批测试,对比输出差异。
回归对比法。把模型新旧两版对同一输入的回复放在一起,人工盲评。这个方法简单粗暴但有效,尤其适合小白。
抽样式线上评估。在多次真实对话中随机挑出一些记录,标注“技能是否被正确触发”“工具调用是否准确”“结果是否满足用户需求”三个指标。定期统计,趋势一目了然。
这些评估方法不需要特别复杂的平台,一个电子表格就能跑起来。别嫌原始,我自己就是靠这个方法论把技能触发准确率从 60% 提到 90% 的。
5. 常见问题与排查技巧实录
5.1 “技能从未被触发”,问题出在哪
最普遍的原因有三个。
第一个:描述里没有覆盖用户的表达方式。用户说的是“把这个表弄干净点”,而你的描述写的是“CSV 数据清洗”。语义上能对,但嵌入向量相似度不高。解决方法是在when_to_use字段里多写几种自然语言的触发说法。
第二个:触发阈值太高。余弦相似度除非是 0.9 以上才触发,那当然很难匹配。我建议先临时把阈值降到 0.3 跑一遍,看分发器的候选排序,再决定合理阈值。
第三个:模型压根没被允许调用工具。有些模型在默认 System Prompt 下不调用任何 Function。我一般在 System Prompt 里主动加一句“你内置以下工具:xxx,如果任务需要可自行调用”。这句话能把工具调用率提升一大截。
5.2 工具调用参数反复出错怎么办
模型生成的参数结构不稳定,大概率是工具的 JSON Schema 写得太随意。我用过一个笨但有效的方法:在工具说明里直接附上一个真实调用示例。
{ "tool_name": "read_csv", "params": { "path": "/data/input.csv", "encoding": "utf-8" } }模型对示例的模仿能力比对抽象描述的理解能力强得多。十个抽象规则不如一个示例,这是我在各种模型上反复验证过的经验。
还有一个隐蔽问题:有些模型工具调用和文本回复是混着输出的,解析的时候容易截断。我建议用成熟的函数调用解析库或严格正则,并且在 Prompt 里强调“你的回复中只应包含工具调用,不要输出自然语言解释”。虽然听起来有点生硬,但实测解析成功率提升三分之一。
工具执行后的结果有时非常大,尤其当你读了一个几千行的 CSV 时。我的解决方案是让工具在返回前先做摘要。只返回行数、列名、前五行数据、缺失值统计。把完整数据留到模型明确要求时再传。这样既省 Token,又加速模型决策。
5.3 模型“幻觉工具”,编了一个不存在的函数
这是典型的模型过度自信问题。它在生成工具调用时凭空杜撰,比如delete_file、send_email之类。解决方式是在工具执行入口做一个白名单校验:
ALLOWED_TOOLS = set(tools.keys()) def call_tool(tool_name, params): if tool_name not in ALLOWED_TOOLS: return { "status": "error", "message": f"Unknown tool: {tool_name}. Valid tools are: {sorted(ALLOWED_TOOLS)}" }这个设计最妙的地方在于:报错信息里带着合法工具列表给模型看,它能立刻“自我纠正”,下一轮就不再乱编了。这比单纯报错要好太多,因为给了模型自救的路径。
5.4 小白常问的“记忆”问题
Agent Skills 本身不带记忆,它是纯技能包。需要记忆的是 Agent 系统本身。我用的方案是在会话里维护一个自动溢出的recent_events数组,同时把重要的用户偏好单独存成long_term_memory.json。每个技能执行完毕后,可以读取这个文件里的偏好字段做参数微调。
比如用户是数据分析师,经常处理大文件,那read_csv工具就默认设encoding="utf-8"、sample_rows=100。这个偏好不用每次重申,存一次就行。
5.5 排查效率翻倍的三板斧
真正的排查工具不是“猜”,而是“看”。我把自己的三板斧分享出来。
第一板斧:每次对话都把“分发器命中了哪个技能”“模型调用了哪个工具”“工具返回了什么状态”打印成结构化日志。不是大段文字,而是 JSON。一眼定位问题。
{ "user_intent": "clean_data", "matched_skill": "csv_processor", "confidence": 0.87, "tool_calls": [{"name": "read_csv", "status": "ok"}], "final_answer": "数据已清洗,去重 42 行。" }第二板斧:故意让某个工具失败,观察模型能不能恢复。比如把 CSV 文件临时改成错误编码,看模型是崩了还是继续尝试。这个叫“故障注入测试”,不需要复杂框架,几十行代码就能实现,能快速摸清系统韧性。
第三板斧:每次修改 Skill 文件只改一处。改完立刻跑同一组测试,看变化。不要一次改三处,否则出了问题根本分不清是哪个改动引起的。这条尤其送给性子急的朋友。
6. 扩展玩法:这个系统还能往哪个方向长
6.1 从“技能包”到“角色包”
一个更深度的玩法是把技能和角色绑定在一起。比如“数据分析师”这个角色,包含数据读取、数据清洗、统计分析、可视化四个技能,外加一套“分析报告的书写规范”。这样你从一个通用助手能切换出一个领域专家,体验是质变级的。
实现上只需要在分发器里多维护一个“角色到技能的映射表”。用户说“进入数据分析师模式”,就把这个角色下的所有技能注入上下文,并把角色的系统提示词替换掉默认。实测的体验是,回答的专业度和稳定性都上了三个台阶。
6.2 接入自己的业务数据
如果你的工作环境中有一堆私有代码库、内部文档、历史工单记录,可以把 RAG 和 Agent Skills 结合起来。RAG 负责“打捞知识”,Skills 负责“执行操作”。比如用户问“帮我找一下上个季度付款失败的订单,看看原因分布”——RAG 先把订单知识拉出来,分析技能再去做统计和归因。
这里有一个特别实用的技巧:把 RAG 的检索结果直接塞进 Skill 的上下文,而不是塞进全部对话。这样模型在执行技能时只面对跟任务相关的信息,不会被无关检索结果干扰。我每次做这种融合,都要反复强调“先检索后聚焦再执行”这个三步流程。
6.3 加一道自动校验层
跟 Agent 协作久了你会发现,它偶尔会犯一些“低级错误”,比如文件路径拼错了、格式判断错了。其实可以加一道自动校验层:当技能输出特定结构的结果时,用一个小的校验函数把关。例如“CSV 清洗”完毕后,工具自动检查行数是否变少、关键列是否有 None,不符预期就重新执行或上报。
这层校验一开始不需要很复杂,只要能兜住最核心的几个数据质量指标就行。后续根据真实事故,持续往校验规则里加条目,你的系统会慢慢变得比初版可靠很多。
6.4 把“经验”沉淀成新技能
最后这点是最有复利价值的。跑一段时间系统之后,你应该能从记录里发现:用户总在用同一种方式提问,或者某个工具链总是需要模型多转几轮才能搞定。这时候,把这个常见模式固化成一个新的 Skill。固化一个动作,就是消灭一类问题,同时省下一堆 Token 和时间。
我之前做过一个实验:在同一个系统里,最初的三个技能解决了 70% 的常见任务。运行一个月后再加两个“长尾技能”,覆盖率到了 92%,系统的平均响应时间反而变快了。因为模型不需要在每次请求时都“思考”该怎么处理——它拿到了明确方案,直接执行。
这个方法论跟带新人很像:一开始什么都讲流程,后来常见场景都形成条件反射,效率自然上来了。把 Agent 当成团队里的一个新成员来培养,你会发现它的成长速度远比你想象中快。
我个人在实际搭建中最大的体会是,Agent Skills 的门槛其实很低,但要把它用出效果,拼的不是模型多强,而是你对“任务边界”和“上下文管理”的理解有多深。技能文件写得好,一个过千亿参数的模型能发挥出专家级的水平;技能文件写成一团浆糊,再强的模型也能干出实习生级别的活。如果你刚上手,建议只挑一个你日常最头疼的任务,先做出一个技能,配上三个工具,把整条链路跑通。然后再加上第二个技能、第三个技能,让它们慢慢协同起来。这个方法我推荐给了很多人,反馈都是:原来不知不觉就用上了 Agent,而且项目上线后会越来越离不开它。