AgentClaw 进化论:从问答工具到自主工业智能体

3 阅读10分钟

起点: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:安全文件写入

四层防护机制:

  1. 路径白名单:只允许写入 /Desktop、/Documents、~/Projects、./ 目录
  2. 文件黑名单:禁止写入 /etc/passwd、.ssh/、.env 等系统敏感文件
  3. 内容审计:对 .py/.sh/.js 等可执行文件扫描危险关键词(rm -rf、eval、os.system)
  4. 大小限制:默认 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 从“被动执行”进化到“主动优化”。

四个模块形成闭环

  1. 反馈收集器:每次工具执行自动采集任务 ID、工具名称、成败、延迟、错误类型。同时支持显式反馈(用户评分)和隐式反馈(响应时间过长推断为低质量)。数据存为 JSONL 格式。
  2. 经验学习器:从成功路径中提取工具调用序列,挖掘重复出现的 2-3 步子序列(模式),为每个模式生成策略对象。模式至少需要出现 3 次才会被采纳,避免噪音。
  3. 自适应优化器:用 EMA(指数移动平均)动态更新路由权重。α = 0.05,当某条路由成功率持续下降时,权重自动降低。同时基于反馈优化 Prompt 模板。
  4. 进化管理器:后台线程每小时运行一轮进化循环,整合反馈、学习经验、更新策略。

整个系统“零侵入部署”——不需要修改任何现有代码,只需添加新文件并更新入口即可启用。

踩坑记录

  • 经验学习器的模式挖掘阈值设太低(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 时代的打开方式。