Agentic AI:把边界和取舍讲清楚
《Agentic AI:一次新的项目切入》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。
摘要
先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。
最近看不少同行的简历和 GitHub 项目,发现一个挺明显的趋势:大家不再执着于展示“我能用 LLM 写首诗”或者“做个简单的问答机器人”。现在的面试者和招聘方都在问同一个问题:你的 Agent 敢不敢直接动生产环境的数据库?出了错谁负责?
这其实标志着 Agentic AI(代理式人工智能)正在从“玩具阶段”进入“工程阶段”。以前我们聊 Agent,聊的是思维链(CoT)、是 Tool Use,是让它像个聪明人一样思考。现在我们要聊的是,当一个拥有执行权限的系统在你手里时,你怎么保证它不会把用户的钱转错,或者把日志写崩。
如果你正准备把 Agent 写进简历,或者正在搭建一个能自动执行任务的系统,这篇文章我想聊聊怎么从“Demo”跨越到“可观测、可控制”的工程实践。
目录
- Agentic 的定义:从“对话”到“行动”
- 自主性边界:给 AI 装上刹车
- 任务拆解:别让 LLM 一口气吃成胖子
- 可观测性:没有日志的 Agent 就是黑盒
- 安全约束:防御性编程思维
- 总结
Agentic 的定义:从“对话”到“行动”

很多初学者对 Agentic 的理解还停留在“能调用的聊天机器人”。但在工程视角下,Agentic AI 的核心差异在于自主性(Autonomy)和持久化状态。
传统的 RAG 应用,用户问一个问题,系统查库、生成回答,结束。这是一个无状态的请求-响应过程。
而 Agentic 系统,是一个有状态的任务循环。它接收指令,规划步骤,执行操作(调用 API、读写文件、查询数据库),然后根据反馈修正下一步计划,直到任务完成。
我在做一个自动化数据清洗的项目时就深刻体会到了这一点。最初我只是让 LLM 根据规则生成 SQL,后来我发现它经常“忘记”上一步执行的结果。比如,它生成了查询语句,但在执行前需要校验表是否存在。如果把这个校验逻辑硬编码在 Prompt 里,Agent 就会变得臃肿且容易幻觉。
真正的 Agentic,是将“规划(Planning)”、“记忆(Memory)”和“工具(Tools)”解耦。它不是一个巨大的 Prompt 模板,而是一个由状态机驱动的执行引擎。
自主性边界:给 AI 装上刹车

这是目前最难处理,也是面试中最容易被深挖的部分。
绝对不要让 Agent 在没有明确边界的情况下执行写操作。
在我之前的一个项目中,我们尝试让 Agent 自动修复线上 Bug。起初,我们给了它 git commit 和 git push 的权限。结果第一次跑的时候,它因为一个拼写错误触发了错误的分支合并,虽然没造成数据丢失,但把 CI/CD 流水线搞挂了。
从那以后,我们确立了三个铁律:
1. 读权限 vs 写权限分离:Agent 可以读取代码、日志、文档,但涉及修改代码或配置,必须经过“人工确认”环节,或者写入到一个沙箱目录,由人工 Review 后再合并。
2. 幂等性优先:所有工具函数必须是幂等的。如果 Agent 因为超时重试了两次删除操作,第二次不能报错说“资源不存在”,而应该平滑处理。
3. 最小权限原则:就像 K8s 的 RBAC 一样,Agent 的工具调用也需要精细的权限控制。不要给它 Admin 权限,只给它执行当前任务所需的特定 API Key。
# 错误示范:直接执行危险操作
def dangerous_cleanup(agent_context):
db.delete_all_temp_tables() # 如果 agent 幻觉,全删了
# 正确示范:带约束的执行器
class ConstrainedToolExecutor:
def __init__(self, allowed_scopes=['read', 'preview']):
self.allowed = allowed_scopes
def execute(self, action, payload):
if action == 'delete' and 'write' not in self.allowed:
raise PermissionError("Write access denied in preview mode")
# 执行前记录快照,支持回滚
snapshot = create_snapshot(payload)
try:
result = perform_action(action, payload)
return {"status": "success", "data": result}
except Exception as e:
rollback(snapshot) # 自动回滚
raise e

