正在打开内容
页面准备好后会自动显示。
页面准备好后会自动显示。
从网页右键收录到原子词、组合配方和插件回读,用一个最小 Chrome 插件跑通生图 Prompt 词库的完整闭环。
我以前存 Prompt 的方式很朴素。
看到喜欢的图,复制描述,随手扔进文档、收藏夹或者聊天记录。刚存进去的时候挺满足,觉得这份灵感总算没丢。等真要用时,麻烦才来了。
想找一个“高位俯拍”,搜不到。
想保留一种光线,换掉人物动作,也做不到。
我只能重新翻出那段 Prompt,从头删。
那时我才发现,收藏和词库根本不是一回事。
完整 Prompt 适合复现一张图。到了下一张,我可能只想沿用它的机位,人物、场景和情绪全部换掉。整段收藏就卡在这里:它太完整了,反而不好拆着用。
所以我给自己的收录工具加了一道整理流程:原文照存,再把里面可以单独替换的部分拆出来。本文会用 Codex 做一个最小版 Chrome 插件,把这套流程跑一遍:
你不需要先学 JavaScript。生产级系统里的复杂字段,这篇也先不碰。
这次只做三件事:收录、拆解、回读。

一段纠缠在一起的长 Prompt,只有被拆成可独立拿取的词卡,才真正开始像词库。
插件装好以后,操作其实很短。
我在网页上选中一句描述,点右键,选择“保存到生图词库”。侧栏里会出现刚刚收下的内容。短词可以直接分类,长段落先放在原始收录区,等 Codex 整理。
整理后的词可以搜索,可以按光线、镜头、构图、动作、情绪、场景等分类浏览,也可以编辑、删除和复制。
先做到这里就行。自动拆词、云端账号、多人同步这些功能都可以晚点再加。现在只检查:
这三件事做不到,功能堆得再多,也只是换了界面的收藏夹。

最小版先完成三件事:网页里选中文字、侧栏里搜索词条、找到后复制或编辑。
我平时也会顺口把它叫作“生图词库插件”。真要自己搭,光有 Chrome 插件不够。它还要接本地服务、分层文件和一套整理规则。
Chrome 插件负责眼前这些操作:
我想把收录入口放在浏览器里,原因很现实:少切一次窗口,我就更可能顺手存下来。直接维护 JSON 当然也行,只是很快会退回手工记账。
Chrome 官方提供了右键菜单、侧栏和扩展存储能力。右键菜单通过 contextMenus 读取选中文字,侧栏通过 sidePanel 承载界面,扩展本地暂存可以使用 chrome.storage。这些能力和当前安装方式都可以在 Chrome 扩展官方文档 中核对。
浏览器不会允许插件随意改电脑里的文件。要把侧栏里的内容落到本地词库,中间需要一个很小的同步服务。
它只监听你自己的电脑,例如 127.0.0.1,接收插件发来的内容,再把它写进你指定的词库目录。
这个服务没有理由对局域网或互联网开放。让它只监听本机,也别顺手把网页地址、账号信息和完整浏览记录存进去。插件连接不上时,内容先留在浏览器暂存区,等服务恢复后再补同步。
本地文件我分成四类:
captures.jsonl 原始收录:保留最初复制的完整文字
terms.json 原子词:只保存可独立使用的视觉控制词
recipes.json 组合配方:保存多个词共同成立的画面关系和派生完整 Prompt
prompts.json 常用 Prompt:保存我手动收录、经常直接复制的段落
混在一个文件里也能跑,只是很难用。搜索结果会被长段文字占满,同义词越积越多,后面再想做组合时,根本分不清哪些内容能单独使用。
最后才轮到 Codex。它负责:
这个项目里出现过“文件已经写了,侧栏就是看不见”的情况。原因可能是运行文件没更新,也可能是接口还在返回旧缓存。于是每次整理结束,我都会从外面再读一遍。
完整过程是:
真源写入
→ 结构审核
→ 运行时编译
→ 自动测试
→ 本地接口回读
→ 插件界面搜索验证

