任务分解、自检与工具权限
复杂任务适合拆成可验证产物:先查资料,再提取约束,再计算,最后组织说明。每一步都有输入和可检查输出,比要求模型写很长的思考过程更容易定位错误。Chain-of-thought是一类推理提示研究方法,不保证正确,也不意味着应用能或应读取模型内部思维链;面向用户保留简短理由、证据与计算结果即可。
Self-consistency通过多次采样投票减少某些随机错误,但样本来自同一模型时可能共享同一错误。自检也会重复原偏见。用外部计算器、schema校验、资料比对和独立测试提供不同证据,才能纠正而非重述错误。
工具调用是建议,执行是服务端决定
下面模拟一个只读查单工具。模型输出的tenant被忽略,真实租户来自认证上下文;请求订单不在租户范围时返回拒绝,而不是把结果交给模型后要求“不要说”。
python
orders = {('A','o1'): 'paid', ('B','o2'): 'pending'}
def execute(call, authenticated_tenant):
if call.get('name') != 'read_order':
raise PermissionError('tool not allowed')
args = call.get('arguments', {})
if set(args) != {'order_id'} or not isinstance(args['order_id'], str):
raise ValueError('arguments')
key = (authenticated_tenant, args['order_id'])
if key not in orders:
raise PermissionError('not accessible')
return {'status':'ok', 'order_id':args['order_id'], 'value':orders[key]}
assert execute({'name':'read_order','arguments':{'order_id':'o1'}},'A')['value']=='paid'
try:
execute({'name':'read_order','arguments':{'order_id':'o2'}},'A')
except PermissionError:
pass
else:
raise AssertionError('cross-tenant access')
print('tool boundary passed')工具目录要说明用途、参数、成本和失败状态。只读、写入和对外发送分别拥有权限;写入操作的授权不能被一个“用户似乎同意”的模型字符串替代。幂等键防重试产生双写,执行后返回状态、来源和错误类型,不把异常文本当成功资料。
直接注入来自用户输入,间接注入藏在网页、PDF或工具结果。标签、提示防御、内容检测都只是辅助;密钥根本不进入上下文,工具只开放必要能力,输出HTML经过对应上下文转义。危险链接检测也不能仅搜索某个词,应该约束实际打开/执行目标。
计划执行循环要设置总轮数、超时、预算和不可恢复错误退出;批评修订要求具体标准与独立依据,不能让批评者无限要求“再完善一点”。
练习
增加一个未知工具delete_order调用,断言拒绝并确认orders内容未变。为什么把工具说明写得更强硬不能代替这一测试?
完成后查看本章答案。
下一章:数据集、成对实验与场景迁移。