news 2026/10/17 7:48:47

断更五年后,我养了一只AI“虾”:OpenClaw自托管代理自动化写作实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
断更五年后,我养了一只AI“虾”:OpenClaw自托管代理自动化写作实践

你可能以为我要讲水产养殖,其实我讲的是一个在本地小主机上跑了一个月的小机器人。我停更创作内容大概有五年了,前阵子突然想明白一件事:重新开始写东西,靠的不是什么宏大决心,而是每天有个东西在固定时间找你、给你递素材、催你动笔。于是就有了这个 OpenClaw “养虾”实验。这里的“虾”不是我养的宠物,是我给一个自托管 AI 代理起的外号。我把它搭在书房一台常开的 Linux 小主机上,每天定时抓取信息源,整理成创作卡片,再等我亲手改写成文。如果你也断更很久、手里攒了一堆没写的选题,或者对自托管 AI 代理感兴趣,这篇文章应该能给你一套直接抄作业的流程,顺带避掉我踩过的几个大坑。

1. 为什么是“养虾”,而不是“训狗”

1.1 五年没写东西,问题不在“没时间”

先聊聊背景。五年前我算是个爱写东西的人,技术笔记、产品思考、偶尔的生活观察,一个月能写好几篇。后来换了一条忙到没整块时间的赛道,停更了一次,就停了五年。停更这种事,最麻烦的不是手生,而是那个“输入—思考—输出”的回路彻底断了。以前我刷到一篇好文会顺手记两笔,看到数据异常会琢磨背后的原因,现在只会划走,划完就忘。

我试过逼自己写,“周末写一篇”的计划立了无数次,全都没撑过第二周。后来复盘才意识到,我缺的不是意志力,而是系统。写作这件事如果全靠大脑记住“我今天要写”,大脑很快就会把这件事归入“不紧急不重要”,然后无限期搁置。所以我需要的是一个外部系统:它帮我做素材收集、初筛、甚至是把零碎想法先变成半成品,我只负责最后那个不能被替代的步骤——用自己的话给出判断和细节。

这个想法听起来简单,但市面上现成的 AI 写作工具其实都解决不了。它们大多是一个对话框,你打开它,还得先想好“今天我该让它帮我写什么”。这一步本身就是巨大的心理门槛。我真正想要的,是一个没人催我、但每天都会自动出现在我数据库里的东西。

1.2 OpenClaw 的定位:不是大模型,而是大模型的“手脚”

在聊配置之前,先把主角说清楚。我用的 OpenClaw 是一个开源的 AI 代理框架,核心思路是让你在本地定义若干个长期运行的“代理”,每个代理有自己的角色设定、可用工具、触发时间和存储位置。代理本身不是大模型,它更像是一个“包工头”:到点了就去抓网页或读本地文件,把得到的内容组装成一次大模型的调用请求,等返回结果后,再写日志、存文件、触发下一个任务。

选它而不是直接用一个云端的写作助手的理由很简单:

  • 数据留在本地,我的素材库、生成的卡片、日志全在我自己硬盘上,不经过第三方平台。
  • 可编排、可定时,它能按 cron 表达式在早晨、中午、晚上自动触发任务,这是普通对话框做不到的。
  • 过程完全透明,每一步都有日志,模型生成时到底用了哪些素材、写得怎么样,我随时可以打开日志复盘。
  • 模型可替换,它后端接的是一个兼容常用接口的云模型服务,哪天觉得某个模型写得不好,改一行配置就能换掉。

用一个生活化的类比:大模型像是一个厨艺不错但不会自己下楼的厨师;OpenClaw 则是我给这位厨师配的厨房系统——有菜篮子、调味架、定时烤箱和上菜窗口。我不用站在旁边喊“今天炒这个”,我只需要把菜谱和开门时间交给系统,它自己就知道什么时候去买菜、什么时候下锅。

1.3 “养虾”的比喻到底怎么落地