插件只是入口。原文保留、拆词、配方、审核和回读,才共同组成一条完整链路。
不会写代码也没关系,但别只对 Codex 说:“帮我做一个很厉害的 Prompt 管理插件。”
“很厉害”无法验收。Codex 可能给你一个漂亮页面,也可能生成一堆看起来齐全的文件,浏览器和本地词库却没接上。
我会先把边界写清楚。
我建新项目时,第一份文件通常是 AGENTS.md。
这是写给 Codex 的工作规则,里面会说明:
Codex 会反复修改项目。规则没先定好,同一个文件这次被当作真源,下次可能又被生成器覆盖;今天叫 terms.json,过两天又多出一份 library-final.json。代码还能运行,文件却已经没人敢删。这种混乱比报错更难收拾。
Chrome 扩展的入口文件叫 manifest.json。你可以把它理解为插件的身份证和权限清单。
里面写清:
少了它,Chrome 不知道要加载什么,也不知道插件被允许做什么。
插件在安装时创建一个只对“选中文字”出现的菜单项。
点击后,后台脚本读取 selectionText,先写入浏览器本地暂存,再尝试发送给本地同步服务。
本地服务不一定一直开着。插件应该先把内容暂存在浏览器里,再尝试同步。否则右键点完看见“已保存”,回头一查却什么都没有,这种反馈最糟糕。
正确反馈应该是:
侧栏只要先完成:
有这几个操作,已经可以判断这个工具会不会留下来常用。
当前 Chrome 官方的 Side Panel API 用来让扩展界面和网页并排显示。开发时可以按照官方文档在 chrome://extensions 打开开发者模式,再选择“加载已解压的扩展程序”并指向扩展目录。具体入口以 Chrome 官方安装说明 为准。

