资讯中心

Agentic AI接入生产三个月:我以为缺的是模型,其实是权限和可观测

📅 2026/8/3 15:47:48
Agentic AI接入生产三个月:我以为缺的是模型,其实是权限和可观测
聊《Agentic AI真能提效吗先看流程里最慢的那一步》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要去年我开始做 Agentic AI 项目以为核心难点在 Prompt 工程和模型选型上线后被现实教育了。真正让 Demo 变成生产系统的是权限边界、执行日志、任务拆解的可观测性。本文复盘这三个阶段的踩坑经历给出小团队能直接用的最小可行方案避免过度设计。---目录Agentic 不是更聪明的聊天机器人自主性的边界什么时候该让 Agent 自己决定任务拆解从一句指令到可执行的步骤可观测性Agent 跑飞了你得知道它去哪了安全约束没有护栏的 Agent 是定时炸弹总结---Agentic 不是更聪明的聊天机器人很多人对 Agentic AI 的理解还停留在能对话的助手这是最大的认知偏差。聊天机器人的本质是响应Agentic 的本质是执行。我第一个项目是一个文档处理 Agent需求是根据用户输入生成周报。Demo 阶段用 LangChain 搭了一个链式调用模型能输出格式正确的周报团队都很满意。直到真正接入业务系统问题才暴露Agent 会自行决定调用哪些接口、读取哪些数据、跳过哪些校验步骤。Chatbot 阶段我们关注的是回答质量Agentic 阶段我们关注的是执行路径的可控性。这两者的工程复杂度不在一个量级。判断一个系统是否属于 Agentic关键看三点1. 是否能自主规划多步任务2. 是否能调用外部工具或 API3. 是否能根据执行结果调整策略如果三个都是那它就不是一个高级聊天机器人而是一个需要工程化约束的执行系统。---自主性的边界什么时候该让 Agent 自己决定自主性是个伪命题真正的问题是在哪些环节放权在哪些环节收权。我见过太多项目一上来就给 Agent 最大权限结果上线后不可控。正确的做法是按风险分级| 操作类型 | 权限策略 | 示例 ||---------|---------|-----|| 只读操作 | 完全自主 | 查询数据库、读取文件 || 低风险写入 | 自主执行后审计 | 创建草稿、发送通知 || 高风险写入 | 人工确认 | 删除数据、转账、发布内容 || 不可逆操作 | 禁止 Agent 执行 | 永久删除、权限变更 |我的项目里有一个教训Agent 被允许自主决定调用哪些 API结果它在一次任务中连续调用了三个写接口其中一个参数传错导致数据被覆盖。当时没有人工确认环节发现问题时已经无法恢复。这个经历让我明确了原则任何涉及状态变更的操作必须有可回滚的路径或人工确认节点。自主性不等于无约束边界清晰了Agent 才能真正用起来。---任务拆解从一句指令到可执行的步骤模型能理解帮我整理这份报告但不知道该怎么拆解。任务拆解是 Agentic 系统最容易被低估的环节。我尝试过几种方案方案一让模型自己规划直接让 LLM 输出执行步骤。问题是模型经常跳过必要步骤或者规划出无法执行的伪步骤。方案二预定义工作流模板为每类任务设计固定流程。好处是可控坏处是灵活性差新场景需要重新设计。方案三混合模式核心流程预定义边缘步骤由模型动态生成。这是我最终采用的方案。代码层面我用了一个简单的步骤描述器class TaskPlanner: def __init__(self, llm_client, tool_registry): self.llm llm_client self.tools tool_registry def plan(self, task_desc: str) - list[dict]: # 先匹配预定义模板 template self._match_template(task_desc) if template: # 模板命中填充动态参数 return self._fill_template(template, task_desc) else: # 无模板让模型规划但限制在已知工具范围内 return self._generate_plan(task_desc) def _match_template(self, task: str) - dict | None: # 简单关键词匹配实际项目可用 embeddings 做语义匹配 keywords self._extract_keywords(task) for tpl in self.TEMPLATE_REGISTRY: if all(kw in tpl[keywords] for kw in keywords): return tpl return None def _generate_plan(self, task: str) - list[dict]: # 限制模型只能使用已注册工具 tool_names [t.name for t in self.tools.registered] prompt f 任务: {task} 可用工具: {tool_names} 请输出执行步骤每个步骤包含 tool_name 和 args。 只使用上述工具不要虚构工具。 response self.llm.chat(prompt) return self._parse_plan(response)关键设计点1. 工具注册表Agent 只能看到已注册的工具杜绝幻觉调用2. 模板优先常见任务走模板减少模型规划负担3. 规划可解析输出结构固定方便后续验证和回放---可观测性Agent 跑飞了你得知道它去哪了这是我最想强调的部分。Demo 能跑和能上线之间最大的差距就是可观测性。Agent 的执行过程是非确定性的同样的输入可能走出不同的路径。没有日志出问题只能猜。我上线后第一件事就是补全了三层日志第一层意图日志记录用户输入和 Agent 理解后的任务描述。用于排查模型是否理解对了需求。第二层执行日志记录每一步的工具调用、参数、返回值。用于排查哪一步出了错。第三层决策日志记录 Agent 的规划理由和状态转换。用于分析为什么走这条路而不是那条路。import logging from datetime import datetime # 三层日志配置 intent_logger logging.getLogger(agent.intent) exec_logger logging.getLogger(agent.execution) decision_logger logging.getLogger(agent.decision) class ObservableAgent: def __init__(self, agent_instance): self.agent agent_instance self.session_id self._gen_session_id() def _gen_session_id(self): return f{datetime.now().strftime(%Y%m%d_%H%M%S)}_{id(self)} def run(self, user_input: str): # 意图日志 intent_logger.info( f[{self.session_id}] user_input: {user_input} ) # 执行过程 plan self.agent.plan(user_input) exec_logger.info( f[{self.session_id}] plan: {plan} ) results [] for step in plan: result self.agent.execute_step(step) exec_logger.info( f[{self.session_id}] step{step[tool]} fresult{result.get(status)} ) # 决策日志记录为什么选择下一步 if result.get(needs_retry): decision_logger.info( f[{self.session_id}] retry_reason: {result[reason]} ) results.append(result) return results日志不是越多越好。我踩过一个坑把模型输出的完整 JSON 都打进去日志量爆炸搜索成本极高。后来改为只记录关键字段step 编号、工具名、执行状态、耗时、异常信息。需要深究时再查完整上下文。---安全约束没有护栏的 Agent 是定时炸弹权限和日志是软约束安全约束是硬边界。两者缺一不可。我总结了一个最小安全框架1. 工具白名单Agent 只能调用注册表中的工具且每个工具标注了允许的操作类型read/write/admin。2. 操作频率限制同一会话内写操作每分钟不超过 N 次防止循环调用导致雪崩。3. 敏感操作拦截涉及删除、修改核心数据、调用外部 API 的操作必须经过人工确认或二次验证。4. 执行超时单个任务总执行时间不超过设定阈值超时强制终止并记录。class SafetyGuard: def __init__(self, max_write_per_min5, max_total_time300): self.write_counter {} # session_id - count self.max_write max_write_per_min self.max_time max_total_time self.start_time None def check(self, session_id: str, operation: dict) - bool: # 检查操作类型 if operation[type] write: count self.write_counter.get(session_id, 0) if count self.max_write: raise PermissionError( fWrite operation limit exceeded for {session_id} ) self.write_counter[session_id] count 1 # 检查超时 if self.start_time is None: self.start_time datetime.now() elapsed (datetime.now() - self.start_time).total_seconds() if elapsed self.max_time: raise TimeoutError( fExecution exceeded {self.max_time}s limit ) return True这个框架不复杂但能拦住 90% 的生产事故。我见过最严重的事故是一个 Agent 在循环中不断调用写入接口因为缺少频率限制一分钟内产生了上万条无效数据最终导致数据库锁表。---总结Agentic AI 从 Demo 到生产真正需要补齐的不是模型能力而是工程化基础设施。我的经验是先做权限边界明确 Agent 能做什么、不能做什么再做日志体系确保执行过程可追溯最后做任务拆解在可控框架内释放自主性小团队资源有限不需要一开始就上全套框架。从最小可行方案开始工具白名单 三层日志 基础安全约束足以让 Agent 安全地上线。Demo 能跑是能力生产能用是工程。Agentic AI 的下一关不在模型评测榜上在你的权限配置和日志查询里。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。