2026-04-19 08:00:00
随着 OpenClaw 的爆火,智能体(Agent)一词已经成了大家每天都挂在嘴边儿上的话。从“智能体”成为 2025 年度科技热词以来,说这个词被滥用或许略显激进,但当一个词进入寻常百姓家时,或许我们应该重新审视一下到底什么是智能体,这个硅基生物之于我们碳基生物又是什么角色,“它”又是如何在改变着我们的生活呢?
我搜集了互联网上对于智能体的定义:
智能体指一个可以观察周遭环境并作出行动以达到目标并且可以通过机器学习以及获取知识来提升自身性能的自主实体。 —— 维基百科
智能体是一种接收输入、解读输入,然后代表用户(无论是人类还是其他智能体)规划和执行操作的系统。 —— web.dev
AI 智能体是使用 AI 来实现目标并代表用户完成任务的软件系统。其表现出了推理、规划和记忆能力,并且具有一定的自主性,能够自主学习、适应和做出决定。 —— Google Cloud
智能体是一个系统,它利用人工智能模型与环境交互,以实现用户定义的目标。它结合推理、规划和动作执行(通常通过外部工具)来完成任务。 —— Hugging Face
如 ReAct 框架 1 所述,智能体的主要特点如下:
以 OpenClaw 为例的智能体,其能力足够丰富,在企业实践中不同场景需要不同类型的智能体以便更好(例如:更快速、更安全等)地服务其目标客户。从业务视角出发在此将智能体划分为个人助理、数字员工和数字分身三类,这三类的差异对比如下:
| 角色 | 个人助理 | 数字员工 | 数字分身 |
|---|---|---|---|
| 服务对象 | 个人 | 他人 | 个人 |
| 所有权 | 个人 | 多种 2 | 个人 |
| 身份 | 智能体自己 | 智能体自己 | 所有权人 |
| 定位 | 帮助所有权人处理个人需求 | 帮助所有权人处理他人需求 | 帮助所有权人以所有权人身份处理需求 |
| 示例 | 帮自己搜集信息 | 帮服务对象查询天气 | 帮自己去参加在线会议 |
结合 OpenClaw 的定义(OpenClaw is a self-hosted gateway …, and it becomes the bridge between your messaging apps and an always-available AI assistant. 3),其更符合个人助理的角色定位。数字分身相比另外两个角色最大的特点是其身份代表的是所有权人,除了技术实现难度外,更重要的是伦理问题。当数字员工出现问题时,是应该所有权人为其负责还是技术服务提供者为其负责呢?这个问题类似智能驾驶,当出现交通事故时,是应该由驾驶员承担责任还是自动驾驶服务提供商承担责任呢?目前来看,几乎全部责任仍是由驾驶人员承担。
从技术视角出发,个人助理和数字员工两个重要角色差异对比如下:
| 角色 | 个人助理 | 数字员工 |
|---|---|---|
| 知识 | 私有 + 共有 | 共有 + 权限管控 |
| 数据 | 私有 + 共有 | 共有 + 权限管控 |
| 技能 | 私有 + 共有 | 共有 + 权限管控 |
| 渠道 | 私有 | 共有 + 权限管控 |
| 定制化 | 程度高 | 程度低 |
| 核心目的 | 节省自己的资源(时间等) | 节省组织的资源(人力等) |
不难看出,个人助理和数字员工的一个核心差异在于权限。个人助理的权限管控并不在智能体内部实现,也就是说当你有某个权限的时候,只要你想个人助理就可以有,权限的边界在智能体之外。但数字员工的权限管控需要在智能体内部实现,数字员工使用同一个渠道对外提供服务,我们必须根据服务对象的不同采取不同的操作。个人助理是可以高度化定制的,只要你想怎么搞都是你自己的事。但数字员工受限就会很多,因为要面向多人服务,我们需要考虑响应的时效性、服务的稳定性、数据的安全性等等。
个人助理解决的是个人的长尾事务,只有将自己从重复繁琐的任务解放出来,我们才能够有更多的时间去思考更重要的事情。而数字员工解决更多的是通用类型的事务,这样才能够服务更多的用户,从而提高组织效能。
其实我们也无需将个人助理和数字员工割裂来看,在个人助理上做一些适当的加减法就可以让其变成数字员工,同时数字员工之于个人助理也可以看作是一项技能而为其所用。我个人认为从个人助理进化到数字员工是一个先做减法再做加法的过程。
当前的个人助理已经是一个可以高度定制同时具有一定自主能力的智能体。在企业应用过程中,基于安全等因素的考虑我们必须在一定程度上限制其灵活性,才能够一方面高效的满足用户需求另一方面避免其成为一匹脱缰的野马。换句话说就是从个人助理的执行优先转变到数字员工的治理优先。这里感觉和当下的 Harness Engineering 有些许呼应,Harness 给到了系统运转的最佳范式,但同时也指定了相应的约束机制。约束的方式(代码层、Prompt 层、Skill 层)和约束的强度影响着任务执行的灵活程度。
正如员工在进入组织前期,他首先要学习的就是组织的规章制度,什么可以做,什么不可以做。当员工对组织的要求清晰之后,才会被允许从事更加复杂的工作,才会被赋予更多的自主权。在这个过程中组织仍会定期观测,同时对必要的问题做出反馈并要求员工进行修正。在此也收集了智能体 4、数字员工 5 和自动驾驶 6 的分级对比:
| 级别 | 自动驾驶 | 智能体 | 数字员工 |
|---|---|---|---|
| L1 |
辅助驾驶 车辆对方向盘和加减速中的一项操作提供驾驶,人类驾驶员负责其余的驾驶动作。 |
规则符号智能 意图 + 行动 |
功能级-辅助工具 作为工具被调用,人类执行并闭环任务。 |
| L2 |
部分自动驾驶 车辆对方向盘和加减速中的多项操作提供驾驶,人类驾驶员负责其余的驾驶动作。 |
推理决策智能 意图 + 行动 + 推理和决策 |
任务级-任务执行 执行被分解的任务,人类拆解分配任务。 |
| L3 |
条件自动驾驶 由车辆完成绝大部分驾驶操作,人类驾驶员需保持注意力集中以备不时之需。 |
记忆反思智能 意图 + 行动 + 推理和决策 + 记忆和反思 |
协作级-协作自治 自主拆解及分配任务、闭环执行,人和数字员工协作,人类监督。 |
| L4 |
高度自动驾驶 由车辆完成所有驾驶操作,人类驾驶员无需保持注意力集中,但限定道路和环境条件。 |
自主学习智能 意图 + 行动 + 推理和决策 + 记忆和反思 + 自主学习 + 泛化 |
指导级-专业指导 提供达到人类专家水平的定制化服务,人类参与。 |
| L5 |
完全自动驾驶 由车辆完成所有驾驶操作,人类驾驶员无需保持注意力集中。 |
个性群体智能 意图 + 行动 + 推理和决策 + 记忆和反思 + 自主学习 + 泛化 + 人格 + 协作 |
智慧级-自主智慧 超越人类专家水平的能力,全面自主,人类授权。 |
我认为我们目前正处于 L3 至 L4 之间的一个地带,我相信在不久的将来我们可以突破 L4 迈入 L5。我希望 AI 会一直是为人所用,而不希望如之前博客所描述的人类成为 AI 的奴隶。引用一下阿西莫夫的机器人三定律,希望在生产力高速发展的同时我们也可以更多的关注一下 AI 可能引起的一系列社会和伦理问题。
2026-04-18 08:00:00
本教程将介绍在 macOS 环境下部署 OpenClaw,QwenPaw 和 Hermes Agent。如无特殊说明,macOS 系统下需在终端中执行命令,Windows 系统下需要在 PowerShell 中执行命令。本教程涉及到的软件信息如下:
| 软件 | 版本 |
|---|---|
| Podman | 5.8.2 |
| OpenClaw | 2026.4.16 |
| QwenPaw | 1.1.2 |
| Hermes Agent | 0.10.0 |
为了更好的进行环境隔离,后续我们使用 Podman 安装不同的智能体框架。
启用或关闭 Windows 功能,在打开的窗口中将 Hyper-V 和 适用于 Linux 的 Windows 子系统 及其子项全部勾选,单击确定,待系统启用功能后重启电脑。运行如下命令安装 Podman:
brew install podman
brew 安装请参见:https://brew.sh/
scoop install podman
scoop 安装请参见:https://scoop.sh/
为了方便观察 Podman 的运行情况,可选的运行如下命令安装 Podman Desktop:
brew install podman-desktop
scoop install podman-desktop
安装完毕后,运行如下命令初始化并启动 Podman:
podman machine init
podman machine start
podman machine init
podman machine start
运行如下命令查看 Podman 的安装和运行情况:
podman info
podman info
更多 Podman 使用方法请参考 Podman 文档。有关 Podman Desktop 的使用方法请参考 Podman Desktop 文档。
克隆 OpenClaw 的源代码至本地:
git clone [email protected]:openclaw/openclaw.git
git clone git@github.com:openclaw/openclaw.git
运行如下命令安装 OpenClaw CLI:
curl -fsSL https://openclaw.ai/install-cli.sh | bash
命令会在 ~/.openclaw 目录下安装 Node 环境和相关依赖。进入 OpenClaw 源代码目录下,运行如下命令构建 Gateway 容器:
export OPENCLAW_DOCKER_APT_PACKAGES="chromium"
./scripts/podman/setup.sh
其中 OPENCLAW_DOCKER_APT_PACKAGES 表示构建 Gateway 容器时使用 apt 命令额外安装的软件包。运行如下命令启动 Gateway 容器:
./scripts/run-openclaw-podman.sh launch
运行如下命令进行配置:
./scripts/run-openclaw-podman.sh launch setup
在配置过程中根据实际情况对模型提供商等选项进行配置。配置如下环境变量来使用宿主机中的 OpenClaw CLI 管理 OpenClaw 容器:
export PATH="$PATH:/Users/leo/.openclaw/bin"
export OPENCLAW_CONTAINER=openclaw
在合适的目录创建如下文件夹:
mkdir /path/to/openclaw
mkdir /path/to/openclaw/workspace
进入 OpenClaw 源代码目录下,运行如下命令构建 Gateway 容器:
podman build -t openclaw:local -f Dockerfile . --build-arg OPENCLAW_DOCKER_APT_PACKAGES="chromium"
其中 OPENCLAW_DOCKER_APT_PACKAGES 表示构建 Gateway 容器时使用 apt 命令额外安装的软件包。运行如下命令配置并启动 Gateway 容器:
$env:OPENCLAW_CONFIG_DIR = "/path/to/openclaw"
$env:OPENCLAW_WORKSPACE_DIR = "/path/to/openclaw/workspace"
podman compose run --rm --no-deps --entrypoint node openclaw-gateway `
dist/index.js onboard --mode local --no-install-daemon
podman compose run --rm --no-deps --entrypoint node openclaw-gateway `
dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'
podman compose up -d openclaw-gateway
在配置中过程中根据实际情况对模型提供商等选项进行配置。
使用 Podman 安装 OpenClaw 后,重启 Gateway 的命令如下:
podman restart openclaw
podman restart openclaw-openclaw-gateway-1
使用浏览器打开 http://127.0.0.1:18789/ 即可进入 OpenClaw 管理页面。更多细节请参考 OpenClaw 文档。
podman compose 命令需要在 OpenClaw 源代码目录下运行。运行如下命令配置飞书消息频道:
openclaw channels login --channel feishu
podman compose exec openclaw-gateway node dist/index.js channels login --channel feishu
使用飞书 APP 扫描生成的二维码进行后续配置即可。
首先在 Discord 中创建一个服务器,进入 Discord 开发者门户,单击 新 APP 按钮创建新的应用,并填写应用名称。
进入 概况 - 机器人 选项卡,启用 Presence Intent,Server Members Intent 和 Message Content Intent。
进入 概况 - 机器人 选项卡,单击 重置令牌
生成令牌,注意令牌仅显示一次,请妥善保管以便后续使用。
进入 概况 - OAuth2 选项卡,在 OAuth2 URL 生成器的 范围 中选中 bot 和 applications.commands。
在 机器人权限 中选中 查看频道,发送消息,阅读消息历史记录,嵌入链接,添加文件 和 添加反应。
将 已生成的 URL 中的 URL 复制到浏览器打开,按照提示安装应用并授权。
打开 Discord 应用,进入 用户设置 页面,在 开发者 菜单中启用 开发者模式。在频道图标上右键,单击 复制服务器 ID,在个人头像上左键,单击 复制用户 ID。
运行如下命令配置 Discord 消息频道:
openclaw config set channels.discord.token "你的 TOKEN"
openclaw config set channels.discord.enabled true --strict-json
podman compose exec openclaw-gateway node dist/index.js config set channels.discord.token "你的 TOKEN"
podman compose exec openclaw-gateway node dist/index.js config set channels.discord.enabled true --strict-json
向机器人发送任意消息,根据机器人回复的消息运行如下命令进行授权:
openclaw pairing approve discord <CODE>
podman compose exec openclaw-gateway node dist/index.js pairing approve discord <CODE>
此时就可以通过 Discord 私信和机器人对话了。在配置文件中添加如下内容来支持在服务器中同机器人对话:
{
"channels": {
"discord": {
"groupPolicy": "allowlist",
"guilds": {
"服务器 ID": {
"requireMention": true,
"users": ["用户 ID"]
}
}
}
}
}
默认情况下,机器人只有在被 @ 时才会响应,如果需要对每条消息都进行响应,可以将 requireMention 设置为 false。
在合适的目录创建如下文件夹:
mkdir -p /path/to/qwenpaw/data
mkdir -p /path/to/qwenpaw/secrets
mkdir /path/to/qwenpaw/data
mkdir /path/to/qwenpaw/secrets
运行如下命令使用 Podman 安装 QwenPaw:
podman pull agentscope/qwenpaw:latest
podman run -d \
--name qwenpaw \
--restart always \
-v /path/to/qwenpaw/data:/app/working \
-v /path/to/qwenpaw/secrets:/app/working.secret \
-p 8088:8088 \
agentscope/qwenpaw:latest
podman pull agentscope/qwenpaw:latest
podman run -d `
--name qwenpaw `
--restart always `
-v /path/to/qwenpaw/data:/app/working `
-v /path/to/qwenpaw/secrets:/app/working.secret `
-p 8088:8088 `
agentscope/qwenpaw:latest
使用浏览器打开 http://127.0.0.1:8088/ 即可进入 QwenPaw 管理页面。
智能体管理 中新建一个智能体,默认智能体 无法进行修改。参见:https://qwenpaw.agentscope.io/docs/channels/?lang=zh#飞书
参见:https://qwenpaw.agentscope.io/docs/channels/?lang=zh#Discord
在合适的目录创建如下文件夹:
mkdir -p /path/to/hermes-agent
mkdir /path/to/hermes-agent
运行如下命令使用 Podman 配置 Hermes Agent:
podman pull nousresearch/hermes-agent:latest
podman run -it --rm \
-v /path/to/hermes-agent:/opt/data \
nousresearch/hermes-agent:latest setup
podman pull nousresearch/hermes-agent:latest
podman run -it --rm `
-v /path/to/hermes-agent:/opt/data `
nousresearch/hermes-agent:latest setup
在配置过程中根据实际情况对模型提供商等选项进行配置。运行如下代码启动 Gateway 容器:
podman run -d \
--name hermes-agent-gateway \
--restart unless-stopped \
-v /path/to/hermes-agent:/opt/data \
-p 8642:8642 \
nousresearch/hermes-agent:latest gateway run
podman run -d `
--name hermes-agent-gateway `
--restart unless-stopped `
-v /path/to/hermes-agent:/opt/data `
-p 8642:8642 `
nousresearch/hermes-agent:latest gateway run
运行如下代码启动 Dashboard 容器:
podman run -d \
--name hermes-agent-dashboard \
--restart unless-stopped \
-v /path/to/hermes-agent:/opt/data \
-p 9119:9119 \
-e GATEWAY_HEALTH_URL=http://$HOST_IP:8642 \
nousresearch/hermes-agent:latest dashboard --host 0.0.0.0 --insecure
podman run -d `
--name hermes-agent-dashboard `
--restart unless-stopped `
-v /path/to/hermes-agent:/opt/data `
-p 9119:9119 `
-e GATEWAY_HEALTH_URL=http://$HOST_IP:8642 `
nousresearch/hermes-agent:latest dashboard --host 0.0.0.0 --insecure
将 $HOST_IP 替换为运行 Gateway 容器机器的 IP 地址(注意:需使用宿主机的 IP 地址,而不是 127.0.0.1)。使用浏览器打开 http://127.0.0.1:9119/ 即可进入 Hermes Agent 管理页面。
参见:https://hermes-agent.nousresearch.com/docs/user-guide/messaging/feishu
参见:https://hermes-agent.nousresearch.com/docs/user-guide/messaging/discord
2026-04-11 08:00:00
Matrix 是一种用于实时通讯的开放、去中心化协议,专注于安全、加密的文字、语音和视频聊天。它允许不同服务器上的用户互通,类似于邮件系统,并支持端到端加密,使用户能完全控制数据,不受单一实体限制。
Synapse 是一个使用 Python/Twisted 和 Rust 编写的开源 Matrix 服务器实现。本教程将介绍使用 Docker 容器部署 Matrix 服务器 Synapse。本教程涉及到的软件信息如下:
| 软件 | Docker 镜像 | 版本 |
|---|---|---|
| PostgreSQL | mixdeve/postgres-zhparser:18 | 18 |
| Redis | redis:8 | 8 |
| Synapse | matrixdotorg/synapse:latest | 1.151.0 |
example.com 替换为实际域名。为了支持中文搜索,在此选择内置 zhparser 分词功能的 PostgreSQL 镜像。在适当位置创建 PostgreSQL 的存储目录,例如 postgresql。运行如下命令生成配置:
docker run -d \
--name postgresql \
--restart always \
-v $(pwd)/postgresql:/var/lib/postgresql \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=<密码> \
-e ALLOW_IP_RANGE=0.0.0.0/0 \
-p 5432:5432 \
mixdeve/postgres-zhparser:18
相关参数说明如下:
| 参数 | 说明 |
|---|---|
| POSTGRES_USER | 数据库用户名,默认 postgres
|
| POSTGRES_PASSWORD | 数据库密码 |
| POSTGRES_DB | 默认数据库名,默认 postgres
|
| ALLOW_IP_RANGE | 允许访问的 IP 范围 |
进入数据库执行如下 SQL 进行配置:
-- 创建用户
CREATE USER synapse WITH PASSWORD '<密码>';
-- 创建数据库
CREATE DATABASE synapse WITH OWNER = synapse ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE = template0;
-- 授权
GRANT ALL PRIVILEGES ON DATABASE synapse TO synapse;
为了提升服务性能,在此开启 Redis 缓存。在适当位置创建 Redis 的存储目录,例如 redis。运行如下命令启动 Redis 容器:
docker run -d \
--name redis \
--restart always \
-v $(pwd)/redis:/data \
-p 6379:6379 \
redis:8 \
redis-server --save 60 1 --appendonly yes
进入服务器在适当位置创建 Synapse 的存储目录,例如 synapse。运行如下命令生成配置:
docker run -it --rm \
-v $(pwd)/synapse:/data \
-e SYNAPSE_SERVER_NAME=example.com \
-e SYNAPSE_REPORT_STATS=no \
-e SYNAPSE_HTTP_PORT=8008 \
-e UID=1000 \
-e GID=1000 \
matrixdotorg/synapse:latest generate
相关参数说明如下:
| 参数 | 说明 |
|---|---|
| SYNAPSE_SERVER_NAME | 服务器域名 |
| SYNAPSE_REPORT_STATS | 是否上报统计信息,默认 yes
|
| SYNAPSE_HTTP_PORT | HTTP 端口,默认 8008
|
| SYNAPSE_CONFIG_DIR | 配置目录,默认 /data
|
| SYNAPSE_CONFIG_PATH | 配置文件路径,默认 <SYNAPSE_CONFIG_DIR>/homeserver.yaml
|
| SYNAPSE_DATA_DIR | 数据目录,默认 /data
|
| UID | 用户 ID,默认 991
|
| GID | 组 ID,默认 991
|
修改配置文件服务部分如下:
public_baseurl: https://matrix-homeserver.example.com
serve_server_wellknown: true
修改配置文件数据库部分如下:
database:
name: psycopg2
txn_limit: 10000
args:
user: synapse
password: <密码>
dbname: synapse
host: <数据库地址>
port: 5432
cp_min: 5
cp_max: 10
修改配置文件缓存部分如下:
redis:
enabled: true
host: <数据库地址>
port: 6379
dbid: 0
运行如下命令启动服务:
docker run -d \
--name synapse \
--restart always \
-v $(pwd)/synapse:/data \
-u 1000:1000 \
-p 8008:8008 \
matrixdotorg/synapse:latest
在服务商中配置 DNS 将 matrix-homeserver.example.com 解析至 Docker 服务器的 IP 地址。通过浏览器访问 http://matrix-homeserver.example.com:8008 即可查看 Synapse 服务是否启动成功。
在 PostgreSQL 数据中运行如下 SQL 安装 zhparser 扩展并配置中文搜索:
-- 创建 zhparser 扩展
CREATE EXTENSION IF NOT EXISTS zhparser;
-- 创建中文搜索配置
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
-- 添加中文向量列
ALTER TABLE event_search ADD COLUMN IF NOT EXISTS chinese_vector tsvector;
-- 对已有数据进行中文分词处理
UPDATE event_search
SET chinese_vector =
CASE
WHEN event_search.key = 'content.body' AND TRIM(event_json.json::jsonb->'content'->>'body') != ''
THEN to_tsvector('chinese', event_json.json::jsonb->'content'->>'body')
WHEN event_search.key = 'content.name' AND TRIM(event_json.json::jsonb->'content'->>'name') != ''
THEN to_tsvector('chinese', event_json.json::jsonb->'content'->>'name')
WHEN event_search.key = 'content.topic' AND TRIM(event_json.json::jsonb->'content'->>'topic') != ''
THEN to_tsvector('chinese', event_json.json::jsonb->'content'->>'topic')
ELSE NULL
END
FROM
event_json
WHERE
event_search.event_id = event_json.event_id
AND (
event_search.chinese_vector IS NULL
OR event_search.chinese_vector::text = ''
);
-- 创建中文索引
CREATE INDEX CONCURRENTLY event_search_chinese_vector_idx ON event_search USING GIN (chinese_vector);
将修改后的 search.py 文件映射至 Synapse 容器,删除之前的容器,运行如下命令重新创建容器:
docker run -d \
--name synapse \
--restart always \
-v $(pwd)/synapse:/data \
-v $(pwd)/synapse/search.py:/usr/local/lib/python3.13/site-packages/synapse/storage/databases/main/search.py \
-u 1000:1000 \
-p 8008:8008 \
matrixdotorg/synapse:latest
search.py 是否发生变化,如有则需要重新修改支持中文的 search.py。同时请注意 Dockerfile 中镜像基于的系统环境和 Python 版本是否发生变化,如有则需要对应调整将修改后 search.py 文件的映射路径。example.com 成为 Matrix 服务域名(例如:@user:example.com),则需要配置发现服务。如果希望使用子域名 matrix-homeserver.example.com 成为 Matrix 服务域名(例如:@user:matrix-homeserver.example.com),则可以跳过本节。发现服务是 Matrix 网络发现服务器位置的一种方式。因为实际服务运行在子域名 matrix-homeserver.example.com 上,需要让其他服务器和客户端知道我们使用主域名,因此需要提供 /.well-known/matrix 信息。因此需要将 https://example.com/.well-known/matrix 映射到 https://matrix-homeserver.example.com/.well-known/matrix,相关细节请参考官方文档。
Synapse 服务默认是禁止自助注册用户的,运行如下命令进入 Synapse 容器:
docker exec -it synapse /bin/bash
运行如下命令创建用户:
register_new_matrix_user http://localhost:8008 \
-c /data/homeserver.yaml -a \
-u "<用户名>" \
-p "<密码>"
在浏览器上打开 https://app.element.io,单击 Sign in
切换 Homeserver 到 example.com,输入用户名和密码即可登录。
2026-04-10 08:00:00
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转 1。
本教程将介绍在具有公网 IP 的服务器和内网路由器上部署 frp 内网穿透服务。本教程涉及到的环境信息如下:
| 环境 | 系统 | |
|---|---|---|
| 服务端 | 外网服务器系统 | Ubuntu 24.04 |
| 客户端 | 内网路由器系统 | OpenWRT 24.10 |
example.com 替换为实际域名。在本地创建 cert 目录,将 OpenSSL 配置文件复制到该目录。通常情况下 Linux 系统位于 /etc/pki/tls/openssl.cnf,macOS 系统位于 /System/Library/OpenSSL/openssl.cnf。
运行如下命令生成 ca 证书:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.com" -days 36500 -out ca.crt
运行如下命令生成服务端证书:
openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key \
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=example.com" \
-reqexts SAN \
-config <(cat openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:*.example.com")) \
-out server.csr
openssl x509 -req -days 36500 -sha256 \
-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.com") \
-out server.crt
运行如下命令生成客户端证书:
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=example.com" \
-reqexts SAN \
-config <(cat openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:*.example.com")) \
-out client.csr
openssl x509 -req -days 36500 -sha256 \
-in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.com") \
-out client.crt
由于 server.crt 和 client.crt 都是由 ca 签发的,因此他们对于 ca 来说都是合法的。
在服务器上运行如下命令安装 acme.sh:
curl https://get.acme.sh | sh -s email=[email protected]
安装脚本将执行如下动作:
$HOME 目录创建 .acme.sh 目录并安装 acme.sh。acme.sh 指向 $HOME/.acme.sh/acme.sh。以阿里云域名管理为例,在 https://ram.console.aliyun.com/ 页面创建用户,并为用户赋予 DNS 相关管理权限。为用户创建 AccessKey,并设置如下环境变量:
export Ali_Key="xxx"
export Ali_Secret="xxx"
运行如下命令申请证书:
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
/path/to 替换为对应文件的实际路径,将 xxx 替换为实际内容。在服务端创建 frp 目录,配置 frps.toml 文件参数如下,更多参数设置请参阅 frp 文档:
bindAddr = "0.0.0.0"
bindPort = 7000
quicBindPort = 7000
vhostHTTPPort = 8080
vhostHTTPSPort = 8443
tcpmuxHTTPConnectPort = 5002
auth.method = "token"
auth.token = "xxx"
transport.tls.certFile = "/path/to/server.crt"
transport.tls.keyFile = "/path/to/server.key"
transport.tls.trustedCaFile = "/path/to/ca.crt"
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "xxx"
webServer.password = "xxx"
log.to = "/path/to/frps.log"
log.level = "info"
log.maxDays = 3
0.0.0.0/0 关闭防火墙拦截。在 /etc/systemd/system 路径创建 frps.service 服务,配置内容如下:
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
运行如下命令管理 frps 服务:
# 自启动 frps
sudo systemctl enable frps
# 启动 frps
sudo systemctl start frps
# 停止 frps
sudo systemctl stop frps
# 重启 frps
sudo systemctl restart frps
# 查看 frps 状态
sudo systemctl status frps
添加如下内容至 Nginx 配置文件中:
server {
listen 80;
listen [::]:80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name *.example.com;
ssl_certificate /path/to/example.com.cer;
ssl_certificate_key /path/to/example.com.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_ssl_server_name on;
proxy_set_header Host $host:80;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
运行如下命令重启 Nginx:
sudo systemctl restart nginx
x.x.x.x 替换为本地服务对应的 IP 地址。在客户端创建 frp 目录,配置 frpc.toml 文件参数如下,更多参数设置请参阅 frp 文档:
auth.method = "token"
auth.token = "xxx"
user = "xxx"
serverAddr = "frps.example.com"
serverPort = 7000
transport.protocol = "quic"
transport.proxyProtocolVersion = "v2"
transport.tls.certFile = "/path/to/client.crt"
transport.tls.keyFile = "/path/to/client.key"
transport.tls.trustedCaFile = "/path/to/ca.crt"
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "xxx"
webServer.password = "xxx"
log.to = "/path/to/frpc.log"
log.level = "info"
log.maxDays = 3
[[proxies]]
name = "example-http"
type = "http"
localIP = "x.x.x.x"
localPort = 80
customDomains = ["example-http.example.com"]
[[proxies]]
name = "example-ssh"
type = "tcpmux"
multiplexer = "httpconnect"
localIP = "x.x.x.x"
localPort = 22
customDomains = ["example-ssh.example.com"]
其中,example-http 采用了通过自定义域名的方式访问内网 Web 服务,更多示例请参考 frp 文档;example-ssh 采用了多个 SSH 服务复用同一端口的方式连接内网 SSH 服务,更多示例请参考 frp 文档。
在 /etc/init.d 路径下创建 frpc 服务,配置内容如下:
#!/bin/sh /etc/rc.common
# 使用 procd
USE_PROCD=1
# 启动顺序
START=95
# 停止顺序
STOP=15
# frpc
FRPC=/path/to/frpc
CONF=/path/to/frpc.toml
start_service() {
procd_open_instance "frpc"
procd_set_param command $FRPC -c $CONF
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param pidfile /var/run/frpc.pid
procd_close_instance
}
service_triggers() {
procd_add_reload_mount_trigger $CONF
}
运行如下命令管理 frpc 服务:
# 赋予执行权限
chmod +x /etc/init.d/frpc
# 自启动 frpc
/etc/init.d/frpc enable
# 启动 frpc
/etc/init.d/frpc start
# 停止 frpc
/etc/init.d/frpc stop
# 重启 frpc
/etc/init.d/frpc restart
# 查看 frpc 状态
/etc/init.d/frpc status
在服务商中配置 DNS 将 example-http.example.com 和 example-ssh.example.com 解析至 frp 服务器的 IP 地址。
此时,通过浏览器访问 https://example-http.example.com 即可实现访问内网 IP 地址 x.x.x.x 在端口 80 上的 Web 服务。
socat 工具。此时,通过如下命令即可实现访问内网 IP 地址 x.x.x.x 在端口 22 上的 SSH 服务:
ssh -o 'proxycommand socat - PROXY:frps.example.com:%h:%p,proxyport=5002' [email protected]
2026-04-05 08:00:00
本教程将介绍在 macOS 和 Windows 环境下部署本地大模型服务。如无特殊说明,macOS 系统下需在终端中执行命令,Windows 系统下需要在 PowerShell 中执行命令。本教程涉及到的软件和模型信息如下:
| 软件 | 版本 |
|---|---|
| ollama | 0.20.2 |
| LM Studio | 0.4.9+1 |
| vllm | 0.19.0 |
| vllm-metal | v0.1.0-20260404-164341 |
| vllm-mlx | 0.2.7 |
| oMLX | 0.3.4 |
| 名称 | 架构 | 量化 | 内存 / 显存 | 能力 | 链接 |
|---|---|---|---|---|---|
| gemma-4-31B-it | 稠密 | 4bit | 32 GB 及以上 |
:GGUF / GGUF / MLX :GGUF / GGUF / MLX |
|
| gemma-4-26B-A4B-it | MoE | 4bit | 32 GB 及以上 |
:GGUF / GGUF / MLX :GGUF / GGUF / MLX |
|
| Qwen3.5-27B | 稠密 | 4bit | 32 GB 及以上 |
:GGUF / GGUF / MLX :GGUF / GGUF / MLX |
|
| Qwen3.5-35B-A3B | MoE | 4bit | 32 GB 及以上 |
:GGUF / GGUF / MLX :GGUF / GGUF / MLX |
|
| CoPaw-Flash-9B | 稠密 | 4bit | 16 GB 及以上 |
:GGUF :GGUF |
为了加速从 Hugging Face 模型仓库下载模型,可以运行如下命令配置相关环境变量:
echo "HF_ENDPOINT=https://hf-mirror.com" >> ~/.bash_profile
[Environment]::SetEnvironmentVariable("HF_ENDPOINT", "https://hf-mirror.com", "User")
更多使用方式可参考 HF-Mirror 官方网站。
推荐在终端运行如下命令安装 ollama:
curl -fsSL https://ollama.com/install.sh | sh
irm https://ollama.com/install.ps1 | iex
运行如下命令可以显示当前安装的版本号:
ollama --version
# ollama version is 0.20.2
ollama 当前采用 ollama pull MODEL 命令下载模型,除了使用官方模型库中的模型名称外(例如:qwen3.5:27b-nvfp4),还可以使用 Hugging Face 的模型链接(例如:https://huggingface.co/lmstudio-community/Qwen3.5-27B-GGUF),运行如下命令下载模型:
ollama pull qwen3.5:27b-nvfp4
ollama pull https://huggingface.co/lmstudio-community/Qwen3.5-27B-GGUF
ollama 当前仅支持通过环境变量配置监听地址和端口,运行如下命令进行配置:
echo "OLLAMA_HOST=0.0.0.0:11434" >> ~/.bash_profile
[Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0:11434", "User")
运行如下命令启动模型服务:
ollama run <模型名称>
ollama run <模型名称>
ollama 默认会选择最适合的运行库,如果需要切换可以手动指定 LLM 运行库,运行如下命令表示使用 CPU 进行推理:
OLLAMA_LLM_LIBRARY="cpu_avx2" ollama serve <模型名称>
打开 ollama 主页面,选择对应的模型,即可开始对话:
模型服务运行在 http://127.0.0.1:11434,API 文档详见:https://docs.ollama.com/api/introduction。运行如下命令以 OpenAI 兼容的接口测试服务:
curl http://127.0.0.1:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
iwr -Uri http://127.0.0.1:11434/v1/chat/completions `
-Method Post `
-ContentType "application/json" `
-Body '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
推荐从 LM Studio 官网下载安装包,并运行安装 LM Studio。如果只需要安装 LM Studio 核心,不需要 GUI 界面,则可以在终端运行如下命令:
curl -fsSL https://lmstudio.ai/install.sh | bash
irm https://lmstudio.ai/install.ps1 | iex
下载并安装所需的 Runtime,macOS 系统支持 GGUF 和 MLX 两种格式,Windows 系统仅支持 GGUF 格式。
打开 LM Studio 主页面,选择对应的模型,即可开始对话:
单击左侧的 按钮,单击 Local Server,将 Status 滑动至 Running 状态。模型服务运行在 http://127.0.0.1:1234,API 文档详见:https://lmstudio.ai/docs/developer。运行如下命令以 OpenAI 兼容的接口测试服务:
curl http://127.0.0.1:1234/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
iwr -Uri http://127.0.0.1:1234/v1/chat/completions `
-Method Post `
-ContentType "application/json" `
-Body '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
推荐从 oMLX 官网下载安装包,并运行安装 oMLX。安装完毕后启动,并从 macOS 菜单栏或 Windows 系统托盘单击 oMLX 图标,选择 Start Server 启动服务。待服务启动后,单击 Admin Panel 从浏览器打开管理面板,初次登录需要设置 API Key。在 Models - Downloader 中可以直接从 Hugging Face 和 ModelScope 模型仓库下载模型。
mlx-community/gemma-4-31b-it-nvfp4)至 REPOSITORY ID 中下载模型。在 Settings - Model Settings 中单击对应模型 STATUS 中的按钮载入模型。
单击 Chat 进入对话页面,选择对应的模型,即可开始对话:
模型服务运行在 http://127.0.0.1:8000。运行如下命令以 OpenAI 兼容的接口测试服务:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
在 macOS 系统上,使用 vllm-metal 库安装 vllm 服务,运行如下命令:
curl -fsSL https://raw.githubusercontent.com/vllm-project/vllm-metal/main/install.sh | bash
这会在 ~/.venv-vllm-metal 路径下创建一个 Python 虚拟环境,并安装 vllm 服务。运行如下命令即可删除安装:
rm -rf ~/.venv-vllm-metal
运行如下命令激活 Python 虚拟环境:
source ~/.venv-vllm-metal/bin/activate
运行如下命令启动 vllm 服务:
vllm serve <模型名称|模型路径>
模型服务运行在 http://127.0.0.1:8000,更多环境变量设置请参考:https://github.com/vllm-project/vllm-metal,更多命令行参数设置请参考:https://docs.vllm.ai/en/stable/api/。运行如下命令以 OpenAI 兼容的接口测试服务:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "<模型名称>",
"messages": [
{
"role": "user",
"content": "你好"
}
]
}'
2026-03-29 08:00:00
AI 的发展想必不用多说,速度之快远超我们的想象。将 AI 大事记和标普 500 1 整合绘制折线图如下:
从图中可以看出,自 2015 年 OpenAI 成立以来,随着标普 500 指数的不断增高,AI 也在以倍速迅猛发展。毋庸置疑在这个时代,如果你不了解 AI,不紧跟 AI,那么你可能会很快就会被社会淘汰。随着一股“龙虾热”的到来,更是把 AI 的关注度推到了风口浪尖。积极的去拥抱新的技术,亲自下场去体验,这都是很好的事,但也大可不必因为 FOMO(Fear of Missing Out,错失恐惧症)而太过盲从。即使你全身心 100% 的投入,在 AI 的浪潮中依然会有你错失的,停下来根据自身的实际情况多一些思考,才是争取不被拍死在沙滩上的最好选择。Anyway,一人开发者的周末项目,在短短不到 5 个月的时间内登顶 GitHub,这里面所预示的变革也绝不是我这些许思考所能妄言定论的,让我们且行且悟吧。
前不久在组织内部(大部分成员并非技术背景)讨论 AI 应用的时候(彼时公司已经提供了内部免费版的龙虾供大家试用),我抛出了如下两个问题:
第一个问题要从前不久如火如荼的排队装龙虾开始说起,从安装龙虾,再到卸载龙虾,每个时代都有每个时代的鸡蛋要领。晚点有篇文章 2 不错,提到网上流传着的一个悖论:“如果你需要托人帮你安装龙虾,那么你可能就不太需要龙虾。”这句话多少有些偏激了,但意思就是那么个意思,如果连这部分技术都不了解,那么在使用龙虾的过程中一旦遇到一些复杂情况,你就会陷入“问虾你为什么不行”-“虾说因为 XXX”-“你说你自己不能解决码?”-“虾说 balabalabalabala”的死循环当中。或者换个角度,如果龙虾真的无论是从可用还是易用角度做到了极致,那么此时此刻是否还需要你这个人去用它呢?这时最重要的问题或许是我们这些碳基生物应该如何避免被硅基生物消灭吧?
第二个问题会比较实在些,天天在谈 ROI,公司出于更长远的战略考虑给到一定的免费额度,但如果需要实打实的花自己钱的时候你真的还会随便用吗?只能说当下很多人还没有被 AI 替代是因为 AI 的成本比我们这些牛马的工资还是要高的。我相信随着技术的不断发展,AI 的成本也会越来越低,此时我们更需要思考些更适合 AI 去做,哪些更适合我们去做,那些 AI 暂时还替代不了我们去做的才是我们的核心竞争力,再用 AI 把自己加持下才是最妙的。
AI 是一种先进的生产力,这个应该不太会有人否认吧。我个人总结其主要先进在两个方面:
在谈及 AI 作为一种先进的生产力时,它与瓦特的蒸汽机、爱迪生的电灯泡、亦或是宾夕法尼亚大学的埃尼阿克并无差异,本质上都是社会生产环节中的一个辅助工具。
根据定义来看,AI 确实“不是”生产关系,生产关系探讨的主要是“人”与“物”以及“人”与“人”的关系,例如:生产资料所有制,生产中的地位和相互关系,产品的分配方式等。但 AI 作为生产力却可以影响生产关系,我认为此时用“重塑”会更适合些,因为这波 AI 带来的冲击确实过于迅猛。
之前听过付鹏的几期演讲和相关的播客,他将套利 4 的核心归纳为价差、利差、汇差,而在这些之前,还会有信息差、认知差、执行差、竞争差、资源差等等。我个人不是很懂投资,买过的股票基金啥的大多也是赔的,听的这些投资内容更多是出于对经济和风险的进一步理解。AI 在帮助我们缩小信息差、认知差、执行差、竞争差、资源差这些方面比之前变得更有可能,尤其是对于我们这些屁民而言。试想一下,之前在一个未知领域遇到了一个问题,Google 一下,搜索引擎玩儿的溜的能多获取一些有用的信息,玩儿不转的就只能凭人品看看有没有靠谱的朋友帮你解惑一二了。如果你有钱那就另说了,此时你又营造了资源差,但 AI 在帮助大家提升认知上貌似是公平的,是容易的。那么当答案获取变得便宜之后,什么又变得昂贵了呢?勇气,执行力,还是?
前不久比较火的一个词应该是“一人公司”(OPC,One Person Company),一个由 AI 技术驱动产生的全新组织范式。如果把一人公司做到极致,貌似你只需要同你的 AI 进行直接交流,AI 可以帮你去对接客户,AI 可以帮你去做产品,AI 可以帮你去销售。此时“人”-“人”的关系就转变成了“人”-“AI”-“人”的关系,甚至是“人”-“AI”-“AI”-“人”的关系,谁知道你的 AI 对接的客户是不是也是一个 AI 呢?从内部视角来看也是一样,从养一只虾到养多只虾,从管多只虾到管一只管多只虾的虾。
flowchart TD
A[你] --> B(🦞#1)
flowchart TD
A[你] --> B(🦞#1)
A[你] --> C(🦞#2)
A[你] --> D(🦞#3)
flowchart TD
A[你] --> B(🦞#01)
B --> C(🦞#11)
B --> D(🦞#12)
B --> E(🦞#13)
你时不时的 PUA 下你的虾,你的虾时不时的摸会儿鱼。作为基层管理者的监管虾忙着分配任务和验收结果,而作为大头兵的牛马虾快乐小狗般地研究是巧克力味儿的屎好还是屎味儿的巧克力好,最后把监管虾看得着急的不要不要的,还不敢和你真实汇报。等你下场去检查的时候,屎山已经高的望不到顶了。这不就是一个活脱脱的赛博职场吗?此时我只想说对你的虾好一点儿,交代任务时加个“请”字,可能比你说他笨更有用些,真的。
旧世界的神(各种差)力量正在减弱,新世界的神(AI)已然崛起 5。生产力的跃升总是先行的,随后才是生产关系的重构,当生产力的“安装期”接近尾声时, 生产关系的变革将成为主线 6,此时你的信仰又该何去何从?
最后我想再谈一点儿技术平权,感觉“龙虾热”把技术平权又双叒叕一次拿到了台面上。有两个问题,我的观点分别如下:
在这里我并没有为我们这些所谓的“工程师”粉饰门面,也没有打消大家探索新世界积极性的意思。想表达的是在科技洪流中,我们更需要思辨,去伪存真,鸿沟永远存在,找到一条更好提升自己的路,平权不平权不重要,干得过别人才重要。周末读到一篇文章,在此分享出来:《谁在制造“龙虾热”?当我们穿过一场名为“技术平权”的幻梦》,观点因人而异,但希望可以缓解部分人的焦虑。
最后的最后,改编一下我比较喜欢的胡适先生的话「大胆假设,小心求证」,AI 时代的我们可以「积极拥抱(这是态度),审慎思考(这是行为)」。AI 作为生产力终究不能自发地改变现有的生产关系,仍需要人的主观能动性。如果未来有一天硅基生命崛起,彼时的人类又是否会变成如当下的 AI 一样,成为一种“工具”,只不过是一种作为被奴役的稀有的资源般存在的“工具”。我不想这天的到来,至少在我有生之年。



