加载时选择包含
manifest.json的插件目录。卡片出现、开关打开,才算完成这一步。
下面这段可以直接复制给 Codex。把方括号里的项目名称和目录替换成你自己的。
可复制 Prompt
codex请为我创建一个最小但真实可用的「[项目名称] Chrome 生图词库插件」。 我没有编程基础。请用普通人的语言解释每个关键结构:为什么需要、少了会发生什么、对使用体验有什么影响。 开始实现前先做两件事: 1. 在项目根目录创建或补充 AGENTS.md,写清目录归属、数据真源、隐私边界、测试要求和完成标准。 2. 先检查当前目录和 Git 状态,保留已有文件与用户修改,不覆盖无关内容。 实现范围: 一、Chrome 扩展 - 使用 Manifest V3。 - 用户在网页上选中文字后,右键菜单出现「保存到生图词库」。 - 点击后读取选中的文字,不为空时先写入 chrome.storage.local 暂存,再尝试同步。 - 提供 Chrome 侧栏,不使用弹窗作为主界面。 - 侧栏支持:搜索、按分类筛选、新增、编辑、删除、复制。 - 每次保存都显示明确状态:已同步、仅本地暂存、内容为空、同步失败及下一步。 - 权限保持最小,只访问完成这些功能所需的 Chrome API 和本机同步服务地址。 二、本地同步服务 - 使用当前项目适合的最小技术方案。 - 只监听 127.0.0.1,不监听 0.0.0.0,不对局域网或公网开放。 - 对写入请求做来源标记、字段校验、长度限制和错误处理。 - 不保存账号、Cookie、浏览历史或完整网页内容;默认只保存用户主动选中的文本、创建时间、来源类型和必要状态。 - 插件无法连接服务时,不丢失已暂存内容;服务恢复后允许手动或自动重试。 三、数据分层 - captures.jsonl:原始收录日志,保留完整原文,不作为词库展示页。 - terms.json:可独立复用的视觉原子词。 - recipes.json:多个原子词共同成立的组合配方;图片反推和案例复刻产生的完整 Prompt 随配方保存。 - prompts.json:用户手动输入、经常直接复制的常用 Prompt;不接收图片反推、批处理或测试生成内容。 - runtime/library.json:只包含已经通过门禁、允许插件读取的内容,由编译步骤生成,不作为人工编辑真源。 - 给每个文件提供最小示例数据,但不要填入我的私人词库、品牌、账号、绝对路径或任何真实敏感内容。 四、最小门禁 - 长文本不得整段写入 terms.json。 - 拆词不能按逗号、字数或标签数量机械切割。 - 原子词必须只控制一个可以独立替换的可见画面变量。 - 多个机制必须同时出现才成立的内容写入 recipes.json。 - 判断不清的内容保留在 captures.jsonl,并标记为待复核,不强行进入 terms.json。 - 用户手动收录的常用 Prompt 进入 prompts.json,不参与原子词库;图片反推等派生完整 Prompt 进入对应 recipes.json 记录。 五、测试与成功信号 - 为右键收录、空文本、离线暂存、恢复同步、增删改查、数据校验和运行时编译添加最小自动测试。 - 检查 manifest、后台脚本和侧栏脚本语法。 - 提供 /health 或等价只读状态接口,至少返回服务正常、词数、配方数、原始收录数、待整理数和运行时生成时间。 - 完成后不要只告诉我「文件已创建」。请依次报告: 1. 自动测试结果。 2. 本地服务真实回读结果。 3. Chrome 安装步骤。 4. 我应该用哪一段测试文字做一次真实右键收录。 5. 收录成功后,应该在原始日志、运行时和侧栏分别看到什么。 - 如果无法自动操作我的 Chrome,请停在文件和接口验证,明确让我手动加载插件,不要假装已经完成浏览器验收。 先给我一个简短实施清单,然后直接实现、测试并报告结果。不要增加登录、云同步、付费、随机抽取或多人协作功能。
可复制 Prompt
image-22:3一名短黑发女性俯卧在浅青绿色碎花床铺上。镜头从近距离高位斜着俯拍,身体沿对角线延伸,双臂在脸下交叠,双腿弯曲抬起。她看向画面外,表情安静,略带倦意。窗边局部高曝光,室内暗部带浅青绿色环境光,画面低对比、轻微柔焦,并保留细小颗粒。
可复制 Prompt
codex请整理当前「[项目名称]」中新收录的生图词库原料。 开始前: 1. 完整读取项目 AGENTS.md、词库 README、整理协议和当前数据结构。 2. 检查 Git 状态,保留用户已有修改,不覆盖无关文件。 3. 读取原始收录、词条真源、组合配方、完整 Prompt 和当前运行时,先确认哪些文件是真源、哪些是派生物。 整理原则: 1. 保留每条原始文本和来源记录,不删除、不改写成摘要来代替原文。 2. 先查重,优先复用已有词,不为增加数量制造同义词。 3. 拆词不能按字数、逗号、标签数或分类数机械切割。 4. 唯一核心判断是: 「这段描述里,是否包含两个或更多可以分别增删、替换或锁定的画面控制机制?」 5. 原子词只控制一个可以独立替换的可见画面变量。 6. 多个词共同存在才成立的画面关系写入 recipes.json,并保留它与原始收录的追溯关系。 7. 用户手动收录、平时反复调用的常用 Prompt 写入 prompts.json;图片反推和案例复刻产生的完整 Prompt 写入对应 recipes.json 记录,不把整段塞进原子词库。 8. 暂时判断不清、证据不足或分类冲突的内容继续留在原始层,标记待复核,不强行入库。 分类要求: 1. 每个原子词做两次独立判断: - 浏览分类:我以后会去哪个分类里找它? - 真实视觉职责:它究竟控制光线、成像、镜头、构图、动作、情绪、人物外观、服装、场景、道具、色彩、材质、版式还是其他机制? 2. 不要从浏览分类自动推导真实视觉职责,也不要从来源段名直接复制职责。 3. 如果两次判断冲突,先复核;无法高置信修正就进入待复核。 4. 不把“具体服装 + 具体场景 + 动作 + 镜头”的整图描述包装成风格词。 5. 如果项目有侧栏显示长度限制,只把它当产品门禁;仍然以独立视觉控制机制决定是否拆词。 写入与验证: 1. 回写原始收录的处理状态、拆解时间、derivedTerms 和 derivedRecipes,保留原文。 2. 更新词条真源和组合配方真源;确保所有配方引用都能精确找到现有词。 3. 运行项目规定的原子性审核、语义职责审核、运行时编译和完整自动测试。 4. 机器规则通过只能报告为机器校验,不能写成人工审核。 5. needs_revision 或等价状态只是隔离,不代表已经返修;不得进入正式运行时。 6. 编译完成后回读健康接口和词库接口,再在插件侧栏搜索至少一个本轮新增词。 7. 如果无法自动操作 Chrome,明确列出人工回读步骤和预期结果,不要假装界面已验证。 8. 如果本轮没有新原料,并且真源、运行时和阅读页面已经一致,保持真正 no-op,不要只为刷新时间戳修改文件。 最终报告必须包含: - 本轮检查的原始收录数。 - 新增原子词数。 - 复用或重复词数。 - 新增或更新配方数。 - 完整 Prompt 数。 - 待复核数。 - 配方悬空引用数。 - 人工通过数。 - 机器校验通过数。 - 进入正式运行时的词数。 - 自动测试结果。 - 健康接口回读结果。 - 插件界面回读结果,或尚需我手动完成的明确步骤。 不要为了让报告好看而补造词、修改审核来源或把旧运行时说成新结果。
这段任务里真正有用的是验收信号。Codex 不能只报一句“文件已创建”,它得告诉你测试有没有过、服务返回了什么、还需要你在 Chrome 里手动确认哪一步。
做完以后,你会拿到 Chrome 扩展和本地同步服务两个目录。先启动服务,再到 Chrome 加载扩展。
下面这张图,是我做图片反推测试时保留的真实参考图。
画面里,一名短发女性俯卧在浅蓝绿色碎花床铺上。镜头从近距离高位斜着俯拍,墙面、窗户、镜子、抬起的双腿和右侧水果共同构成一个很具体的生活场景。
为了复现它,我把能看见的细节整理成了一段完整 Prompt。
这段文字可以直接拿去生图,却不适合当词条。下一次我只想借用“近距离高位斜俯拍”,还得把几百字重新读一遍;想留下“安静走神轻倦意”也是一样。
反推解决的是“怎么描述这张图”,入库解决的是“以后怎么拆着用”。到这里,工作才做了一半。