之所以把代理叫作“虾”,是因为我发现养 AI 代理和养水族生物在方法论上高度相似。养虾的人没法天天把虾捞出来教它游泳,能做的只有三件事:调好水质、按时投饵、观察状态。AI 代理也一样,你没法实时干预它的每一次判断,你能做的只有:

  • 缸体:运行环境,也就是那台常开的小主机、Python 环境和 OpenClaw 本体。
  • 水:代理的上下文与人格设定,水太清,它会变得机械;水太肥,它会输出一堆不靠谱的胡话。
  • 氧气泵:定时调度器,保证它每天在固定时间“浮上来呼吸”,持续产出,而不是憋一口气猛写两万字然后歇一星期。
  • 饵料:信息源接入,代理每天消化几条 RSS、几篇本地笔记,相当于喂食。
  • 观察窗:日志系统,我每天早上打开终端看日志,就能知道“虾”昨晚干了什么、有没有状态异常。

这个比喻还有一个好处,它天然强调了“低干预”。训练狗时你会不断纠正动作,养虾时你只能信任系统。把代理当虾养,意味着我不指望它一次就能写出能直接发布的文章,我只负责持续优化环境,然后等它慢慢形成一个稳定的产出节拍。

2. 搭建“虾缸”:核心组件与关键配置拆解

2.1 部署形态:本地进程还是容器

我选择的是在一台常开的 Linux 小主机上直接跑本地进程,用系统的守护进程机制保证崩溃后自动拉起。为什么不放容器里?按理说容器更干净、更容易迁移,但对我来说,这台小主机还要跑其他内网服务,OpenClaw 只是其中一个模块,直接在守护进程里管理反而省事,少一层网络端口映射。如果你是从零开始、希望快速试错,容器方式更整洁;如果你像我一样希望“看到日志就能摸到文件”,本地进程其实更顺手。

不过有一点必须注意:OpenClaw 这类代理框架一旦跑起来,它的任务目录、缓存目录、配置目录最好单独放在一个文件夹下,不要跟系统目录混在一起。我给它的家目录是~/shrimp-lab,所有素材、卡片、日志、配置文件都收纳在这个目录里,后面做备份、迁移、清理都方便。

2.2 给“虾”建人格:角色配置文件怎么写

建完环境后的第一件事,不是急着让它干活,而是先给它“立人设”。OpenClaw 的核心配置文件是一段 YAML,里面有一个persona字段,用来定义代理的身份和行为规则。我一开始只是随便填了一句“你是创作助手”,结果它生成的卡片味道很冲,满屏都是“首先、其次、最后”的排比腔。后来我把人设写成了下面这样:

agent: name: "shrimp-01" persona: | 你是小虾,一个住在本地书桌角落的创作助手。 你的日常工作:从素材库里挑出三条看起来普通但值得深挖的信息, 写成一张650字左右的卡片。 你的语言习惯:像朋友聊天,不用“首先/其次/最后”, 不写正确的废话,每个观点至少给一个具体例子。 你不署名,不直接发布,只把卡片放在指定目录,等作者本人来取。

这里面每一句都有讲究。第一句“住在本地书桌角落”,是在暗示代理保持低姿态,不要动不动“作为一个人工智能”;“写三张卡片,650字”是给任务设了硬边界,避免它自由发挥到两千字;“不用‘首先/其次/最后’”是针对大模型默认输出套路的直接约束;“不写正确的废话”是为了逼它在每一张卡片里放一个可被验证的具体细节。

还有一个容易被忽略的字段是temperature,也就是模型采样的随机性。我给它设置为 0.65,在我用的模型上这是一个“稳定但还有点性格”的位置。如果低于 0.3,输出的确工整,但每个句子都像同一个模板印出来的;如果高于 0.8,又会频繁跑题。这个参数没有绝对正确的值,跟你选的模型和任务类型强相关,建议从 0.5 起步,每次调 0.05,找到自己的手感。

2.3 工具权限:只给“虾”最小限度的本领

