Spark Creative Solutions

Spark Creative Solutions · 第一模块

第一模块 · 2026 年 11 月 7 日

让你的 AI 助手递归地自我改进:最低额度配置法

写给我的学员和朋友。来自 2026 年 11 月 7 日 Dan 在自己账户上一天的工作。适用于 Windows 或 Mac 上的 Claude、ChatGPT 或 Gemini;这里没有任何一步要求你是程序员。每一步都说明了它在每个应用里的位置。

为什么有效

你的额度,大部分不是花在思考上。它们从四个漏洞流走,而每一个都能在一个下午堵上。

  • 你打开的每一个插件、连接器和工具,都会被装进每一条消息,不管你用不用。二十个闲置的工具,在每个聊天的每一轮都在收你的钱。
  • 截图。每当你的助手看你的屏幕,或者靠图片操作浏览器,它付出的代价是读文本的几百倍。
  • 重新解释。每一个从零开始的新聊天都让你再打一遍自己的情况,也让助手去翻记忆和旧聊天来追上进度。那次翻找比你的消息本身还贵。
  • 定时任务每天早上用最贵的模型读遍一切,生成一个你从来不打开的页面。

整套配置背后只有一个想法:你的助手开始时先读一个小文件,结束时再写一个小文件。其余都是修剪。Dan 自己的账户从每天早上四次重型运行减到一次,从"再告诉我一遍我们到哪了"变成一个 300 个 token 的文件,助手开口之前先读它。同样的做法在 Claude、ChatGPT 和 Gemini 里都管用,因为它们是习惯和文件,不是功能。

你需要什么,花多少钱

一个付费的助手套餐、它的免费桌面应用、你电脑上的一个文件夹,以及大约 40 分钟。这本指南里其余的一切都免费。

项目费用说明
助手套餐一个应用的标准付费档(Claude Pro、ChatGPT Plus 或 Google AI Pro)免费档足够养成文件习惯,但重度使用会被限制。只有在大多数日子都碰到上限时才升到更高档。永远不要同时付两个套餐。
该助手的桌面应用免费读取你电脑上的文件夹需要它。Windows 和 Mac 都有。
一个文本编辑器免费Windows 的记事本,Mac 的 TextEdit,或者 Obsidian(免费,更好,可选)。
Google 账号免费用于第六步的免费自动化(Apps Script)和第五步的廉价帮手。
Python免费只用于第四步可选的脉搏脚本。Mac 自带;Windows 从 python.org 两下点击装好。
支出上限0第一天就设好:一个月度上限,关掉自动充值。有了上限,试验才安全。

除非你有 Mac,否则按 Windows 来;下面每一步都有两个版本。手机用来阅读,不用来做这套配置。

第一步,修剪

十分钟,也是这份清单上最大的一笔节省。所有打开的东西都会被装进每一条消息。

  • 打开应用的设置,看看你启用了哪些插件、连接器、集成、GPT 或扩展。把过去两周没用过的全部关掉。需要时一下就能重新打开。
  • 只留一个自动化连接器,不要两个。如果你同时有 IFTTT 和 Zapier,留下里面真有东西的那个。
  • 记忆:让助手把它记得的东西展示给你("按类别导出你记得的关于我的一切")。删掉错的和过时的。用平实的话告诉它该记住什么:你的名字、你的工作、你希望它遵守的规则。好的记忆意味着少解释;过时的记忆意味着信心十足的错误答案。
  • 支出:找到账单页面,设一个月度上限,关掉自动充值。如果你上个月的充值远远超过固定套餐的价格,那么升一档比买额度更便宜。

在哪里。 Claude:Settings,然后 Connectors 和 Plugins;记忆在 Settings、Memory。ChatGPT:Settings,然后 Apps and connectors;记忆在 Personalization、Manage memories。Gemini:Settings,然后 Apps;记忆在 Saved info。支出上限在每个应用的账单页面,如果你用 API 的话则在 API 控制台。

第二步,主文件夹和三个文件

建一个你的助手永远能看到的文件夹,在里面放三个小文本文件。这就是整个连续性系统;40 行就装得下。