任务拆解:别让 LLM 一口气吃成胖子
LLM 的上下文窗口虽然在变大,但它的逻辑推理能力在处理复杂长链条任务时依然会退化。这就是为什么我们需要显式的任务拆解(Task Decomposition)。
不要指望一个 System Prompt 能让 Agent 完美执行一个“月度财务报表生成并发送”的任务。你需要把它拆成子任务:
1. 数据提取:连接 BI 工具,提取上月销售数据。
2. 数据清洗:处理缺失值,格式化金额。
3. 图表生成:调用绘图工具生成柱状图。
4. 报告撰写:基于数据和图表生成文字分析。
5. 分发:发送邮件。
在每个子任务之间,必须有明确的状态检查点(Checkpoint)。
在实际落地中,我推荐使用类似 LangGraph 的结构来管理这种依赖关系。每个节点代表一个子任务,边代表条件转移。如果“数据提取”失败,Agent 不应该继续往下走,而是应该触发重试机制或通知人类。
graph TD
A[开始] --> B(提取数据)
B -->|成功| C{数据质量检查}
B -->|失败| D[重试或报警]
C -->|通过| E[生成图表]
C -->|不通过| F[清洗数据]
F --> E
E --> G[撰写报告]
G --> H[发送邮件]
H --> I[结束]
可观测性:没有日志的 Agent 就是黑盒
这是本期最想强调的重点。很多 Demo 看起来很美,因为开发者盯着屏幕看它一步一步运行。但一旦放到后台,如果没有完善的日志和追踪,你就彻底失去了控制权。
你必须为 Agent 的每一次“思考”和“行动”打上 Trace ID。
当用户反馈“Agent 把我的订单取消了,我很生气”时,你不能只说“哦,可能是模型抽风了”。你需要拿出日志,告诉面试官(或者老板):
- 用户在 10:00 提交了订单取消请求。
- Agent 在 10:00:05 解析了意图,置信度 0.95。
- Agent 调用了
check_order_status工具,返回订单状态为“已发货”。 - Agent 根据策略“已发货不可取消”,拒绝了请求,并回复了用户。
- 但是在 10:00:10,Agent 又调用了一次
override_policy,原因是...(这里可能是 Prompt 被诱导,或者是参数传递错误)。
只有具备这种细粒度的可观测性,才能进行调试和优化。我建议在架构层引入 OpenTelemetry,将 LLM 的输入输出、Token 消耗、工具调用耗时全部埋点。
安全约束:防御性编程思维
除了上面的权限控制,还需要在 Prompt 层面做约束。
1. 注入防护:Agent 调用的外部工具可能会接收到用户输入的恶意内容(如 ; DROP TABLE)。必须在工具入口处做严格的类型检查和过滤,而不是信任 LLM 的输出。
2. 输出校验:LLM 生成的 JSON 格式经常出错。在解析之前,先用正则或 schema 校验。如果校验失败,不要直接崩溃,而是让 LLM 自己看到错误信息并尝试修正。
3. 敏感信息脱敏:在将数据传给 LLM 之前,确保 PII(个人身份信息)已被脱敏。特别是在跨国业务中,GDPR 合规是红线。
总结
Agentic AI 的开发,本质上是从“Prompt Engineering”向“System Architecture”的转变。
对于开发者来说,如果你想在今年的技术市场脱颖而出,不要再只展示你会写复杂的 Chain of Thought。去展示你如何构建一个有边界、可追踪、能回滚的系统。
在简历中,你可以这样描述你的项目:
> “设计并实现了一个基于 LangGraph 的自动化运维 Agent。通过引入细粒度的 RBAC 控制和 OpenTelemetry 全链路追踪,实现了 99% 的任务执行可观测性。在沙箱环境中进行了 1000+ 次压力测试,验证了其在面对模型幻觉时的容错机制,最终将人工介入率降低了 40%。”
这才是工程化思维下的 Agentic AI。希望这次的复盘能给你接下来的项目带来一些实实在在的启发。如果有具体的工具链选型问题,欢迎在评论区交流。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。





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

更多推荐


所有评论(0)