Agentic AI接入生产三个月:我以为缺的是模型,其实是权限和可观测
2026/8/3 15:47:43 网站建设 项目流程

聊《Agentic AI真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。

摘要

去年我开始做 Agentic AI 项目,以为核心难点在 Prompt 工程和模型选型,上线后被现实教育了。真正让 Demo 变成生产系统的,是权限边界、执行日志、任务拆解的可观测性。本文复盘这三个阶段的踩坑经历,给出小团队能直接用的最小可行方案,避免过度设计。

---

目录

  • Agentic 不是更聪明的聊天机器人
  • 自主性的边界:什么时候该让 Agent 自己决定
  • 任务拆解:从一句指令到可执行的步骤
  • 可观测性:Agent 跑飞了,你得知道它去哪了
  • 安全约束:没有护栏的 Agent 是定时炸弹
  • 总结

---

Agentic 不是更聪明的聊天机器人

很多人对 Agentic AI 的理解还停留在"能对话的助手",这是最大的认知偏差。聊天机器人的本质是响应,Agentic 的本质是执行。

我第一个项目是一个文档处理 Agent,需求是"根据用户输入生成周报"。Demo 阶段用 LangChain 搭了一个链式调用,模型能输出格式正确的周报,团队都很满意。直到真正接入业务系统,问题才暴露:Agent 会自行决定调用哪些接口、读取哪些数据、跳过哪些校验步骤。

Chatbot 阶段我们关注的是回答质量,Agentic 阶段我们关注的是执行路径的可控性。这两者的工程复杂度不在一个量级。

判断一个系统是否属于 Agentic,关键看三点:
1. 是否能自主规划多步任务
2. 是否能调用外部工具或 API
3. 是否能根据执行结果调整策略

如果三个都是,那它就不是一个"高级聊天机器人",而是一个需要工程化约束的执行系统。

---

自主性的边界:什么时候该让 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']} " f"result={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_min=5, max_total_time=300): 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( f"Write 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( f"Execution exceeded {self.max_time}s limit" ) return True

这个框架不复杂,但能拦住 90% 的生产事故。我见过最严重的事故是一个 Agent 在循环中不断调用写入接口,因为缺少频率限制,一分钟内产生了上万条无效数据,最终导致数据库锁表。

---

总结

Agentic AI 从 Demo 到生产,真正需要补齐的不是模型能力,而是工程化基础设施。

我的经验是:

  • 先做权限边界,明确 Agent 能做什么、不能做什么
  • 再做日志体系,确保执行过程可追溯
  • 最后做任务拆解,在可控框架内释放自主性

小团队资源有限,不需要一开始就上全套框架。从最小可行方案开始:工具白名单 + 三层日志 + 基础安全约束,足以让 Agent 安全地上线。

Demo 能跑是能力,生产能用是工程。Agentic AI 的下一关,不在模型评测榜上,在你的权限配置和日志查询里。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询