【AI面试临阵磨枪-088】Skill 如何做参数校验、依赖注入、权限控制、超时、重试、幂等?

【AI面试临阵磨枪-088】Skill 如何做参数校验、依赖注入、权限控制、超时、重试、幂等? 一、面试题目请讲解 AI Agent Skill 层面如何实现参数校验、依赖注入、权限控制、超时控制、重试机制、幂等性分别说明实现方式、落地规则与技术方案。二、知识储备1. 参数校验入参/出参校验目标提前拦截非法参数、空值、格式错误、越界数据避免下游工具调用报错、产生幻觉、资损。校验内容非空校验用户ID、订单ID、手机号、关键业务参数必填格式校验手机号、订单号、时间格式、枚举值范围校验退款金额、赔付额度、时间范围、状态合法性业务规则校验订单是否可退款、是否超售后时效实现方式配置化校验JSON Schema / YAML 定义参数规则代码层校验Skill 入口统一校验器强约束校验失败直接拒绝执行返回明确错误不进入工具调用要点在Skill入口统一拦截不在内部各个步骤重复校验。2. 依赖注入DI目标解耦 Skill 与底层 Tool、数据库、缓存、外部接口实现可插拔、可测试、可替换。注入对象工具依赖查询订单、物流、退款、RAG 检索工具基础设施Redis、向量库、消息队列、配置中心通用组件日志、鉴权、熔断、重试、监控实现方式构造函数注入Skill 初始化时注入依赖上下文注入执行时通过上下文透传容器托管Skill 中台统一管理依赖实例优势Skill 只关注业务流程不用关心底层调用细节便于单元测试、Mock 测试。3. 权限控制目标多租户、多角色、数据隔离防止越权访问、越权操作如查别人订单、随意退款。三层权限租户级只能操作本租户数据tenant_id 强制过滤用户级只能操作自己的订单/数据user_id 绑定功能级普通用户不能执行赔付、后台操作等高危 Skill实现执行前鉴权从上下文获取用户身份、角色、租户ID数据过滤所有查询自动带上租户用户过滤条件高危操作二次校验大额退款、赔付需权限放行要点权限前置校验贯穿 Skill 全流程工具调用前必校验。4. 超时控制目标防止下游接口慢、网络抖动导致 Skill 卡死、线程堆积、雪崩。实现全局超时整个 Skill 执行总超时如 5s单工具超时每个 Tool 调用独立超时如 2s超时策略超时直接熔断返回兜底结果或人工转接落地规则实时数据类订单/物流严格短超时复杂推理类适当放宽超时后不再重试直接降级5. 重试机制目标应对瞬时网络波动、接口抖动提高执行成功率禁止业务异常重试。重试规则面试必背可重试网络异常、连接超时、5xx 服务端错误不可重试参数错误、权限不足、业务规则不允许、4xx 错误实现指数退避重试1s→2s→4s最多 2–3 次按工具粒度重试不整段 Skill 重试重试次数超限直接熔断降级禁忌退款、赔付类高危操作禁止重试防止重复扣款。6. 幂等性最关键防资损目标保证同一请求多次触发只执行一次防止重复退款、重复赔付、重复创建工单。实现方案唯一幂等ID每个 Skill 调用生成 requestId全局唯一幂等表/Redis记录 requestId 执行状态待执行/成功/失败执行前查状态已成功直接返回结果执行中加分布式锁结果可回溯通过订单ID用户ID做业务幂等高危场景强制幂等退款、赔付、红包发放、订单创建必须幂等兜底。三、代码实现Skill 统一执行骨架class BaseSkill: def __init__(self, tools, auth_service, idempotent_helper): # 依赖注入 self.tools tools self.auth auth_service self.idempotent idempotent_helper async def run(self, context): # 1. 参数校验 self.validate_params(context.params) # 2. 权限校验 self.auth.check_permission(context.user_id, context.tenant_id) # 3. 幂等校验 idempotent_key f{context.skill_id}:{context.request_id} if self.idempotent.is_done(idempotent_key): return self.idempotent.get_result(idempotent_key) try: # 4. 带超时、重试执行业务流程 result await self.execute_with_timeout_retry(context) self.idempotent.mark_success(idempotent_key, result) return result except Exception as e: self.idempotent.mark_fail(idempotent_key) return self.fallback()四、破局之道面试升华Skill 相比传统 Function Calling核心优势就是标准化的非功能能力封装。通过参数校验提前拦截非法输入、依赖注入解耦工具、权限控制保障安全、超时防止卡死、重试提升稳定性、幂等杜绝资损把原本模型容易出错、不可控的单步调用升级为稳定、安全、可运维、可规模化的企业级业务能力这也是生产环境落地的核心要求。