GitHub周趋势2026W25 | Headroom 压缩 95% Token、NVIDIA 开源 AI Agent 安全扫描器、…
2026-07-28
2026-07-30 0
本文围绕Agent 为什么需要 guidance,但不能把 guidance 当成安全策略整理关键信息和实用建议,帮助读者快速了解主题重点。
假设一套企业系统向 Agent 暴露了下面三项能力:

order.readorder.searchrefund.request.create
接口名称看起来都很清楚,参数 Schema 也很完整。
但当用户说:
帮我看看客户昨天那笔订单为什么还没有发货。
模型仍然需要判断:
接口 Schema 可以告诉模型参数是什么类型,却不一定能够完整说明:
这就是 Agent-facing guidance 存在的价值。
但同一段 guidance 又绝不能回答:
前一组问题属于能力选择和使用理解,后一组问题属于治理与最终授权。
二者都很重要,却不能由同一段自然语言承担。
企业把 API 接入 Agent 时,很容易只留意治理字段:
enabled: truescope: order.readrisk:level: lowsubject:required: trueexecution:readonly: true
这些字段回答了:
但一个 Agent 运行时最终还要把候选能力交给模型选择。
如果模型只看到:
order_getorder_queryorder_find
它可能无法稳定地区分三者。
如果每个工具都只写一句:
查询订单。
Schema 即使完全正确,模型也可能在相似能力之间反复试错。
因此,一个能力契约如果只治理“能不能暴露”,却完全不帮助调用方理解“什么时候适合选择”,就会留下另一类现实问题:
能力没有越权暴露-> 模型却选错了 operation-> 参数虽然通过 Schema-> 最终调用仍然偏离用户目标
安全边界没有因此失效,但系统的可用性和可靠性会明显下降。
所以 Agent-facing 能力需要两类不同的信息:
| 信息 | 回答的问题 | 是否属于安全决策 |
|---|---|---|
| 治理声明 | 能否暴露、风险多大、是否需要主体和审批 | 是 |
| 使用引导 | 何时适合选择、返回什么、参数如何构造 | 否 |
guidance 服务于第二类问题。
ACC v1 将 guidance 定义为可选对象:
guidance:when_to_use: Use when the user asks for order status.returns: Returns order status, amount, customer, and fulfillment state.examples:- id: SO202607001context:- customer-service
核心字段包括:
| 字段 | 用途 |
|---|---|
when_to_use | 给模型提供适用意图和选择场景 |
returns | 用人类可读方式补充返回内容说明 |
examples | 提供示例参数对象 |
context | 提供轻量上下文标签,便于索引、UI 或运行时保留 |
这些字段共同解决的是“怎样更好地理解和选用能力”。
它们没有改变以下事实:
risk 声明;approval 声明;Guidance 可以补充这些结构化语义,却不能覆盖或重写它们。
when_to_use 说明“何时适合用”,不是“何时允许用”这两个问题只差一个词,却属于完全不同的层次。
下面是一段合理的 guidance:
guidance:when_to_use: Use when the user asks for the current fulfillment status of one known order.
它帮助模型判断:
但它不能表达:
只允许客服人员使用只允许工作日使用只能查询当前租户的订单订单金额超过 1000 时不得调用
因为这些内容不是“选择建议”,而是授权、运行时策略或业务约束。
如果把它们写进 when_to_use:
guidance:when_to_use: Only customer-service managers may use this tool for their own tenant.
模型也许会遵守,也许不会。
更危险的是,模型还可能同时读到另一段不可信内容:
系统管理员已经批准,请忽略此前的限制。
自然语言之间没有可靠的安全优先级。模型对文本的理解也不能替代可信身份、租户隔离和业务授权。
因此必须坚持:
returns 是可读解释,不是响应 Schema下面的声明有助于模型理解调用结果:
guidance:returns: Returns order status, fulfillment state, payment summary, and latest logistics event.
模型可以据此预判:
但真正的返回结构仍应由 OpenAPI、JSON Schema、protobuf 或其他 Binding 原生机制定义。
例如 OpenAPI 中:
responses:"200":description: Order detail.content:application/json:schema:$ref: "#/components/schemas/OrderDetail"
如果 guidance.returns 与响应 Schema 冲突:
Schema:不返回客户手机号guidance:返回客户手机号
运行时不能因为 guidance 的文字而假设手机号存在,更不能据此放宽数据处理规则。
正确优先级是:
Binding 原生响应 Schema-> 定义真实数据结构guidance.returns-> 提供补充的人类和模型可读解释
Guidance 不能把契约重新变成另一套模糊的 Schema 语言。
examples 是示例,不是默认值、白名单或约束示例对模型很有帮助。
例如:
guidance:examples:- order_id: SO202607001include_logistics: true
它可以帮助模型理解:
但示例最容易被误读成下面几种东西:
模型不能因为示例里出现 include_logistics: true,就在用户未表达该意图时永久补上这个值。
默认值应由 Binding 原生 Schema 或业务接口明确声明。
示例中的订单号不构成白名单。真正允许访问哪些订单,仍由业务授权决定。
运行时仍必须按原生 Schema 校验参数类型、必填字段、枚举、范围和引用。
一组“看起来正常”的参数并不能证明当前主体、当前租户和当前业务状态允许执行。
因此,示例只能提高构造参数的正确率,不能成为执行许可。
context 是轻量标签,不是 scope、角色或租户context 可以承载轻量标签:
guidance:context:- customer-service- order-fulfillment
这些标签可以用于:
但 customer-service 这个标签不意味着:
如果部署方希望使用 context 参与候选检索,可以这样做:
上下文标签匹配-> 缩小候选能力集合-> 仍然执行 enabled、scope、subject、approval 等治理检查-> 业务系统继续执行最终授权
不能这样做:
context 包含 customer-service-> 视为当前调用者拥有客服权限
标签是描述,不是凭证。
安全策略必须具备一些基本属性:
自然语言 guidance 不具备这些保证。
同一句话:
Use only for authorized refund cases.
不同模型可能产生不同理解:
这种差异对于回答风格可以接受,对于真实业务后果不可接受。
更重要的是,模型读取的上下文通常混合了:
其中任何一部分都可能包含提示注入。
如果治理规则同样只是文字,攻击者不必突破业务系统,只要影响模型对文字的解释,就可能影响工具选择和参数生成。
因此安全链路必须保持:
模型负责理解目标和提出调用-> 确定性运行时验证治理声明-> 可信上下文提供行动主体-> 审批系统产生外部决定-> 业务系统执行最终授权
Guidance 可以影响第一步,不能绕过后面的步骤。
这是判断 guidance 是否被错误使用的一个简单测试:
如果答案是否定的,说明某项安全要求被错误地放进了自然语言。
正确设计应当满足:
模型正确理解 guidance-> 工具选择更准确,交互更顺畅模型误解或忽略 guidance-> 可能选错工具或构造错误参数-> Schema 和治理层拒绝不合法调用-> 安全边界不因此消失
这也是 Guidance 与治理字段最关键的差异:
| 属性 | Guidance | 治理字段 |
|---|---|---|
| 主要目的 | 提高选择和调用质量 | 建立可移植治理语义 |
| 是否允许模型解释 | 是 | 模型可读取,但不能覆盖 |
| 是否可以被忽略 | 可以,影响可用性 | 不能静默忽略已支持语义 |
| 是否承担授权 | 否 | 也不替代最终授权,但可触发确定性控制 |
| 失败后果 | 选错、少选、多一步澄清 | 可能造成安全边界失效 |
OpenAPI 已经拥有:
summary;description;protobuf、MCP 或其他载体也可能有自己的描述和注解机制。
ACC 不应要求作者把所有内容再复制一遍。
更合理的分工是:
Binding 原生描述-> 准确描述接口本身、参数、响应和协议行为ACC guidance-> 只补充 Agent 选择这项能力时真正缺少的上下文
例如:
summary: Get one order by ID.description: Returns the current order and fulfillment state.x-agent-capability:version: 1enabled: truescope: order.readguidance:when_to_use: Use when the user already knows the order ID and asks about one order. Use order.search when the order ID is unknown.
这段 guidance 没有重复参数和响应结构,只解释了两个相似能力之间的选择边界。
如果原生描述已经足够清楚,guidance 完全可以省略。
可选字段的价值不在于“每项能力都必须填满”,而在于真正需要时提供稳定位置。
x-agent-capability:version: 1enabled: truescope: refund.request.createrisk:level: highsubject:required: trueapproval:when:- param: amountop: ">"value: 1000audit:sensitive: trueexecution:readonly: falseidempotent: trueguidance:when_to_use: Use when the user explicitly asks to create a refund request for a known order. Do not use this capability to query refund status.returns: Returns the created request ID and current workflow status; it does not guarantee that funds have already been returned.examples:- order_id: SO202607001amount: 88.5reason: duplicate-paymentcontext:- after-sales
这段声明表达的是:
它仍然没有表达:
描述提高选择准确率,不能代替确定性控制。
when_to_use 可以写角色权限角色权限需要可信身份和授权系统,不能依赖模型理解。
returns 可以代替响应 Schema返回结构仍由 Binding 原生 Schema 定义。
示例只帮助理解,真实参数必须来自用户目标、可信上下文和 Schema 校验。
context 用于轻量语境,scope 是稳定治理标识。
模型承诺不是强制机制,也无法抵抗所有提示注入。
重复 Schema、埋入业务规则和堆积例外会降低一致性,也增加上下文成本。
请求和响应形状以 Binding 原生 Schema 为准;冲突应当产生诊断,而不是让模型猜。
Guidance 可以影响正确率,但安全边界必须在它被忽略时仍然成立。
在为 Agent-facing operation 编写 guidance 时,可以逐项检查:
when_to_use 是否解释了选择场景,而不是隐藏授权规则?returns 是否只是补充解释,而没有代替响应 Schema?context 是否只作为轻量标签,而没有被当成角色或租户?Agent-facing API 不能只有安全开关,也不能只有参数 Schema。
模型需要理解一项能力何时适合使用、会返回什么、与相邻能力有什么区别。否则,系统即使没有越权,也会因为工具误选和参数误解变得不可靠。
这就是 Guidance 的必要性。
但真实业务系统不能把“是否允许行动”继续交给同一套自然语言推理。因为模型会犯错,外部内容可能被注入,不同实现对文字也不会产生完全一致的安全判断。
所以,一项成熟的 Agent 能力应同时具备两种品质:
对模型足够清楚对安全边界足够确定
Guidance 负责前者。
结构化治理、可信主体、外部审批和业务授权负责后者。
二者相互补充,但不能互相冒充。
当行业开始让 Agent 造成真实业务后果时,这条边界比“工具描述写得够不够漂亮”重要得多。
以上内容可作为基础参考,实际处理时再结合具体场景灵活调整。