你可能会说:
- “能不能在 Agent 动手之前,先拦一道?”
- “提示词里写了"不许读别的文件",为什么它还是去读了?”
它是什么
Agent 每次调用工具(读文件、执行命令、发请求)之前,框架会先看有没有钩子要检查这一步。钩子是普通代码,看得到工具名和参数,可以放行、拒绝,或者记一笔。
它和提示词的区别在于:提示词是请求,模型多半会照做,但也可能做不到;钩子是代码,不管模型怎么想,都会执行。必须做到的限制,比如不许读目录之外、不许执行命令,放在钩子里。
钩子只适合"能不能做"这类边界清楚的规则,不适合做业务判断:回答好不好、语气对不对,交给提示词和评测。写好的钩子,要用测试证明它拦得住。
打个比方
像门口的闸机:墙上贴着"闲人免进"是提醒,闸机认卡才放行是规矩。
在这个网站里
兄弟项目里的知识库 Agent,用一个工具调用前的钩子检查每次读取的路径:落在语料目录之外就拒绝。它配了 17 条单元测试,还实测拦下了读取系统文件的请求(第 18、24 课)。E2E 导师也有一个钩子,每次调用工具前再核对一遍工具名。
容易搞混的地方
常见误解
提示词里写清楚"不许做",就等于设了限制
正确理解
提示词是请求,钩子才是限制。必须做到的,写成代码,再用测试证明。
常见误解
钩子加得越多越安全
正确理解
每多一道代码闸门,Agent 能做的事就少一些。钩子只拦安全和副作用,判断类的规则交给提示词和人。
你可以这样告诉 AI
复制下面这段,贴给你的 AI
哪些操作是必须拦下的?请写成工具调用前的钩子,检查工具名和参数,并写测试覆盖越界的情况。哪些只是希望它做到的,留在提示词里。
接下来去哪
先知道
- 智能体——一个会自己决定下一步做什么的程序:大模型负责思考,工具负责动手,循环往复直到完成任务。
- 工具调用——模型不直接动手,而是说"我要调用某某工具、参数是这些",由你的程序去执行,再把结果交还给它。
对比着看
- 提示词——你交给模型的全部文字:要求、背景、参考、限制。模型只能根据它看到的这些来写。
接着看
在这些课里出现