OpenClaw实战:从零搭建企业级AI Agent自动化系统
从 2025 年开始个人开发者和中小企业做自动化工具时已经不再满足于“写个脚本跑批处理”。大家真正想要的是一个能自己理解任务、调用工具、处理异常、甚至在不同系统之间完成闭环操作的智能体。而 OpenClaw 这个项目之所以在技术社区里持续升温核心原因只有一个它把“从零搭建一个可用 AI Agent”的门槛从数周开发周期压缩到了小时级别。这篇文章会直接回答几个开发者最关心的问题OpenClaw 到底是什么、它的架构设计和传统自动化方案有什么本质区别、在真实企业项目里应该怎么落地、环境怎么搭、配置怎么改、代码怎么写、以及最容易踩的坑在哪里。不管你是刚接触 Agent 开发的新手还是已经在用 Python 脚本、Dify、Coze 等工具做自动化的进阶开发者这篇文章都会给你一条明确的学习路径。全文会以一个企业级实战案例为主线从环境准备到完整代码实现再到运行验证和排查思路一次性讲透。1. OpenClaw 到底是什么1.1 一句话定义OpenClaw 是一个面向开发者的智能体Agent编排与自动化执行框架。你可以把它理解成一个“带大脑的脚本执行器”普通的自动化脚本只能按照写死的逻辑顺序执行而 OpenClaw 允许你把自然语言任务交给一个由大模型驱动的 Agent这个 Agent 会自己拆解任务、选择合适的工具、执行操作并在遇到错误时进行调整。1.2 它解决的真实痛点在过去实现一个“自动整理销售日报并发送邮件”的需求通常需要以下步骤写 Python 脚本读取数据库。写模板逻辑生成日报内容。调用 SMTP 库发送邮件。用 cron 或定时任务配置调度。处理各种异常情况比如数据库连接失败、邮件被退信、格式错误。这套流程本身不复杂但问题是一旦需求变为“每天分析销售数据发现异常时写一段分析报告并相关负责人”脚本逻辑就会变得非常复杂因为你需要在代码里预设大量分支判断。OpenClaw 的解决思路是把“任务意图”交给 Agent让大模型去决定调用哪些工具、以什么顺序执行、如何组合结果。开发者只需要做好两件事提供工具能力定义清晰的权限边界。1.3 适合谁用OpenClaw 最适合以下三类人群有一定编程基础想快速构建 AI 自动化工具的开发者。企业内部的运维、数据分析、项目管理人员需要把重复性工作自动化。正在调研 Agent 框架选型的技术负责人想对比 OpenClaw 与 Dify、Coze、LangChain 的差异。如果你是完全没有编程基础的小白建议先补一下 Python 基础、命令行操作和 JSON/YAML 配置语法否则在排错阶段会比较吃力。2. 核心概念与架构原理2.1 Agent智能体在 OpenClaw 中Agent 是任务执行的核心单元。它接收用户输入的自然语言目标通过大模型的推理能力生成一系列可执行动作。通俗理解Agent 就像是一个“数字员工”你告诉它“去把销售部的周报整理出来并检查有没有数据异常”它会自己去想该怎么做。2.2 Action动作Action 是 OpenClaw 暴露给 Agent 的最小工具单元。每个 Action 通常对应一个具体的函数或 API 调用例如读取数据库某张表的数据。调用某个 HTTP API。执行一段 Shell 命令。向指定邮箱发送邮件。开发者需要把 Action 描述清楚包括它的功能、参数、返回值格式。这样大模型才能正确地决定何时使用它。2.3 Skill技能Skill 是多个 Action 的集合面向特定场景封装。比如“邮件处理技能”可能包含读取收件箱、解析邮件内容、根据规则回复、归档邮件等 Action。在实际项目中Skill 的价值在于复用。你不需要每次写任务时都从零定义工具直接把 Skill 挂在 Agent 上即可。2.4 Trigger触发器Trigger 是 OpenClaw 启动任务的条件来源。它解决了“谁来决定 Agent 什么时候开始干活”的问题。目前常见的触发方式包括定时触发每天上午 9 点执行一次。Webhook 触发外部系统通过 HTTP 请求触发。事件触发监听某个事件源比如新邮件到达、数据库表新增记录。手动触发开发者在控制台或通过命令行手动发起。2.5 与传统自动化方案的架构对比对比维度传统脚本RPA机器人流程自动化OpenClaw 类 Agent 框架逻辑编写方式代码写死流程拖拽或录制自然语言代码工具异常处理能力低需人工写分支中需预设规则高大模型可动态调整扩展性需大量开发受限于平台能力极高自定义 Action适用场景确定性任务确定性 UI 操作半结构化、需要理解的复杂任务人员门槛中高低中可以这样理解这三者的差异传统脚本像是“固定线路的公交车”RPA 像是“在固定轨道上跑的列车”而 OpenClaw 这类 Agent 框架更像是“带导航的专车司机”——它能根据实时路况决定走哪条路。2.6 OpenClaw 的设计核心从架构来看OpenClaw 的设计核心可以概括为三点模型无关它不绑定某一家大模型可以通过 API 接入 OpenAI、Claude、国产模型等。工具优先Agent 本身不内置业务能力所有能力都通过 Action 和 Skill 注入。权限可控每个 Action 都可以设定权限级别避免 Agent 越权执行危险操作。这就意味着OpenClaw 更适合作为“企业内部的自动化中台”而不是一个开箱即用的 SaaS 工具。3. 环境准备与安装部署3.1 基础环境要求在开始安装 OpenClaw 之前需要准备好以下环境操作系统LinuxUbuntu 20.04、macOS 或 Windows建议使用 WSL2。Python 版本3.10 或更高版本。Node.js如果涉及前端面板或部分工具链可能需要 Node.js 18。Docker推荐安装用于隔离依赖和部署服务。Git用于拉取代码。版本说明不同时间节点 OpenClaw 的依赖版本会有变化这里不写死具体版本号一律以项目官方文档的 requirements 为准。如果是生产环境建议固定版本并锁定依赖。3.2 获取 OpenClaw 项目推荐使用 Git 拉取官方仓库的方式安装。# 克隆项目 git clone https://github.com/openclaw/openclaw.git cd openclaw # 查看分支和版本标签具体以官方仓库为准 git tag -l git branch -a如果网络访问 GitHub 不稳定可以考虑使用镜像源但不建议在生产环境长期依赖镜像。3.3 创建虚拟环境并安装依赖# 创建虚拟环境 python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 升级 pip pip install --upgrade pip # 安装项目依赖 pip install -r requirements.txt在国内网络环境下可以临时使用清华 PyPI 镜像加速安装pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple3.4 配置大模型 APIOpenClaw 需要连接一个大模型后端来完成推理任务。你需要确保自己有一个可用的模型 API Key并正确配置到环境变量中。# 以 OpenAI 兼容接口为例 export OPENAI_API_KEY你的_API_Key export OPENAI_BASE_URL模型服务的API地址 export OPENCLAW_MODEL你的模型名称如果是国内模型服务商很多也是 OpenAI 兼容协议可以通过修改 BASE_URL 来实现不需要额外改代码。3.5 验证安装# 查看 OpenClaw 命令帮助 openclaw --help # 查看版本号 openclaw --version如果命令能正常输出版本信息说明基础安装是成功的。4. 核心流程拆解在动手写代码之前先理解 OpenClaw 的核心工作流程。这会帮助你避免“配好了环境却不知道怎么组织项目”的尴尬。4.1 一次完整任务的运行流程一次完整的 OpenClaw 任务执行流程如下用户通过 CLI、Webhook 或定时器触发任务。Agent 接收自然语言任务描述。Agent 调用大模型将任务拆解为子步骤。Agent 根据可用 Action 列表决定每个子步骤调用哪个 Action。Action 执行实际逻辑操作文件、调用 API、查数据库等。Agent 收集 Action 的返回值决定是否继续下一步或者直接结束。任务完成后输出结果或执行收尾动作。4.2 开发者需要关注的三层在 OpenClaw 项目里开发者需要关注三层内容配置层定义 Agent 使用哪些模型、哪些 Skill、哪些 Action。业务层编写 Action 函数把企业需要的业务能力包装成 Agent 可调用的工具。运维层配置触发器、监控日志、控制权限。这三层如果混淆就会出现一个问题业务逻辑散落在 Agent 的提示词里而不是封装在 Action 中。这在初期能跑通但一旦任务复杂度上来运行效果会非常不稳定。4.3 重要原则能封装成 Action 就不要写在任务描述里这里要强调一个核心经验OpenClaw 的 Agent 虽然能用自然语言理解任务但不要把复杂的业务规则全部塞进自然语言描述里。原因有两个大模型对长文本的遵循能力是有限的复杂的业务规则会影响任务执行的准确性。业务逻辑放在 Action 里可以被测试、被复用、被 review放在提示词里就只能靠“运气”。所以正确做法是需要确定性逻辑的地方用代码实现。需要开放性思考的地方交给 Agent 决策。4.4 企业场景的落地流程拿一个真实的企业场景举例销售日报自动生成与异常预警。这个任务可以分解为定时触发每天 18:00 执行。拉取数据从业务数据库读取当日销售表。数据加工计算销售额、订单量、较昨日增长率。异常判断如果销售额低于阈值标记异常。报告生成用模板生成日报异常部门需要额外输出原因分析。消息推送通过企业微信机器人或钉钉机器人发送。可以看到这个流程中步骤 2、3、4、6 都属于确定性逻辑应该写进 Action步骤 5 的“原因分析”和整体调度更适合交给 Agent。5. 企业级实战案例OpenClaw 落地销售日报自动化为了让整篇文章不变成空谈理论下面我们会用一个具体的企业级场景完整走一遍 OpenClaw 项目的搭建过程。5.1 场景描述假设你现在是某电商公司的研发工程师业务方提出一个需求每天晚上 18:30系统自动从销售数据库拉取当天的订单数据生成一份简明的销售日报内容包括总销售额、总订单数、客单价、Top 5 商品。如果销售额环比昨天下降超过 20%需要额外生成一段异常原因分析并发送到运营负责人的企业微信。如果使用传统方式这个需求需要写数据读取模块、计算逻辑、报告生成模板、企业微信推送模块并且还要处理各种边界情况。而使用 OpenClaw做法是编写三个 Action查询销售数据、计算销售指标、发送企业微信消息。编写一个 Skill销售日报。创建一个 Agent绑定上述 Skill。配置一个定时触发器。在任务描述中写明异常判断规则。下面逐步实现。5.2 项目目录结构建议按照下面的结构组织 OpenClaw 项目openclaw-sales-report/ ├── openclaw.yaml # 主配置文件 ├── skills/ │ └── sales_report/ │ ├── SKILL.md # 技能描述文件 │ └── actions/ │ ├── query_orders.py # 查询订单数据 │ ├── calculate_metrics.py # 计算指标 │ └── send_wecom.py # 推送企业微信消息 ├── data/ │ └── ... └── logs/ └── ...5.3 主配置文件 openclaw.yaml# openclaw.yaml # OpenClaw 主配置文件 agent: name: sales-report-agent description: 负责生成销售日报并发送异常预警 model: ${OPENCLAW_MODEL} skills: - sales_report trigger: type: cron cron: 30 18 * * * timezone: Asia/Shanghai task: description: | 每天生成销售日报 1. 查询当天所有订单数据。 2. 计算总销售额、总订单数、客单价。 3. 找出销售额 Top 5 商品。 4. 与昨天数据对比如果销售额环比下降超过 20%生成异常分析。 5. 将日报内容通过企业微信机器人发送。 logging: level: INFO dir: logs说明这里的 cron 表达式30 18 * * *表示每天 18:30 执行。模型名称通过环境变量注入避免敏感信息硬编码在配置文件中。5.4 实现 Action查询销售数据文件路径skills/sales_report/actions/query_orders.py# skills/sales_report/actions/query_orders.py Action: 查询指定日期范围内的订单数据 import json import os from datetime import date, timedelta import pymysql def query_orders(start_date: str, end_date: str) - dict: 从销售库查询订单数据。 Args: start_date: 开始日期格式 YYYY-MM-DD end_date: 结束日期格式 YYYY-MM-DD Returns: 订单列表的 JSON 字符串 connection pymysql.connect( hostos.getenv(DB_HOST, localhost), portint(os.getenv(DB_PORT, 3306)), useros.getenv(DB_USER, root), passwordos.getenv(DB_PASSWORD, ), databaseos.getenv(DB_NAME, sales_db), charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) sql SELECT order_id, product_name, category, amount, order_time, salesperson FROM orders WHERE order_time %s AND order_time %s try: with connection.cursor() as cursor: cursor.execute(sql, (start_date, end_date)) rows cursor.fetchall() return {success: True, data: rows, count: len(rows)} except Exception as e: return {success: False, error: str(e)} finally: connection.close() if __name__ __main__: today date.today().isoformat() yesterday (date.today() - timedelta(days1)).isoformat() result query_orders(yesterday, today) print(json.dumps(result, ensure_asciiFalse, indent2))这个 Action 的逻辑本身很简单连接数据库、查询订单、返回 JSON。关键点在于通过环境变量读取数据库连接信息避免硬编码。使用参数化查询防止 SQL 注入。返回结构统一为{success: ..., data: ..., count: ...}或{success: ..., error: ...}方便 Agent 解析。5.5 实现 Action计算销售指标文件路径skills/sales_report/actions/calculate_metrics.py# skills/sales_report/actions/calculate_metrics.py Action: 根据订单数据计算核心销售指标 import json from collections import Counter from typing import List, Dict def calculate_metrics(orders: List[Dict]) - dict: 输入订单列表输出销售指标。 Args: orders: 订单列表每个元素是包含 amount、product_name 等字段的字典 Returns: 指标字典 if not orders: return { total_amount: 0, total_orders: 0, average_order_value: 0, top_products: [], } total_amount round(sum(float(o[amount]) for o in orders), 2) total_orders len(orders) avg_order_value round(total_amount / total_orders, 2) # 统计 Top 5 商品 product_amount Counter() for o in orders: product_amount[o[product_name]] float(o[amount]) top_products [ {product_name: name, sales_amount: round(amount, 2)} for name, amount in product_amount.most_common(5) ] return { total_amount: total_amount, total_orders: total_orders, average_order_value: avg_order_value, top_products: top_products, } if __name__ __main__: demo_orders [ {product_name: 手机, amount: 5999.0}, {product_name: 耳机, amount: 799.0}, {product_name: 手机, amount: 5999.0}, {product_name: 手表, amount: 1999.0}, ] print(json.dumps(calculate_metrics(demo_orders), ensure_asciiFalse, indent2))这个 Action 的作用是把所有订单数据加工成真正有用的销售指标。为什么不让 Agent 直接算因为金额汇总、排序、百分比计算属于确定性逻辑用代码算既快又准用大模型算反而容易出错。好的工具设计原则是让 Agent 做“判断和表达”让代码做“计算和存取”。5.6 实现 Action发送企业微信机器人消息文件路径skills/sales_report/actions/send_wecom.py# skills/sales_report/actions/send_wecom.py Action: 通过企业微信机器人发送 Markdown 消息 import json import os import requests def send_wecom_message(content: str) - dict: 发送消息到企业微信群机器人。 Args: content: Markdown 格式的消息内容 Returns: 调用结果 webhook_url os.getenv(WECOM_WEBHOOK_URL, ) if not webhook_url: return {success: False, error: 未配置 WECOM_WEBHOOK_URL} payload { msgtype: markdown, markdown: { content: content } } try: response requests.post(webhook_url, jsonpayload, timeout10) result response.json() if result.get(errcode) 0: return {success: True} else: return {success: False, error: result} except Exception as e: return {success: False, error: str(e)} if __name__ __main__: demo_content ( ### 销售日报测试\n 总销售额font color\info\5999.0/font\n 总订单数font color\info\4/font\n ) print(json.dumps(send_wecom_message(demo_content), ensure_asciiFalse, indent2))企业微信机器人是很多国内企业常用的消息推送通道。需要注意的是Webhook URL 属于敏感信息务必通过环境变量注入不要提交到代码仓库。5.7 编写 Skill 描述文件文件路径skills/sales_report/SKILL.md# 销售日报技能 ## 描述 本技能用于生成企业销售日报并执行异常预警。 ## 能力 - 查询指定日期范围内的订单数据query_orders - 计算销售核心指标calculate_metrics - 发送企业微信机器人消息send_wecom_message ## 使用场景 - 每日销售数据汇总 - 销售额异常下降预警 - Top 商品排名统计 ## 注意事项 - 所有日期时间使用北京时间。 - 金额单位为元保留两位小数。 - 环比下降阈值由用户任务描述中指定。为什么需要 SKILL.md因为 OpenClaw 的 Agent 需要通过这个文件了解当前 Skill 的用途和能力边界才能决定何时调用它、怎么组织参数。5.8 运行与验证完成上面的文件编写后在项目主目录下执行openclaw run如果配置的是 cron 触发器OpenClaw 会按计划时间运行。如果需要立即手动触发一次测试可以使用openclaw run --now运行日志会输出到logs/目录下。正常的执行结果包括成功查询到订单query_ordersAction 返回success: true。成功计算指标calculate_metrics返回指标数据。异常判断如果环比下降超过 20%Agent 会生成异常分析。消息推送企业微信返回errcode: 0。6. 运行结果与效果验证6.1 验证方式一日志检查运行完成后打开日志文件确认任务执行链路完整。重点看Agent 是否正确理解了任务描述。是否依次调用了预期的 Action。每个 Action 的返回值是否符合预期。是否有异常报错。日志中常见的成功标志如下[INFO] Task started: 生成今日销售日报 [INFO] Agent selected action: query_orders [INFO] query_orders returned: successtrue, count328 [INFO] Agent selected action: calculate_metrics [INFO] calculate_metrics returned: total_amount198233.50 [INFO] Agent selected action: send_wecom_message [INFO] send_wecom_message returned: successtrue [INFO] Task finished6.2 验证方式二企业微信消息确认如果推送成功企业微信群里的机器人会发送一条 Markdown 消息。内容类似于### 每日销售日报 日期2025-06-10 - 总销售额198233.50 元 - 总订单数328 - 客单价604.37 元 Top 5 商品 1. 手机 120000.00 元 2. 耳机 25000.00 元 3. 手表 18000.00 元 ...6.3 验证方式三模拟失败场景实际项目中第一次跑通的可能性很低常见的失败场景是数据库连不上或者企业微信推送失败。建议在 Action 中提前包含错误判断和返回值约定这样 Agent 才能感知到错误并做出下一步决策。这里比较关键的一点是OpenClaw 的 Action 返回值必须结构化。不要让 Action 直接抛异常给 Agent而是返回一个包含success字段和error字段的字典。这样 Agent 才能“看懂”发生了什么并尝试修复或者终止任务。7. 常见问题与排查思路在实际使用 OpenClaw 的过程中新手最容易遇到以下几类问题。问题现象可能原因排查方式解决方案安装依赖失败网络原因部分源访问不稳定检查 pip 输出使用国内 PyPI 镜像启动时提示缺少 API Key环境变量没有正确导入echo $OPENAI_API_KEYexport 环境变量后重新启动Agent 调用了错误的 ActionSKILL.md 描述不够清晰查看日志中 Agent 决策过程补充 Action 描述和适用场景Action 返回了空数据数据库连接失败或 SQL 条件问题单独运行 Action 脚本加日志检查连接信息任务不按定时触发cron 表达式时区不对查看配置 timezone明确配置 Asia/Shanghai企业微信推送失败Webhook 被废弃或格式错误查看返回的 errcode重新生成 Webhook检查内容格式大模型输出不稳定任务描述过长、复杂规则过多拆分成多个 Action业务规则尽量封装到代码中7.1 Agent 调用 Action 不准确怎么办这是 OpenClaw 使用中最常见的问题本质原因通常是Action 的描述信息不够详细大模型不知道这个 Action 具体是干什么的。解决方案Action 的名字要直接比如query_orders就比db_query_v2好。注释和文档字符串要写清楚参数含义。SKILL.md 中明确说明使用场景和边界。在开发阶段可以给 Agent 一次只挂一个 Action减少决策空间。7.2 大模型出现幻觉或错误判断怎么办不要试图用更长的提示词来解决这个问题。正确做法把所有事实性数据的获取交给 Action。大模型只负责“基于 Action 返回的真实数据分析原因”。设置校验步骤让 Agent 在输出前检查数据是否完整。7.3 如何调试单个 Action这里提供一个小技巧每个 Action 文件在独立运行时会读取真实环境变量、连接真实数据库并输出 JSON 结果。这意味着你可以脱离 OpenClaw 单独调试每一个工具函数。python skills/sales_report/actions/query_orders.py这种设计在开发阶段非常有用。当你确认每个 Action 都能独立跑通后再启动 OpenClaw 进行联调排错效率会高很多。8. 最佳实践与工程建议8.1 安全与权限边界OpenClaw 的 Agent 本质上是一个能执行代码的自动化系统因此安全意识和权限控制必须高度重视。必须使用最小权限数据库账号不要用 root。数据库账号只授予该 Agent 必需的 SELECT 权限。涉及写操作的 Action生产环境必须增加人工审批环节。API Key、数据库密码、Webhook 等敏感信息一律通过环境变量或密钥管理服务注入禁止提交到 Git 仓库。开发环境、测试环境、生产环境要使用独立的配置和凭据。涉及删除、更新、大量数据变更的 Action必须在代码中做二次确认并保留完整操作日志。8.2 日志与可观测性Agent 系统的故障排查比较考验日志设计。建议从以下角度做好日志记录完整的任务描述。记录 Agent 每次选择的 Action。记录每个 Action 的入参和出参注意脱敏。记录每次大模型调用的 token 消耗便于成本统计。记录中间结果和最终结果。一个好的做法是给每个任务分配一个 trace_id贯穿所有日志这样排查问题时能快速串起整条链路。8.3 配置管理OpenClaw 项目的配置不要散落在代码里。推荐统一使用 openclaw.yaml 管理 Agent、Skill、Trigger 的配置环境相关变量通过 .env 文件管理。建议在项目根目录创建.env.example文件把需要配置的变量列出来供团队成员参考# .env.example OPENAI_API_KEYsk-xxx OPENAI_BASE_URLhttps://api.example.com/v1 OPENCLAW_MODELgpt-4o-mini DB_HOSTlocalhost DB_PORT3306 DB_USERsales_reader DB_PASSWORDyour_password DB_NAMEsales_db WECOM_WEBHOOK_URLhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?keyxxx8.4 成本控制使用 OpenClaw 时成本主要来自大模型 API 调用。以下几点可以帮助控制成本不要让 Agent 反复调用同一个只读 Action可以对结果做缓存。合理选择模型简单任务使用小模型复杂推理使用大模型。任务描述要精简不要包含大量无关历史上下文。设置单次任务的最大 Action 调用次数防止 Agent 陷入死循环。8.5 版本管理与回滚OpenClaw 项目的 Skill技能、Action动作和配置Configuration都应当纳入版本控制。生产环境部署前至少要在测试环境中完整跑通一次再发布。如果发布新版本后发现问题应当保留上一版本的镜像或代码快照支持快速回滚。此外有条件的话建议增加一项机制定时任务的执行结果应持续记录方便事后追踪。与业务相关的系统处理敏感数据时要注意数据合规和信息脱敏日志和报告中不要出现不必要的个人隐私信息。9. 总结与后续学习方向OpenClaw 代表了一种新的自动化范式它不再要求开发者把每一个业务分支都写死在代码里而是允许你用自然语言描述目标让大模型去调度工具、组合逻辑、处理异常。这在半结构化任务、跨系统协调、需要理解的自动化场景中具有明显的效率和灵活性优势。但是也要清醒地认识到它的边界OpenClaw 不是万能的。对于完全确定性的高并发任务传统代码仍然是最优解对于需要严格合规审批的流程人工环节仍然是必要保障对于复杂 UI 操作专用 RPA 工具可能更合适。如果这篇文章对你有一点点帮助建议收藏备用。你完全可以用文中的技能设计思路复制这套框架来搭建适合自己业务场景的自动化方案而不是直接照抄代码或目录结构。后续可以深入的方向包括把真实业务系统里的数据库查询、消息推送等能力改造成可复用的 Action。探索用 OpenClaw 串联多个内部系统的可能比如让 Agent 自动查询工单状态并调用不同的处理流程。研究触发器的高级用法比如 Webhook 与第三方表单结合。关注项目官方的版本更新和文档同时多参考生产环境下的实际案例。实践才能出真知。建议你在自己的项目里挑一个重复性最高的任务亲手用 OpenClaw 实现一遍。只要完成一次你对 Agent 自动化的理解会比看十篇文章更有用。