标注的七处并不是七个固定分类,而是在提醒你:一张图里通常同时存在多个可以独立调整的变量。
图片反推不是猜原作者写过什么,那也猜不回来。
我能做的是看着画面,把构图、动作、光线和成像这些可见信息,重新写成模型能执行的指令。
这张图我是这样看的:
2:3 竖幅的写实生活方式人像。我会尽量避开“氛围感”“电影感”“很有故事”这类词。它们听起来对,落到生成时却没说清任何东西。
“电影感”不能告诉模型镜头在哪里。
“慵懒”也不能告诉模型双臂如何交叠、视线落向哪里。
下面这段是为了文章重新整理的公开演示版。它只保留理解拆词方法所需的信息,不是我私人词库里的完整原文:
我还用更完整的原始版本做过一次纯文本返图。参考图没有作为图片输入,也没有参与编辑。
返图保留了俯卧、交臂、抬腿、镜子、窗光、花被、纸卡和柠檬前景,但人物脸部占比比参考图更大。
主要结构基本回来了,构图比例还是有差异。一张返图也说明不了稳定性,它只能证明这段 Prompt 在这一次生成里抓住了哪些东西。

这次返图保留了俯卧、交臂和窗光,人物脸部却明显更近。完整描述能复现方向,不等于复制原图。
我把上面这段完整 Prompt 放进网页输入区,全部选中,右键保存。
收录器先把它登记成待处理原料。整理完成后,长文本继续留在原始收录层,同时补上:
拆词本身带判断,今天觉得能独立使用的词,后面可能发现还混着两个机制。原文删掉以后,就很难核对当时为什么这么拆。原始层不追求整洁,它负责把证据留住。

右键菜单出现“保存到生图词库”,说明浏览器入口已经接通。它仍然只完成了原料收录。
逗号和字数只能帮我快速找到可疑段落。要不要拆,最后看这一句:
这个描述里,是否包含两个或更多可以分别增删、替换或锁定的画面控制机制?
有,就拆。没有,即使文字稍长,也可以先保留。
例如:
“斑驳浅灰绿卧室”虽然包含材质、颜色和空间名词,但它共同控制的是一个可识别的旧居卧室场景。在当前产品门禁内,它可以作为场景原子词。
“青绿柔雾卧室俯卧抬腿生活方式人像”看起来也是一句短标题,但它同时包含成像、场景、动作、构图和人物类型,不能作为一个独立视觉词,只能作为组合配方名称。
所以我不拿字数直接判定原子词。
这张图里,我找到了这些可以分别调整的部分:
接着做替换测试:
拆词也不是越碎越好。“蓝”“床”“光”都很短,却说不清要控制什么。一个词能单独改变可见结果,就够了。