在你的用户目录下建一个叫 ops 的文件夹。在助手的桌面应用里连接它(Claude:+ 按钮,Add folder;ChatGPT:Settings、Work with apps,或桌面应用里的文件夹选择器;Gemini:一个 Google Drive 文件夹起同样的作用,因为 Gemini 读 Drive)。然后用任何文本编辑器在里面建这三个文件。

文件内容谁来写
NOW.md你此刻在哪里:在做什么,最后完成的是什么,下一步是什么,唯一一件等着你的事。最多 20 行。你,花一分钟,在一段工作的开始和结束。或者由第四步的脉搏脚本自动完成。
handoff.md每次会话两行:日期、做了什么、接下来是什么。最新的在最上面。助手,在每次工作聊天结束、你说"写交接"的时候。
hands.md一张只有你能做的事的勾选清单:要输入的密码、要分享的文件、要点的按钮。助手追加;你打勾。

三个文件的模板都在附录里。让它们管用的规则:这些文件里没有秘密,没有长篇,而且助手在做任何别的事之前先读它们。

如果你用 Obsidian,把文件夹放进你的仓库。Obsidian 的 Local REST API 插件,加上 Claude 桌面配置里的一行,就能让助手读写仓库而不用每次附加文件夹;那是以后某个晚上的项目,不是第一天的事。

第三步,Ops 项目和开场指令

创建一个项目(Claude:Project;ChatGPT:Project 或自定义 GPT;Gemini:一个 Gem,或者个人账号在 2026 年 11 月 17 日之后,用一条 Saved info 加一个固定的 Drive 文件夹),把下面这段粘贴为它的指令:

On the first turn of every chat, before anything else, read ops/NOW.md, ops/handoff.md and ops/hands.md. Open by saying in one line where I am and what I was doing, then take my message. No screenshots and no searching old chats until those three files are read.

At the end of a working session, when I say "write the handoff", add two lines to the top of ops/handoff.md: the date, what was done, what is next. Anything that needs my own hands goes as a tick-box line into ops/hands.md.

Style: concise, no moralising, no numbered lists, no em dashes. Ask before anything that cannot be undone: sending, deleting, sharing, publishing, paying. Never type a password; I type those.

复制:ops-project-instructions.txt(英文;指令用中文同样有效,愿意的话让你的助手翻译)

把 ops 文件夹附加到项目本身,而不是某一个聊天,这样每个新聊天都能看到它。几乎所有工作都在这一个项目里做。大多数应用在项目之间互不相见,一旦你的工作集中在一个地方,这就不再要紧。

效果:开一个新聊天不再有任何成本。助手开口就是"你的简报草稿写到一半,Takeout 还在跑,打印机需要加纸",你接着干就行。

第四步,脉搏(可选,像魔法的那部分)

一个很小的脚本每五分钟用你真正在做的事重写一遍 NOW.md,这样你永远不用手动更新它。它记录三样东西:前台的应用及其窗口标题、过去 15 分钟你碰过的文件,以及 hands.md 和 handoff.md 的开头。什么都不会离开你的电脑,也永远不截图。

隐私是内建的,不是事后补的。脚本带着一份短名单,名单上的应用永远不记录窗口标题(密码管理器、Signal、银行),并跳过任何隐私浏览窗口。不在允许名单上的应用,只记录名字。安装前先编辑这些名单。

  • Windows:把附录里的 pulse.ps1 存进 ops,然后打开任务计划程序,创建基本任务,触发器选"当我登录时",操作选"启动程序":powershell.exe -ExecutionPolicy Bypass -File "C:\Users\你\ops\pulse.ps1",再在任务属性里设为每 5 分钟重复一次。一个对话框,搞定。
  • Mac:把附录里的 pulse.py 和 install-pulse.command 存进 ops,双击 .command 文件一次,在两个权限提示上点 OK。

检查它是否在工作:五分钟后打开 NOW.md。如果第一行带着时间,循环就闭合了,从此每个聊天一打开就知道你在哪里。

Gemini 用户:把脚本的输出指向一个 Drive 文件夹而不是本地文件夹,Gemini 从那里读取。

第五步,廉价帮手

