0%

📢 更新日志

  • 2026-03-09 补充 HEARTBEAT.md 抢占主会话的排障记录,修正文中 Docker Compose 版本与记忆机制描述,新增“升级是否成功”的核验方法。
  • 2026-03-06 新增 Step-3.5-Flash 接入与会话级 /model 切换说明,补充默认模型不切全局、只切当前会话的使用方式。
  • 2026-03-03 新增”记录系统优化”章节,解决会话文件膨胀问题,添加自动归档和结构化存储方案。
AI提效 实战踩坑

写在前面

最近刷到不少 OpenClaw 的文章,演示零成本安装、智能体集群、国内部署经验。我手头正好有台配置不高的云服务器闲置着,决定动手搭建一个专属 AI 助手。

但这篇文章不是推广,是真实的部署踩坑记录。整个过程历时数小时,遇到了 OOM 内存不足、配置验证失败、防火墙规则冲突等一系列问题,把完整的解决过程记录下来。

先说结论:OpenClaw 确实能跑起来,但需要对 Docker、网络和 Linux 有一定了解,且内存配置要充足。


OpenClaw 是什么

OpenClaw 是一个开源的个人 AI 助手框架,核心价值在于:它不是只聊天的 AI,而是能动手干活的 AI

核心能力:

  • 在 Telegram、Discord、Slack 等平台接收指令
  • 操作文件系统、执行 Shell 命令、浏览网页
  • 调用 API、读写数据库
  • 跨会话持久化记忆

最重要的是——运行在自己的服务器上,数据完全掌控。


我的环境

搬瓦工买的一台机器,配置不高,平时捣鼓各种东西的。

配置项 实际环境
系统 Ubuntu 24.04.2 LTS
CPU 3 核
内存 2GB RAM
磁盘 39GB SSD
Docker 29.2.1
Docker Compose v5.1.0
公网 IP your-server-ip

⚠️ 重要提示:2GB 内存对于源码构建来说不够,需要配置 Swap。


部署过程实录

第一步:安装 Docker

Ubuntu 24.04 下安装 Docker 很顺利:

1
2
3
4
5
6
7
8
9
# 更新系统
apt update && apt upgrade -y

# 安装 Docker
curl -fsSL https://get.docker.com | sh

# 验证安装
docker --version # Docker version 29.2.1
docker compose version # Docker Compose version v5.1.0

国内用户建议配置镜像加速,编辑 /etc/docker/daemon.json

1
2
3
4
5
6
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://dockerhub.icu"
]
}

第二步:源码构建(第一个坑:OOM)

官方提供了 Docker 镜像,但我选择从源码构建以获得最新功能:

1
2
3
4
mkdir -p /opt/openclaw
cd /opt/openclaw
git clone https://github.com/openclaw/openclaw.git
cd openclaw

开始构建:

1
docker build -t openclaw:local -f Dockerfile .

🚨 第一个大坑:构建到 pnpm install 时容器被杀

查看日志发现是 OOM(内存不足)。2GB RAM 在构建 Node.js 项目时不够用,pnpm install 直接占满内存导致进程被系统杀死。

解决方案:添加 Swap 空间

1
2
3
4
5
6
7
8
9
# 创建 5GB Swap 文件
dd if=/dev/zero of=/swapfile bs=1G count=5
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 验证
free -h
# 显示:Swap: 5.0Gi

添加 Swap 后重新构建,成功完成。

📷 安装过程 - 添加 Swap 解决 OOM

安装过程


第三步:配置 OpenClaw

创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.8'

services:
openclaw-gateway:
image: openclaw:local
container_name: openclaw
restart: unless-stopped
environment:
- HOME=/home/node
- NODE_ENV=production
volumes:
- ./.openclaw:/home/node/.openclaw
- ./.openclaw/workspace:/home/node/.openclaw/workspace
ports:
- "127.0.0.1:18789:18789"
- "127.0.0.1:18790:18790"
command: ["node", "dist/index.js", "gateway", "--bind", "lan", "--port", "18789"]

🚨 第二个坑:配置验证极其严格

OpenClaw 对 openclaw.json 配置文件的校验非常严格,很多字段在官方文档中没有明确说明,但缺失会导致启动失败。

我遇到的错误:

1
2
3
✖ Configuration validation failed:
- gateway.mode is required
- gateway.controlUi.allowedOrigins is required when using non-loopback bind

正确的最小配置openclaw.json):

1
2
3
4
5
6
7
8
9
10
11
12
{
"gateway": {
"port": 18789,
"mode": "local",
"controlUi": {
"allowedOrigins": ["http://localhost:18789", "http://127.0.0.1:18789"]
},
"auth": {
"token": "your-secure-token-here"
}
}
}

📷 OpenClaw Web UI 界面

OpenClaw Web UI

关键注意点

  • gateway.mode 必须显式设置为 "local"
  • gateway.controlUi.allowedOrigins 在使用非 localhost 绑定时是必需的
  • gateway.bind 不能写在 JSON 中(无效字段),必须通过 CLI 参数 --bind lan 设置

第四步:配置阿里云百炼模型

我选择使用阿里云百炼的 Coding Plan,配置 kimi-k2.5 作为主力模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
"models": {
"mode": "merge",
"providers": {
"bailian": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
"apiKey": "YOUR_BAILIAN_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "kimi-k2.5",
"name": "kimi-k2.5",
"input": ["text", "image"],
"contextWindow": 262144,
"maxTokens": 32768
},
{
"id": "qwen3.5-plus",
"name": "qwen3.5-plus",
"input": ["text", "image"],
"contextWindow": 1000000,
"maxTokens": 65536
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "bailian/kimi-k2.5"
}
}
}
}

第五步:配置 Telegram Bot

@BotFather 创建 Bot 并获取 Token。

🚨 第三个坑:配对码过期与 dmPolicy 冲突

1
2
3
4
5
6
7
8
9
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "YOUR_BOT_TOKEN_HERE",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"]
}
}
}

初始配置时我加了 "dmPolicy": "open",结果与 allowFrom 白名单冲突,报错:

1
dmPolicy: open requires allowFrom: ["*"]

解决方案:删除 dmPolicy 字段,直接使用 allowFrom 白名单。

启动服务:

1
2
docker compose up -d
docker compose logs -f

看到日志显示 Telegram channel started 且没有错误,说明 Bot 已上线。

📷 Telegram Bot 配置成功


第六步:Google Workspace 集成(扩展能力)

这是 OpenClaw 真正强大的地方——通过 Google Workspace 集成,AI 可以帮你管理邮件、日历、文档。

OpenClaw 使用 gog skill 来访问 Google 服务(Gmail、Calendar、Drive、Docs、Sheets)。

