文章目录
- 1. 边缘 Agent 在干什么
- 2. 结论先行
- 3. 最小结构
- 4. 工具失败契约(板端版)
- 5. Orin 上工具怎么分
- 6. 和检测链路怎么接
- 6.1 worker 侧伪代码
- 7. 资源与降级
- 8. 验收清单
- 9. 常见坑
- 10. 小结
摘要:端侧已经能跑检测和小模型后,下一步常被说成「上 Agent」。真正难的不是再调一个 LLM,而是:感知事件如何触发工具、工具失败时板子上怎么收敛、哪些能力留在 Orin、哪些必须回云。本文写边缘 Agent 的最小结构、工具失败契约、Orin 上的分工,以及一版可落地的验收清单。概念层失败契约见 给 Agent 加工具:先确定失败边界;本文落在 Jetson Orin 现场。
1. 边缘 Agent 在干什么
云端 Agent 常见路径是:对话 → 选工具 → 调 API → 再回答。
Orin 现场更常见的是:
相机/传感器 → 检测或规则 →(可选)本地小模型整理 → 调本地工具 → 告警/联动/上报
LLM 不是每帧都上场。多数帧只走检测与规则;只有少数事件才进入「要不要调用工具 / 要不要问模型」。
和 端侧 YOLO 检测结合大模型告警、Orin端侧检测+小模型解释闭环 的差别:那两篇偏检测结果如何进解释与告警文案;这里偏工具边界与失败收敛,让板子在断网、超时、继电器卡死时仍可预期。
2. 结论先行
- 感知与动作分开:检测负责「看到什么」,工具负责「做什么」;中间用规则门控,别让模型直接驱动 GPIO。
- 工具先写失败契约:超时、权限、部分成功、是否可重试,写成结构化结果。
- Orin 适合放本地工具:落图、写库、GPIO/串口、本地队列;重推理或强知识放云或更大盒。
- 默认降级路径:云超时就本地规则告警,不要空转重试把板子打满。
- Agent 能调通 ≠ 现场能用:还要限流、审计、人工确认高副作用动作。
3. 最小结构
| 层 | 职责 | Orin 上常见实现 |
|---|---|---|
| 感知 | 出框、轨迹、事件 | TensorRT / DeepStream |
| 门控 | 类别、区域、冷却时间、置信度 | 规则引擎 / 小状态机 |
| 策略 | 是否调用工具、是否问 LLM | 本地策略服务;可选小模型 |
| 工具 | 落盘、通知、IO、工单 | 本地进程 / MCP / HTTP |
| 出口 | 告警、人机界面、上云 | MQTT / HTTP / 串口 |
推荐默认数据流:
- 检测产生
event(时间、camera_id、class、bbox、score) - 门控决定
pass / drop / debounce - 通过后进入工具调用;需要自然语言时再调本地或云端模型
- 工具返回结构化结果,策略层决定重试、降级或人工
不要把「每帧画框」和「每次工具调用」绑成同一频率。多路 DeepStream 已经吃紧时,Agent 工具再按帧打,会把 GPU 和 CPU 一起拖垮。多路合批与容量见 Orin 上用 DeepStream 跑多路检测。
4. 工具失败契约(板端版)
给 Agent 加工具:先确定失败边界 写过通用字段;边缘侧建议固定这些:
| 字段 | 作用 |
|---|---|
ok | 是否成功 |
error_code | 稳定枚举,便于策略分支 |
retryable | 是否允许自动重试 |
side_effect | none/possible/done |
user_message | 可展示的短句 |
request_id | 日志关联 |
timeout_ms | 超时 |
示意:
{"ok":false,"error_code":"GPIO_TIMEOUT","retryable":false,"side_effect":"possible","user_message":"开闸指令超时,已转人工确认","request_id":"evt_20260817_001"}板端硬规则:
side_effect != none时,禁止在未确认前自动重试写操作(开闸、下发工单、打标)- 云端工具超时:本地告警仍要发出,标记
degraded=true - 模型不得凭自然语言「好像失败了」自行再调一次高副作用工具
适配层做参数校验;校验失败映射为VALIDATION_ERROR, retryable=false,别把脏参数打到 GPIO 或数据库。
5. Orin 上工具怎么分
| 工具类型 | 放哪 | 说明 |
|---|---|---|
| 截图落盘、写 SQLite、本地日志 | Orin 本地 | 断网也要留证 |
| GPIO / 串口 / 继电器 | Orin 本地 | 低延迟;必须失败契约 |
| 推企业微信 / 云工单 | 本地发起,云上执行 | 超时走本地声光告警 |
| 重知识问答、长上下文总结 | 云或更大盒 | Orin 可做门控与摘要输入 |
| 二次分类 / 属性 | 本地;可走 DLA | 见 Orin 上 DLA 和 GPU 怎么分工、怎么用 |
MCP / function calling 只是工具暴露方式。边缘上更关键的是:谁允许调用、失败如何返回、副作用如何标记。自建 MCP Server 之前,先看能力是否真要被多个 Host 复用;单板单进程用本地 tool 接口往往更简单。判断见 MCP 工具分发层,自建Server。
6. 和检测链路怎么接
已经跑通检测或 DeepStream 时,不要把 Agent 嵌进每一帧 OSD 回调里硬算。更稳的接法:
- DeepStream / 检测进程只产出事件(或写环形队列)
- 独立
agent-worker消费事件 - worker 内做门控、工具调用、可选 LLM
- 用冷却时间(同一 camera + class 的 N 秒合并)防止刷屏
事件示意:
{"camera_id":"cam_3","ts":1723867200.12,"class":"person","score":0.87,"roi":"gate_a","frame_path":"/data/events/cam3_....jpg"}frame_path本地可访问,云端模型只要图时再上传;默认先本地落盘,避免每事件都吃上行带宽。检测结果如何整理成下游输入,也可对照 端侧 YOLO 检测结合大模型告警。
6.1 worker 侧伪代码
# 示意:事件消费与工具调用(非完整项目)defhandle_event(evt,tools,policy):ifnotpolicy.gate(evt):# 类别/ROI/冷却return{"ok":True,"skipped":True}plan=policy.plan(evt)# 要调哪些工具、要不要 LLMresults=[]fornameinplan.tools:out=tools[name].call(evt,timeout_ms=plan.timeout_ms)results.append(out)ifnotout["ok"]andnotout.get("retryable",False):breakifout.get("side_effect")in("possible","done")andnotout["ok"]:policy.escalate(evt,out)# 人工确认,禁止自动重试breakifplan.need_llmandpolicy.cloud_ok():summary=policy.llm_summarize(evt,results)else:summary=policy.local_template(evt,results)policy.emit_alert(evt,results,summary)重点不在框架名字,而在:gate、side_effect、escalate必须存在。缺这三样,上 LangChain / 自研都一样会在现场失控。
7. 资源与降级
Orin Nano / NX / AGX 内存与功耗差一截,Agent 层同样要按板型收敛:
| 板型 | 建议 |
|---|---|
| Nano | 规则门控 + 本地工具为主;LLM 尽量云端或极小模型 |
| NX | 本地小模型可做事件摘要;工具并发要限流 |
| AGX | 可常驻更强本地策略;仍建议高副作用动作人工确认 |
板型取舍可对照 NVIDIA Jetson Orin NX 简介、NVIDIA Jetson AGX Orin 简介。
降级表(建议写进配置,而不是只写进提示词):
| 条件 | 动作 |
|---|---|
| 云 API 超时 / 断网 | 本地告警 + 落盘,标记 degraded |
| GPU 占用过高 | 暂停 LLM,仅规则 + 工具 |
| 同一事件 10 秒内重复 | debounce,不重复调用工具 |
工具retryable=false | 停自动重试,进人工队列 |
| 事件队列满 | 丢最旧并打点,或拒新并告警(二选一写死) |
队列深度、单工具超时、全局并发,最好在配置文件里,方便现场按路数改,而不是改模型提示。本地与云端如何分流,也可参考 本地与云端大模型混合路由。
8. 验收清单
- 人为拔网线:本地仍能落图并告警
- 人为让「开闸」工具超时:不出现二次开闸
- 非法参数:返回
VALIDATION_ERROR,不触达硬件 - 多路高频事件:worker 队列有上限,满则策略明确
- 日志能用
request_id串起:事件 → 工具 → 结果 - 功耗档固定后再测:Agent 打开前后的掉帧情况
- 断电重启后:冷却状态与「进行中写操作」可恢复或可人工清理
9. 常见坑
| 现象 | 多见原因 | 处理 |
|---|---|---|
| 一上 Agent 就掉帧 | 每帧调工具 / 调 LLM | 事件化 + 冷却 |
| 重复开闸 / 重复工单 | 超时后盲着重试 | side_effect+ 禁自动重试 |
| 断网后「什么都没发生」 | 成功路径依赖云 | 本地降级路径 |
| 模型胡调 GPIO | 无门控、无权限表 | 白名单工具 + 规则门控 |
| 日志无法复盘 | 只有自然语言错误 | 结构化失败契约 |
| 工具偶发成功一半 | 未标记side_effect=possible | 写操作分「预检/提交」两步 |
10. 小结
Orin 上的边缘 Agent,核心不是「板子上再塞一个聊天机器人」,而是:感知事件经门控后,安全地调用本地工具,并在失败时按契约降级。检测链路继续用 TensorRT / DeepStream;Agent 层管工具、副作用与断网行为。
先把失败契约和降级表跑通,再考虑 MCP 分发、更强本地模型或上 Thor。顺序反了,现场只会得到一个会说话但不收敛的 Demo。