OpenClaw 可以给代理挂很多工具:网页抓取、文件读写、定时器、数据检索。我建议遵循最小权限原则——它需要什么就给什么,不要因为它“能”做什么就全部开放。

我当前允许的工具只有四个:

工具权限范围用途
读取素材目录只读~/shrimp-lab/materials检索需要引用的来源
写入卡片目录只写~/shrimp-lab/cards保存生成卡片
抓取网页限速,每天最多 10 次获取指定信息源的新内容
定时调度三个内置任务早中晚各触发一次

这里特别要注意的是“写入目录”的范围。一开始我把写权限放开到~/shrimp-lab整个目录,结果有一次代理为了“整理素材”,直接把原始素材文件给改写了。那一刻我意识到,必须像管实习生一样管代理:给它一个明确的交付目录,写好文件就够了,其他目录一律只读。把写权限锁死后,再没出过这类问题。

2.4 投喂计划:定时任务设计与素材源选择

定时任务是“养虾”实验里最关键的机制。我设置了三轮:

  1. 早上 8 点:抓取几个固定信息源的更新,把内容清洗成简短的素材条目,存入素材库。
  2. 中午 12 点:从素材库里挑三条,结合本地笔记中的个人观察,生成一张创作卡片。
  3. 晚上 10 点:跑一次自我总结,在日志里输出今天的运行报告,包括抓了几篇、生成几张卡、平均耗时。

素材源的选择也有讲究。我不只放科技新闻,还有一本我常读的旧书摘录、一个记录自己失败项目的本地文件。原因是“创作表达”的核心不是搬运热点,而是把外部信息和自己的经历摩擦出新东西。所以素材源里必须有一部分“自己的东西”,否则代理生成的内容会非常“新闻稿”,没有任何个人痕迹。

信息源加入到配置后,先跑一次手动任务看抓取质量。如果某个源返回的全是垃圾广告,就直接剔除;如果某个源连续一周没有产生有用素材,也先停用,别舍不得。

3. 实操现场:从零跑通一只“虾”的完整流程

3.1 环境准备与初始化命令

我习惯把所有实验都放在独立的虚拟环境里,避免污染系统的 Python 环境。下面是整个初始化过程的命令记录,按顺序执行即可:

mkdir -p ~/shrimp-lab && cd ~/shrimp-lab python3 -m venv .venv source .venv/bin/activate pip install openclaw openclaw init --agent shrimp-01 --home . openclaw doctor

其中openclaw doctor这一步很重要,它会自动检查网络连通性、模型接口密钥是否有效、目录权限是否正常。我第一次跑doctor时,它报了一个“模型接口密钥未配置”,我才想起来配置文件里只填了模型名,忘了把密钥从环境变量引进去。如果你也遇到类似问题,先别急着翻代码,优先看配置文件和服务端日志,绝大多数问题都出在密钥和网络出口上。

3.2 配置文件全览

初始化完成后,核心配置集中在~/shrimp-lab/openclaw.yaml里。我现在的完整配置大致是这样:

agent: name: "shrimp-01" persona_file: "persona.md" model: provider: "openai_compatible_gateway" name: "creative-small" temperature: 0.65 max_tokens: 1200 storage: material_dir: "~/shrimp-lab/materials" card_dir: "~/shrimp-lab/cards" log_dir: "~/shrimp-lab/logs" sources: - name: "tech_rss" type: "rss" url: "https://example.com/feed.xml" - name: "my_notes" type: "local_markdown" path: "~/shrimp-lab/notes/ideas.md" schedule: morning_fetch: "0 8 * * *" noon_card: "0 12 * * *" evening_report: "0 22 * * *" limits: daily_llm_calls: 30 url_fetch_per_day: 10

配置里有几个关键点想展开说一下。

persona_file指向一个单独的 Markdown 文件,比直接写在 YAML 里更好维护。后面你想调整人格,比如从“冷静的观察者”改成“带点毒舌的老友”,只需要改那个人格文件,不必动主配置,也不会触发代理重启时的额外风险。