原子词负责独立替换,组合配方负责保留原来的关系。少做任何一边,词库都会不好用。
真实项目里,我会把更多细节继续拆开,也会先查词库里有没有同义词。文章不需要公开整张图的完整入库结果。为了让方法一眼能看懂,这里只保留九个代表性控制轴:
| 新增原子词 | 浏览分类 | 真正控制什么 |
|---|---|---|
| 低对比柔焦 | 成像 | 画面清晰与反差质感 |
| 窗边局部高曝光 | 光线 | 曝光落点 |
| 浅青绿环境光抬升暗部 | 光线 | 暗部色彩与亮度 |
| 近距离高位斜俯拍 | 镜头 | 相机位置与观察角度 |
| 俯卧床面 | 动作 | 身体基础姿态 |
| 脸下交叠双臂 | 动作 | 手臂关系 |
| 视线落向画外 | 动作 | 视线方向 |
| 安静轻倦意 | 情绪 | 可读情绪 |
| 浅青绿旧卧室 | 场景 | 空间环境 |
查重看起来没拆词那么有成就感,却很影响后面的使用。如果“轻微颗粒”“细小颗粒”“细颗粒噪点”各存一遍,搜索很快就会被同义词占满。词数上去了,选择反而更费劲。
我现在宁愿少加几个,也不想给同一种效果起五个名字。
对普通读者来说,“光线、镜头、动作、情绪”这些分类已经足够浏览。
系统还要多记一层:这个词究竟在改什么。
例如“视线落向画外不看镜头”,浏览时放在“动作”很顺手;系统记录的职责则是姿态和视线关系。
“蓬松微乱短黑发”放在“主体”,控制的是脸部与发型设计。
“安静走神轻倦意”才是情绪。
两层混在一起以后,会出现一些很奇怪的结果:
最小版本不需要背英文枚举,入库时多问两句就行:
两次答案对不上,先放进待复核。
单独看下面这些词,它们都可以替换:
但它们一起出现时,才接近原图的身体关系和观察角度。于是我另外保存了一张组合配方:
青绿卧室俯卧人像
它负责保留这些词同时出现时的整体画面方向。
配方是一张关系清单。以后想回到这个画面方向,我不用翻完整 Prompt,也不需要把这些词重新猜一遍。
这几类内容可以这样分:
有些内容暂时分不清,就留在原始层。词库不需要为了表面整齐,把每段文字都塞进某个格子。

判断标准只有一个:这个描述能不能被单独增删、替换或锁定。
我的生产级插件还给单项操作词的显示名设置了一个门禁:最多 16 个 Unicode 字符。
这是为了适配狭窄的 Chrome 侧栏。词名太长会挤坏卡片,也很容易把一句描述伪装成一个单独变量。
你的最小版本可以先不使用这个限制,也可以根据自己的界面改成 12、20 或 24 个字符。
界面长度和拆词标准要分开。短词可能混了三个机制,稍长的词也可能只控制一件事。
terms.json 里出现新词,只能说明写入完成。我还会继续检查下面几处。
完整 Prompt 保留在原始日志里,并记录已完成拆解。
它还会记录拆解时间、派生词和组合配方。
以后发现拆错,还能回到原文重看。
原来那条整段文字不继续占据词条真源。
不然侧栏搜一个普通词,可能蹦出几百字;运行文件也会把整段场景误当成一个可选项。
新词分别落在光线、镜头、动作、情绪和场景等分类中。
它们没有因为来自同一张图,就被统一塞进“风格”。
有一个名称写错,或者旧词改名后没有迁移,配方就会悬空。这时应该停下编译先修数据,不能带着错误继续生成运行文件。
我的项目会把审核通过的词编译成插件读取的运行文件。
程序跑过规则,只能记作“机器校验”。没人逐条看过,就不能写成人工审核。判断不清的内容先隔离,也不能把“已隔离”说成“已返修”。
机器规则通过和人工逐条确认是两种状态,不能互相冒充。
我会从插件里搜索一个刚整理的公开示例词,例如“近距离高位斜俯拍”。
搜索得到,说明插件正在读取包含它的运行文件;再对照原始收录和配方,才能确认从原料到使用端的整条链路没有断。
你的第一版只有二十个词也没关系。先保证每个词能找到来源、能搜索、能回读。数量以后自然会涨。

写进文件只是中间状态。至少要从运行文件和插件界面重新找到一个本轮新词。
当你的插件已经能收录以后,可以把下面这段交给 Codex。
这段任务没有让 Codex 自动“优化 Prompt”。它负责保留原文、拆词、查重、编译和回读。
这只能说明浏览器收到了操作。
你还要检查:
别用新增数量判断整理质量。继续检查:
答不清的先放待复核。
程序能检查:
但程序不能因为规则都通过,就替你宣称这个词已经被人逐条看过。
机器校验可以挡掉结构错误,人工审核负责那些程序看不懂的语义判断。两种都要留真实标签。
别急着建几千条词。先把下面这条链路跑通:
127.0.0.1。这条链路跑通以后,再考虑图片类型、词条锁定、局部重抽和相容关系。那些功能会让词库更好用,但不需要挤进第一版。
下次再遇到喜欢的长 Prompt,可以先原样收下。然后只拆一个你确定会单独搜索、单独替换的词,再把原来的组合关系留住。
先这样用几天。你很快就会知道,自己的词库到底缺什么。