你的主助手是贵的那个。把大量阅读交给便宜的,只把结果交回来。

  • 长文件。永远不要把 200 页的 PDF 贴进主聊天。先让一个便宜的模型做摘要(AI Studio 里 Gemini 的免费档,或三个应用任意一个的免费档),再把两页的摘要交给主助手。便宜十倍,而且常常更好,因为主助手现在是在一份干净的摘要上推理。
  • 第二意见。做决定时,一个有力的答案胜过四个。只有当你希望它们互相反驳时才用多个模型,然后要一份综合。
  • 粘贴文本,永远不上传。上传到多模型服务的文件可能一直留在它们的存储里,没有删除按钮;Dan 是用昂贵的方式学到这一点的。只粘贴你要它读的文本,去掉姓名、地址、健康和客户信息,别的一概不给。免费档可能会用你粘贴的内容来训练,所以清理不是可选项。
  • 唯一值得拥有的脚本,给喜欢折腾的人:一个 40 行的 Python 文件,Gemini 密钥放在旁边的文件里,能从命令行给任何文档做摘要,这样主助手永远不用加载它。Dan 的版本叫 council.py,找他要。给密钥设一个支出上限,每月几欧元,就可以放心忘掉它。

在哪里。 Gemini 密钥:AI Studio,API keys;付费档只要几分钱,Google 声明付费档的数据不用于训练。Claude 和 ChatGPT 的密钥:各自的开发者控制台,同样的思路,同样的上限。第一天不需要。

第六步,值回票价的定时任务

定时任务就是一个没有你也在跑的聊天。它的花费和一次聊天一样,每天,永远,所以每一个都必须自己赚回成本。

  • 留下那些结果以推送通知到达你、而你真的会读的任务。早上一行字,带着今天的日程和真正要紧的两封邮件,值得。一个你从来不打开的漂亮页面,不值得。
  • 把每个任务放到能胜任的最便宜的模型上。读一张清单并过滤,是小模型的活。读收据并把金额搞对,需要中等模型。几乎没有什么需要定时跑最顶级的模型。
  • 基于规则的活根本不需要模型。给已知发件人的邮件打标签并归档,是一条 Gmail 过滤器。盯着共享文件夹看有没有别人编辑,是一段六行的 Google Apps Script 定时跑,免费,而且它能看到是谁编辑的,助手看不到。日历的健全性检查是一条正则表达式。让助手写脚本;你把它贴进 script.google.com,点一次允许。
  • 每月一次,列出所有任务,对每一个问:上周我读了吗?没读的,砍掉或减半。

在哪里。 Claude:定时任务,在侧边栏可见,每个都有自己的模型设置。ChatGPT:Tasks。Gemini:Scheduled actions。Google Apps Script 对三者都适用,因为它住在你的 Google 账号里,不在助手里。

Dan 的账户在一次审计前后:工作日四次用顶级模型的重型运行变成一次;每天两次的文件夹监视变成一个免费脚本;其余的都移到小模型上。到达他手上的信息一样,额度只剩一小部分。

随这一切同行的安全规则

这不是为谨慎而谨慎。每一条都存在,是因为有人跳过它一次,付出了真正的时间或隐私。

  • 密码和 API 密钥由你来输入,输进你自己电脑上的文件,永远不输进聊天。贴进聊天的密钥会留在那份记录里。万一发生了,当天就生成新密钥、删掉旧的。
  • 没有你的同意,不做任何不可逆的事:不发送、不删除、不分享、不发布、不付款。把这一行放进你的项目指令,助手每次都会先问。
  • 给外部模型的是粘贴的文本,永远不是文件。先去掉姓名、地址、健康、金钱和客户信息。保留一份永远不能离开你机器的词汇清单,粘贴前把文本对着它检查一遍。
  • 名为 Private 的文件夹保持私密。告诉助手哪些文件夹它永远不能读,并把这份清单也放进项目指令。
  • 窗口标题和最近文件是你生活的日志。让脉搏的拒绝名单保持诚实,别把 NOW.md 放进任何你分享的东西里。
  • 助手的权限系统说不,不是一个需要绕过的障碍。那是系统在做它的工作;这一步进你的 hands.md 清单。
  • 让你的话保持是你的。转发助手写的东西时,说明一下。它替你起草时,保留你的标点和你的语气;打磨过头是破绽。

