编程 工具调用入门:让 LLM 能动手、能看、有护栏

2026-09-07 23:12:38

Agent Skills 101:给 AI 手、眼睛和安全护栏

让 LLM 写十四行诗只要四秒;让它查天气、读本地 SQLite、总结新上传的 PDF,它却撞上一堵无形的墙——就像隔着隔音玻璃和一个天才聊天:才华横溢,但与外部世界完全脱节。这堵墙在引入 agent skills(工具调用/function calling)那一刻消失——被动文本生成器变成主动问题解决者。但从玩具 demo 到可靠系统,不只是给 API 端点传一个函数列表。

心智模型:线性 LLM 与 Agentic 系统的区别

传统设置是纯线性的:User Input → [LLM] → Output Text。模型在 token 上算概率分布、返回文本流;答案需要实时数据或外部计算时,只能猜——通常导致自信的幻觉。

Agentic 架构把线性请求变成连续推理循环,四步:

  • Observe:评估用户请求,检查当前状态/环境;
  • Think:推理目标——已知答案,还是需要外部数据?
  • Act:需要数据或变更时,触发一个 skill(API 调用、数据库查询或脚本);
  • Reflect:评估 skill 返回的输出,决定任务完成还是需要下一步。

Agent Skill 底层是什么

工具调用里没有神秘的 AI 魔法。一个 agent skill 由两块组成:

  • 一个普通代码函数:你写的 Python/JavaScript 函数,做具体的事(抓 API、解析文件);
  • 一个结构化 schema:告诉 LLM 工具叫什么、做什么、期望什么参数的 JSON 规格。
import json

def get_user_subscription(user_id: str) -> dict:
    """Fetches subscription status for a given user ID from our system."""
    database = {
        "usr_101": {"tier": "Pro", "status": "active", "renewal_days": 12},
        "usr_102": {"tier": "Free", "status": "active", "renewal_days": 0},
    }
    return database.get(user_id, {"tier": "Unknown", "status": "error"})

配合工具 schema(name、description、parameters)交给模型,模型在需要时以 JSON 参数发起调用,你的代码执行并把结果送回循环。

可靠性的三个护栏

从 demo 到生产,作者强调的实践要点:

  • schema 即契约:参数约束写死在 JSON schema 里(类型、必填、枚举),模型越界请求在入口被拒绝;
  • 循环限步:Observe-Think-Act-Reflect 可能无限转圈,给最大迭代次数与超时;
  • 权限最小化:skill 按能力拆分(只读/写操作分离),敏感动作需显式确认或单独审批路径。

实践建议

  • 每个 skill 保持"一个函数 + 一个 schema"的粒度,宁可多而小,不要大而全——模型更容易选对工具;
  • 失败路径要设计:skill 抛错时把错误信息传回模型,让它 Reflect 后换策略,而不是静默吞掉;
  • 先做"手"(能执行动作)再做"眼睛"(能读环境),最后加安全护栏(限步、鉴权、审批)——按这个顺序迭代。

来源:Agent Skills 101: Giving Your AI Hands, Eyes, and Safety Rails - DEV Community

复制全文 生成海报 AI Agent 教程

推荐文章

程序员茄子在线接单