max_tokens: 1200看起来不大,但足够对付 650 字的卡片。设置这个上限有两个作用:一是控制单次调用成本,二是强制代理学会在限定篇幅内表达,而不是习惯性越写越长。

limits部分是保护闸。OpenClaw 这类框架最怕的就是代理在异常情况下疯狂调用模型接口,我设定了每天最多 30 次调用、最多 10 次网页抓取,超出的任务直接跳过并写日志。这个限制一周内就救了我一次,后面在常见问题里会细说。

3.3 第一次“开缸”:手动触发并解读日志

配置完成后,千万别直接等定时任务,先手动跑一轮。我先用一个只读任务验证抓取,再跑一次卡片生成任务:

openclaw run --task=fetch --dry-run openclaw run --task=make_card

第一次跑出卡片时,日志长这样:

[12:00:01] [schedule] job noon_card triggered [12:00:02] [context] read 3 stale notes, pruned 1 [12:00:05] [retrieval] picked 3/12 candidates [12:00:09] [llm] call ok, usage in=1410 out=912 tokens [12:00:10] [writer] card saved -> cards/2025-0521-006.md [12:00:10] [report] done in 9.2s

这段日志信息量很大。read 3 stale notes, pruned 1说明代理自动清理了一条过期的旧笔记;picked 3/12说明素材库中 12 条候选里只选中了 3 条,这个筛选逻辑是人格文件里写死的“优先挑反常识信息”;usage in=1410 out=912 tokens则是每次调用的实际消耗。我会定期统计这些 token 消耗,用来估算成本,也用来判断素材是否太多、是否撑爆上下文。

3.4 参数计算过程:上下文预算和成本估算

说到 token 消耗,这里给一个具体的计算过程,方便你自己做预算。我用的模型上下文窗口是 8000 token。每次生成卡片的请求由三部分组成:

  • 系统提示词和人格文件,加起来大约 600 token;
  • 选中的素材摘要,每条约 120 token,选 3 条就是 360 token;
  • 本地个人笔记的相关片段,取 200 token。

这样输入侧约 1160 token。输出侧是 650 字卡片,中文一个字大约对应 1.5 个 token,也就是约 975 token。全部加一起,一次调用约 2100 token,距离 8000 的窗口还有很大余量。这就意味着我暂时不需要担心上下文溢出,也说明“每天 30 次调用”的限制是非常宽裕的。

成本方面,按这个体量算,一天三次定时任务加上偶尔手动调试,一个月消耗不到二十万 token。按市面上主流的按量计费模型换算,也就是一杯咖啡钱以内,完全可以承受。重点是控制住异常情况下的调用量,而不是心疼正常使用的那点消耗。

3.5 “换水”流程:周期性调整人格与素材库

养虾要定期换水,AI 代理也一样。我的“换水”周期是每周日晚上:

  1. 清点本周生成的卡片,被采纳的移入成稿库,没被采纳的删掉。
  2. 清理素材库里超过两周的旧条目,只保留有长期价值的参考。
  3. 更新一次人格文件里的“本周兴趣点”,比如本周我关注“本地优先软件”,就会在人格文件里加一句“最近多留意本地优先的工具和案例”。
  4. 跑一次openclaw run --task=make_card做冒烟测试,确认配置改动没有引入异常。

这个流程看起来简单,却是整套实验里回报最高的部分。每次“换水”后的一周,卡片质量都会有肉眼可见的回升。如果你的代理输出越来越无聊,别急着换大模型,先试试清理素材、更新兴趣点,大概率能解决。

4. 翻车排查与治理:养虾一个月踩过的坑

4.1 “虾”在自言自语:任务重复执行与日志刷屏

运行到第三周时,我发现日志里每隔几秒就有一条 fetch 记录,一天跑了三百多次,差一点把限流额度打满。排查后确认是两个守护进程在同时跑同一个代理目录,调度器互相不知道对方的存在,导致定时任务重叠触发。