每周十五分钟

这就是让它递归的部分:助手改进它自己的配置,你是那只点击的手。

每周一次,打开 Ops 项目,说:"读 hands.md 和 handoff.md。告诉我这周我付了钱却没用到的东西,你不得不问我两次的事,以及哪一个改动最能省额度。然后把我们商定的内容更新到项目指令里。"它思考的时候,你在 hands.md 上能勾的先勾掉。

三个问题让这个循环保持诚实:

  • 这周我重新解释了什么?那是项目指令或记忆里缺的一行。
  • 助手截图或搜索了什么,而一个文件本可以告诉它?那是 NOW.md 里缺的一行。
  • 有什么定时跑了、我却从来没读?那是一个该砍的任务。

把答案写进指令,而不是记在脑子里。一个月之后,这套配置就像手套一样合身,额度账单只剩原来的一小部分。然后教给一个朋友;解释的过程,正是你发现自己还有哪些部分是凭习惯在做的时候。

任何地方都不用破折号,不用编号列表,以你自己的名义发出的一切都用你自己的标点。通话完毕,带着爱。

附录:可以照抄的模板和脚本

三个文件,第一天应该有的样子。每一个也都可以下载;右键,保存到 ops。文件是英文的;用法一样,让你的助手翻译它们是一个不错的第一个练习。

NOW.md

# NOW.md
Working on: the newsletter draft, section 3
Last finished: sent the invoice to the printer
Next: proofread section 3, then export the PDF
Waiting on me: reply to the landlord about Thursday

下载:NOW.md

handoff.md

# handoff.md (newest on top)
2026-11-07 Set up the ops folder, Project and pulse. Next: prune the plugins, set the spend cap.

下载:handoff.md

hands.md

# hands.md: things only I can do
- [ ] set the monthly spend limit and turn auto-reload off
- [ ] connect the ops folder to the Project

下载:hands.md

Windows 的脉搏:pulse.ps1

存进 ops,用任务计划程序设为每 5 分钟运行。先编辑顶部的两份名单。

# pulse.ps1: rewrites ops\NOW.md with what you are doing. Nothing leaves this computer.
$ops = "$HOME\ops"
$deny = @("1Password","Bitwarden","KeePass","Signal","Passwords")          # never logged at all
$titleOk = @("Claude","ChatGPT","Code","Obsidian","chrome","msedge","firefox","WINWORD","EXCEL","notepad","explorer","WhatsApp","OUTLOOK","Zoom")  # window title logged only for these
Add-Type @"
using System; using System.Runtime.InteropServices;
public class W { [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid); }
"@
$h = [W]::GetForegroundWindow(); $procId = 0; [W]::GetWindowThreadProcessId($h, [ref]$procId) | Out-Null
$p = Get-Process -Id $procId -ErrorAction SilentlyContinue
$app = if ($p) { $p.ProcessName } else { "unknown" }; $title = ""
if ($deny -contains $app) { $app = "[private app]" }
elseif ($titleOk -contains $app -and $p.MainWindowTitle -and $p.MainWindowTitle -notmatch "InPrivate|Incognito|Private") { $title = $p.MainWindowTitle.Substring(0, [Math]::Min(90, $p.MainWindowTitle.Length)) }
$since = (Get-Date).AddMinutes(-15)
$files = Get-ChildItem "$HOME\Documents","$HOME\Desktop","$HOME\Downloads",$ops -Recurse -File -ErrorAction SilentlyContinue |
  Where-Object { $_.LastWriteTime -gt $since -and $_.FullName -notmatch "\\Private\\|Signal|\\\.git\\|node_modules|NOW\.md" } |
  Sort-Object LastWriteTime -Descending | Select-Object -First 8
