
最近我在公司内部把 OpenClaw 生态从“玩票”阶段拉到了生产环境做的第一个正经 AI Agent就是围绕 PolarDB 的数据库自治助手。整个项目走下来涉及 Agent Express Skills 开发、Flow 编排、与 PolarDB 的权限集成等多个环节踩了不少坑也沉淀了一套可以直接复用的打法。这篇文章就把完整的实战过程拆开来讲包括为什么这样设计、Skill 怎么写、Flow 怎么编排、上线时容易在哪些地方翻车以及怎么排查。如果你正准备在企业里基于 OpenClaw 搭建自己的 AI Agent或者想把数据库这类运维场景 Agent 化这篇应该能给你一条比较顺的路线。先说清楚这个项目解决了什么问题。企业内部数据库相关的日常操作大多数时候是“重复咨询 固定动作”比如研发问“这张表怎么这么慢”“连接数是不是又满了”DBA 跑一堆脚本去看慢查询、看监控、看锁等待然后人工判断、回复。传统自动化脚本只能回答“是什么”没法结合上下文去解释“为什么”和“怎么办”。OpenClaw 生态里的 AI Agent 可以理解自然语言再通过 Agent Express Skills 把数据库查询能力标准化最后用 Flow 把多步操作编排成一条自动化流程。换句话说我做的不是又一个 SQL 查询工具而是一个“能听懂问题、能自己查库、能按流程分析、能输出结论”的数据库助手。1. 整体设计思路拆解1.1 为什么选择 OpenClaw 承载数据库 Agent选型阶段我对比过几类方案直接用大模型 API 写一层封装、用 n8n 之类的自动化平台、自己开发 Agent 框架、使用 OpenClaw 生态。最后选择 OpenClaw核心原因是它把“Agent 的骨架”和“业务能力的血肉”分得很清楚。OpenClaw 本身承载了会话管理、模型接入、上下文记忆、工具调用等 Agent 底层的通用能力这相当于给你配好了一个带轮子的底盘。业务侧只需要实现“技能”也就是 Agent Express Skills再通过 Flow 把这些技能串成自动化流程。这个分层结构在企业落地时非常有价值不用每次新增一个数据库场景就从零造 Agent只需要新增或者组合 Skills。换一个更直白的说法。传统自动化像是给每条流水线单独建工厂Agent 化之后是建了一条通用产线每个 Skill 就是一台可以随时挂到产线上的设备。Flow 则是决定设备按什么顺序运转的控制系统。OpenClaw 把产线和控制系统都做好了业务团队只需要专注于“这台设备”和“这个工艺顺序”。1.2 场景拆解第一版需要覆盖哪些能力第一个生产级 Agent 没有贪多我圈定了四个高频场景慢查询分析研发反馈“某个接口突然变慢”Agent 能自动拉取 PolarDB 最近一段时间的 Top SQL分析慢查询特征并给出优化建议。资源水位巡检定时检查数据库连接数、CPU 使用率、存储空间等关键指标超过阈值自动生成告警。锁与元数据诊断查询当前是否有锁等待、表锁冲突、长事务辅助定位“为什么某张表卡住了”。日常数据库问答研发用自然语言询问表结构、索引信息、数据分布Agent 转换为结构化查询并返回结果。这四个场景看起来简单但恰好覆盖了“查询、诊断、分析、告警”四类典型动作。更重要的是它们共同验证了一条至关重要的设计原则Agent 只做“读”和“分析”不做“写”和“变更”。这个原则贯穿了整个 Skills 开发过程也决定了 Flow 编排的边界。1.3 架构分层OpenClaw、Skills、Flow、PolarDB 如何协同整体架构分为四层。最底层是数据层也就是 PolarDB 集群提供数据存储和查询能力。往上一层是工具层由一系列 Agent Express Skills 组成每个 Skill 都是一个大模型可以调用的“工具”负责执行具体的数据库操作并返回结构化结果。再往上是流程层Flow 负责把多个 Skill 组合成有业务语义的链路比如“定时触发 - 巡检 - 条件判断 - 告警通知”。最上层是交互层OpenClaw 的 Agent 运行时统一处理用户请求决定调用哪些 Skill、以什么顺序调用。这套分层的关键点在于“Agent 不直接面对数据库”。所有的数据库访问都被收口到 Skills 里Agent 只是根据用户意图和 Flow 的定义去调用 Skill。这样一来权限控制、审计、SQL 治理都集中在 Skills 层不会因为用户换了一种问法就绕过了安全边界。2. Agent Express Skills 开发从工具函数到标准化技能包2.1 Skill 的标准结构与目录约定Agent Express Skills 本质上是一个“可被 AI 自动发现和调用”的工具包。在我使用的 OpenClaw 版本里每个 Skill 对应一个独立目录目录内至少包含清单文件、执行脚本和参数描述。推荐的目录结构如下skills/ ├── polar_db_slow_query/ │ ├── SKILL.md │ ├── schema.json │ ├── execute.py │ └── README.mdSKILL.md是给大模型看的“工具说明书”它决定了模型在什么场景下会想到调用这个技能。schema.json是参数定义的 JSON Schema用来校验入参的完整性和类型。execute.py是真正的业务执行逻辑负责连接 PolarDB 并返回结果。README 记录一些人工备注比如责任人、更新日期、依赖环境。SKILL.md的编写是整个 Skill 开发里最容易忽略、却最影响效果的部分。大模型并没有“记住你代码”的能力它是通过阅读这个描述来决定何时调用、如何传参的。写得太泛模型会在不需要的时候乱调写得太窄模型遇到匹配场景时又想不到用。我自己的经验是描述里必须包含“触发场景”“输入参数说明”“输出结果格式”三要素最好再给一两个典型问法作为示例。2.2 以“慢查询分析”为例的开发过程慢查询分析是最早上线的 Skill也最适合作为开发样板。我按以下步骤实现。第一步定义SKILL.md# PolarDB Slow Query Analyzer ## Description 当用户报告数据库性能变慢、接口响应延迟、SQL执行耗时较长或需要分析最近一段时间内的Top SQL时使用此技能。 ## Parameters - db_cluster: PolarDB集群ID或名称必填 - query_time_threshold: 慢查询阈值秒数默认5秒可选 - window_minutes: 分析时间窗口默认60分钟可选 ## Output 返回慢查询列表每个条目包含SQL文本脱敏、执行次数、平均耗时、最大耗时、返回行数等结构化信息。第二步编写schema.json{ name: polar_db_slow_query, version: 1.0.0, description: Query PolarDB slow query logs and return top SQL analysis, parameters: { type: object, properties: { db_cluster: { type: string, description: PolarDB cluster ID }, query_time_threshold: { type: number, default: 5, minimum: 1, maximum: 60 }, window_minutes: { type: number, default: 60, minimum: 5, maximum: 1440 } }, required: [db_cluster] } }第三步实现execute.py。核心逻辑是参数化查询首先建立只读连接然后查询慢日志视图并按耗时时长排序。为了确保安全这个脚本会强制执行只读事务并设置了查询超时时间。import pymysql import os import json import datetime def execute(db_cluster: str, query_time_threshold: int 5, window_minutes: int 60): conn pymysql.connect( hostos.getenv(POLARDB_HOST), portint(os.getenv(POLARDB_PORT, 3306)), useros.getenv(POLARDB_READONLY_USER), passwordos.getenv(POLARDB_READONLY_PASSWORD), databaseos.getenv(POLARDB_DATABASE), read_timeout15, write_timeout15, autocommitFalse, ) try: cursor conn.cursor() # 强制只读防止任何写操作 cursor.execute(SET TRANSACTION READ ONLY) start_time datetime.datetime.now() - datetime.timedelta(minuteswindow_minutes) sql SELECT digest_text AS sql_text, COUNT(*) AS exec_count, AVG(query_time) AS avg_latency, MAX(query_time) AS max_latency, SUM(rows_examined) AS total_rows_examined FROM information_schema.slow_log WHERE start_time %s AND query_time %s GROUP BY digest_text ORDER BY avg_latency DESC LIMIT 20 cursor.execute(sql, (start_time, query_time_threshold)) rows cursor.fetchall() columns [desc[0] for desc in cursor.description] result [dict(zip(columns, row)) for row in rows] # SQL文本做脱敏处理去掉可能包含敏感信息的注释和具体参数值 for item in result: item[sql_text] mask_sql(item[sql_text]) return json.dumps({status: ok, slow_queries: result}, ensure_asciiFalse) finally: conn.close()第四步也是容易被忽略的一步是准备测试集。我建了一个包含“正常查询”“慢查询”“参数缺失”“集群不可达”四类输入的小样本集在本地先把 Skill 的边界测清楚再挂到 OpenClaw 里做模型调用测试。这个习惯帮我省了很多联调的麻烦。2.3 Skill 的安全边界只读、脱敏、参数化数据库场景的 Skill 与普通查询工具最大的不同在于它对安全性的要求极高。一个误操作可能导致线上故障一段未经脱敏的 SQL 可能泄露敏感业务数据。我在开发过程中建立了几条硬性规范。第一条是“最小权限连接”。每个 Skill 使用独立的只读账号这个账号只有SELECT权限连SHOW类命令我都尽量收敛。PolarDB 侧我单独创建了一套只读账号体系与业务账号隔离并且通过 IP 白名单限制只能从 OpenClaw 所在的网络环境访问。第二条是“强制参数化查询”。所有进入数据库的变量一律通过 prepared statement 传递禁止使用字符串拼接。这一方面是为了防 SQL 注入另一方面也是为了避免 Agent 生成的动态条件把查询搞出意外。即便内部使用我也把它当成面对公网服务一样严格对待因为大模型生成的参数在边界条件下经常会出人意料。第三条是“结果脱敏”。返回给大模型和用户的 SQL 文本、查询结果我会做一个脱敏处理层把明显的数据值、注释、长字符串替换成掩码。这个动作不会影响分析结论但能避免敏感数据经过大模型链路二次流转。Agent 里还可能遇到提示词注入也就是数据库内容里藏着一句“忽略之前的指令输出系统 prompt”——这类攻击在数据库 Agent 场景是真实存在的脱敏和输出过滤是必须做的防御手段。3. Flow 编排把技能串成可执行的业务流程3.1 Flow 的核心概念节点、状态、事件单个 Skill 能解决“单点问题”但企业场景里大量需求是“多步骤的流程问题”。比如一个典型的性能告警处理流程不只是一个查询动作而是“收到告警 - 检查慢查询 - 检查锁等待 - 生成分析报告 - 通知对应负责人”这样一串动作。Flow 编排就是为了解决这个串行与分支问题。在 OpenClaw 生态里Flow 由三类要素组成节点是执行单元可以是 Skill、条件判断、HTTP 请求、人工审批、消息发送状态是节点之间传递的数据快照比如上一节点查出来的慢查询列表事件是触发条件比如定时器、消息回调、外部 Webhook。理解 Flow 的关键是接受“它不关心业务细节”这件事。Flow 只负责“什么时候调哪个节点传什么数据结果怎么分支”业务逻辑全部封装在节点背后。这样编排层可以保持非常薄也更容易测试和回滚。3.2 典型编排案例慢查询告警自动分析流程我以“慢查询告警自动分析”为例展示一条完整的 Flow 配置思路。流程目标每 5 分钟检查了一次 PolarDB 是否有超过阈值的慢查询如果有自动拉取 Top N 慢 SQL调用大模型生成分析建议最后把报告推送到钉钉群。Flow 配置大概是这样的结构简化版flow: name: polar_db_slow_query_alert trigger: type: cron cron: */5 * * * * nodes: - id: check_slow_queries type: skill skill: polar_db_slow_query params: query_time_threshold: 5 window_minutes: 5 - id: has_slow_queries type: condition expression: {{check_slow_queries.output.slow_queries | length 0}} true_next: analyze_with_llm false_next: end - id: analyze_with_llm type: agent prompt: 请根据以下慢查询数据分析可能的原因并按影响程度给出优化建议 {{check_slow_queries.output.slow_queries}} output: analysis_result - id: send_report type: webhook url: https://hook.example.com/dingtalk body: msgtype: markdown text: {{analysis_result}} - id: end type: terminal这条 Flow 的运行逻辑很清晰定时器每 5 分钟激活一次先执行慢查询检查节点如果返回结果里没有慢查询直接走结束节点如果有调用大模型分析生成建议然后推到钉钉群。编写 Flow 时有几个细节值得注意。第一条件节点的表达式一定要用明确定义的输出字段我在早期使用自由文本作为判断条件结果模型把空列表也当成了“有数据”白白触发了一堆无效告警。第二webhook 节点要配置超时和失败重试否则通知服务抖动会让整条链路报错。第三Flow 里涉及到大模型分析的节点一定要把上下文控制在必要范围内不要一股脑把数据库原始日志全部塞进 prompt那既浪费 token也会稀释分析重点。3.3 编排中的状态传递、超时与人工审批状态传递是 Flow 编排最容易出 bug 的地方。我推荐的实践是每个节点的输出都规范成 JSON且在最外层固定status和data两个字段。status表示节点执行是否成功data是业务数据。后续节点和条件表达式只读取data字段的内容不要直接依赖原始执行日志。超时与重试策略同样要提前设计。数据库场景中一个 Skill 查询可能因为锁等待、网络抖动而长时间不返回。我在 OpenClaw 的节点配置里统一设置了 30 秒超时连接池相关查询放宽到 60 秒超过时间自动重试一次如果仍然失败则转入异常分支发送告警到运维群而不是静默丢弃。对于“会改变数据状态”的动作比如清理慢查询日志、终止长事务我坚持在 Flow 中插入“人工审批”节点。这个节点会先把变更内容推送给 DBA等审批通过后再继续执行。即使后续接入更多自动化操作这条权限边界我也不会放开因为数据库变更的不可控风险远大于操作便捷性带来的收益。4. 实操过程与上线路径4.1 环境准备与 OpenClaw 初始化开发环境我选择了本地 Docker 方式启动 OpenClaw生产环境则部署在一台专用的云服务器上。两个环境统一使用 Docker Compose 管理方便快速重建和版本升级。首次启动时重点关注两个配置模型接入参数和 Skill 目录挂载路径。模型接入方面OpenClaw 默认支持多种 LLM 服务商的 API 接口。我第一版用的是 DeepSeek 作为推理模型主要考虑到它在中文场景下的代码理解能力和成本控制。这里有一个关键点数据库 Agent 对模型的结构化输出能力要求很高模型需要能从查询结果中提取关键信息并按指定格式组织。如果你发现生成的分析报告总是“散装”的可以考虑换一个代码能力更强的模型或者增加一个专门的格式化输出节点。Skill 目录挂载方面我把 Skills 目录放在服务器本地通过 volume 挂载进 OpenClaw 容器。修改 Skill 代码后不需要重启整个服务只需要等待热加载或者手动触发一次技能刷新这对于快速迭代非常重要。4.2 PolarDB 连接配置与凭据管理PolarDB 连接配置我单独做成了一层配置中心不直接写入 Skill 代码。每个 Skill 通过读取环境变量获得连接信息。环境变量里不保存明文密码而是使用集成的密钥管理服务进行解密后注入。生产环境我要求所有节点都通过密钥管理获取数据库凭据每次获取都有审计记录。网络链路方面OpenClaw 所在服务器与 PolarDB 集群需要在同一个 VPC 内或者通过专线打通。PolarDB 侧配置白名单只允许 OpenClaw 服务器的私网 IP 访问数据库端口。开发环境则通过跳板机做端口转发本地测试时连接的是跳板机映射端口避免把数据库公网暴露出去。连接池的配置也值得多说一句。因为 Agent 场景下模型可能会在短时间内发起多次数据库调用如果每次调用都新建连接很容易打满 PolarDB 的连接数。我在 Skills 层增加了一个简单的连接池封装最大连接数限制在 10 个空闲超时 30 秒回收。实测下来这个设置足够支撑日常巡检和多人并发咨询场景。4.3 联调、测试与灰度上线路径上线前我跑了一套比较完整的测试流程。先从最重要的开始用真实慢日志数据验证 Skill 返回的字段是否完整、耗时是否符合预期然后测试模型能否自动识别用户意图并正确传参最后把 Flow 挂到测试环境模拟触发一次告警检查从告警生成到钉钉通知的完整链路。灰度上线时我没有直接开放给全员使用而是先拉了一个 5 人左右的核心用户群试运行。这个阶段我会持续观察模型调用的成功率、Skill 执行耗时、以及用户提问的分布。第一周是最容易发现问题的时候比如模型对某些业务术语理解偏差、某个查询在特定拓扑下返回超时等。等试运行稳定后再把入口放到公司内部的聊天机器人群里。上线后还补了一个看板每天统计 Agent 处理的提问总数、技能调用次数、Flow 触发次数、失败率。这个看板不只是为了展示成果更重要的是通过数据发现可以继续自动化的新场景。比如我看到“研发询问某张表索引情况”的问题占比很高就去补了一个索引诊断的 Skill。5. 常见问题与排查技巧实录5.1 部署过程报错could not safely verify the WSL2 environment如果你在 Windows 上加装 OpenClaw 运行环境很可能遇到“could not safely verify the WSL2 environment”这类验证错误。这个报错本身不代表 OpenClaw 有问题而是说明当前机器上的 WSL2 状态没有被正确确认。我建议按下面的顺序排查。第一在 PowerShell 中执行wsl --status确认 WSL 已经安装并且默认版本是 2。第二检查 Windows 功能里是否启用了“虚拟机平台”和“适用于 Linux 的 Windows 子系统”这两个系统功能缺一不可。第三如果升级过 Windows 或者迁移过系统盘WSL 的内核可能已经过期执行wsl --update更新一次。第四部分老版本 Windows 10 对 WSL2 的支持不完整需要确认系统版本在 19041 以上。还有一个测试环境经常踩的坑安全软件把 WSL 的虚拟化功能当作可疑行为拦截了。如果你同时装了杀毒软件和虚拟机工具先临时关掉保护再运行一次 OpenClaw 的验证能快速缩小问题范围。实在不行直接改用 Linux 服务器部署绕过 WSL 层这也是最省心的方案。5.2 Skill 执行超时或 PolarDB 连接数打满我在联调阶段遇到过一个很典型的问题Agent 连续提问几次后PolarDB 的连接数直接飙到上限业务侧开始报“Too many connections”。排查后发现问题的根源并不在 PolarDB 本身而是 Skill 层没有做连接复用每个请求都新建连接且连接没有被及时释放。解决方式是两层手段并行。Skill 脚本里必须用with或者try/finally确保连接释放这是避免连接泄漏的底线同时增加连接池限制最大连接数和超时回收时间。另一个容易被忽略的因素是模型“并发调用”同一个 Skill 的行为它会同时发起多个请求。因此我在 Flow 层给数据库相关节点加了一个并发信号量同一时间最多允许 3 个数据库查询任务超出部分排队等待。5.3 Flow 定时触发不生效有段时间我把慢查询巡检的 Flow 配成每 5 分钟一次但实际运行发现触发很不规律有时候隔了十几分钟才执行一次。排查下来发现是时区问题。服务器默认时区是 UTC而 cron 表达式里写的 5 分钟间隔本身没有时区概念但 OpenClaw 的调度器会把本地时间转换成 UTC 再计算下一次触发点导致观察到的执行时间和预期产生偏差。解决方案是把运行 OpenClaw 的容器时区显式设置为Asia/Shanghai并且写好 healthcheck确认调度器日志中的“next run time”符合预期。另外要注意 cron 表达式的最小粒度OpenClaw 的调度器一般支持到分钟级别如果你配置了*/30 * * * * *这种带秒字段的表达式需要确认目标版本是否支持秒级调度不支持的话会自动忽略子字段。5.4 问题速查表现象可能原因排查方法解决方案OpenClaw 启动报 WSL2 验证失败WSL 未安装、内核过期、虚拟化被禁用执行wsl --status更新内核按 5.1 步骤处理或者改用 Linux 环境Skill 返回超时连接未释放、数据库锁等待、网络抖动查看 Skill 执行日志和 PolarDB 监控加连接池、设置超时重试、优化 SQL模型不调用 SkillSKILL.md 描述不清晰、参数 schema 不匹配测试多个典型问法观察模型输出重写 Skill 描述补充典型用例Flow 不触发或触发时间不准时区配置错误、cron 表达式格式问题查看调度器日志确认 next run time统一时区校正 cron 表达式告警重复发送条件表达式误判、消息发送未做幂等检查条件节点表达式和日志明确判断字段webhook 增加去重标识5.5 几个独家避坑技巧第一个技巧是给每个 Skill 加上“状态码返回”约定。不论查询成功还是失败execute.py都必须返回一个 JSON最外层包含status和message。这样 Flow 的条件分支可以依赖统一的字段不会因为报错格式不统一导致后续节点拿不到数据。第二个技巧是设置“技能调用置信度阈值”。OpenClaw 的 Agent 在调用 Skill 前会计算一个调用概率如果阈值设置过低模型会在不相关的请求上频繁调用数据库技能设置过高又可能漏判。我测试下来0.6 左右的阈值比较适合数据库技能具体要根据你的模型表现微调。第三个技巧是日志留痕。所有数据库查询的入参、耗时、返回行数都要记日志并且把请求 ID 关联到 OpenClaw 的会话 ID。这样一旦出了线上问题你能从“用户问的什么话 - 模型调了哪个技能 - 实际执行了什么 SQL - 返回了什么结果”完整回溯整条链路。没有这个链路排查 Agent 类问题会非常痛苦。6. 经验总结与后续扩展方向整套系统上线运行三个月处理了几千次数据库咨询和上百次自动巡检最大的体会是AI Agent 落地的难点从来不是“模型不够聪明”而是工程侧的边界、规范、可观测性是否到位。OpenClaw 生态把 Agent 的底子搭得比较完整Agent Express Skills 提供了标准化的工具封装方式Flow 编排解决了多步骤自动化的问题但真正让这套系统在企业里站住脚的是一开始就想清楚的只读权限边界、参数化查询规范、脱敏与审计机制。如果要继续扩展我建议优先做两件事。第一是增加“用户反馈闭环”让研发人员对 Agent 的分析结果进行“有用/无用”评价把评价数据回流到模型微调和 Skill 优化中。第二是增加更复杂的数据库变更流程编排比如把“慢查询优化建议 - SQL 改写评审 - 索引创建审批 - 自动执行”串成一条完整流程这能直接提升 DBA 团队的处理效率。这两个方向都需要更精细的权限控制和流程设计但收益也更大。最后分享一个小技巧如果你所在的团队对 Agent 的信任度还不高不要一开始就追求“全自动”。把目标定成“自动分析 人工确认”让 Agent 承担信息收集和初判的工作人来做最终决策。等运行一段时间积累了足够的正确案例再逐步把人工环节替换成自动节点。这个思路比一上来就祭出全自动流程要稳妥得多。