解决方法是给代理加一个“单实例锁”,确保同一时刻只能有一个进程在运行。如果你也会用守护进程托管代理,记得检查是不是只拉起了一个实例,多实例是最隐蔽的翻车源头。

4.2 “虾”开始扯谎:模型幻觉污染素材

有一次卡片里引用了一篇“来源文章”,我点开一看,标题确实存在,但正文根本没有卡片里说的那个观点。这是典型的模型幻觉——它在抓取结果里看到了标题,就顺着标题编了一个看似合理的解读。

我的根治办法是改配置,强制代理在卡片里保存“来源 ID”字段,每个观点必须对应一条真实存在于素材库中的记录。如果生成的内容找不到匹配的来源 ID,就判定为无效产出,直接丢弃并记录一次幻觉事件。从那以后,假引用的情况几乎消失,偶尔再出现也能靠日志快速定位。

4.3 输出千篇一律:人格漂移问题

运行到第二周,我明显感觉到卡片开始“油掉”,句子结构越来越雷同,形容词越堆越多。查日志发现,代理的上下文里保留了太多旧卡片,把性格给稀释了。模型只会顺着上文模仿,而上下文里全是它自己写过的旧句子,自然就走进了自我重复的循环。

我做的调整有两点:一是把每次生成前的历史摘要从完整保留改成只保留最后 5 条;二是每周“换水”时强制给上下文注入一条全新的“今日兴趣点”,打断连续重复的惯性。效果立竿见影。

4.4 资源占用与请求费用飙升

还有一次,某天的请求量冲到日常值的十倍,原因是模型服务返回了一串超时错误,而代理默认会在失败后立即重试。重试机制本身是好事,但没有上限就变成了灾难。

我在配置里加了三个保护参数:

  • 单次任务最多重试 3 次;
  • 重试采用指数退避,第一次等 30 秒,第二次等 2 分钟,第三次等 5 分钟;
  • 单日调用数超过 30 次后,所有非关键任务直接跳过。

加了这套限制后,哪怕模型服务抽风一整天,我的成本也不会失控。

4.5 常见问题速查表

症状可能原因快速排查根治办法
任务重复执行多个进程并存查看进程列表,数一数几个实例启用单实例锁
内容引用不存在模型幻觉核对卡片里的来源 ID 是否存在强制校验来源 ID
输出越来越套路上下文被旧输出稀释看日志中历史摘要长度缩减历史摘要,注入新兴趣点
请求量异常升高失败重试无上限查调用计数曲线指数退避 + 每日配额
本地磁盘疯涨日志和卡片堆积查看日志目录大小日志轮转,每周归档
模型密钥报错环境变量未正确引用本地打印环境变量检查配置里改为引用环境变量

5. 从“养虾”回到写作:这套系统到底帮了我什么

5.1 一张卡片到一篇文章

到现在,我已经攒了接近三十张卡片,其中真正被我扩展成文章的只有五篇,比例不算高,但胜在稳定。我原以为“有素材”就能写,实际操作后才发现“被半加工的素材”才是最好的起点。

举个例子,某天“虾”生成了一张卡片,标题是“为什么我对效率工具越来越警惕”,它的核心观点是:很多效率工具不是在节省时间,而是把你的日程切得更碎。我看了之后觉得有道理,但“虾”给的理由太抽象,于是我自己补了一个具体的失败案例——我用过一段时间任务打卡软件,结果每天花更多时间维护打卡记录,而不是做事。我把这个案例替换掉卡片里原有的例子,又重新组织了段落顺序,大约四十分钟就写完了一篇草稿。以前从零开始写,光是想选题就要耗掉一个晚上。

5.2 创作节奏重建

最明显的变化不是产量,而是节奏。现在每天早上打开电脑,第一件事不再是“我要写点什么”这种让人焦虑的念头,而是看一眼昨晚的卡片。有感觉就顺手改一段,没感觉就先搁着。这个动作轻到几乎没有门槛,但每天都发生,日积月累,那根断了五年的“输入—思考—输出”的回路,居然真的被接上了。