$lines = @("# NOW (auto, $(Get-Date -Format 'ddd dd MMM HH:mm'), pulse.ps1, read this first)", "Active: $app" + $(if ($title) { " `"$title`"" } else { "" }))
$lines += "Files touched (last 15 min):"
if ($files) { $files | ForEach-Object { $lines += "  " + $_.FullName.Replace($HOME, "~") } } else { $lines += "  none" }
foreach ($f in @("hands.md","handoff.md")) { if (Test-Path "$ops\$f") { $lines += "From ${f}:"; Get-Content "$ops\$f" | Where-Object { $_.Trim() -and -not $_.StartsWith("#") } | Select-Object -First 5 | ForEach-Object { $lines += "  $_" } } }
$lines | Select-Object -First 22 | Set-Content "$ops\NOW.md" -Encoding UTF8

下载:pulse.ps1

Mac 的脉搏:pulse.py 加 install-pulse.command

两个都存进 ops,双击 .command 一次。

#!/usr/bin/env python3
# pulse.py: rewrites ops/NOW.md with what you are doing. Nothing leaves this computer.
import os, subprocess, datetime, re
HOME = os.path.expanduser("~"); OPS = os.path.join(HOME, "ops")
DENY = {"Signal", "Passwords", "1Password", "Keychain Access", "Bitwarden", "Messages", "Photos"}
TITLE_OK = {"Claude", "ChatGPT", "Obsidian", "Google Chrome", "Safari", "Finder", "Pages", "Numbers", "TextEdit", "Notes", "Mail", "WhatsApp", "Zoom", "Code"}
EXCLUDE = ("/Private", "Signal", "/.git", "node_modules", "/Library/", "NOW.md")
def osa(s):
    try: return subprocess.run(["osascript", "-e", s], capture_output=True, text=True, timeout=8).stdout.strip()
    except Exception: return ""
app = osa('tell application "System Events" to get name of first application process whose frontmost is true')
title = ""
if app in DENY: app = "[private app]"
elif app in TITLE_OK:
    title = osa('tell application "System Events" to tell (first application process whose frontmost is true) to get name of front window')[:90]
    if re.search(r"incognito|private", title, re.I): title = "[private window]"
files = []
for d in ("Documents", "Desktop", "Downloads", "ops"):
    r = subprocess.run(["mdfind", "-onlyin", os.path.join(HOME, d), "kMDItemFSContentChangeDate >= $time.now(-900)"], capture_output=True, text=True)
    files += [p for p in r.stdout.splitlines() if os.path.isfile(p) and not any(x in p for x in EXCLUDE)]
files = sorted(set(files), key=os.path.getmtime, reverse=True)[:8]
lines = ["# NOW (auto, %s, pulse.py, read this first)" % datetime.datetime.now().strftime("%a %d %b %H:%M"), "Active: %s%s" % (app or "unknown", ' "%s"' % title if title else "")]
lines.append("Files touched (last 15 min):"); lines += ["  " + p.replace(HOME + "/", "~/") for p in files] or ["  none"]
for f in ("hands.md", "handoff.md"):
    p = os.path.join(OPS, f)
    if os.path.exists(p):
        lines.append("From %s:" % f); lines += ["  " + l.rstrip() for l in open(p, encoding="utf-8") if l.strip() and not l.startswith("#")][:5]
open(os.path.join(OPS, "NOW.md"), "w", encoding="utf-8").write("\n".join(lines[:22]) + "\n")

下载:pulse.py

#!/bin/bash
# install-pulse.command: runs pulse.py every 5 minutes via launchd. Double-click once.
OPS="$HOME/ops"; PL="$HOME/Library/LaunchAgents/com.me.pulse.plist"; mkdir -p "$HOME/Library/LaunchAgents"
cat > "$PL" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict><key>Label</key><string>com.me.pulse</string>
<key>ProgramArguments</key><array><string>/usr/bin/python3</string><string>$OPS/pulse.py</string></array>
<key>StartInterval</key><integer>300</integer><key>RunAtLoad</key><true/></dict></plist>
PLIST
launchctl bootout "gui/$(id -u)/com.me.pulse" 2>/dev/null; launchctl bootstrap "gui/$(id -u)" "$PL" && echo "installed"
python3 "$OPS/pulse.py" && cat "$OPS/NOW.md"

下载:install-pulse.command

Gemini 的 Gems,如果你的个人 Google 账号里有:在 2026 年 11 月 17 日之前导出(Google Takeout,取消全选,只勾选"Gemini");指令会以文本形式导出,可以贴进一个项目或一条 Saved info。