6.1 创建 Google Cloud 项目

  1. 访问 Google Cloud Console
  2. 创建新项目(例如:openclaw-integration
  3. 启用以下 API:
    • Gmail API
    • Google Calendar API
    • Google Drive API
    • Google Docs API
    • Google Sheets API

6.2 配置 OAuth 凭据

  1. 进入 APIs & Services > Credentials
  2. 点击 Create Credentials > OAuth client ID
  3. 选择 Desktop app 类型
  4. 记下 Client IDClient Secret

6.3 配置 MCP 服务器

OpenClaw 通过 MCP (Model Context Protocol) 集成 Google Workspace。

在服务器上创建 MCP 配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir -p /opt/openclaw/.openclaw/mcp
cat > /opt/openclaw/.openclaw/mcp/google-workspace.json << 'EOF'
{
"mcpServers": {
"google-workspace": {
"command": "npx",
"args": ["-y", "@gongchangio/mcp-google-workspace"],
"env": {
"GOOGLE_CLIENT_ID": "your-client-id.apps.googleusercontent.com",
"GOOGLE_CLIENT_SECRET": "your-client-secret",
"GOOGLE_REDIRECT_URI": "http://localhost:18790/oauth2callback"
}
}
}
}
EOF

6.4 重启 OpenClaw 并授权

1
2
3
4
5
cd /opt/openclaw
docker compose restart

# 查看日志等待授权提示
docker compose logs -f | grep -i google

首次启动会显示 OAuth 授权链接,在浏览器中打开并授权后,会获得一个 code,将其填回即可。

6.5 实际使用场景

配置完成后,你可以通过 Telegram 让 AI 帮你:

管理邮件

“帮我查看今天的重要邮件,并回复需要处理的”

操作日历

“帮我查一下下周的会议安排,把周五下午的会议改到周四”

读写文档

“读取 Drive 里的 ‘项目计划.docx’,帮我总结要点并更新状态”

⚠️ 注意:Google OAuth 有权限范围限制

  • 个人 Gmail 账户:直接可用
  • Google Workspace(企业账户):需要管理员授权
  • 敏感范围(如删除邮件)需要额外验证

第七步:安全加固(重中之重)

🚨 第四个坑:Docker 绕过 INPUT 链的防火墙规则

我最初的防火墙配置:

1
2
iptables -I INPUT 1 -p tcp --dport 18789 -s 127.0.0.1 -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 18789 -j DROP

测试发现:公网仍然可以访问 Web UI!

原因:Docker 在 DOCKER 链中插入了 ACCEPT 规则,且该链在 INPUT 链之前被处理。

正确的解决方案:使用 DOCKER-USER

1
2
3
4
5
6
7
8
# 在 DOCKER-USER 链中插入规则(在 Docker 规则之前执行)
iptables -I DOCKER-USER 1 -p tcp -s 127.0.0.1 --dport 18789 -j ACCEPT
iptables -I DOCKER-USER 2 -p tcp --dport 18789 -j DROP
iptables -I DOCKER-USER 3 -p tcp -s 127.0.0.1 --dport 18790 -j ACCEPT
iptables -I DOCKER-USER 4 -p tcp --dport 18790 -j DROP

# 保存规则
iptables-save > /root/iptables-rules.txt

最终安全策略

项目 状态
配置文件权限 容器运行用户可读(避免 EACCES
公网 Web UI 通过 DOCKER-USER 链完全阻止
本地 Web UI 127.0.0.1 可访问
Telegram 访问 仅白名单用户 ID 可用
外部访问方式 SSH 隧道

📷 最后安全检查 - 安全加固结果

安全检查

SSH 隧道访问命令

1
2
ssh -N -L 18789:127.0.0.1:18789 root@your-server-ip
# 然后在本地浏览器访问 http://localhost:18789

进阶玩法:持久记忆配置(第9步)

OpenClaw 的持久记忆系统让它能跨会话记住你的偏好、项目信息和个人习惯。这是从”工具”升级为”助手”的关键。

记忆文件目录结构

路径 用途 文件类型
/home/node/.openclaw/memory/ 数据库存储(自动) main.sqlite - 对话历史
/home/node/.openclaw/workspace/ 结构化记忆文件 MEMORY.md, USER.md
/home/node/.openclaw/workspace/memory/ 每日记忆归档 YYYY-MM-DD.md

核心记忆文件

1. USER.md - 用户档案

1
2
3
4
5
6
7
8
9
10
# USER.md - About Your Human

- **Name:** Gamehu
- **What to call them:** Gamehu
- **Timezone:** Asia/Shanghai (UTC+8)

## Context
- **职业:** IT 行业,编程 + 团队管理
- **需求:** 个人助手
- **风格偏好:** 简单直接,不绕弯子

2. MEMORY.md - 长期记忆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# MEMORY.md - Long-term Memory

## Technical Stack
- **Primary Languages:** Java, JavaScript, Python, Go
- **Frameworks:** Spring Boot, React
- **Cloud:** Alibaba Cloud, AWS

### Preferences
- **Code Style:** Clean, well-documented
- **Learning Style:** Hands-on, project-based
- **Dislikes:** Repetitive small talk

### Current Projects
- Building personal AI assistant
- Managing development team

如何工作

  1. 自动记忆:所有对话自动存入 SQLite,跨会话保持上下文
  2. 结构化记忆:AI 主动读取 MEMORY.md 了解你的背景和偏好
  3. 持续更新:OpenClaw 可以通过 heartbeat 或维护任务定期整理记忆,但主会话不建议配置成高频主动提醒模式

测试持久记忆

给 Bot 发送:

“记住我喜欢用 Go 语言写后端服务”

过一段时间再问:

“我之前告诉你我喜欢用什么语言?”

如果配置正确,Bot 应该能回答出 Go


进阶玩法:记录系统优化(第9.5步,新增)

在解决 compaction 卡死问题后,我意识到 OpenClaw 的会话记录管理还有很多优化空间。之前的经历是:会话文件在两天内膨胀到 1.4MB(603 条消息),导致系统卡死。为了防止类似问题再次发生,我设计并部署了一套结构化的记录管理系统

为什么需要记录系统优化

问题 优化前 优化后
会话文件膨胀 1.4MB(603条消息) 每日自动归档,单文件 < 100KB
数据管理 所有文件混在一起 结构化分类存储
查找历史 翻找 JSONL 文件 Markdown 摘要,一目了然
数据备份 手动复制 自动归档 + 一键导出

优化后的目录结构

我在 workspace 下创建了完整的分类存储结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/root/.openclaw/workspace/
├── memory/ # 记忆类数据
│ ├── daily/ # 每日摘要 (YYYY-MM-DD.md)
│ ├── weekly/ # 每周汇总
│ └── archived/ # 长期归档
├── records/ # 记录类数据
│ ├── conversations/ # 对话记录 (按月归档)
│ │ └── 2026-03/
│ │ ├── 2026-03-03/ # 当日完整会话
│ │ └── 2026-03-03-sessions.tar.gz
│ ├── tasks/ # 任务记录
│ │ ├── completed/ # 已完成任务
│ │ └── failed/ # 失败任务
│ ├── browser/ # 浏览器操作记录
│ │ ├── screenshots/ # 网页截图
│ │ └── page-dumps/ # 页面快照
│ └── files/ # 文件操作日志
├── outputs/ # 输出类数据
│ ├── generated/ # AI 生成的文档
│ ├── exports/ # 导出文件
│ └── reports/ # 定时报告
└── logs/ # 日志类
├── system/ # 系统日志 (archive-YYYY-MM-DD.log)
├── model/ # 模型调用记录
└── errors/ # 错误日志

自动归档脚本

创建 /root/.openclaw/workspace/archive-daily.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
WORKSPACE="/root/.openclaw/workspace"
SESSIONS_DIR="/home/node/.openclaw/agents/main/sessions"
DATE=$(date +"%Y-%m-%d")
MONTH=$(date +"%Y-%m")

# 创建归档目录
mkdir -p "$WORKSPACE/records/conversations/$MONTH/$DATE"
mkdir -p "$WORKSPACE/memory/daily"

# 归档会话文件
if [ -d "$SESSIONS_DIR" ]; then
cp "$SESSIONS_DIR"/*.jsonl "$WORKSPACE/records/conversations/$MONTH/$DATE/" 2>/dev/null || true
SESSION_COUNT=$(ls -1 "$SESSIONS_DIR"/*.jsonl 2>/dev/null | wc -l)
SIZE=$(du -sb "$SESSIONS_DIR" 2>/dev/null | cut -f1)
else
SESSION_COUNT=0
SIZE=0
fi

# 生成每日摘要 Markdown
cat > "$WORKSPACE/memory/daily/${DATE}.md" << DAILYMD
---
date: ${DATE}
type: daily-summary
sessions_count: ${SESSION_COUNT}
sessions_size_kb: $((${SIZE} / 1024))
---

# 📅 ${DATE} 对话摘要

## 📊 今日统计
- **日期**: ${DATE}
- **星期**: $(date +%A)
- **会话数**: ${SESSION_COUNT}
- **数据大小**: $((${SIZE} / 1024)) KB

## 🏷️ 重要标签
-

## 💡 今日收获
-

## 📌 待办事项
- [ ]

---
DAILYMD

# 记录归档日志
echo "[$(date)] 归档完成: ${DATE}, ${SESSION_COUNT} 个会话" >> "$WORKSPACE/logs/system/archive-${DATE}.log"

赋予执行权限:

1
chmod +x /root/.openclaw/workspace/archive-daily.sh

配置定时任务

添加每天 23:00 自动执行归档:

1
2
3
4
5
# 添加定时任务
(crontab -l 2>/dev/null | grep -v archive-daily; echo "0 23 * * * /root/.openclaw/workspace/archive-daily.sh >> /root/.openclaw/workspace/logs/system/cron.log 2>&1") | crontab -

# 查看已配置的定时任务
crontab -l

快捷命令配置

创建 /root/.openclaw/.aliases.sh,方便快速查看记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看今日记录
alias oc-today='cat /root/.openclaw/workspace/memory/daily/$(date +%Y-%m-%d).md 2>/dev/null || echo "今日记录不存在"'

# 查看昨日记录
alias oc-yesterday='cat /root/.openclaw/workspace/memory/daily/$(date -d yesterday +%Y-%m-%d 2>/dev/null || date -v-1d +%Y-%m-%d).md 2>/dev/null || echo "昨日记录不存在"'

# 手动执行归档
alias oc-archive='/root/.openclaw/workspace/archive-daily.sh'

# 查看统计
alias oc-stats='echo "=== OpenClaw 统计 ===" && echo "会话文件: $(ls -1 /home/node/.openclaw/agents/main/sessions/*.jsonl 2>/dev/null | wc -l)" && echo "每日摘要: $(ls -1 /root/.openclaw/workspace/memory/daily/*.md 2>/dev/null | wc -l)"'

# 查看目录大小
alias oc-size='du -sh /root/.openclaw/workspace/*/ 2>/dev/null | sort -h'

使用方法:

1
2
3
4
5
6
7
8
9
10
11
# 加载快捷命令
source /root/.openclaw/.aliases.sh

# 查看今日记录
oc-today

# 手动归档
oc-archive

# 查看统计
oc-stats

Docker 容器内配置

为了让 OpenClaw Bot 也能执行归档,在 Docker 容器内创建归档脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 在容器内创建归档命令
docker exec openclaw-openclaw-gateway-1 bash -c 'cat > /tmp/oc-archive.sh << "EOF"
#!/bin/bash
WORKSPACE="/home/node/.openclaw/workspace"
SESSIONS="/home/node/.openclaw/agents/main/sessions"
DATE=$(date +"%Y-%m-%d")
MONTH=$(date +"%Y-%m")
mkdir -p "$WORKSPACE/records/conversations/$MONTH/$DATE"
COUNT=0
if [ -d "$SESSIONS" ]; then
cp "$SESSIONS"/*.jsonl "$WORKSPACE/records/conversations/$MONTH/$DATE/" 2>/dev/null || true
COUNT=$(ls -1 "$SESSIONS"/*.jsonl 2>/dev/null | wc -l)
fi
cat > "$WORKSPACE/memory/daily/$DATE.md" << DAILY
---
date: $DATE
type: daily-summary
sessions_count: $COUNT
---

# 📅 $DATE 对话摘要

## 📊 统计
- 会话数: $COUNT

## 🏷️ 标签
-

## 💡 收获
-
DAILY
echo "✅ 归档完成: $DATE, $COUNT 个会话"
EOF
chmod +x /tmp/oc-archive.sh'

Telegram Bot 使用

配置完成后,你可以直接在 Telegram 中对 Bot 发送:

指令 功能
“归档今天的对话” 手动触发归档
“查看今天的记录” 显示今日摘要
“查看昨天的记录” 显示昨日摘要
“统计我的对话数量” 显示统计报告

每日摘要示例

生成的 Markdown 文件 (memory/daily/2026-03-03.md):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
---
date: 2026-03-03
type: daily-summary
sessions_count: 5
sessions_size_kb: 45
---

# 📅 2026-03-03 对话摘要

## 📊 今日统计
- **日期**: 2026-03-03
- **星期**: Tuesday
- **会话数**: 5
- **数据大小**: 45 KB

## 🏷️ 重要标签
- OpenClaw 配置
- 技能开发

## 💡 今日收获
- 配置了自动归档系统
- 解决了会话文件膨胀问题

## 📌 待办事项
- [ ] 测试归档功能
- [ ] 配置 Web 画廊

这种结构化的记录管理方式,让你可以:

  1. 快速回顾 - 每天打开 Markdown 文件即可看到当日概况
  2. 防止膨胀 - 自动归档避免会话文件无限增长
  3. 便于导出 - 重要记录可以轻松导出分享
  4. Telegram 管理 - 直接通过 Bot 指令管理记录

进阶玩法:自定义 Skill(第10步)

OpenClaw 的 Skill 系统让你可以扩展 AI 的能力。我把自己的 Hexo 博客做成了 Skill,让 Bot 可以直接帮我创建博客文章。

我的 Hexo 博客 Skill

1. 创建脚本

在服务器上创建文章生成脚本 /opt/hexo-blog/create-post.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
# Hexo Blog Post Creator

BLOG_DIR="/opt/hexo-blog"
POSTS_DIR="$BLOG_DIR/source/_posts"

# 参数
TITLE="${1:-新建文章}"
CATEGORY="${2:-随笔}"
TAGS="${3:-日常}"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
FILENAME=$(echo "$TITLE" | sed 's/ /-/g' | tr '[:upper:]' '[:lower:]')-$(date +"%Y%m%d").md

# 创建目录
mkdir -p "$POSTS_DIR"

# 创建文章
cat > "$POSTS_DIR/$FILENAME" << EOF
---
title: $TITLE
author: Gamehu
date: $DATE
tags:
EOF

# 添加标签
IFS=',' read -ra TAG_ARRAY <<< "$TAGS"
for tag in "${TAG_ARRAY[@]}"; do
echo " - $(echo $tag | xargs)" >> "$POSTS_DIR/$FILENAME"
done

# 添加分类和正文
cat >> "$POSTS_DIR/$FILENAME" << EOF
categories:
- $CATEGORY
---

## 写在前面

$TITLE

<!-- more -->

## 正文

开始写作...

---
EOF

echo "✅ 文章创建成功: $POSTS_DIR/$FILENAME"

赋予执行权限:

1
chmod +x /opt/hexo-blog/create-post.sh

2. 创建 Skill 文件

OpenClaw 使用 SKILL.md 文件(不是 YAML),创建 ~/.openclaw/skills/hexo-blog/SKILL.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
name: hexo-blog
description: Create and manage Hexo blog posts via shell script
---

# Hexo Blog Skill

Create new blog posts with proper front matter for Hexo.

## Usage

Ask me to create a blog post:
- "帮我创建一篇博客文章,标题是《XXX》,分类是技术,标签是 OpenClaw,AI"
- "写一篇新文章,关于 Docker 使用心得"

## Tools

This skill uses the `shell` tool to execute `/opt/hexo-blog/create-post.sh`.

## Example

```bash
/opt/hexo-blog/create-post.sh "文章标题" "分类" "标签1,标签2"
1
2
3
4
5

#### 3. 重启 OpenClaw 加载 Skill

```bash
docker restart openclaw-openclaw-gateway-1

验证 Skill 是否加载:

1
2
openclaw skills list
# 应该显示: ✓ ready │ 📦 hexo-blog │ Create and manage Hexo blog posts...

3. 实际使用

@gamehu_kb_bot 里直接说:

“帮我创建一篇博客文章,标题是《OpenClaw 使用心得》,分类是工具,标签是 OpenClaw,AI”

Bot 会自动:

  1. 生成文件名 openclaw-shi-yong-xin-de-20260302.md
  2. 创建带完整 Front Matter 的 Markdown 文件
  3. 返回文件路径

Skill 核心概念

组件 作用 示例
Script 执行实际任务 Shell/Python 脚本
SKILL.md Skill 定义和说明 Markdown 文件(带 YAML frontmatter)
Directory Skill 存放位置 ~/.openclaw/skills/<skill-name>/

更多 Skill 想法

  • Git Helper: 自动提交、查看状态、创建分支
  • Docker Manager: 查看容器日志、重启服务
  • File Organizer: 整理下载文件夹、重命名文件
  • Daily Reporter: 生成每日工作总结

进阶玩法:浏览器控制(第12步)

OpenClaw 内置了浏览器控制功能,让 AI 能够操作真实浏览器执行网页任务,比如搜索信息、填写表单、抓取数据等。

🚨 坑位 14:Docker 镜像默认不包含浏览器

问题

Docker 部署后尝试使用浏览器功能时,报错:

1
2
[tools] browser failed: Error: No supported browser found 
(Chrome/Brave/Edge/Chromium on macOS, Linux, or Windows).

原因

默认的 Dockerfile 不会安装 Chromium/Playwright 浏览器,需要通过 --build-arg OPENCLAW_INSTALL_BROWSER=1 参数构建带浏览器的镜像。

解决方案:重新构建带浏览器的镜像

1. 停止当前服务

1
2
cd /opt/openclaw
docker compose down

2. 构建带浏览器的新镜像

1
2
3
4
5
# 构建时间约 15-30 分钟,增加约 300MB
docker build -t openclaw:local-browser -f Dockerfile \
--build-arg OPENCLAW_INSTALL_BROWSER=1 \
--build-arg OPENCLAW_DOCKER_APT_PACKAGES="chromium xvfb" \
.

3. 修改环境变量使用新镜像

编辑 .env 文件:

1
2
3
4
5
# 修改前
OPENCLAW_IMAGE=openclaw:local

# 修改后
OPENCLAW_IMAGE=openclaw:local-browser

4. 启动服务

1
docker compose up -d

5. 验证浏览器安装

1
2
3
4
5
6
7
8
# 进入容器检查
docker exec openclaw-openclaw-gateway-1 \
ls -la /home/node/.cache/ms-playwright/

# 应该看到:
# chromium-1208/
# chromium_headless_shell-1208/
# ffmpeg-1011/

浏览器控制功能

功能 说明
网页浏览 访问指定 URL,获取页面内容
表单填写 自动填写并提交网页表单
信息搜索 在搜索引擎或电商网站搜索
数据抓取 提取网页中的结构化数据
截图保存 截取网页画面

使用示例

在 Telegram 中直接发送以下指令:

搜索信息

“打开浏览器,访问 GitHub,搜索 ‘openclaw’,告诉我前 3 个结果”

商品比价

“帮我在京东上搜索 ‘机械键盘’,找到评分最高的 3 个产品,记录价格”

数据抓取

“访问 https://news.ycombinator.com/,提取首页前 10 条新闻的标题和链接”

浏览器控制原理

1
用户指令 → OpenClaw Agent → 浏览器控制服务 → 无头 Chrome → 网页操作 → 结果返回

浏览器控制服务默认监听:http://127.0.0.1:18791/

注意事项

  1. 无头模式:Docker 部署默认使用 headless 模式(无界面),适合服务器环境
  2. 访问限制:受限于服务器网络,无法访问需要登录的页面(除非提供 Cookie)
  3. 执行时间:复杂页面加载可能需要 10-30 秒
  4. 安全提醒:避免让 Bot 访问敏感网站或输入真实账号密码

实践任务

尝试让 Bot 完成以下任务:

  • ✅ 信息收集:从某个网站抓取数据并整理
  • ✅ 表单填写:自动填写一个在线表单
  • ✅ 价格比较:在多个网站比较同一商品的价格

进阶玩法:多 Bot 配置(第11步)

OpenClaw 支持配置多个 Telegram Bot,每个 Bot 可以绑定不同的 Agent,实现分工协作。
注意:仅配置 channels.telegram.accounts 还不够,想要真正隔离上下文,必须再加 agents.list + bindings

我的多 Bot 架构

Bot 用户名 职责 对应 Agent
主助手 @GameHuOpenclaw_bot 通用对话、代码、写作 main
新闻助手 @gamehu_news_bot 科技新闻、每日简报 news
成长助手 @gamehu_growth_bot 学习计划、习惯追踪 growth
知识库助手 @gamehu_kb_bot 文档查询、笔记整理 kb

配置步骤

1. 在 @BotFather 创建多个 Bot

每个 Bot 都需要独立的 Token:

1
2
3
4
/main_bot - 主助手
/news_bot - 新闻助手
/growth_bot - 成长助手
/kb_bot - 知识库助手

2. 配置多账号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"channels": {
"telegram": {
"enabled": true,
"accounts": {
"main": {
"botToken": "YOUR_MAIN_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"]
},
"news": {
"botToken": "YOUR_NEWS_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"]
},
"growth": {
"botToken": "YOUR_GROWTH_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"]
},
"kb": {
"botToken": "YOUR_KB_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"]
}
}
}
}
}

3. 增加 Agent 路由绑定(关键)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"agents": {
"list": [
{ "id": "main", "default": true, "workspace": "/home/node/.openclaw/workspace" },
{ "id": "news", "workspace": "/home/node/.openclaw/workspace-news" },
{ "id": "growth", "workspace": "/home/node/.openclaw/workspace-growth" },
{ "id": "kb", "workspace": "/home/node/.openclaw/workspace-kb" }
]
},
"bindings": [
{ "agentId": "main", "match": { "channel": "telegram", "accountId": "main" } },
{ "agentId": "news", "match": { "channel": "telegram", "accountId": "news" } },
{ "agentId": "growth", "match": { "channel": "telegram", "accountId": "growth" } },
{ "agentId": "kb", "match": { "channel": "telegram", "accountId": "kb" } }
]
}

⚠️ workspace 字段必须显式指定:每个 agent 需要独立的 workspace 路径,否则多个 agent 共享同一个 workspace,记忆和配置会互相干扰。

这样每个 bot 会落到不同 agent,会话文件分目录保存,记忆文件也完全隔离。

4. 为每个 Agent 创建独立 Workspace

每个 agent 对应一个独立目录,在服务器上创建:

1
2
3
mkdir -p /root/.openclaw/workspace-news
mkdir -p /root/.openclaw/workspace-growth
mkdir -p /root/.openclaw/workspace-kb

每个目录下的结构:

1
2
3
4
5
6
workspace-news/
├── SOUL.md # Agent 的身份定义
├── MEMORY.md # 长期记忆
├── USER.md # 用户信息
├── AGENTS.md # Agent 行为规范
└── memory/ # 每日记忆文件

每个 AGENT.md 定义该 Bot 的专业领域和行为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# News Agent

## Role
你是一个科技新闻助手,专注于提供最新、最有价值的科技资讯。

## Capabilities
- 追踪科技行业动态
- 总结技术文章要点
- 提供每日新闻简报

## Style
- 简洁明了,重点突出
- 提供信息来源链接
- 主动推送重要消息

4. 重启服务

1
docker compose restart

查看日志确认所有 Bot 启动:

1
2
3
4
[telegram] [main] starting provider (@GameHuOpenclaw_bot)
[telegram] [news] starting provider (@gamehu_news_bot)
[telegram] [growth] starting provider (@gamehu_growth_bot)
[telegram] [kb] starting provider (@gamehu_kb_bot)

实际使用效果

  • 上下文隔离:在 @gamehu_growth_bot 聊学习计划,切到 @gamehu_news_bot 问新闻,再回到 growth Bot,它还记得刚才的学习话题
  • 专业化分工:每个 Bot 专注于自己的领域,回复质量更高
  • 并行对话:可以同时和多个 Bot 对话,互不干扰

⚠️ 注意事项

  • 多账号配置时,不要在顶层设置 botToken,全部放在 accounts
  • 每个 accountId(如 main、news、growth、kb)必须是唯一的
  • 账号名不要用 default,会和系统默认账号冲突

进阶玩法:定时任务推送到指定 Bot(第11.5步)

配置好多 Bot 之后,你可能会发现一个问题:OpenClaw 里设置的定时任务(cron job),推送结果全都跑到了 main bot,而不是对应的 bot

🚨 坑位 17:定时任务 delivery 缺少 accountId

问题现象

在 OpenClaw Web UI 里配了新闻推送任务,时间一到,消息却出现在了 @GameHuOpenclaw_bot(main bot),而不是 @gamehu_news_bot。

根本原因

OpenClaw 的定时任务存储在 ~/.openclaw/cron/jobs.json,每个任务的 delivery 字段控制推送目标。如果只写了 to(用户 ID),没有写 accountId,OpenClaw 不知道用哪个 bot 账户推送,默认走 main。

另外,to 只负责“推给谁”(用户 / 群 / 频道),accountId 负责“用哪个 bot 发”。这两个字段职责不同,缺一不可。

有问题的配置:

1
2
3
4
5
"delivery": {
"mode": "announce",
"channel": "telegram",
"to": "YOUR_USER_ID"
}

解决方案

在每个 job 的 delivery 中加上 accountId,同时在 job 顶层加上 agentId。建议把执行超时提到 120 秒(字段 timeoutSeconds):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"id": "xxx",
"agentId": "news",
"name": "每日新闻推送",
"timeoutSeconds": 120,
"payload": {
"kind": "agentTurn",
"message": "执行新闻脚本并发送结果给用户"
},
"delivery": {
"mode": "announce",
"channel": "telegram",
"accountId": "news",
"to": "YOUR_USER_ID"
}
}

推送目标的两种正确姿势

方案 A(推荐):同一个用户,按不同 Bot 身份推送

这种方式最适合你当前“4 个 Bot 各司其职”的场景。to 全部写你的用户 ID,accountId 分别写 main/news/growth/kb,消息会显示来自对应 bot。

1
2
3
4
5
6
7
8
9
10
{
"agentId": "news",
"timeoutSeconds": 120,
"delivery": {
"mode": "announce",
"channel": "telegram",
"accountId": "news",
"to": "YOUR_USER_ID"
}
}

方案 B:推送到群 / 频道 / 话题

如果要发到频道,不要填 bot 用户名(如 @gamehu_news_bot),而是填频道 chat id(通常是 -100...)。并确保对应 bot 已加入目标群/频道且有发言权限。

1
2
3
4
5
6
7
8
9
10
{
"agentId": "news",
"timeoutSeconds": 120,
"delivery": {
"mode": "announce",
"channel": "telegram",
"accountId": "news",
"to": "-1001234567890"
}
}

各任务对应关系

任务 agentId accountId 推送到
每日新闻推送 news news @gamehu_news_bot
每日成长提醒 growth growth @gamehu_growth_bot
每周知识库总结 kb kb @gamehu_kb_bot
其他通用任务 main main @GameHuOpenclaw_bot

修改完 jobs.json 后重启服务即可生效:

1
cd /opt/openclaw && docker compose restart

进阶玩法:接入 Step-3.5-Flash,并支持会话级切换(第11.6步)

最近我把底层模型又补了一档:Step-3.5-Flash。但这里有个非常容易搞混的点,我一开始也踩了坑:

🚨 坑位 18:想要“随时切模型”,不等于要改全局默认模型

如果你直接把 agents.defaults.model.primary 全局切到 Step,看起来省事,实际上会把别的会话、别的 Bot,甚至定时任务一起带偏。
更稳的做法是:

  • 全局默认模型继续保持不变,我这里还是 bailian/kimi-k2.5
  • step/step-3.5-flash 注册成一个可选 provider
  • 需要的时候,直接在 当前 Telegram 会话 里发送 /model ... 切换

Step provider 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"models": {
"mode": "merge",
"providers": {
"bailian": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
"apiKey": "YOUR_BAILIAN_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "kimi-k2.5",
"name": "kimi-k2.5",
"contextWindow": 256000,
"maxTokens": 8192
}
]
},
"kimi": {
"baseUrl": "https://api.moonshot.cn/v1",
"apiKey": "YOUR_KIMI_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "moonshot-v1-128k",
"name": "moonshot-v1-128k",
"contextWindow": 131072,
"maxTokens": 8192
}
]
},
"step": {
"baseUrl": "https://api.stepfun.com/v1",
"apiKey": "YOUR_STEP_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "step-3.5-flash",
"name": "Step 3.5 Flash",
"contextWindow": 256000,
"maxTokens": 8192
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "bailian/kimi-k2.5"
},
"contextTokens": 131072
}
}
}

为什么我把 contextTokens 调到 131072

这不是说 kimi-k2.5step-3.5-flash 只能吃 128k,而是为了兼容我现在保留的第三档模型 moonshot-v1-128k

如果你想做到:

  • 默认走百炼
  • 需要时切 Step
  • 偶尔还能切回 Moonshot 做速度/成本对比

那最稳的双档/三档基线,就是把 contextTokens 先压在 131072。这样:

  • bailian <-> step 切换时,几乎不会因为窗口变化引发额外压缩
  • 切到 moonshot-v1-128k 时,也不会立刻超限

当前会话切换命令

直接在 Telegram 里发:

1
2
3
4
5
6
/models
/models step
/model status
/model step
/model bailian/kimi-k2.5
/model kimi/moonshot-v1-128k

这里要强调 3 个边界:

  1. 只影响当前会话
  2. 不会清空 SOUL.md / MEMORY.md / USER.md / AGENTS.md
  3. 不会影响 cron 定时任务

也就是说,这种切换本质上是“会话级模型覆盖”,不是“全局改配置”。

切模型会不会丢上下文

长期记忆不会丢,工作区画像也不会丢。真正会受影响的是短期上下文压缩

  • bailian/kimi-k2.5 切到 step/step-3.5-flash,因为两边都是大窗口,风险很低
  • bailianstep 切到 moonshot-v1-128k,因为窗口更小,下一轮可能触发更激进的 compaction

所以我现在的原则很简单:

  • 平时默认:bailian/kimi-k2.5
  • 需要测试 Step:/model step
  • 需要切回稳定默认:/model bailian/kimi-k2.5
  • 需要做小窗口对比:/model kimi/moonshot-v1-128k

⚠️ 如果你想支持“切换模型 step”这种中文自然语言,而不是 /model step,那是另外一层 parser 改造,不是 OpenClaw 开箱即用能力。


完整配置文件参考

openclaw.json(多 Bot 生产版本,已脱敏,包含 compaction 修复):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{
"gateway": {
"port": 18789,
"mode": "local",
"controlUi": {
"allowedOrigins": ["http://localhost:18789", "http://127.0.0.1:18789"]
},
"auth": {
"token": "your-secure-token-here"
}
},
"models": {
"mode": "merge",
"providers": {
"bailian": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
"apiKey": "YOUR_BAILIAN_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "kimi-k2.5",
"name": "kimi-k2.5",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 256000,
"maxTokens": 8192
}
]
},
"kimi": {
"baseUrl": "https://api.moonshot.cn/v1",
"apiKey": "YOUR_KIMI_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "moonshot-v1-128k",
"name": "moonshot-v1-128k",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 131072,
"maxTokens": 8192
}
]
},
"step": {
"baseUrl": "https://api.stepfun.com/v1",
"apiKey": "YOUR_STEP_API_KEY",
"api": "openai-completions",
"models": [
{
"id": "step-3.5-flash",
"name": "Step 3.5 Flash",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 256000,
"maxTokens": 8192
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "bailian/kimi-k2.5"
},
"contextTokens": 131072,
"compaction": {
"mode": "safeguard",
"reserveTokensFloor": 24000,
"identifierPolicy": "strict",
"memoryFlush": {
"enabled": true,
"softThresholdTokens": 6000
}
}
},
"list": [
{ "id": "main", "default": true },
{ "id": "news" },
{ "id": "growth" },
{ "id": "kb" }
]
},
"bindings": [
{ "agentId": "main", "match": { "channel": "telegram", "accountId": "main" } },
{ "agentId": "news", "match": { "channel": "telegram", "accountId": "news" } },
{ "agentId": "growth", "match": { "channel": "telegram", "accountId": "growth" } },
{ "agentId": "kb", "match": { "channel": "telegram", "accountId": "kb" } }
],
"session": {
"scope": "per-sender",
"reset": {
"mode": "idle",
"idleMinutes": 30
},
"maintenance": {
"mode": "enforce",
"pruneAfter": "7d",
"maxEntries": 120
}
},
"channels": {
"telegram": {
"enabled": true,
"dmPolicy": "pairing",
"groupPolicy": "allowlist",
"historyLimit": 30,
"accounts": {
"main": {
"botToken": "YOUR_MAIN_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"],
"dmPolicy": "pairing",
"groupPolicy": "allowlist",
"streaming": "off"
},
"news": {
"botToken": "YOUR_NEWS_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"],
"dmPolicy": "pairing",
"groupPolicy": "allowlist",
"streaming": "off"
},
"growth": {
"botToken": "YOUR_GROWTH_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"],
"dmPolicy": "pairing",
"groupPolicy": "allowlist",
"streaming": "off"
},
"kb": {
"botToken": "YOUR_KB_BOT_TOKEN",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"],
"dmPolicy": "pairing",
"groupPolicy": "allowlist",
"streaming": "off"
}
}
}
}
}

⚠️ 关键提示

  1. 如果你保留多档模型可切换,contextTokens 不要盲目拉满;我现在用 131072 作为三档模型共存时的安全基线。
  2. 浏览器功能:默认镜像不包含 Chromium,需要使用 --build-arg OPENCLAW_INSTALL_BROWSER=1 构建 openclaw:local-browser 镜像
  3. 多 Bot 场景必须配置 bindings,否则 direct chat 默认会落到主会话桶,容易串上下文。
  4. 如果你临时切到 moonshot-v1-128k,继续保持 contextTokens <= 131072,避免再次出现 compaction 超限。

单 Bot 简化版(含 compaction 修复):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"gateway": {
"port": 18789,
"mode": "local",
"controlUi": {
"allowedOrigins": ["http://localhost:18789", "http://127.0.0.1:18789"]
},
"auth": {
"token": "your-secure-token"
}
},
"models": {
"providers": {
"bailian": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1",
"apiKey": "YOUR_API_KEY",
"models": [{
"id": "kimi-k2.5",
"contextWindow": 256000,
"maxTokens": 8192
}]
}
}
},
"agents": {
"defaults": {
"model": { "primary": "bailian/kimi-k2.5" },
"contextTokens": 131072,
"compaction": {
"mode": "safeguard",
"reserveTokensFloor": 24000
}
}
},
"session": {
"reset": {
"mode": "idle",
"idleMinutes": 30
},
"maintenance": {
"mode": "enforce",
"pruneAfter": "7d",
"maxEntries": 120
}
},
"channels": {
"telegram": {
"enabled": true,
"historyLimit": 30,
"botToken": "YOUR_BOT_TOKEN",
"allowFrom": ["YOUR_USER_ID"]
}
}
}

踩坑总结

坑位 问题 解决方案
1 构建时 OOM 添加 5GB Swap 空间
2 gateway.mode 缺失 必须显式设置 "mode": "local"
3 controlUi.allowedOrigins 缺失 非 localhost 绑定时必须配置
4 gateway.bind 配置无效 必须使用 CLI 参数 --bind lan
5 Telegram 配对失败 删除 dmPolicy,使用 allowFrom 白名单
6 防火墙不生效 使用 DOCKER-USER 链而非 INPUT
7 Google OAuth 授权失败 确保 Redirect URI 与配置完全一致
8 MCP 服务器无法启动 检查 npx 是否可用,网络是否通畅
9 多 Bot 配置时 default 账号冲突 避免使用 default 作为 accountId,改用 mainnews
10 多 Bot 顶层 botToken 被覆盖 使用 accounts 时,顶层不要设置 botToken
11 Skill 脚本权限不足 确保脚本有执行权限 chmod +x script.sh
12 Skill 中文字符处理 使用 `echo
13 Compaction 卡死导致无响应 配置合理 contextTokens + 设置 historyLimit + 启用 session.maintenance
14 Docker 镜像无浏览器 使用 --build-arg OPENCLAW_INSTALL_BROWSER=1 重新构建镜像
15 镜像体积过大 (5.7GB) 使用多阶段构建 + node:22-bookworm-slim 基础镜像
16 会话记录膨胀失控 部署结构化记录系统 + 每日自动归档 + 分类存储
17 定时任务推送全到 main bot jobs.json 每个 job 加 agentId + delivery.accountId
18 想切 Step 却误改全局默认模型 保持默认模型不动,使用 /model ... 做会话级切换
19 HEARTBEAT.md 抢占 main 主会话 保留 heartbeat,但改成低风险静默版;主动提醒交给 cron 或其他 bot

镜像优化指南(第15坑)

问题:镜像体积过大

OpenClaw 默认构建的镜像体积巨大:

  • openclaw:local: 4.4GB
  • openclaw:local-browser: 5.7GB

在 2GB 内存的服务器上,光是镜像就占满了磁盘。

原因分析

问题 说明 占用
单阶段构建 构建依赖和生产代码混在一起 ~1GB
未清理 devDependencies 开发依赖未删除 ~500MB
bookworm 基础镜像 完整 Debian 系统 ~1GB
Chromium + Playwright 浏览器全套 ~1.7GB

解决方案:多阶段构建

创建 Dockerfile.optimized

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# ============================================================================
# 阶段1:构建阶段
# ============================================================================
FROM node:22-bookworm AS builder

WORKDIR /app
RUN corepack enable

# 复制依赖文件
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

# 复制源码并构建
COPY . .
RUN pnpm build && pnpm ui:build

# 关键:清理开发依赖,只保留生产依赖
RUN pnpm prune --prod

# ============================================================================
# 阶段2:生产阶段 - 使用精简基础镜像
# ============================================================================
FROM node:22-bookworm-slim AS production

# 只安装必需的系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates curl git \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 从构建阶段只复制必要文件
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/openclaw.mjs ./

# 使用非 root 用户运行
RUN groupadd -r nodeuser && useradd -r -g nodeuser nodeuser
RUN chown -R nodeuser:nodeuser /app
USER nodeuser

ENV NODE_ENV=production
EXPOSE 18789 18790

CMD ["node", "openclaw.mjs", "gateway", "--allow-unconfigured"]

构建优化版镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /opt/openclaw

# 构建轻量级版本 (2-3GB)
docker build \
--target production \
-t openclaw:slim \
-f Dockerfile.optimized \
.

# 构建浏览器版本 (3-4GB)
docker build \
--target browser \
-t openclaw:slim-browser \
-f Dockerfile.optimized \
.

优化效果对比

镜像 原体积 优化后 节省
openclaw:local 4.4GB openclaw:slim 2.5GB 43%
openclaw:local-browser 5.7GB openclaw:slim-browser 3.5GB 39%

使用优化版镜像

修改 .env 文件:

1
2
3
4
5
# 轻量级版本(推荐日常使用)
OPENCLAW_IMAGE=openclaw:slim

# 或浏览器版本(需要网页自动化时)
# OPENCLAW_IMAGE=openclaw:slim-browser

然后重启服务:

1
docker compose up -d

进一步优化建议

  1. 使用 Alpine 基础镜像(极致精简)

    1
    2
    3
    FROM node:22-alpine
    # 可将体积降至 < 1.5GB
    # 但可能有兼容性问题
  2. 启用 Docker 镜像压缩

    1
    docker build --compress ...
  3. 定期清理无用镜像

    1
    docker image prune -a

重大坑位详解:Compaction 卡死问题(第13坑)

部署运行几天后,我遇到了一个极其隐蔽但致命的问题:Telegram Bot 突然不响应了,或者响应需要等 5 分钟以上。

现象

  • 发送消息后 Bot 无响应
  • 日志卡在 embedded run compaction start 不动
  • 服务重启后短暂正常,很快又卡死

根因分析

深度诊断后发现了两个根本原因

根因 1:contextTokens 不匹配

OpenClaw 默认上下文预算与实际模型窗口不一致时,会导致系统误判可用空间,compaction 后仍然超限(日志显示使用了 145.7%)。

所以一定要注意不同的模型一定要修改响应的配置。

根因 2:无 historyLimit 限制

所有历史消息(603 条)全部进入上下文,而不是只取最近的几十条。两天内会话文件膨胀到 1.4MB,每次 compaction 都要扫描全部历史。

触发因素:输出被频繁截断

maxTokens 配得过小会让长任务反复截断并补发,间接加速会话膨胀。它不是唯一根因,但会放大卡顿问题。

解决方案

需要添加三组关键配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"agents": {
"defaults": {
"contextTokens": 131072,
"compaction": {
"mode": "safeguard",
"reserveTokensFloor": 24000,
"identifierPolicy": "strict",
"memoryFlush": {
"enabled": true,
"softThresholdTokens": 6000
}
}
}
},
"session": {
"scope": "per-sender",
"reset": {
"mode": "idle",
"idleMinutes": 30
},
"maintenance": {
"mode": "enforce",
"pruneAfter": "7d",
"maxEntries": 120
}
},
"channels": {
"telegram": {
"enabled": true,
"historyLimit": 30,
"accounts": {
...
}
}
}
}

关键配置说明

配置项 作用
agents.defaults.contextTokens 131072 多档模型共存时更稳,切回 moonshot-v1-128k 也不容易超限
agents.defaults.compaction.mode safeguard 启用保护模式,预留安全空间
session.maintenance.mode enforce 强制清理 7 天前的旧会话
session.maintenance.maxEntries 120 最多保留 120 个会话
channels.telegram.historyLimit 30 每次请求最多带 30 条历史

多 Bot 配置注意

上面的 historyLimitsession 配置放在 channels.telegram 级别,会对所有 4 个 Bot 统一生效。如果需要不同 Bot 不同策略,可以在每个 account 下单独设置 historyLimit

多模型切换补充说明

后来我又把 step/step-3.5-flash 接进来了。这里最重要的经验是:
别为了切模型去改全局默认模型,直接用 /model ... 切当前会话就够了。

原因很简单:

  • 改全局会影响别的 Bot 和别的会话
  • 还可能把 cron 定时任务一起带偏
  • 当前会话切换则只影响自己这一条对话链

我现在的实际用法:

1
2
3
4
/model step
/model bailian/kimi-k2.5
/model kimi/moonshot-v1-128k
/model status

其中:

  • bailian <-> step 风险最低
  • 切到 moonshot-v1-128k 时,最容易触发短期上下文压缩
  • 但长期记忆文件不会丢

修复后的效果

  • 响应时间从 5 分钟+ 降至 3-20 秒
  • 会话文件大小控制在 10KB 以内
  • 服务连续运行 14 小时+ 无卡死

补充坑位:HEARTBEAT 抢占主会话(第19坑)

后来我又遇到过一次比 compaction 更隐蔽的问题:Telegram 能收到消息,但主 Bot 要么完全不回,要么要等很久才回。

现象

  • @GameHuOpenclaw_bot 发消息,长时间没有任何回复
  • 日志能看到消息进入 lane=session:agent:main:main
  • 但执行结束后没有正常的 sendMessage
  • 重启后可能短暂恢复,过一阵又复发

真实根因

这次不是 Telegram 渠道挂了,也不是容器死了,而是 HEARTBEAT.md 的主动任务把 main 主会话占掉了

排查时我在 sessions.json 里发现,agent:main:main 这条映射的 origin.provider 已经不是 Telegram,而是 heartbeat。结果就是:

  • 你的正常聊天消息仍然会进入 main
  • main 会话上下文已经被 heartbeat 任务污染
  • 最终表现成“不回复”或“回复极慢”

为什么会发生

这里有个很容易误解的点:HEARTBEAT.md 很有用,但它不是核心运行时依赖。OpenClaw 的 heartbeat 机制本身会启动,但如果你把 HEARTBEAT.md 写成“主动检查 git、主动提醒发博客、主动输出长段内容”的详细任务单,它就可能在重启、升级尝试或异常恢复后占用 main session

我这次现场看到的情况是:

  • 启动日志显示 update available (latest): v2026.3.7 (current v2026.2.27)
  • 说明当时服务器实际跑的仍然是 v2026.2.27
  • 也就是说,之前那次“升级”并没有真正成功
  • 但升级尝试或相关重启之后,main 会话映射被 heartbeat 改写了

所以这次故障更准确地说,是升级尝试触发重启后,暴露了 heartbeat 抢占主会话的问题,而不是“新版本本身有 bug”。

如何判断是不是这个问题

如果你遇到“消息进来了但 Bot 不回”,重点看两处:

  1. docker compose logs -f openclaw-gateway
  2. ~/.openclaw/agents/main/sessions/sessions.json

如果日志里反复出现主会话执行,但没有正常发消息,同时 sessions.jsonagent:main:main.origin.provider = heartbeat,基本就能确定是这个坑。

我最终采用的修复方式

  1. 先备份 sessions.json 和当前 session 文件
  2. 删除被污染的 agent:main:main 映射
  3. 重启 openclaw-gateway
  4. 把原来的激进版 HEARTBEAT.md 改成低风险版

低风险版的原则是:

  • 默认只返回 HEARTBEAT_OK
  • 只做静默的记忆维护
  • 不主动发博客提醒
  • 不做 git 巡检
  • 不输出聊天式长文本

最稳的实践建议

如果你的 main bot 是日常高频对话入口,我现在的建议很明确:

  • HEARTBEAT.md 可以保留
  • 但只保留静默记忆维护能力
  • 主动提醒类任务放到 cron 或单独 bot
  • 不要再把“像助手一样主动找你说话”的逻辑写进主工作区 heartbeat

这样既能保留记忆整理能力,又不会再次把主聊天打挂。

顺手补一句:如何确认升级到底成没成功

不要只看自己执行过 git pulldocker compose restart,要以启动日志里的版本号为准。

如果日志仍然显示:

1
update available (latest): v2026.3.7 (current v2026.2.27)

那结论很简单:你还在跑旧版本,升级并没有真正完成。


实际使用体验

部署完成后,通过 Telegram 与 Bot 对话:

修复前(问题阶段)

  • 响应速度:最初很快,2 天后变成 5 分钟+
  • 稳定性:运行 2 天后完全卡死
  • 原因:compaction 机制被大会话文件阻塞

修复后(当前状态)

  • 响应速度:3-20 秒,正常可用
  • 稳定性:连续运行 14 小时+ 无故障
  • 内存占用:约 800MB-1.2GB
  • 功能:文件操作、Shell 命令、网页浏览全部正常

关键优化点

配置 contextTokenshistoryLimitsession.maintenance 后,OpenClaw 从”两天必挂”变成”长期稳定运行”。这是生产环境部署的必选项,不是可选项。

📷 Telegram 实际对话效果

Telegram使用效果


安全建议

  1. 永远不要openclaw.json 提交到 Git
  2. 配置文件权限:最小权限原则,但必须保证容器运行用户可读
  3. Web UI 访问:仅通过 SSH 隧道,不要暴露在公网
  4. Telegram 白名单:严格控制 allowFrom 列表
  5. 定期更新:关注 OpenClaw 安全公告

参考资源

Claude Code 思考

引言

最近有篇 Medium 文章火了,标题很炸:Claude Code’s Creator, 100 PRs a Week

说的是 Boris Cherny,Claude Code 的核心开发者,一周提交了 100 个 PR。

文章还提到了他的工作流:

  • 5 个 Claude 实例在终端跑
  • 另外 5-10 个在浏览器跑
  • 早上用手机启动会话
  • 晚上检查进展

看得很震撼对吧?

我的第一反应

老实说,看完我有点焦虑

一周 100 PR,平均每天 14 个 PR。
这是人能干出来的量吗?

但冷静下来想想,我看了下 Boris 之前分享的 13 条实战秘籍。

结合这两份材料,我发现了一些有意思的偏差

这篇文章说了什么

Boris 的工作流

根据文章,Boris 的设置是:

  1. 多实例并行

    • 5 个终端实例,跑 5 个 Claude Code
    • 另外 5-10 个浏览器实例,干别的任务
  2. 24/7 监控

    • 早上用手机启动会话
    • 白天在电脑干活
    • 晚上检查进展
    • 循环往复
  3. 极致优化

    • 每个实例都跑满
    • 不等一个完再开下一个
    • 充分利用 Claude 的并发能力

结果:一周 100 PR。

结合 Boris 的 13 条秘籍来分析

一致的地方

文章说的和工作流,和 Boris 的秘籍是一致的:

  1. 并行多个任务
    Boris 的第 2 条秘籍就是”并行多个任务”。
    5-10 个实例,这确实是极限并行。

  2. 无人值守模式
    Boris 的第 3 条秘籍用 --permission-mode=dontAsk
    不用等他点批准,Claude 自己跑,不用等。

  3. 持续反馈和优化
    Boris 的第 13 条秘籍是”持续反馈和优化”。
    团队每周多次更新 CLAUDE.md,持续优化。

但文章遗漏了什么

文章只说了结果,没说代价

100 PR 一周的背后:

  • 要有 10+ 个 Claude 实例
  • 要持续 24/7 监控
  • 要管理这么多会话的上下文
  • 要处理 100 个 PR 的 review

不是一般开发者能做到的

我的判断

这篇文章有用吗?

有用,但要谨慎看待

有用的地方

  1. 展示了 Claude Code 的极限
    它确实能处理大量任务
    并行确实能大幅提升效率

  2. 工作流的思路

    • 多实例并行
    • 手机远程控制
    • 持续监控
    • 无人值守模式

这些思路可以借鉴,但不用照搬。

  1. 自动化的价值
    agent stop 钩子
    Chrome 扩展自动测试
    这些自动化确实能省时间

要警惕的地方

  1. 容易引发焦虑
    看到”一周 100 PR”,容易焦虑:

    • 我是不是太慢了?
    • 我是不是没充分用 AI?
    • 我是不是不够努力?

    但 Boris 是 Claude Code 的创建者,
    他懂每一处细节,
    他有整个团队支撑,
    他做的是自己最擅长的事.

  2. 不适合普通开发者
    大部分人:

    • 没有那么多实例预算
    • 没有那么多监控时间
    • 没有那么强的多任务能力
    • 没有团队支撑

    照搬这个工作流,大概率翻车

  3. 质量 vs 数量的平衡
    100 PR 一周,质量怎么样?

    • 每个 PR 都认真 review 吗?
    • 都有测试吗?
    • 都有文档吗?

    数量不是一切。

普通人应该怎么做

可以借鉴的

  1. 保持简单配置
    Boris 说得对,默认配置就够用.
    别一上来就调配置.

  2. 并行 2-3 个任务
    量力而行,2-3 个就好.
    Boris 的 5-10 个,是极限操作.

  3. 善用 /goal 命令
    把相关任务一起执行.
    Claude 会自动处理依赖关系.

  4. 无人值守模式
    长任务用 --permission-mode=dontAsk.
    不用一直守着点批准.

  5. 建立 CLAUDE.md
    把项目特有的事记下来.
    避免重复踩坑.

不建议照搬的

  1. 一天 14 个 PR
    没必要,真的没必要.
    质量比数量重要.

  2. 24/7 监控
    不是所有人都这么干.
    正常工作,有张有弛就行.

  3. 5-10 个实例
    资源消耗太大.
    2-3 个实例就够了.

  4. 晚上检查进展
    正常下班就该下班.
    没必要 24/7 在线.

核心思想

结合文章和 Boris 的秘籍,我觉得核心思想是:

把 Claude Code 当作团队的一部分,而不是工具.

  • 不是”让它帮我写代码”
  • 而是”它帮我干活,我管理”

Boris 的成功,不是因为他开 10 个实例.
而是因为他建立了一套高效的工作流

这套工作流:

  • 清晰的任务拆分
  • 合理的并行策略
  • 自动化的质量保障
  • 持续的反馈优化

写在最后

这篇文章的价值,是展示了可能性

但不要被数字迷惑.

100 PR 一周,是:

  • Boris 作为创建者的极限操作
  • 有团队支撑
  • 有多年积累

普通人:

  • 学思路,别学数字
  • 借鉴经验,别照搬
  • 找平衡,别追求极限

Boris 自己都说,他的配置”出乎意料的简单”.

简单才是王道.

别让焦虑支配你。

找到适合自己的节奏,持续优化,就够了.

Claude Code 是来提升效率的,不是制造焦虑的

参考

Claude Code 实战

起因

最近看到 Claude Code 的创始人 Boris Cherny 在 Twitter 上分享了自己使用 Claude Code 的 13 条核心技巧。

这个人不是普通用户,他是 Claude Code 的核心开发者之一。

他的配置,他的习惯,肯定有东西值得学习。

技巧一:保持默认配置

如果你不会调,就别调

Boris 说,因为他们团队都在深度使用 Claude Code,所以默认配置已经优化得挺好的了。

新手容易犯的错误:

  • 看到各种配置就想调
  • 调完反而用不好
  • 默认配置其实已经够用了

建议:

  • 先用默认配置
  • 等熟悉了再考虑个性化
  • 大部分场景,默认就够用

技巧二:并行多个任务

不要盯着一个任务等结果

Claude 是机器人,不是活人。它可以同时处理很多事情。

Boris 的习惯是同时运行 5 到 10 个 Claude 任务。

怎么操作:

  • 在不同终端窗口开多个任务
  • 或者用 /goal 命令并行执行
  • 让 Claude 后台自动排队处理

好处:

  • 不用等一个任务完成才开下一个
  • 总体完成速度更快
  • 充分利用 Claude 的并发能力

技巧三:无人值守模式

长任务的时候,别一直守着点”批准”。

Boris 用的是 --permission-mode=dontAsk 参数。

这个参数的意思是:

  • Claude 可以自己执行命令
  • 不用等用户确认
  • 适合那种不需要人工干预的任务

适用场景:

  • 批量代码重构
  • 自动化测试
  • 文档生成
  • 代码审查

注意事项:

  • 敏感操作不要用这个模式
  • 文件系统权限操作要小心

技巧四:使用 Chrome 扩展自动测试

这是个很实用的技巧。

Boris 用 Chrome 扩展让 Claude 自己打开浏览器测试 UI。

工作流:

  1. Claude 修改前端代码
  2. 自动打开浏览器测试
  3. 发现问题
  4. 自动修复
  5. 再测试
  6. 直到完美

好处:

  • 不用自己手动打开浏览器
  • 测试-修复循环自动化
  • 用户体验问题能快速迭代

技巧五:agent stop 钩子验证

任务完成后,不是直接提交。

Boris 配了个钩子:agent stop。

这个钩子会:

  • 自动验证代码
  • 跑测试
  • 检查代码质量
  • 验证通过才完成

如果验证失败:

  • Claude 继续修复
  • 再验证
  • 直到通过

好处:

  • 质量有保障
  • 不用人工手动验证
  • 形成自动化的闭环

技巧六:共享知识库 CLAUDE.md

这个点很重要。

Boris 的团队共用一个 CLAUDE.md 文件。

放在哪?放在 Git 仓库里。

更新频率:团队成员每周都会多次更新。

更新什么?

  • 发现 Claude 哪里做错了
  • 就把规矩写进 CLAUDE.md
  • 确保它下次不再犯同样的错误

效果:

  • 团队知识沉淀
  • 避免重复犯错
  • 集体优化使用方式

技巧七:保持简单配置

Boris 说,他的配置可能出乎意料地”素”。

意思就是:简单

为什么?

  • Claude Code 开箱即用非常出色
  • 大部分场景不需要自定义
  • 复杂配置反而容易出问题

建议:

  • 能不用插件就不用
  • 能不改配置就不改
  • 保持系统简洁

技巧八:团队协作规范

不是一个人用,是整个团队怎么用。

Boris 团队的做法:

  • 统一的 CLAUDE.md
  • 统一的钩子配置
  • 统一的权限设置
  • 统一的项目结构

好处:

  • 团队协作顺畅
  • 知识可以共享
  • 问题可以快速定位

技巧九:合理使用 MCP

MCP (Model Context Protocol) 是 Claude 的扩展机制。

Boris 的建议:

  • 不要装太多 MCP 服务器
  • 装真正有用的
  • 配置好访问权限

原因:

  • MCP 服务器多了,反而慢
  • 每个都要授权,麻烦
  • 质量参差不齐

技巧十:善用 /goal 命令

/goal 命令可以并行执行多个任务。

例子:

1
2
3
4
5
/goal
1. 重构用户模块
2. 更新 API 文档
3. 添加单元测试
4. 修复已知 bug

Claude 会:

  • 同时执行这些任务
  • 自动处理依赖关系
  • 高效完成

技巧十一:长任务拆分

太长的任务,Claude 容易跑偏。

Boris 的做法:

  • 拆分成多个小任务
  • 每个任务有明确目标
  • 串行或并行执行

好处:

  • 每个任务更容易控制
  • 出问题容易定位
  • 进度更清晰

技巧十二:善用上下文

Claude 能记住的上下文有限。

Boris 的建议:

  • 重要信息一开始就给
  • 不要分多次重复说
  • 用文件记录长期信息

比如:

  • 项目架构写在 CLAUDE.md 里
  • 业务规则也写进去
  • Claude 可以随时读取

技巧十三:持续反馈和优化

不是一次配好就完了。

Boris 团队的做法:

  • 每周多次更新 CLAUDE.md
  • 发现问题马上记录
  • 团队分享最佳实践
  • 持续优化使用方式

本质:

  • 把 Claude 当作团队成员
  • 不断培训它
  • 优化它的工作方式

我的一些实践

用了 Claude Code 一段时间,我也积累了一些经验。

我的配置

  1. 保持默认配置
    基本上没怎么调,默认就够用

  2. 并行任务
    经常同时开 2-3 个任务

  3. 简单的钩子
    只配置了必要的几个

  4. 我的 CLAUDE.md
    项目根目录放了个文件,记录了一些项目特有的事

我的感受

Claude Code 确实好用。

但它的价值,不是简单地”帮我写代码”。

而是:成为你工作流的一部分

  • 你教它规则
  • 它按规则干活
  • 出错了你纠正
  • 下次它就学会了

这个循环持续优化,你的”AI 助手”会越来越聪明。

给使用 Claude Code 的建议

新手建议

  1. 先用默认配置
    别一上来就调配置,默认其实挺好用

  2. 从简单任务开始
    先让它干些简单的,熟悉了再上复杂任务

  3. 善用 /goal
    多个相关任务,用 /goal 一起执行

进阶建议

  1. 配置你的 CLAUDE.md
    项目相关的规则、架构、约定都写进去

  2. 设置自动化钩子
    agent stop 之类的钩子配置好

  3. 合理使用 MCP
    装真正有用的,别太多

团队建议

  1. 统一配置
    团队用统一的 CLAUDE.md,统一的钩子

  2. 定期分享
    定期分享使用心得,最佳实践

  3. 持续优化
    把 Claude 当团队成员,持续培训它

写在最后

Boris 的这 13 条技巧,核心思想就一个:

把 Claude Code 当作你团队的一部分,而不是一个工具。

  • 它会犯错,就像人一样
  • 你要纠正它,就像指导新人一样
  • 它会学习,就像积累经验一样

持续优化,持续反馈,它就会越来越懂你的项目,越来越懂你的需求。

这比单纯”让它帮我写代码”要有用得多。

参考:

Claude Code 实战

背景

Anthropic 最近给 Claude Code 加了个 Remote Control 功能,简单说就是可以用手机或其他设备远程控制本地终端

用起来感觉挺方便的:

  • 在电脑上启动任务
  • 在手机上接着继续干
  • 本地环境、MCP 服务器、项目配置全都保留
  • 上下文不丢失

这篇文章主要记录我自己的iPhone + Claude Code Remote Control实战经验。

一、前提条件

1. 订阅要求

Remote Control 目前需要 Pro 或 Max 订阅。

  • Pro 用户:估计很快就会全量放开
  • Max 用户:现在就能用(我用的就是 Max)

API 密钥不支持这个功能。

2. 登录认证

在终端里跑:

1
claude /login

会跳到浏览器,让你登录 claude.ai 账号。

3. 工作区信任

第一次在项目目录跑 claude,会弹个窗口问你是否信任这个工作区。

一定要点Yes,不然用不了。

二、安装 Claude App(手机端)

iOS 用户

在 App Store 搜 “Claude by Anthropic”,认准官方的。

或者用电脑端的 /mobile 命令,会弹个 QR 码,手机一扫就能直接跳到下载页面。

Android 用户

Google Play 搜 “Claude by Anthropic”。

装好后用手机浏览器登录同一个 claude.ai 账号。

三、启动远程控制

有两种方式,看你在什么场景。

方式一:直接启动新会话

在项目目录下:

1
2
3
claude remote-control
# 或者简写
claude rc

终端会显示:

  • 一个 session URL
  • 提示你按空格键显示 QR 码

进程会一直跑着,等你连。

方式二:在现有会话中开启

如果你已经在 Claude Code 里干活了,想切换到手机上:

1
2
3
/remote-control
# 或者简写
/rc

当前对话会直接带过去,不用重新开始。

提示:用 /rename 先给会话起个名字,手机上好找。

常用参数

启动的时候可以加参数:

1
claude remote-control --verbose

--verbose:显示详细的连接日志,方便调试。

四、用 iPhone 连接

终端显示 QR 码和 URL 后,你有三种方式连。

方式一:扫 QR 码(推荐)

  1. 电脑终端按空格键,显示 QR 码
  2. iPhone 打开 Claude App
  3. 点右上角扫描图标
  4. 对准 QR 码扫一下

秒连上。

方式二:打开 URL

终端会显示个类似这样的链接:

1
https://claude.ai/code/session/xxxxxxxxxxxxx

用 iPhone 的 Safari 直接打开就行。

方式三:在 App 里找

打开 Claude App,进 session 列表。

Remote Control 的会话会显示一个电脑图标,带个绿点,表示在线。

建议先给会话起名字,不然都叫”Remote Control session”很难分。

五、实际使用场景

场景一:躺沙发上继续

白天在电脑上启动个任务:

1
claude rc

跑起来了,晚上躺沙发上:

  • 手机 Claude App 扫码连接
  • 接着白天的工作继续
  • 看到本地环境的所有内容

场景二:会议中监控

让 Claude 在本地跑个长任务:

1
claude rc

开会的时候,用手机时不时看看进度:

  • 看到工具调用日志
  • 看到输出结果
  • 随时发送新指令

场景三:通勤路上查看

早上在电脑启动会话,上班路上:

  • 手机打开查看当前状态
  • 看到昨天的工作上下文
  • 回复一些简单的指令

到了公司,电脑接着干。

六、自动开启远程控制(可选)

默认得手动输 /rc 才能远程控制。

每次都自动开启:

在 Claude Code 里输:

1
/config

“Enable Remote Control for all sessions” 设成 true。

以后每次启动 Claude Code,默认都支持远程控制。

七、一些注意事项

1. 一个会话只能一个远程连接

同时只能一个设备连。
但可以在终端、浏览器、手机之间轮着来发消息,上下文是同步的。

2. 终端不能关

Remote Control 是本地进程,终端关了会话就断了。

再连的话重新跑:

1
claude rc

3. 网络断了别慌

电脑如果在,但网络断了超过大概 10 分钟,会话会超时退出。

电脑恢复网络后,重新 claude rc 就行。

4. 手机端只是个窗口

重要理解:

代码在你本地跑,不是在云端跑。

手机 Claude App 或者网页端,只是个窗口,让你能看到和操作本地会话。

  • 本地文件系统访问
  • MCP 服务器
  • 项目配置

这些全都保留在本地。

八、Remote Control vs 网页版 Claude Code

这两个长得一样,但本质不同:

Remote Control 网页版 Claude Code
执行位置 你的本地机器 Anthropic 管的云端
本地文件系统 可访问 不访问
MCP 服务器 可用 不用
项目配置 保留 重新配置
使用场景 本地工作,想换个设备接着干 快速启动,不需要本地环境

建议:

  • 本地有项目,想换个设备接着干 → Remote Control
  • 快速测试,不需要本地环境 → 网页版
  • 多任务并行 → 网页版

九、我的实际体验

用了几天,说说感受。

好的地方

  1. 上下文不丢失
    从电脑切换到手机,对话历史全在
    不用重新解释之前干到哪了

  2. 本地环境完全保留
    MCP 服务器能用
    本地文件能访问
    项目配置不用重新配

  3. 灵活切换设备
    终端发一条
    浏览器发一条
    手机再发一条

    都在同一个会话里。

  4. 支持断线重连
    网络断了自动重连
    只要电脑还在,不会丢

需要注意的地方

  1. 一次只能一个远程连接
    多设备同时连不了

  2. 终端不能关
    关了就断了

  3. Mac 优先
    目前功能是 Research Preview,Max 用户先用上

十、一些实用技巧

技巧一:用 /rename 起名

每次启动 Remote Control 前,先:

1
/rename hexo-blog-work

手机上会话列表里一眼就能找到。

技巧二:多终端切换

  • 电脑上发条指令
  • 手机上看看结果
  • 再发一条给手机

来回切,挺方便的。

技巧三:长任务监控

让 Claude 本地跑长任务(比如批量重构):

1
/rc

手机随时看进度,不用一直守着电脑。

十一、安全说明

Anthropic 在文档里说明了安全性:

  • 本地 Claude Code 只发出站 HTTPS 请求
  • 不开任何入站端口
  • 流量走 Anthropic API 的 TLS 加密通道
  • 用多个短期凭证,各自独立过期

简单说,安全级别和普通 Claude Code 会话一样。

十二、常见问题

Q: Remote Control 和网页版 Claude Code 有啥区别?

A:本质区别是代码在哪跑。

  • Remote Control:在你本地跑,能访问本地文件、MCP、项目配置
  • 网页版:在 Anthropic 云端跑,不用本地环境

Q:能用 API 密钥吗?

A:不行。必须是 Pro 或 Max 订阅。

Q:手机端能看到我电脑上的所有东西?

A:不是。手机端只是窗口,操作的是本地 Claude Code 会话。
能访问的范围,就是 Claude Code 能访问的范围。

Q:网络断了会怎样?

A:电脑如果在,只是网络断了,会话会等待。
超过大约 10 分钟连不上,会超时退出。

Q:能多个设备同时连吗?

A:一次只能一个远程连接。
但可以在多个设备间切换,上下文同步。

总结

Remote Control 这个功能,解决的是:

“AI 编程任务需要持续交互,但人不能一直在电脑前”

这个实际痛点。

不是什么革命性创新,但让工作流更顺畅了:

  • 电脑上启动
  • 手机上继续
  • 灵活切换
  • 本地环境全保留

如果你是 Claude Code 的 Max 用户,推荐试试。

终端里输 /rc 或者 claude rc 就能开始。

参考

官方文档: remote-control

AI 实践

背景

最近看到一位开发者在 X 上分享了他的 AI 编码工作流,看得我眼前一亮。他不再直接使用 Codex 或 Claude Code,而是用 OpenClaw 作为编排层,让一个叫 Zoe 的编排器来管理一群 AI 代理。

说实话,刚开始看的时候我还在想,直接用 Claude Code 不就够了吗?为什么还要搞个编排层?看完整个架构和工作流程后,我才明白这确实是个质的飞跃

先看成果

这哥们儿过去4周的数据:

  • 一天 94 次提交。他最高产的那天,开了 3 个客户会议,一次编辑器都没打开。平均每天 50 次提交左右
  • 30 分钟 7 个 PR。从想法到生产环境的速度飞快,因为编码和验证基本都自动化了
  • 提交次数直接转化为 MRR(Monthly Recurring Revenue):他用这个系统来做真实的 B2B SaaS 产品——和创始人主导的销售结合,大部分功能请求都能当天交付。速度就是转化率

Git 历史看起来像他刚招了一个开发团队,实际上就他一个人,从管理 Claude Code,变成管理一个 OpenClaw 代理,而 OpenClaw 又管理着一群其他的 Claude Code 和 Codex 代理。

为什么需要编排层?

上下文窗口的零和博弈

上下文窗口是零和游戏。你必须在里面选择放什么:

  • 填满代码 → 没空间放业务上下文
  • 填满客户历史 → 没空间放代码库

这就是为什么两层系统有效:每个 AI 只加载它需要的。

OpenClaw 和 Codex 有完全不同的上下文:

OpenClaw:

  • 客户数据和会议记录(通过 Obsidian vault)
  • 业务目标和策略
  • 过去的决策和成败经验
  • 产品路线图
  • 市场信息

Codex:

  • 当前代码库
  • 具体文件和类型定义
  • 单元测试
  • 构建/测试流程
核心思想:通过上下文的专业化,而不是通过不同的模型来实现专业化

Codex 和 Claude Code 的局限

Codex 和 Claude Code 对你的业务几乎一无所知。它们看到的是代码,不是你业务的完整图景。

OpenClaw 改变了这个公式。它作为你与所有代理之间的编排层,在 Obsidian vault 中保存所有业务上下文(客户数据、会议记录、过去的决策、什么有效、什么失败),然后将历史上下文转化为每个编码代理的精确提示词。

代理专注于代码。编排器保持在高层策略层面。

系统工作流程

第1步:客户需求 → 与 Zoe 一起定范围

跟客户通完电话,他和 Zoe 讨论这个需求。因为所有会议记录都自动同步到他的 Obsidian vault,他这边完全不需要解释什么。

他们一起确定功能范围——最终确定了一个模板系统,让客户可以保存和编辑现有配置。

然后 Zoe 做三件事:

  1. 充值解除客户阻塞——她有管理员 API 访问权限
  2. 从生产数据库拉取客户配置——她有只读生产数据库访问权限(Codex 代理永远不会这个),获取他们现有设置,包含在提示词中
  3. 生成 Codex 代理——带有包含所有上下文的详细提示词

第2步:生成代理

每个代理都有自己的 worktree(隔离分支)和 tmux 会话:

1
2
3
4
5
6
# 创建 worktree + 生成代理
git worktree add ../feat-custom-templates -b feat/custom-templates origin/main
cd ../feat-custom-templates && pnpm install
tmux new-session -d -s "codex-templates" \
-c "/Users/elvis/Documents/GitHub/medialyst-worktrees/feat-custom-templates" \
"$HOME/.codex-agent/run-agent.sh templates gpt-5.3-codex high"

代理在 tmux 会话中运行,通过脚本进行完整的终端日志记录。

如果代理走错了方向?不需要杀掉它:

1
2
3
4
5
# 错误方向:
tmux send-keys -t codex-templates "Stop. Focus on the API layer first, not the UI." Enter

# 需要更多上下文:
tmux send-keys -t codex-templates "The schema is in src/types/template.ts. Use that." Enter

任务在 .clawdbot/active-tasks.json 中跟踪:

1
2
3
4
5
6
7
8
9
10
11
12
{
"id": "feat-custom-templates",
"tmuxSession": "codex-templates",
"agent": "codex",
"description": "Custom email templates for agency customer",
"repo": "medialyst",
"worktree": "feat-custom-templates",
"branch": "feat/custom-templates",
"startedAt": 1740268800000,
"status": "running",
"notifyOnComplete": true
}

完成后更新 PR 号和检查:

1
2
3
4
5
6
7
8
9
10
11
12
{
"status": "done",
"pr": 341,
"completedAt": 1740275400000,
"checks": {
"prCreated": true,
"ciPassed": true,
"claudeReviewPassed": true,
"geminiReviewPassed": true
},
"note": "All checks passed. Ready to merge."
}

第3步:循环监控

一个 cron 任务每 10 分钟运行一次,照顾所有代理。这基本上就是一个改进版的 Ralph Loop。

但它不直接轮询代理——那样太贵了。而是运行一个脚本读取 JSON 注册表并检查:

  • tmux 会话是否存活
  • 跟踪分支是否有打开的 PR
  • 通过 gh cli 检查 CI 状态
  • 如果 CI 失败或有关键审查反馈,自动重生失败的代理(最多 3 次)
  • 只有需要人工关注时才提醒

他不是盯着终端看。系统告诉他什么时候该看。

第4步:代理创建 PR

代理提交、推送,并通过 gh pr create --fill 打开 PR。这时他不会收到通知——单有 PR 不算完成。

完成的标准(非常重要,你的代理必须知道这个):

  • PR 已创建
  • 分支已同步到 main(无合并冲突)
  • CI 通过(lint,类型,单元测试,E2E)
  • Codex 审查通过
  • Claude Code 审查通过
  • Gemini 审查通过
  • 包含截图(如果有 UI 变化)

第5步:自动化代码审查

每个 PR 都由三个 AI 模型审查。它们捕捉不同的东西:

  • Codex 审查者——边缘情况方面卓越。审查最彻底。捕捉逻辑错误、缺少错误处理、竞态条件。误报率很低
  • Gemini Code Assist 审查者——免费且极其有用。捕捉安全性问题、其他代理忽略的可扩展性问题。并建议具体修复方案。安装它是必然的
  • Claude Code 审查者——基本没用——倾向于过度谨慎。很多”考虑添加…”的建议通常是过度工程化。除非标记为关键,否则我都跳过。它自己很少发现关键问题,但验证其他审查者标记的内容

这三个都在 PR 上直接发布评论。

第6步:自动化测试

他们的 CI 流水线运行大量自动化测试:

  • Lint 和 TypeScript 检查
  • 单元测试
  • E2E 测试
  • 针对预览环境(与生产相同)的 Playwright 测试

上周他加了新规则:如果 PR 改变任何 UI,必须在 PR 描述中包含截图。否则 CI 失败。这大幅缩短审查时间——他可以确切看到改变了什么,而无需点击预览。

第7步:人工审查

这时他收到 Telegram 通知:”PR #341 准备好审查。”

到这时候:

  • CI 通过
  • 三个 AI 审查者批准了代码
  • 截图显示 UI 变化
  • 所有边缘情况在审查评论中有记录

他的审查需要 5-10 分钟。很多 PR 他在不读代码的情况下合并——截图向他展示他需要的一切。

第8步:合并

PR 合并。一个日常 cron 任务清理孤立的 worktree 和任务注册表 JSON。

这基本上就是 Ralph Loop,但更好。

Ralph Loop 从记忆中拉取上下文,生成输出,评估结果,保存学习。但大多数实现每个周期运行相同的提示词。蒸馏的学习改进未来的检索,但提示词本身保持静态。

他们的系统不同。当代理失败时,Zoe 不会用相同的提示词重新生成它。她用完整的业务上下文查看失败,并弄清楚如何解除阻塞:

  • 代理上下文用完了?”只关注这三个文件。”
  • 代理走错了方向?”停。客户想要 X,不是 Y。这是他们在会议中说的。”
  • 代理需要澄清?”这是客户的邮件和他们公司的业务。”

Zoe 照顾代理直到完成。她有代理没有的上下文——客户历史、会议记录、他们之前尝试过什么、为什么失败。她使用那个上下文在每次重试时写更好的提示词。

但她也不会等他分配任务。她主动寻找工作:

  • 早上:扫描 Sentry → 发现 4 个新错误 → 生成 4 个代理调查和修复
  • 会议后:扫描会议记录 → 标记 3 个客户提到的功能请求 → 生成 3 个 Codex 代理
  • 晚上:扫描 git log → 生成 Claude Code 更新变更日志和客户文档

跟客户通完电话去散个步。回到 Telegram:”7 个 PR 准备好审查。3 个功能,4 个 bug 修复。”

当代理成功时,模式被记录。”这个提示词结构对计费功能有效。””Codex 需要预先知道类型定义。””总是包含测试文件路径。”

奖励信号是:CI 通过,所有三个代码审查通过,人工合并。任何失败触发循环。随着时间推移,Zoe 写更好的提示词,因为她记住什么交付了。

不同代理的特点

不是所有编码代理都平等。快速参考:

Codex 是他的主力。后端逻辑、复杂 bug、多文件重构、任何需要跨代码库推理的东西。它更慢但彻底。他用它处理 90% 的任务。

Claude Code 更快,更擅长前端工作。它权限问题也更少,所以很擅长 git 操作。(他以前更常用这个来驱动日常,但 Codex 5.3 现在就是更好更快)

Gemini 有不同的超能力——设计感知。对于漂亮的 UI,他让 Gemini 先生成 HTML/CSS 规范,然后交给 Claude Code 在他们的组件系统中实现。Gemini 设计,Claude 构建。

Zoe 为每个任务选择正确的代理,并在它们之间路由输出。计费系统 bug 给 Codex。按钮样式修复给 Claude Code。新仪表板设计从 Gemini 开始。

成本

每月大约 $100 给 Claude,$90 给 Codex,但你可以从 $20 开始。

当前遇到的瓶颈

他现在遇到的瓶颈是:RAM。

每个代理都需要自己的 worktree。每个 worktree 都需要自己的 node_modules。每个代理运行构建、类型检查、测试。五个代理同时运行意味着五个并行 TypeScript 编译器、五个测试运行器、五组依赖加载到内存中。

他的 16GB Mac Mini 在开始交换前最多跑 4-5 个代理——而且还得够幸运它们不要同时尝试构建。

所以他买了一个 128GB RAM 的 Mac Studio M4 Max($3,500) 来驱动这个系统。3 月底到货,他会分享是否值得。

启示

我们会在 2026 年看到大量一人百万美元公司开始。对那些理解如何构建递归自我改进代理的人来说,杠杆是巨大的。

它看起来是这样的:一个 AI 编排器作为你自己的延伸(就像 Zoe 对他),将工作委托给处理不同业务职能的专业代理。工程。客户支持。运营。市场。每个代理专注于它擅长的。你保持专注和完全控制。

下一代创业者不会招一个 10 人的团队来做拥有合适系统的人能做的事。他们会像这样构建——保持小规模,快速移动,每天交付。

个人思考

看完这个案例,我有几个感触:

  1. 这不是要取代人类。人类仍然需要设定目标、做战略决策、做最终审查。AI 代理只是放大了人类的产出能力。

  2. 编排层是关键。直接用 Claude Code 当然能提高效率,但要达到”一天94次提交”这种量级,需要一个更高层的系统来管理、协调、监控多个代理。

  3. 业务上下文不能丢。为什么需要编排层?因为只有编排器有完整的业务上下文。代理们只看到代码,看不到背后的业务逻辑、客户需求、历史决策。

  4. 自动化程度决定上限。从手动写提示词,到自动生成提示词;从手动审查,到三层 AI 自动审查+最终人工确认;每个环节的自动化都能大幅提升效率。

  5. 成本相对可控。一个月不到 $200 的成本,却能实现这么高的产出,ROI 还是挺高的。

当然,这个系统也有明显的局限——RAM。这也提示我们,基础设施要跟上。

但更重要的是,这种”人+AI编排器+AI代理集群”的模式,可能是未来的主流工作方式。

参考

原文: https://x.com/elvissun/status/2025920521871716562、https://x.com/huangyun_122/status/2026370426881060945

AI 实践

前两天刷推看到一个案例,一个哥们用 8 天时间搞了 4 万行 TypeScript,17 个插件,3000 多个测试。而且最主要的是,这活儿基本全是 AI 干的。

我当时第一反应是:这特么怎么做到的?

阅读全文 »

AI 思考

最近看到一篇关于规范驱动开发的文章,作者指出一个有趣的现象:规范也是文档,而文档总是过时的

这话说的没错,但我有一点点不同看法。规范驱动开发不是过时了,而是在AI时代进化了

不过,在讲怎么进化之前,我想先聊一个更底层的问题——为什么有时候规范是最新的,效率还是没提升?

阅读全文 »

Vibe Coding

写在前面

作为干技术的人,我看过不少Vibe Coding的示例——坦白说,个人觉得也就那么回事。几行提示词搭个待办清单就自称“全栈开发者”;把ChatGPT当补丁工具用就觉得自己在“重构软件工程”。是有些看不上的。 直到看完Lazar这场访谈。

我紧张了。

一个从来没写过一行代码的人,能把事情做到这个程度:在token预算里做架构设计,在上下文窗口的夹缝里做项目管理,在“够用”和“魔法”之间做审美决策。他能主导产品从0到1的落地,能和精英工程师协作而不拖后腿,能把模糊的商业想法翻译成机器能执行的指令——他真正把Vibe Coding做成了一份职业,甚至是一门手艺。

读完你会发现,Vibe Coding不是逃避技术的借口,而是对另一种能力的极致要求:清晰、品味、以及知道什么才是真正重要的。

访谈链接:https://www.youtube.com/watch?v=0XNkUdzxiZI

几个月前,Lovable增长负责人Elena Verna在播客中提到,她和一个“专业的Vibe Coding师”一起工作——全职,拿工资,却不写代码。这个人叫Lazar。

两周前,主持人终于把Lazar请到了麦克风前。一个半小时的对话,我记了六千字笔记。聊完只有一个感受:关于“AI会不会取代程序员”的争论,其实问错了问题。

真正的问题是:当“把东西做出来”变得无比廉价,什么能力会变得无比稀缺?

Lazar的答案非常直接:清晰度、品味、判断力。下面是他完整的工作流和心法——一个从来没写过一行代码的人,如何成为顶尖的AI原生构建者。


一、一个“Vibe Coder”到底在做什么?

Lazar的职位描述听起来像个玩笑:每天用Lovable把想法推到生产环境,从营销模板到内部工具,从Shopify集成的模版到公司的周边商城——你在官网上买的那件衬衫,就是从他自己搭的商店里卖出去的。

“我做的是我愿意免费做的事情,世界上最好的工作。”Lazar说。

他的角色在公司内部像个“游牧者”:今天在增长团队,明天帮企业组做内部工具,后天又在社区组捣鼓新东西。没有固定的汇报线,只有一个模糊的指令:“这是一个想法,最快速度把它变成现实。”

这听起来像极了一个拿着锤子到处找钉子的疯子。但Lazar说,这恰恰是AI时代的稀缺能力——把模糊的想法,翻译成机器能执行的指令


二、“我没写过一行代码”——优势还是劣势?

Lazar非常坦诚:在加入Lovable之前,他这辈子没写过代码。最多手敲过几次console.log

“没有技术背景反而是种优势,”他说,“因为我根本不知道自己‘不该做什么’。”

他讲了个例子:六个月前,社区有人说希望Lovable能做Chrome扩展。技术人员立刻开始解释:我们是React栈,架构不兼容,这很麻烦……但非技术的人只会想:嗯?为什么不行?Lazar直接对着工具说:“基于这个应用给我做一个Chrome扩展。”

结果做出来了。

类似的事还有:社区经理在做演示文稿时随口说了句“如果这是个视频会很酷”,就直接用提示词在Lovable里生成了一个真正的视频——当时连这个功能都没正式上线。

Lazar把这种心态叫做 “积极的妄想”:在被证明不行之前,默认一切皆有可能。

但他也承认,没有技术背景的人容易掉进两个陷阱:

  1. 卡住了不知道怎么排障。
  2. 搭了个摇摇欲坠的系统,某天突然崩掉,自己完全不知道为什么。

所以他在做的,并不是鼓吹“不学编程”,而是重新定义“学什么”。


三、清晰度,才是真正的编程语言

Lazar反复强调一个观点:AI输出比人类快得多,瓶颈早就不在“写代码”上,而在“你知道自己想写什么”上。

他把80%的时间花在规划和聊天上,只有20%在执行计划。

“我在优化‘正确的速度’,大多数人在优化‘错误的速度’。”他说。

那什么是“正确的速度”?

Lazar用了一个阿拉丁与灯神的比喻:你一次只能许三个愿望,不是三万个。 LLM的上下文窗口就是你的token预算——你用多少来理解问题、多少来搜索、多少来思考、多少来执行代码,完全取决于你的输入质量。

“如果你只丢一句‘帮我做个应用’,然后抱怨AI生成的东西太丑、太烂、全是bug——那是你自己的问题。你没给工具足够的清晰度,却指望它读心。

那么,如何获得清晰度?

Lazar的工作流让我大开眼界:


方法一:并行五个项目,让AI自己卷自己

这可能是最反常识的一步。

大多数人的习惯是:一个项目,反复改,反复调,越调越乱。Lazar的做法是:同时开五个Lovable窗口,从五个完全不同的角度起手。

  • 第一个:大脑倾倒。想到什么说什么,纯粹探索。
  • 第二个:稍微清晰一点,列出大概要哪些页面、哪些功能。
  • 第三个:找一张Dribbble截图,丢进去,“做成这个风格”。
  • 第四个:找一个现成的代码片段,精确复刻某个组件。
  • 第五个:把前四个的“赢家”要素揉在一起。

“很多人问我为什么发货这么快,”Lazar说,“因为我从来不一次只做一个项目。我等一个智能体跑完的时间,足够另四个窗口同时推进。”

等五个版本都跑出来,哪个对、哪个错、哪个好看、哪个好用,一目了然。清晰度不是在脑子里想出来的,是在对比中长出来的。


方法二:用PRD给AI当“导航系统”

一旦方向确定,Lazar会做一件更反直觉的事:停掉所有构建,花一整天写文档。

他至少写四个文档:

  1. 主计划(Master Plan):10,000英尺视角,为什么做这个、为谁做、希望用户有什么感受。
  2. 实施计划(Implementation Plan):高层顺序,先从后端还是前端?表结构怎么设计?API什么时候接?
  3. 设计指南(Design Guide):具体到CSS变量、颜色梯度、字体系统。
  4. 用户旅程(User Journey):用户注册后第一步做什么?第二步做什么?什么算“完成”?

这些文档汇总成一个plan.mdtasks.md,成为项目的“真理源”。

“之后我的提示词就只剩一句话:继续下一个任务。”Lazar说,“我不需要再重复上下文,因为上下文已经全在文档里了。智能体每次启动任务,先读最新版的tasks.md,然后执行,执行完告诉我做了什么、应该怎么测试。”

这就是他说的 “动态上下文迁移”:不是靠聊天窗口的滚动记忆,而是靠持续更新的文档,让token永远分配在“解决问题”上,而不是“回忆我们在干什么”上。


四、卡住了怎么办?Lazar的4x4调试框架

不管你计划得多好,总会遇到bug。Lazar有个简单的 “4x4脱困框架” ,每种方法只试一次:

第一层:让工具自己修。 Lovable、Cursor、Claude Code都有“尝试修复”按钮。很多时候只是个小错,工具自己就能纠正。

第二层:加日志,让它看见问题。 如果工具不知道自己在犯错,它就永远修不好。Lazar的做法是:让工具在关键路径上加console.log,运行一遍,把日志拷回聊天窗口。99%的情况下,这就够了。

第三层:引入外部顾问。 他会把代码库导出到GitHub,然后丢给Codex(或者Claude + RepoMix),只做诊断,不改代码。拿到诊断结论,再回Lovable修复。

第四层:回滚。 很多时候是你自己的问题——提示词写歪了,前提设错了,或者只是累了。回退三步,深呼吸,重写提示。有时候同样的请求再跑一遍,它就过了。

最后还有 “第4.5层”:等bug修好,切到聊天模式问它:“我刚才用了四层才修好。你教我,下一次我该怎么提示,才能一次到位?”

99%的时候,它会给你一个非常好的答案。然后你把答案写进rules.md或项目知识库,从此它就知道“你这个人容易在哪些地方犯错”,下次自动帮你避坑。


五、技术栈不再重要,重要的是品味

访谈后半段,主持人问了一个很多人关心的问题:职业标签会不会失效?程序员、设计师、PM,以后还有区分吗?

Lazar的回答很直接:

“我如果现在有个18岁的弟弟问我该学什么,我可能会说:去当水管工。别读CS了。”

“不是因为工程不重要——我们比以往任何时候都更需要精英工程师来撑住基础设施。而是因为,对于一个18岁的人来说,四年的机会成本太高了。

他的逻辑是:当“把东西做出来”变得极其廉价,“做出好东西”就变成了稀缺能力。而“好东西”的判断标准,99%与代码无关——是设计、是品味、是对人类情感的理解。

他承认自己最大的成长,来自和Lovable的设计师们一起工作。

“我以前觉得一个渐变就是三个颜色。直到我点开Figma,发现一个看起来‘很简单’的背景,用了50层——不同梯度、不同不透明度、不同叠加模式。那一刻我才明白,原来我一直以为的‘够用’,离‘世界级’有多远。”

他现在甚至会专门做一个应用来“学习设计风格”:波普艺术、玻璃拟态、新粗野主义……每个风格配一组可复制的提示词,公开分享。

“我的安全感不来自职位,也不来自公司,”他说,“来自我知道自己能快速学会新工具、快速理解需求、快速做出有美感的产品。


六、给每一个想入局的人:从构建开始

访谈的最后,主持人问:如果只能给听众一条建议,你会说什么?

Lazar几乎没有犹豫:

“今天就去构建点什么。”

“不要等自己想清楚。你的想法永远不会自己变清楚。开五个窗口,同时试五个方向。让AI帮你试错,帮你迭代,帮你把模糊变成具体。”

“然后,把你的过程公开。不用等完美,不用等大作品。真实持续的输出,比任何简历都管用。

他说自己当初进入Lovable,没有投简历,没有内推,只是在X上持续发自己做的小项目、踩过的坑、试过的提示词。公司的人看到了,主动找过来。

“作品就是机会。”他说。


尾声:魔法与够用之间

这场访谈让我印象最深的,是Lazar对“未来竞争力”的定义。

他说,我们正在快速进入一个 “人人都能产出够用”的世界。任何人花两小时,都能用AI搭出一个能跑通的SaaS、一个像模像样的官网、一个带数据库的小工具。

“够用”不再是护城河。

真正拉开差距的,是你能不能做出 “魔法感” ——让用户第一次点开页面时,心里“哇”一声;让同事用你做的内部工具时,感觉“这比市面上的商业软件还顺手”。

而这种魔法感,不来自你会不会写React,不来自你用Supabase还是Firebase,也不来自你的代码有没有遵循SOLID原则。

它来自你的判断力——知道什么该留,什么该砍,什么该磨三天,什么该一键生成。

它来自你的清晰度——能把脑子里那团模糊的、兴奋的、不确定的感觉,翻译成一行行工具能理解的指令。

它来自你的品味——能区分“还行”和“惊艳”,能为了一个渐变叠加层多试二十次,能在所有人都满足于“跑通了”的时候,对自己说:

“还可以更好。”

而这,是AI永远无法外包的能力。

AI Infrastructure

写在前面

最近发现个项目叫 PAI(Personal AI Infrastructure),看了下挺有意思。

核心想法很简单:**把 AI 从”临时工具”变成”持久基础设施”**。

不像 ChatGPT 那种问完就忘,PAI 让 AI 记住你是谁、你在做什么、你之前怎么处理类似问题。用下来最大的感受是:AI 终于不用每次都当陌生人重新认识了。

这篇文章不谈虚的,直接讲怎么搭起来。

说明:以下步骤都是我实际搭建时验证过的,遇到的问题和解决方法也都记录在「踩坑」章节。


一、核心概念(两分钟看完)

1.1 PAI 是什么

方面 ChatGPT PAI
记忆 对话结束就忘 Hook 驱动的 Memory 系统(WORK/LEARNING/STATE/)
身份 不知道你是谁 TELOS 系统定义数字身份
扩展 39 个 Skills 可扩展
定制 提示词里重复 配置文件化 + Hooks 自动化
代理能力 单模型 13 个专用 Agents(Algorithm/Architect/Engineer 等)

1.2 工具栈

工具 作用 必需/可选
Claude Code AI 运行环境 必需
Bun TypeScript 运行时 必需
本地 Markdown TELOS 和记忆存储 必需
Obsidian 可视化编辑 TELOS 可选(推荐)
Git 版本控制和同步 可选

关于 Obsidian:用 Obsidian 管理 TELOS 文件的好处是有双向链接和图谱视图,能更直观地看到各文件之间的关系。不过如果你习惯用 VS Code 或 vim,也没问题。


二、安装实战(重点)

我的建议是:先跑起来,再慢慢调。别想着一次把所有配置都搞完美。

路径 A:官方安装器(推荐)

适合想要完整 PAI 功能的用户(Hooks、Skills、Agents、Voice Server 全套系统)。

1
2
3
4
5
6
7
8
# 1. 克隆仓库
git clone https://github.com/danielmiessler/PAI.git ~/Personal_AI_Infrastructure

# 2. 复制配置
cp -r ~/Personal_AI_Infrastructure/Releases/v3.0/.claude ~/

# 3. 运行安装器(8 步向导)
cd ~/.claude && bash install.sh

安装器会自动完成

  • 安装 Bun(如果缺失)
  • 创建 TELOS 文件模板
  • 注册所有 Hooks 到 settings.json
  • 配置 pai 命令别名
  • (可选)配置 ElevenLabs 语音服务

路径 B:轻量 DIY(本文重点)

适合只想快速上手核心身份功能的用户——手动创建 TELOS + 配置 CLAUDE.md + Obsidian 可视化

2.1 创建目录结构

1
2
3
4
5
6
7
8
9
10
# 创建 PAI 基础目录
mkdir -p ~/.claude/USER/identity
mkdir -p ~/.claude/MEMORY/WORK
mkdir -p ~/.claude/MEMORY/LEARNING/SYSTEM
mkdir -p ~/.claude/MEMORY/LEARNING/ALGORITHM
mkdir -p ~/.claude/MEMORY/LEARNING/SYNTHESIS
mkdir -p ~/.claude/MEMORY/LEARNING/SIGNALS
mkdir -p ~/.claude/MEMORY/RESEARCH
mkdir -p ~/.claude/MEMORY/SECURITY
mkdir -p ~/.claude/MEMORY/STATE

创建后的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
~/.claude/
├── CLAUDE.md # 主入口
├── settings.json # 配置文件
├── skills/ # PAI 技能系统
├── hooks/ # 20 个生命周期钩子
├── agents/ # 13 个专用代理
├── MEMORY/ # 记忆系统
│ ├── WORK/ # 工作跟踪
│ ├── LEARNING/ # 学习记录
│ ├── RESEARCH/ # 研究输出
│ ├── SECURITY/ # 安全审计
│ └── STATE/ # 运行时状态
└── USER/
└── identity/ # TELOS 文件

2.2 配置 Obsidian(可选但推荐)

如果你用 Obsidian 管理 TELOS:

  1. 打开 Obsidian,点击「创建新 Vault」
  2. Vault 名称:PAI-Identity(或其他你喜欢的)
  3. 文件夹路径选择:~/.claude/USER/identity
  4. 点击「打开」

这样你的 TELOS 文件就能在 Obsidian 中可视化编辑,还能看到图谱关系。

2.3 创建 TELOS 文件

TELOS 是 5 个核心 Markdown 文件,定义”你是谁”。

先填这 5 个核心文件。下面是我的示例,你可以参考着写自己的:

IDENTITY.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Identity

## 基本信息

我是 Gamehu,技术 Leader / 架构师 / 全栈开发者。

## 技术栈

**核心能力**
- 后端:Java 专家,多年架构设计经验
- 前端:React 为主,熟悉现代前端工程化
- 全栈:能独立完成从数据库到 UI 的完整开发

## 职业定位

- 技术 Leader:负责团队技术方向和决策
- 架构师:关注系统设计、可扩展性、代码质量
- 技术影响力:想建立个人技术 IP,做有影响力的人

## 兴趣领域

**技术前沿**
- AI / LLM / Agent 开发
- 新技术趋势跟踪和评估
- 工具链优化和工程实践

## 性格特质

- 总想走在技术前沿
- 喜欢了解新事物,但注重实用性
- 不满足于"够用",追求"优秀"
- 想做一款属于自己的产品(网站/软件)

## 沟通风格

- 简洁直接,不绕弯子
- 实战导向,少谈理论多动手
- 喜欢用代码和示例说话
- 中文思考,中文对话

GOALS.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Goals

## 长期愿景(3-5 年)

- 建立技术影响力,做有 IP 的人
- 做一款属于自己的产品

## 中期目标(1 年内)

- 掌握 AI 原生开发能力
- 持续输出高质量技术内容

## 当前项目

- [ ] 完成 PAI 搭建和优化
- [ ] AI Agent 开发实践
- [ ] 技术文章持续输出

SKILLS.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Skills

## 技术能力

### 后端 - 专家级

- **Java**:多年实战经验,Spring 生态深入
- **架构设计**:DDD、微服务、分布式系统
- **数据库**:PostgreSQL、MySQL、Redis
- **DevOps**:Docker、K8s、CI/CD

### 前端 - 精通

- **React**:主技术栈,Hooks 生态
- **前端工程化**:Webpack、构建优化
- **CSS**:Styled Components、Tailwind

### 全栈

- 能独立完成完整功能开发
- 前后端联调、部署都在行

## 正在学习

### AI / LLM

- Prompt Engineering
- Agent 开发(Claude Code、自定义 Agent)
- RAG 原理和实现

### 技术前沿

- 持续关注新框架、新工具

VALUES.md

1
2
3
4
5
6
7
8
9
10
11
12
# Values

## 核心价值观

- **实用主义**:不折腾,快速验证想法
- **技术追求**:关注代码质量而非炫技
- **影响力**:通过技术输出建立个人品牌

## 决策原则

- **简单优于复杂**:能用简单方案就不过度设计
- **实用优于完美**:先跑起来再优化

BELIEFS.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Beliefs

## 关于技术

- 技术是手段,不是目的
- 架构比实现重要
- 代码质量是长期价值

## 关于学习

- 深度大于广度
- 实践驱动学习
- 记笔记,建立知识体系

## 关于 AI

- AI 是增强,不是替代
- 上下文是关键
- 个人 AI 基础设施是未来方向

2.4 更新 CLAUDE.md 主入口

~/.claude/CLAUDE.md 开头添加 TELOS 引导:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 你是 Gamehu 的个人 AI 助理

## 你的身份

- 我是 Gamehu,技术 Leader / 架构师 / 全栈开发者
- 核心技术栈:Java(专家级)、React(精通)、架构设计
- 目标:建立技术影响力,做有 IP 的人,梦想做一款自己的产品

## TELOS 数字身份

**在每次对话开始时,先阅读以下 TELOS 文件了解我**

1. `~/.claude/USER/identity/IDENTITY.md` - 我是谁
2. `~/.claude/USER/identity/SKILLS.md` - 我会什么
3. `~/.claude/USER/identity/GOALS.md` - 我想达成什么
4. `~/.claude/USER/identity/VALUES.md` - 我重视什么
5. `~/.claude/USER/identity/BELIEFS.md` - 我相信什么

## Memory 记忆系统

- 对话中的重要决策和学习,由 Hooks 自动捕获并保存到 `~/.claude/MEMORY/LEARNING/`
- 主动从我过去的对话中学习,记住我的偏好和决策模式
- 当我重复问类似问题时,参考我之前的答案

---
# 任何项目都务必遵守的规则(极其重要!!!)

2.5 配置 pai 命令别名(可选)

~/.zshrc 末尾追加:

1
2
# PAI 命令别名
alias pai='cd ~/.claude && claude'

然后重新加载配置:

1
source ~/.zshrc

2.6 验证配置

重启 Claude Code,然后问:

1
你知道我是谁吗?

如果 AI 能正确回应你的身份信息(根据 IDENTITY.md),说明配置成功了。


三、核心组件详解

3.1 Memory 系统 v7.0

PAI v3.0 使用新的 Memory 架构(取代旧的 hot/warm/cold 模型):

目录 用途 格式
WORK/ 工作跟踪,每次会话自动创建 目录 + YAML
LEARNING/ 从对话中提炼的学习记录 Markdown + JSONL
RESEARCH/ Agents 输出捕捉 Markdown
SECURITY/ 安全审计事件 JSONL
STATE/ 快速运行时数据 JSON

数据流

1
2
3
4
5
6
7
8
9
用户请求

Claude Code projects/ (原生会话存储)

Hooks 自动捕获:
├── AutoWorkCreation → WORK/
├── ResponseCapture → WORK/, LEARNING/
├── RatingCapture → LEARNING/SIGNALS/
└── WorkCompletionLearning → LEARNING/

3.2 Skills 系统

PAI 内置 39 个 Skills,涵盖思考、研究、开发、安全等全领域:

类别 代表 Skills
核心系统 PAI, PAIUpgrade, Telos
思考分析 Science, FirstPrinciples, IterativeDepth, BeCreative
研究工具 Research, OSINT, Recon, Parser
开发工具 CreateSkill, CreateCLI, Cloudflare
内容处理 Fabric, Documents, ExtractWisdom, WebAssessment
安全工具 RedTeam, PromptInjection, SECUpdates
专用代理 Agents - 13 个命名 Agent(Algorithm/Architect/Engineer 等)

使用方式:在对话中直接调用,例如 /science/telos/fabric

3.3 Hooks 系统

Hooks 在特定生命周期事件时触发,自动执行相应逻辑。PAI v3.0 有 20 个 Hooks:

Hook 类型 触发时机 典型 Hooks
SessionStart 会话开始 StartupGreeting, LoadContext, CheckVersion
UserPromptSubmit 提交问题时 RatingCapture, AutoWorkCreation, SessionAutoName
PreToolUse 调用工具前 SecurityValidator, AgentExecutionGuard, SkillGuard
PostToolUse 工具调用后 AlgorithmTracker, QuestionAnswered
SessionEnd 会话结束 WorkCompletionLearning, SessionSummary, UpdateCounts

Hooks 是 TypeScript 脚本,需要 Bun 运行时来执行。这就是为什么安装 Bun 是必需的。

3.4 Agents 系统

PAI 提供 13 个专用 Agent,每个都有明确的 persona 和专长:

Agent 专长 用途
Algorithm ISC 专家,验证纯粹主义者 系统化问题解决
Architect 系统设计 架构规划和设计
Engineer 构建和实现 代码实现
Designer 设计决策 UI/UX 设计
QATester 质量保证 测试和验证
Intern 学习和初级任务 辅助性任务

四、日常使用

4.1 常用 Skills

命令 作用
/science 科学方法思考和迭代
/telos 管理 TELOS(个人 + 项目分析)
/fabric 240+ 种提示词模式(提取、总结等)
/brainstorm 创意风暴和需求分析

4.2 典型工作流

1
启动 Claude Code → AI 加载 TELOS → 执行任务 → Hooks 自动捕获学习

五、踩坑记录(实战验证)

5.1 Bun 未安装

问题:Hooks 是 TypeScript 脚本,执行需要 Bun。如果 Bun 没有安装,Hooks 无法运行。

解决

1
2
3
curl -fsSL https://bun.sh/install | bash
source ~/.zshrc
bun --version # 验证安装

5.2 Memory 目录未创建

问题:首次使用时,MEMORY/ 下的子目录(WORK/、LEARNING/ 等)不存在,Hooks 会报错。

解决

1
2
3
4
5
6
7
8
9
# 创建完整的 Memory v7.0 目录结构
mkdir -p ~/.claude/MEMORY/WORK
mkdir -p ~/.claude/MEMORY/LEARNING/SYSTEM
mkdir -p ~/.claude/MEMORY/LEARNING/ALGORITHM
mkdir -p ~/.claude/MEMORY/LEARNING/SYNTHESIS
mkdir -p ~/.claude/MEMORY/LEARNING/SIGNALS
mkdir -p ~/.claude/MEMORY/RESEARCH
mkdir -p ~/.claude/MEMORY/SECURITY
mkdir -p ~/.claude/MEMORY/STATE

5.3 Hooks 未注册

问题:Hooks 文件存在但没有在 settings.json 中注册,导致不会触发。

解决:确保 settings.json 中包含完整的 hooks 配置(参考官方模板)。

5.4 TELOS 路径错误

问题:CLAUDE.md 中引用的 TELOS 文件路径与实际位置不符。

检查

1
2
ls ~/.claude/USER/identity/
# 应该看到 IDENTITY.md, SKILLS.md, GOALS.md, VALUES.md, BELIEFS.md

5.5 图片文件名不匹配

问题:Hexo 的 asset_img 标签引用的文件名与实际文件名不一致。

解决:确保引用名称与实际文件名完全一致(包括扩展名)。


六、Obsidian 进阶配置

如果你用 Obsidian 管理 TELOS,有几个插件值得装:

插件 作用
Graph Analysis 可视化 TELOS 各文件的关系
Dataview 查询和汇总 TELOS 内容
Templates 快速创建新 TELOS 条目

一个小技巧:在 Obsidian 中设置 [[GOALS]] 为首页,每次打开都能看到当前目标。


七、延伸思考

PAI 让我重新思考了 AI 的使用方式。

以前把 AI 当”临时工”,用完就扔。现在更像”长期助理”,相处越久越懂你。

关键区别:不是模型更强,而是上下文更完整。

当 AI 知道你的背景、理解你的目标、记住你的决策历史,它给出的建议就不再泛泛而谈,而是真正贴合你的情况。

这才是”个人” AI 的含义。


八、参考资源


最后

没有银弹。

PAI 不是万能药,它只是一个框架,让你更系统地使用 AI。

真正有价值的是:你有意识地构建自己的数字基础设施,而不是每次都从头开始。

Skills 第1篇

写在前面

最近有个不太懂技术的同事来问我,Skills、Rules 这些概念到底有啥区别,该怎么区分它们的作用。我本来以为自己比较了解,结果讲着讲着就发现,我对这些概念的边界和协同逻辑,好像没那么清晰,看着同事那疑惑的眼神以及收尾那不太肯定的“嗯”,想着必须重新了解,从“能力、约束、调度、协议”四个维度,把它们的区别摸透。既能补全自己的认知漏洞,也希望能给有同样困惑的朋友,尤其是刚接触这块的同事,能比较清晰的给他们讲清楚。

对于 AI 的重度用户或初级开发者来说,经常会混淆:到底什么是“规则”,什么又是“技能”? 当 Anthropic 推出 MCP 协议后,这层关系变得更加扑朔迷离。
这篇旨在尽量简单生动的理清这四个概念。

一、概念定义:AI Agent 的四层架构模型

构建成熟可用的 AI 智能体应用,核心在于协调四大要素形成闭环链路。各层级各司其职、层层支撑,既明确边界又深度协同,共同构成智能体稳定运行的核心骨架。

1. Skills(能力层)—— 破解“做得到”的可行性难题

  • 技术定义:Skills 是 AI 智能体的显性能力外延,核心落地形态为 Function Calling(函数调用)External Tools(外部工具集成),是智能体突破自身能力边界、落地实际操作的关键载体。

  • 核心职能:大语言模型(LLM)通过 JSON Schema 描述符,精准解析工具的功能范围、参数规范及返回格式,打破自身训练数据的时空限制,实现从“文本生成”到“落地执行”的核心跨越。

2. Rules(控制层)—— 筑牢“不越界”的合规性底线

  • 技术定义:Rules 是智能体的运行准则与风格锚点,通常通过 System Prompt(系统提示词) 硬编码或 Guardrails(护栏系统) 部署,形成刚性约束框架,划定运行边界。

  • 核心职能:以确定性逻辑约束随机性模型的输出,在生产环境中承担三大核心职责——安全性防护(Safety)、品牌调性统一(Tone)、输出格式标准化,从根源上规避模型“幻觉”与违规风险。

3. Prompt(调度层)—— 打通“懂需求”的意图性链路

  • 技术定义:Prompt 是用户意图与模型上下文的实时动态组合体(Context Window),是指令传递、需求转化与场景激活的核心媒介。

  • 核心职能:在 Rules 划定的约束框架内,精准捕捉并转化用户需求,按需激活对应 Skills 工具,实现“需求-能力”的精准匹配,驱动任务全流程推进。

4. MCP(协议层)—— 破解“连得上”的连接性瓶颈

  • 技术定义Model Context Protocol(模型上下文协议,简称 MCP) 由 Anthropic 牵头发起,是聚焦智能体与异构数据源互联适配的开放技术标准。

  • 核心职能:实现数据源(Resources)与模型端的解耦设计,通过标准化接口让 AI 智能体“即插即用”访问各类数据资源(数据库、本地文件、SaaS 应用等),是 Context-as-a-Service(上下文即服务) 模式落地的核心基础设施。


二、场景推演:以“AI 数字化导游”为例

为具象化四大模块的协同逻辑,我们以“AI 商务出行助手”(原“数字化导游”适配场景)为例,拆解智能体响应商务需求的全流程运行链路:

用户输入(Prompt):“我下周三要去上海出差,帮我结合日程表规划通勤路线,并订一张符合要求的机票。”

架构维度 实际运行逻辑 核心架构价值
Rules 底层刚性约束:1. 交互全程礼貌称呼用户,保持专业商务调性;2. 机票预订严格遵循公司报销标准(单张≤¥2000);3. 仅规划通勤路线,严禁推荐无关景区及违规服务。 筑牢合规基准,确保输出既符合企业行政政策,又规避安全风险,保持风格统一。
MCP 通过 MCP 协议实现数据互联,自动读取用户 Outlook 日程表(确认出差具体时段)、Notion 行程偏好(如座位、航司倾向),无需人工手动录入或复制信息。 低成本构建实时上下文,打通数据孤岛,保障信息获取的高效性与私密性。
Skills 识别用户核心意图后,自动激活 Flight_Search_API 查询符合预算的航班余票,调用 Map_Routing_SDK 结合日程与酒店位置计算最优通勤路线。 将文本需求转化为实际业务操作,落地“查询-规划-预订”的核心功能,突破纯文本输出局限。
Prompt 整合“上海”“下周三”等用户指令参数,叠加 MCP 获取的日程/偏好数据、Skills 返回的航班/路线信息,生成结构化出行建议(含航班备选、通勤方案)。 串联全流程模块,实现“意图输入-结果输出”的闭环,驱动各环节协同落地。

三、架构特征对比表

为进一步明确四大维度的定位差异,通过核心特征对比,助力开发者精准把握各模块的设计重点与落地优先级:

维度 核心角色 核心痛点 工业级实现 变动频率
Skills 能力工具箱 解决“手脚不长”、无法落地操作的问题 Function Calling / Plugins / 工具市场集成 中(随业务需求迭代工具矩阵)
Rules 运行紧箍咒 解决模型“不可控、易幻觉”的问题 System Message / Guardrails / 合规校验引擎 低(仅随合规政策调整)
Prompt 需求指挥棒 解决“意图理解偏差”的任务匹配问题 Prompt Engineering / CoT(思维链)/ 上下文管理 高(随场景优化指令设计)
MCP 数据总线/插座 解决“数据孤岛、集成复杂”的问题 MCP Server / Client / 标准化数据接口 极低(作为基础设施长期稳定)