有一点我很确定:AI 代理只承担“催熟”的职责,最后的署名和发布,没有任何一步交给它。卡片写得再好,没有经过我的判断和改写,它就不会出现在我的博客里。这是底线,也是这套流程能继续跑下去的原因。

5.3 可扩展的方向

实验跑了一个月,后面还有几个想尝试的方向:

  • 让“虾”在每周日晚自动生成一份“本周创作复盘”,统计我改了几篇、卡在哪一步最多;
  • 给代理加一个语音输入通道,把平时随手录的碎片想法也并入素材库;
  • 接一个日历接口,让它根据我下周的空闲时间建议写作时段。

这些都是下一步的“换水”清单。养虾这件事最有意思的地方,在于你永远不知道下一次水质调整会带来什么变化。

最后分享一个我没想到的细节:某天早上我发现日志显示凌晨 3 点“虾”自己跑了一次素材整理,写了一张关于桌面整理的卡片。我坐在书桌前看着那行日志,突然有点感动。五年前我停更,是因为觉得自己写的东西没人看、写了也不会改变什么。现在一个小机器人,用每天三张卡片和深夜的自动整理,把我重新拽回了书桌前。如果你也断更很久,我建议别等“状态好了再写”,直接搭一个像虾缸一样的小系统,喂点料,每天打开看一眼,写作会自己想办法回来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 7:47:45

纯 Win32 API 实现的中国象棋 Demo:零依赖 GDI 绘图与消息循环教学

简介:本资源是一份基于Windows SDK开发象棋程序的完整实践项目,面向C初学者及Windows平台GUI开发入门者,聚焦GDI绘图、Windows消息机制、棋局状态管理与基础AI逻辑实现等核心技能。压缩包共38个文件,含18个ICO图标资源&#xff08…

作者头像 李华
网站建设 2026/10/17 7:46:53

氧化钇有什么特性?耐高温、抗烧结与潜在抑烟应用

在稀土氧化物家族中,氧化钇(Y₂O₃)以耐高温和抗烧结性能著称。它不像氧化铈那样有变价能力,也不像氧化镧那样常用于协效阻燃,但在高温结构材料和陶瓷领域,氧化钇有着不可替代的位置。高熔点与热稳定性氧化…

作者头像 李华
网站建设 2026/10/17 7:46:03

动态数组实现栈与队列:扩容缩容策略与工程实践

前几天做一个小工具,里面需要缓存一批待处理的消息,先发进来的先处理,后发进来的排队等。手边没有合适的第三方库,我索性自己写了一个队列。写的时候发现,最顺手的实现方式还是数组——准确地说,是动态数组…

作者头像 李华
网站建设 2026/10/17 7:45:49

React 自定义 Hook:useKeyPress 实现优雅的键盘监听与快捷键管理

做前端时间久的同学应该都有这种体会:页面只要涉及键盘操作,代码就容易变得又散又乱。尤其是那种中后台管理系统,表格里要支持上下左右移动选中行、CtrlC复制、Delete删除、F2编辑,一整套操作写下来,每个页面都塞一段w…

作者头像 李华
网站建设 2026/10/17 7:45:40

端侧智能体落地指南:4GB设备上的FunctionGemma函数调用实践

最近我把一个量化的 FunctionGemma 3B 模型塞进了一块 4GB 内存的开发板,让它从一个“只会聊天”的模型,变成了一个真的能执行动作的端侧智能体:能读日历、建日程、查天气、控制智能灯。这个过程踩了不少坑,也把“对话”到“行动”…

作者头像 李华
网站建设 2026/10/17 7:45:11

AI原生应用意图理解全攻略:从数据构造到服务化落地

做AI原生应用这一年多,我最大的感触是:很多团队把精力全砸在模型参数和Prompt模板上,却把一个最基础、最决定体验的模块给看轻了——用户意图理解。你产品功能再强,模型再大,用户一句话进来,你连他到底想干什么都没接住…

作者头像 李华