起点:L1 的成就与局限
AgentClaw L1 是一个能用的系统。
它基于 LangGraph 的 ReAct Agent,能调用工具、检索文档、多 Agent 协作。我用 FastAPI 把它服务化,加了安全中间件,用 Docker 一键部署。Level 1 跑通的那天,我问它“上位机框架支持哪些运动卡”,它从文档里检索到答案,准确返回。
但很快,三个致命局限暴露了。
第一,健忘。 每次新对话,它把昨天的对话全忘了。我问“昨天说的那个报警代码是什么”,它一脸茫然。因为 MemorySaver 只存会话内的短期记忆,会话结束,记忆清空。
第二,被动。 设备温度超标了,良率骤降了,它一无所知。只有我主动问“查一下良率”,它才会去查。它像一个只会等指令的员工,不会主动汇报。
第三,单步执行。 我说“检查良率,如果低于 95% 就查缺陷记录并生成报告”。它只做了第一步“检查良率”,然后停了。它不会自动把任务拆成多步,依次执行完。
L1 是一个能回答问题的工具。但我要的,是一个能自主发现问题和解决问题的工业助手。
这就是 Level 2 和 Level 3 要解决的事。
进化一:记忆系统——给 Agent 装上“笔记本”
我设计了三层记忆架构。
| 记忆类型 | 存储内容 | 生命周期 | 检索方式 |
|---|---|---|---|
| 对话记忆 | 每轮对话的摘要 | 跨会话持久化 | 语义相似度 Top-K |
| 知识记忆 | 设备参数、操作手册、故障案例 | 永久,手动删除 | 语义相似度 Top-K |
| 用户偏好 | 输出风格、常用设备 | 跟随用户 | 用户 ID 匹配 |
每种记忆用独立的 ChromaDB Collection 存储,避免检索时互相干扰。检索评分采用三维加权:语义相似度 60% + 时间衰减 30% + 访问频率 10% 。这让 Agent 能优先召回既相关又新鲜又常用的内容。
时间衰减用 30 天半衰期——30 天前的记录得分打 5 折,60 天前的打 2.5 折。为什么?因为设备参数可能已经调整过,旧信息容易误导。
集成方式很简单:用户消息进来 → 检索相关记忆 → 注入 System Prompt → 调 LLM → 保存本轮对话。整个过程只多了两步,但效果质变——Agent 记住我了。
踩坑记录:
- ChromaDB 在 FastAPI 多线程并发时触发
thread panicked,原因是底层 SQLite 非线程安全。解决方案:threading.Lock加锁,生产环境建议迁移到 Qdrant。 - Embedding 模型首次下载需 70MB,公司网络代理下会卡住。解决方案:
unset http_proxy https_proxy。
进化二:主动感知——给 Agent 装上“监控屏幕”
主动感知系统的核心是 SensorManager 调度器。它从 JSON 配置文件加载多个传感器,通过 asyncio 异步定时轮询设备状态接口,规则引擎判断异常后通过 WebSocket、飞书、邮件多通道推送。
关键设计:
- 每个传感器独立 asyncio 协程,互不阻塞。一个传感器超时,不影响其他。
- 规则引擎支持
>、<、==操作符,同一字段可设多级告警(温度 > 70°C warning,> 85°C critical)。 - 配置驱动:告警规则全部在 JSON 里定义,运维人员改配置即可,无需动代码。
与 AutoFrame 上位机的对接也很直接:在 DigitalTwinBridge 的 WebSocket 消息处理中增加 action: query 路由,按 data_source 返回设备状态、良率、工艺参数等数据。
踩坑记录:
- 异步协程与同步代码混用导致事件循环卡死。解决方案:统一使用
async/await,同步操作用loop.run_in_executor包装。 - 飞书 Webhook 推送纯文本不换行。解决方案:改用
msg_type: interactive卡片格式。
进化三:多模态能力——给 Agent 装上“眼睛”和“画笔”
VLM 视觉理解工具:基于智谱 GLM-4V-Flash(免费额度),支持 OCR、描述、分析三种模式。
安全设计直接复用了 file_read 的白名单/黑名单机制:图片路径必须在白名单内,禁止访问 /etc/、.ssh/、.env 等敏感路径,大小限制 20MB。
图片生成工具:基于智谱 CogView-3-Flash,支持文生图。提示词有安全审计,拦截危险内容模式(暴力、色情、违禁),输出目录有白名单限制,生成文件自动用时间戳和提示词哈希命名。
多模态输入路由器:自动检测用户输入中的图片 URL、base64、本地路径,智能分发到 VLM 或文生图管线。路由器用正则匹配,支持三种输入类型检测——纯文本、文本+图片、纯图片。
踩坑记录:
- 智谱 GLM-4V 的 base64 图片不需要
data:image/...前缀,直接发纯 base64 字符串。这个坑花了我两小时。 - GLM API 不支持
detail和temperature参数,发送会导致 400 Bad Request。解决方案:条件移除。
进化四:OS 操作系统能力——给 Agent 装上“手”
这是整个进化中最核心的一步。Agent 从“能看能说”升级为“能动手操作”。
file_write:安全文件写入
四层防护机制:
- 路径白名单:只允许写入
/Desktop、/Documents、~/Projects、./ 目录 - 文件黑名单:禁止写入 /etc/passwd、.ssh/、.env 等系统敏感文件
- 内容审计:对 .py/.sh/.js 等可执行文件扫描危险关键词(rm -rf、eval、os.system)
- 大小限制:默认 10MB,防止意外写入超大文件
覆盖写入前自动创建带时间戳的备份文件,数据可恢复。
browser_tool:浏览器自动化
核心挑战是线程安全。Playwright 的异步 API 必须在创建它的线程中运行,而 Agent 主循环在另一个线程。
解决方案:独立后台线程创建 EventLoop 和浏览器实例,所有操作通过 asyncio.run_coroutine_threadsafe() 跨线程调度。threading.Lock 确保同一时间只有一个操作在执行。
process_mgr:进程管理
安全机制:命令白名单(只允许 python/pip/npm/docker 等),危险参数检测(拦截 rm -rf、sudo、mkfs)。
进程终止采用两阶段策略:先 SIGTERM 优雅终止,等待 2 秒后如果进程仍存活,再 SIGKILL 强制终止。这能避免资源残留。
scheduler:定时调度
基于 APScheduler 的 BackgroundScheduler,支持间隔调度、Cron 表达式、一次性任务。每个任务有唯一 job_id,可查询、暂停、删除。使用 Asia/Shanghai 时区。
sys_monitor:系统监控
每次 get_overview() 生成快照,包含 CPU、内存、磁盘、网络数据。历史记录保留 1000 条。告警阈值可配置:CPU > 85%、内存 > 90%、磁盘 > 95% 触发告警。
踩坑记录:
- Playwright 跨线程调度时
future.result()超时。解决方案:timeout 设为self.timeout / 1000 + 5秒,留足余量。 - 进程终止直接 SIGKILL 导致子进程变孤儿。解决方案:先 SIGTERM,等待 2 秒,再 SIGKILL。
进化五:自主进化闭环——让 Agent 越用越聪明
这是 Level 3 的核心。Agent 从“被动执行”进化到“主动优化”。
四个模块形成闭环:
- 反馈收集器:每次工具执行自动采集任务 ID、工具名称、成败、延迟、错误类型。同时支持显式反馈(用户评分)和隐式反馈(响应时间过长推断为低质量)。数据存为 JSONL 格式。
- 经验学习器:从成功路径中提取工具调用序列,挖掘重复出现的 2-3 步子序列(模式),为每个模式生成策略对象。模式至少需要出现 3 次才会被采纳,避免噪音。
- 自适应优化器:用 EMA(指数移动平均)动态更新路由权重。α = 0.05,当某条路由成功率持续下降时,权重自动降低。同时基于反馈优化 Prompt 模板。
- 进化管理器:后台线程每小时运行一轮进化循环,整合反馈、学习经验、更新策略。
整个系统“零侵入部署”——不需要修改任何现有代码,只需添加新文件并更新入口即可启用。
踩坑记录:
- 经验学习器的模式挖掘阈值设太低(min_count=2)导致大量噪音策略。调高到 3 后效果稳定。
- EMA 的 α 设太高(0.3)导致权重剧烈波动。降到 0.05 后平滑很多。
进化六:RAG 知识库——从依赖框架到手写引擎
v5 我手写了一个完整的 RAG 引擎,不依赖 LangChain 或 ChromaDB。
为什么要手写? 理解底层原理。面试时能讲清楚“向量检索是怎么工作的”,而不是“我调了 ChromaDB”。
四个组件:
- DocumentLoader:支持 TXT、Markdown、JSON、CSV 四种格式。Markdown 自动去除标题标记、链接语法、代码块标记,只保留语义内容。
- TextSplitter:固定长度、段落、滑动窗口三种模式。固定长度模式会在句子边界处分割,避免截断。
- InMemoryVectorStore:内置 TF-IDF 向量化 + 余弦相似度检索。同时支持自定义 embedding_fn 参数,可替换为 OpenAI Embedding。
- RAGEngine:统一管道,
search_as_context()直接生成带引用格式的 LLM 上下文。
最终架构:五层统一
text
L5 服务层:FastAPI + Gradio + Docker
L4 编排层:AgentOrchestrator(多 Agent 协作)
L3 核心层:ReAct 推理引擎
L2 工具层:13 个工具(5 内置 + 3 多模态 + 5 OS + RAG)
L1 基础层:配置 + 日志 + 安全中间件
安全体系贯穿六层:
- 工具层:路径白名单、命令白名单、内容审计
- RAG 层:文档格式白名单、检索结果过滤
- Agent 层:最大循环次数、超时控制
- 进化层:策略验证、A/B 测试
- OS 层:进程组隔离、SIGTERM 优先
- 服务层:API Key 校验、速率限制
所有机制遵循“默认拒绝”原则:除非明确允许,否则拒绝操作。
反思:我到底做了什么
有人可能会问:“这不就是调包吗?”
我的回答:
- 我手写了 RAG 引擎——文档加载、分块、TF-IDF 向量化、余弦相似度检索,全部纯 Python 实现。
- 我设计了四层安全防护的文件写入工具——路径白名单、黑名单、内容审计、大小限制、自动备份。
- 我实现了跨线程的浏览器自动化——独立 EventLoop、
run_coroutine_threadsafe调度、线程锁防竞态。 - 我构建了自主进化闭环——反馈收集、序列模式挖掘、EMA 权重优化、后台进化管理器。
- 我定义了五层纵深安全体系,覆盖从工具到服务的完整链路。
我用 LangGraph 和 FastAPI,是因为它们是最好的轮子。但框架覆盖不到的安全机制、进化逻辑、OS 操作、RAG 引擎,全部是我自己设计并实现的。
AgentClaw 不是一个 Demo。它是一套生产级自主进化工业 Agent 的完整设计方案。
从 AME 的视角看这件事
我是一名 AME。我的工作不是写代码,是确保产线稳定高效运行。
当产线的知识传递成为瓶颈时,用 AI 解决它就是 AME 的分内事。我不是跨界做 AI,我是用 AI 解决 AME 的问题。
AgentClaw 的设计思路也来自 AME 的工作习惯:
- 安全机制对应产线的“防呆设计”
- 进化闭环对应产线的“持续改进”
- 分层架构对应产线的“模块化设计”
- 文档体系对应产线的“标准化作业”
我用 AME 的思维做 AI:把它当作产线上的一个“工站”来设计。有明确的输入输出、节拍要求、质量标准、运维手册。
当我把 AgentClaw 部署到 Docker,配置好健康检查,写好 FACA 踩坑记录的那一刻,我感觉我不是在做 AI。我是在为一个新的数字工站做设备导入。
这,就是一个 AME 在 AI 时代的打开方式。