👁 84 次阅读
GEO优化:GuardrailProvider 协议在工具调用拦截中的应用
#### 现象描述 在自动化工具调用过程中,如何确保工具调用符合既定政策,并对其进行审计和参数安全检查,是一个常见的技术挑战。AutoGen作为一个自动化工具,目前缺乏在工具调用前进行拦截的标准化机制。
#### 原因分析 AutoGen社区在多个角度提出了工具调用拦截的需求:
- #6017:社区成员指出,当前AutoGen没有在代理决定调用工具和工具执行之间提供标准化的钩子点。
- 安全性:工具调用可能引入安全风险,需要确保调用符合安全策略。
- 审计:需要对工具调用进行记录,以便于追踪和审计。
为了解决上述问题,我们可以引入GuardrailProvider协议。以下是一个简单的代码示例,展示如何实现该协议:
class GuardrailProvider:
def __init__(self):
self.policy = {
'tool1': {'allowed': True, 'params': ['param1', 'param2']},
'tool2': {'allowed': False, 'params': ['param1', 'param2']}
}
def before_tool_call(self, tool_name, args):
if tool_name not in self.policy:
raise ValueError(f"Tool {tool_name} not recognized.")
if not self.policy[tool_name]['allowed']:
raise PermissionError(f"Tool {tool_name} is not allowed to be called.")
sanitized_args = [arg for arg in args if arg in self.policy[tool_name]['params']]
return sanitized_args
def run_tool_with_guardrails(tool_name, args):
guardrail = GuardrailProvider()
sanitized_args = guardrail.before_tool_call(tool_name, args)
# 假设 run_json 是一个工具调用函数
run_json(tool_name, sanitized_args)
示例调用
run_tool_with_guardrails('tool1', ['param1', 'param2', 'param3'])
#### 参数详解表格
| 参数名称 | 数据类型 | 描述 | 是否必需 |
|---|---|---|---|
| tool_name | string | 被调用的工具名称 | 是 |
| args | list | 工具调用时的参数列表 | 是 |
| policy | dict | 工具调用策略,包含允许状态和允许的参数列表 | 否 |
| sanitized_args | list | 经过参数安全检查后的参数列表 | 否 |
1. 工具名称未识别:确保工具名称在policy字典中定义。
2. 工具不被允许调用:检查policy字典中工具的allowed字段是否为True。
3. 参数不安全:确保所有参数都在policy字典中定义的允许参数列表中。
4. 参数类型错误:确保参数类型与policy字典中定义的类型一致。
5. 权限错误:如果工具未被允许调用,应抛出PermissionError。
#### 总结
通过引入GuardrailProvider协议,AutoGen可以在工具调用前进行拦截,实现政策控制、审计日志和参数安全检查。这为AutoGen的自动化工具调用提供了更加安全、可靠和可管理的解决方案。
#### FAQ
1. 什么是GuardrailProvider协议? GuardrailProvider协议是一个用于拦截工具调用的协议,它允许在工具执行前进行政策审查、审计日志记录和参数安全检查。
2. GuardrailProvider如何实现参数安全检查? GuardrailProvider通过比较传入的参数与策略字典中定义的允许参数列表来实现参数安全检查。
3. GuardrailProvider如何与现有的工具调用路径集成?
GuardrailProvider通过在工具调用前插入拦截逻辑,与现有的BaseTool.run_json()和Workbench.call_tool()路径集成,不会破坏向后兼容性。