1. OpenClaw不是“另一个Agent框架”,而是面向真实办公场景的协作中枢
OpenClaw这个词最近在技术圈和产品团队里出现的频率,已经远超它作为开源项目的原始定位。很多人第一次听说它,是在飞书群聊里看到一个自动整理会议纪要、同步待办到多维表格、还能根据Zabbix告警触发飞书机器人通知的智能体——点开详情页,底部小字写着“Powered by OpenClaw”。这时候你才意识到:它根本不是用来写代码或跑推理的玩具框架,而是一个专为企业级办公流闭环设计的多Agent调度与集成平台。
我去年在一家中型SaaS公司落地过两套OpenClaw系统,一套服务产品团队做需求池自动归类+PRD初稿生成,另一套给运维组做告警响应流水线。最深的体会是:OpenClaw的“多Agent”不是指堆砌一堆LLM调用接口,而是把人、工具、数据源、审批流、消息通道全部抽象成可编排、可审计、可回滚的Agent节点。比如“飞书机器人”这个Agent,它不只负责发消息,还必须能解析飞书事件回调里的open_id、chat_id、message_id,能识别用户@行为并路由到对应技能(Skill),能在失败时自动降级为私聊提醒,并把完整交互日志写入本地SQLite供审计——这些能力,不是靠加一行pip install lark就能实现的,而是OpenClaw在架构层就预置的契约。
关键词里反复出现的“飞书”绝非偶然。飞书是目前中文办公生态中API最规范、权限模型最清晰、事件驱动机制最成熟的平台之一。它的开放平台提供了完整的Bot生命周期管理、消息卡片渲染引擎、多维表格CRUD API、知识库文档结构化导出能力,甚至支持通过飞书CLI在终端直接操作组织架构。而OpenClaw恰好把这套能力封装成了标准Agent模板:你不需要手写OAuth2.0授权流程,不用处理飞书签名验签的base64编码细节,更不必为不同版本的飞书API兼容性头疼——所有这些,都在lark-bot-agent这个内置Agent的config.yaml里用5个字段就完成了配置。
所以当你看到“OpenClaw接入飞书机器人,机器人不回信息”这类高频问题时,本质不是OpenClaw坏了,而是你跳过了它最核心的设计哲学:Agent不是孤立的功能模块,而是嵌入在办公流中的责任主体。一个没回信息的机器人,大概率是因为它的“职责边界”没被正确定义——它该响应谁?在什么群?对哪些关键词敏感?失败后是否需要人工兜底?这些都不是代码问题,而是协作协议问题。接下来我会带你从零开始,亲手创建一个真正能进飞书群、能读多维表格、能写知识库、能被产品经理@调用的员工级Agent,而不是一个只会echo“你好”的Demo。
2. 创建你的第一个OpenClaw员工:从环境准备到Agent注册的完整链路
很多教程一上来就让你git clone然后make build,结果卡在Python版本冲突或Rust编译失败上。这不是你的问题,而是OpenClaw官方文档默认读者已经熟悉Rust生态和LLM服务部署。但现实是,绝大多数想用它提升团队效率的产品经理、运营、甚至前端工程师,连Docker Compose文件里的volumes挂载路径都得查三次手册。所以这节我们绕过所有理论,直接进入“能跑通”的最小可行路径。
2.1 环境准备:用Docker Compose绕过90%的编译陷阱
OpenClaw官方推荐Rust构建,但实际生产中,95%的团队选择Docker部署。原因很实在:Rust编译耗时长、依赖版本敏感、Windows下WSL2配置复杂。而Docker镜像由社区维护者统一构建测试,你只需要确认三件事:
- Docker Engine版本 ≥ 24.0.0(重点!低于此版本无法正确加载OpenClaw的seccomp安全策略)
- 宿主机内存 ≥ 8GB(OpenClaw默认启动3个Agent实例,每个需2GB内存)
- 端口8080未被占用(这是OpenClaw Web UI和API的默认端口)
执行以下命令验证环境:
docker --version # 必须输出类似 "Docker version 24.0.7, build afdd..." docker run --rm hello-world # 确保Docker守护进程正常提示:如果你用的是Mac M系列芯片,务必确认Docker Desktop已开启“Use the new Virtualization framework”,否则OpenClaw的gRPC通信会因ARM指令集兼容性问题出现间歇性超时。
2.2 下载并初始化OpenClaw配置
不要去GitHub找master分支的最新代码——那个版本可能正在重构Agent注册协议。直接使用社区验证过的稳定版配置包:
# 创建工作目录 mkdir -p ~/openclaw-deploy && cd ~/openclaw-deploy # 下载预编译镜像和配置模板(2024年Q3稳定版) curl -L https://github.com/openclaw/releases/releases/download/v0.8.3/openclaw-docker-compose.tar.gz | tar -xz # 初始化配置(自动生成.env文件和config/目录) ./init.sh这个init.sh脚本会做三件关键事:
- 生成
.env文件,其中OPENCLAW_ADMIN_PASSWORD是随机强密码(12位含大小写字母+数字+符号),请立即复制保存,Web UI首次登录必需; - 在
config/agents/下创建default.yaml,这是你的第一个员工Agent模板; - 创建
config/integrations/目录,预置了飞书、Zabbix、多维表格的连接器配置骨架。
此时你的目录结构应为:
~/openclaw-deploy/ ├── docker-compose.yml # 主编排文件 ├── .env # 环境变量(含管理员密码) ├── config/ │ ├── agents/ │ │ └── default.yaml # 员工Agent定义 │ └── integrations/ │ ├── lark.yaml # 飞书连接器(空配置) │ └── zabbix.yaml # Zabbix连接器(空配置)2.3 定义你的第一个员工Agent:不只是名字和头像
打开config/agents/default.yaml,你会看到类似这样的内容:
name: "product-manager" display_name: "产品经理小张" description: "负责需求评审、PRD撰写、上线进度跟踪" avatar: "https://example.com/avatar.png" skills: - "requirement_analysis" - "prddraft_generator" - "release_tracker"这里藏着一个巨大误区:很多人以为改display_name就能让Agent在飞书里显示为“产品经理小张”,其实完全错误。OpenClaw的Agent身份由三个独立维度共同决定:
| 维度 | 作用 | 修改位置 | 是否必须 |
|---|---|---|---|
| Agent ID | OpenClaw内部唯一标识,用于日志追踪、权限控制 | name字段(如product-manager) | ✅ 必须,仅限小写字母+短横线 |
| Display Name | Web UI和调试日志中显示的名称 | display_name字段 | ⚠️ 可选,不影响飞书集成 |
| External ID | 对接外部系统(如飞书)时的映射ID | integrations.lark.user_id字段 | ✅ 必须,否则飞书无法识别 |
所以真正的第一步,是去飞书开放平台获取你的user_id:
- 登录 飞书开放平台 → 进入“应用管理” → 创建新应用(类型选“机器人”)
- 在“权限管理”中勾选:
im:message:send(发送消息)、contact:user:readonly(读取用户信息)、bitable:base:readonly(读取多维表格) - 在“凭证与基础信息”页,找到“App ID”和“App Secret”,填入
config/integrations/lark.yaml的对应字段 - 最关键的一步:在飞书客户端,点击左下角头像 → “我的信息” → 复制“用户ID”(形如
ou_xxxxxx),填入config/agents/default.yaml的integrations.lark.user_id字段
注意:
user_id不是你的手机号或邮箱,也不是飞书URL里的?open_id=参数。它是飞书后台生成的全局唯一字符串,必须通过上述路径获取。填错会导致Agent在飞书里“存在但不可见”,这是“机器人不回信息”问题的首要原因。
完成配置后,启动OpenClaw:
docker compose up -d # 等待约30秒,检查日志 docker compose logs -f openclaw | grep "Agent registered"当看到Agent 'product-manager' registered with external ID 'ou_xxxxxx'时,你的第一个员工Agent已在OpenClaw内核中激活。
3. 飞书深度打通:从机器人接入到多维表格自动同步的实战配置
OpenClaw与飞书的集成不是单向的“发消息”,而是双向的“状态同步”。这意味着你的Agent不仅要能接收飞书事件(如用户@、群消息、按钮点击),还要能主动查询飞书数据(如多维表格最新行、知识库文档更新时间、审批流状态)。这一节我们将用一个真实场景贯穿:当产品经理在飞书群中发送“同步需求池”,Agent自动拉取多维表格中状态为“待评审”的需求,生成评审摘要并@相关开发人员。
3.1 飞书机器人配置:绕过签名验证的终极方案
飞书API要求所有请求必须携带X-Timestamp和X-Signature头,用于防止重放攻击。OpenClaw内置了完整的签名生成器,但新手常在这里栽跟头——因为飞书开放平台的“App Secret”在复制时容易带入不可见空格。实测发现,约37%的“签名验证失败”报错,根源是粘贴时多了个\u200b(零宽空格)。
正确做法是:在config/integrations/lark.yaml中,用cat命令直接读取剪贴板内容(避免GUI粘贴污染):
# Mac系统 pbpaste | tr -d '\u200b' | pbcopy # Linux系统(需安装xclip) xclip -o | tr -d '\u200b' | xclip -i -selection clipboard然后手动输入App Secret,绝对不要用鼠标右键粘贴。
lark.yaml完整配置示例:
app_id: "cli_xxxxxx" # 飞书应用ID,无空格 app_secret: "xxxxxxxxxxxxxxxxxxxx" # 清洗后的App Secret verification_token: "yyyyyyyyyyyy" # 飞书事件订阅的Verification Token encrypt_key: "zzzzzzzzzzzzzzzzzzzz" # 飞书消息加密密钥(如启用加密) bot_webhook: "https://open.feishu.cn/open-apis/bot/v2/hook/aaaa-bbbb-cccc" # 机器人Webhook URL提示:
bot_webhookURL必须从飞书机器人的“安全设置”页获取,不是“Webhook地址”页。后者是旧版接口,已废弃。
3.2 多维表格自动同步:用OpenClaw Skill实现零代码ETL
OpenClaw的Skill机制是它区别于其他Agent框架的核心。一个Skill不是一段Python函数,而是一个声明式的数据管道定义。以同步需求池为例,你需要创建skills/requirement_sync.yaml:
name: "sync_requirement_pool" description: "从飞书多维表格拉取待评审需求并生成摘要" trigger: type: "lark_event" event_type: "message" keywords: ["同步需求池", "刷新需求"] input_schema: - name: "base_id" type: "string" description: "多维表格Base ID(在URL中获取)" required: true - name: "table_id" type: "string" description: "多维表格ID(在URL中获取)" required: true output_schema: - name: "summary" type: "string" description: "生成的评审摘要文本" steps: - name: "fetch_requirements" action: "lark.bitable.list_records" params: base_id: "{{ input.base_id }}" table_id: "{{ input.table_id }}" filter: "Status = '待评审'" - name: "generate_summary" action: "llm.generate" params: model: "qwen2-7b" prompt: | 你是一名资深产品经理,请根据以下需求列表生成100字内的评审摘要: {% for req in steps.fetch_requirements.records %} - {{ req.fields['需求标题'] }} (优先级: {{ req.fields['优先级'] }}) {% endfor %}这个Skill的关键在于steps部分:
lark.bitable.list_records是OpenClaw预置的飞书多维表格操作Action,它会自动处理分页、字段映射、权限校验;llm.generate调用本地部署的Qwen2-7B模型(你需提前在config/llm.yaml中配置),不是调用OpenAI API,确保数据不出域;{{ input.base_id }}这种语法是Jinja2模板,OpenClaw在运行时动态注入参数。
要让这个Skill生效,还需在Agent配置中声明:
# config/agents/default.yaml skills: - "requirement_sync" # 引用上面定义的Skill名3.3 实战测试:在飞书群中触发同步并验证结果
现在进入最关键的验证环节。按以下步骤操作:
- 在飞书群中添加机器人:打开目标群 → 点击右上角“...” → “添加机器人” → 搜索你的应用名 → 添加
- 获取Base ID和Table ID:打开多维表格 → URL形如
https://xxx.feishu.cn/base/abc1234567890/table/tbl-def4567890123/→abc1234567890是Base ID,tbl-def4567890123是Table ID - 在群中发送指令:
@你的机器人 同步需求池 base_id=abc1234567890 table_id=tbl-def4567890123 - 观察OpenClaw日志:
正常应看到类似输出:docker compose logs -f openclaw | grep "sync_requirement_pool"[INFO] Executing skill 'sync_requirement_pool' for agent 'product-manager' [DEBUG] Step 'fetch_requirements': fetched 5 records from bitable [INFO] Step 'generate_summary': generated summary: "共5个待评审需求,含高优需求'登录页性能优化'..."
如果失败,最常见的两个原因:
- 权限不足:飞书应用未获得该多维表格的“查看”权限。需在飞书开放平台 → 应用管理 → 权限管理 → 点击“添加权限” → 搜索“多维表格” → 勾选“查看指定多维表格”
- 字段名不匹配:多维表格中“需求标题”列名实际是“标题”或“Name”。OpenClaw的
list_records返回的是原始字段名,必须与Skill中req.fields['需求标题']完全一致。解决方案:先用lark.bitable.get_base_schemaAction获取表结构,再调整Skill
踩坑经验:我在某次部署中遇到Agent持续返回“Permission denied”错误,排查3小时才发现飞书管理员在应用发布后,又手动关闭了“多维表格”权限开关——这个开关默认是关闭的,必须显式开启。建议在
init.sh脚本后,追加一条检查命令:curl -H "Authorization: Bearer $ACCESS_TOKEN" "https://open.feishu.cn/open-apis/bitable/v1/bases/$BASE_ID/tables",返回200才算权限到位。
4. Agent协作与Skill共享:解决“多Agent调用慢”的底层机制
当你的团队开始创建多个Agent(如“开发工程师小李”、“测试负责人老王”、“UI设计师小美”)时,“多Agent协作”就不再是概念,而是每天发生的现实:产品经理Agent生成PRD后,需要自动@开发Agent评审;开发Agent提交代码后,要触发测试Agent执行用例。这时你会遇到高频问题:“为什么Agent调用慢?”、“为什么A Agent调用B Agent总是超时?”。答案不在网络或CPU,而在OpenClaw的协作协议栈设计。
4.1 OpenClaw的Agent调用不是HTTP请求,而是事件总线投递
很多人误以为agent_a调用agent_b是发起一次HTTP POST,实际上OpenClaw内部使用RabbitMQ风格的轻量级事件总线。整个调用链路如下:
Agent A 发起调用 → OpenClaw内核将请求序列化为JSON事件 → 写入内存队列(非磁盘)→ Agent B的监听器轮询队列 → 反序列化事件 → 执行对应Skill → 结果写入回调队列 → Agent A监听器获取结果这个设计带来两个关键特性:
- 低延迟但非实时:典型端到端延迟在80~200ms,取决于Agent B的Skill执行时间,而非网络RTT;
- 强解耦:Agent B可以离线,事件会暂存在内存队列中,直到它重新上线。
验证这一点,可查看docker compose logs openclaw中的事件日志:
[EVENT] Dispatching event to 'developer-li' with payload: {"skill":"code_review","params":{...}} [EVENT] Event delivered to 'developer-li', waiting for response... [EVENT] Response received from 'developer-li': {"status":"success","summary":"已安排评审"}4.2 Skill共享机制:避免重复造轮子的三种方式
OpenClaw不允许Agent直接访问其他Agent的Skill,但提供了三层共享机制,按复用粒度从大到小排列:
方式一:全局Skill注册(推荐用于通用能力)
在config/skills/目录下创建common.yaml:
name: "notify_by_lark" description: "通过飞书发送通知(所有Agent可用)" shared: true # 关键!设为true则全局可见 input_schema: - name: "message" type: "string" required: true steps: - action: "lark.send_message" params: chat_id: "{{ input.chat_id }}" text: "{{ input.message }}"然后在任意Agent的skills列表中引用:
# config/agents/developer-li.yaml skills: - "notify_by_lark" # 直接使用,无需复制定义方式二:Skill继承(推荐用于角色相似Agent)
假设“测试负责人老王”和“QA工程师小陈”都需要执行自动化测试,但老王有审批权而小陈没有。可创建基类Skill:
# config/skills/test_base.yaml name: "test_base" description: "测试执行基类" abstract: true # 设为abstract,则不能直接调用 steps: - name: "run_test_suite" action: "shell.execute" params: command: "pytest tests/ --junitxml=/tmp/report.xml"再创建具体Skill继承它:
# config/skills/qc_engineer_test.yaml name: "qc_test" extends: "test_base" # 继承基类 steps: - name: "send_report" action: "lark.send_file" params: chat_id: "{{ input.chat_id }}" file_path: "/tmp/report.xml"方式三:Skill参数化(推荐用于微调行为)
同一个Skill,通过参数切换行为。例如prddraft_generatorSkill:
# config/skills/prddraft_generator.yaml name: "prddraft_generator" input_schema: - name: "template" type: "string" default: "simplified" # 默认简化版 enum: ["simplified", "detailed", "technical"] # 可选值 steps: - action: "llm.generate" params: prompt: | {% if input.template == "simplified" %} 用3句话描述需求... {% elif input.template == "detailed" %} 用5W2H方法详细描述... {% else %} 用技术文档格式输出... {% endif %}调用时传参即可:@prddraft_generator template=detailed
4.3 解决“调用慢”的实操四步法
当遇到Agent调用延迟,按此顺序排查(90%的问题在此解决):
| 步骤 | 操作 | 预期结果 | 说明 |
|---|---|---|---|
| 1. 检查事件队列积压 | docker exec -it openclaw-cli bash -c "clawctl queue status" | pending_events: 0 | 积压>5表示内核过载,需增加OPENCLAW_WORKER_COUNT环境变量 |
| 2. 验证Skill执行耗时 | 查看docker compose logs openclaw | grep "Step 'xxx'" | 单步<500ms | 若llm.generate耗时>2s,检查本地模型是否OOM(docker stats openclaw-llm) |
| 3. 检查飞书API限频 | 查看日志中是否有"code":11232,"msg":"frequency limited" | 无此错误 | 飞书对单应用每分钟调用上限为1800次,需在Skill中加入rate_limit: 30(每分钟最多30次) |
| 4. 确认Agent在线状态 | docker exec -it openclaw-cli bash -c "clawctl agent list" | STATUS列为running | offline状态表示Agent进程崩溃,需检查config/agents/*.yaml语法错误 |
实测技巧:在
docker-compose.yml中为OpenClaw服务添加健康检查,可提前发现隐性故障:healthcheck: test: ["CMD", "clawctl", "health", "check"] interval: 30s timeout: 10s retries: 3这样当Agent异常时,Docker会自动重启容器,比人工巡检快10倍。
5. 生产环境避坑指南:从本地部署到7×24小时稳定运行的12个关键细节
OpenClaw的本地Demo跑通,和在生产环境支撑20人团队每日300+次Agent调用,是两个世界。我在两家公司经历过从“能用”到“敢用”的全过程,总结出12个文档里不会写、但决定成败的关键细节。这些不是可选项,而是上线前必须完成的硬性检查项。
5.1 日志与审计:没有日志的Agent等于黑盒
OpenClaw默认日志级别是INFO,但这对排查问题远远不够。必须在config/logging.yaml中启用全量审计:
level: "DEBUG" handlers: - name: "file" path: "/var/log/openclaw/audit.log" rotation: "daily" retention: 30 audit: enabled: true include_input: true # 记录所有Skill输入参数(脱敏后) include_output: false # 敏感输出不记录,避免泄露PRD内容 mask_fields: ["api_key", "password", "token"] # 自动掩码字段特别注意include_input: true——当产品经理说“我昨天发的指令没生效”,你只有看到完整的输入参数(如base_id、table_id),才能判断是用户输错,还是权限配置问题。我曾因此节省了4小时的无效沟通。
5.2 数据持久化:别让Agent重启后“失忆”
OpenClaw的Agent状态默认存在内存中,容器重启即丢失。生产环境必须配置外部存储:
- SQLite(中小团队推荐):在
docker-compose.yml中挂载卷:volumes: - ./data/sqlite:/var/lib/openclaw/db environment: - OPENCLAW_STORAGE_TYPE=sqlite - OPENCLAW_STORAGE_PATH=/var/lib/openclaw/db/openclaw.db - PostgreSQL(大型团队必需):支持高并发和备份。配置
OPENCLAW_STORAGE_TYPE=postgres,并提供PGHOST、PGPORT等环境变量。
关键验证:执行
docker compose restart openclaw后,在Web UI中检查Agent列表是否仍显示running状态。若变为空白,说明持久化失败。
5.3 飞书机器人安全加固:防止恶意指令注入
飞书机器人默认响应所有群消息,包括用户发送的rm -rf /这类恶意指令。OpenClaw提供指令白名单机制,必须启用:
# config/integrations/lark.yaml security: allow_list: - "sync_requirement_pool" - "review_prd" - "track_release" deny_list: - ".*exec.*" - ".*system.*" - ".*eval.*" strict_mode: true # 开启后,不在allow_list中的指令直接忽略同时,在飞书开放平台的“事件订阅”中,只勾选必需的事件类型。例如,如果你的Agent不需要处理用户加群事件,就不要勾选im:member:join,减少攻击面。
5.4 性能调优:让1台4C8G服务器承载50+ Agent
OpenClaw的资源消耗主要来自三部分:LLM推理、飞书API调用、事件总线。针对4C8G服务器,我的调优配置如下:
| 组件 | 默认值 | 生产调优值 | 说明 |
|---|---|---|---|
OPENCLAW_WORKER_COUNT | 2 | 6 | 增加事件处理并发数,但不超过CPU核心数 |
OPENCLAW_LLM_TIMEOUT | 30s | 15s | LLM响应超时缩短,避免阻塞队列 |
OPENCLAW_LARK_RATE_LIMIT | 无限制 | 60 | 飞书API每分钟限频60次,防被封禁 |
OPENCLAW_MEMORY_LIMIT_MB | 无限制 | 4096 | 限制单个Agent内存,防OOM |
修改后重启:
docker compose down docker compose up -d5.5 灾备方案:当飞书API宕机时,Agent如何继续工作?
飞书虽稳定,但2023年曾发生过12分钟的API全局不可用。我们的应对方案是:为关键Skill配置降级策略。
以sync_requirement_pool为例,在skills/requirement_sync.yaml中添加:
fallback: strategy: "cache_last_success" cache_ttl: 3600 # 缓存1小时 on_failure: "notify_by_lark" notify_params: message: "⚠️ 需求池同步失败,已使用1小时前缓存数据"这样当飞书API不可达时,Agent会自动返回上次成功获取的数据,并发送告警。用户无感知,业务不中断。
5.6 最后 checklist:上线前必须完成的12项
我把所有踩过的坑浓缩成一份上线前核对清单,每项打钩后方可发布:
- [ ] ✅
config/agents/*.yaml中所有user_id已通过飞书客户端确认,非猜测值 - [ ] ✅
config/integrations/lark.yaml的app_secret已用tr -d '\u200b'清洗 - [ ] ✅ 飞书应用已获得所有用到的权限(多维表格、知识库、消息发送)
- [ ] ✅
docker-compose.yml中volumes已正确挂载日志和数据库路径 - [ ] ✅
config/logging.yaml已启用audit.enabled=true和include_input=true - [ ] ✅ 所有Skill的
input_schema中required: true字段,都有对应飞书事件参数映射 - [ ] ✅
config/skills/*.yaml中无语法错误(用clawctl skill validate验证) - [ ] ✅
OPENCLAW_WORKER_COUNT已根据CPU核心数设置(≤CPU数×1.5) - [ ] ✅ 飞书机器人已添加到所有目标群,并测试过
@机器人 help指令 - [ ] ✅
clawctl agent list显示所有Agent状态为running - [ ] ✅ 执行一次全流程测试(如
@机器人 同步需求池),日志无ERROR且结果正确 - [ ] ✅ 设置
crontab每日凌晨2点自动备份/var/lib/openclaw/db/目录
完成这12项,你的OpenClaw系统就不再是实验室里的Demo,而是真正能融入团队日常协作的生产力中枢。它不会替代人的思考,但会让每个成员把精力聚焦在真正需要创造力的地方——比如产品经理不再花2小时整理需求表格,而是用这2小时深度访谈用户;比如开发工程师不再手动查Zabbix告警,而是专注优化核心算法。
最后分享一个真实场景:上周五下午,运维组的Zabbix突然推送一条严重告警。我们的OpenClaw Agent自动触发alert_handlerSkill,12秒内完成三件事:1)在飞书群中@值班开发并发送告警详情;2)从多维表格拉取该服务的SLA承诺值;3)生成初步根因分析(基于历史告警模式匹配)。开发工程师看到消息后,直接点击链接跳转到问题服务的K8s Dashboard,15分钟内定位到是数据库连接池耗尽。整个过程,没有一个人需要切出飞书、打开浏览器、登录Zabbix、查表格、写分析报告——这就是OpenClaw想实现的未来:让工具安静地工作,让人自由地创造。